The AI auditor: what it actually checks, and what it leaves to you
"AI-powered" usually means a black box. Fatouraty's auditor is the opposite on purpose: every finding comes from an exact, inspectable rule, and it runs with no API key at all. The language model, when one is configured, only explains — it never flags anything, and it never acts.
The Fatouraty team
Most of what gets marketed as an "AI auditor" in accounting software is a language model given access to your books and asked to comment. Every finding it produces might be real or might be invented, and there is no way to tell which without checking it by hand — the exact work the tool was supposed to save you. Fatouraty's auditor is built the other way around: detection itself is a set of plain, deterministic rules run against your real numbers, and the language model — when a key for it is configured — is only called after every finding is already decided, to write a paragraph explaining them, not to decide anything.
Rules, not guesses
The auditor runs a fixed battery of checks on every pass: duplicates, statistically unusual amounts, compliance gaps, overdue balances, forgotten drafts, and — when inventory is active — valuation problems on top. Every one of those checks is a rule you could read and fully understand, not a pattern a model learned from data you cannot see. Which means every one of them runs with no external call and no API key at all; if AI is not configured for your workspace, you get the exact same list, just without the narrative paragraph on top.
The checks themselves
This is the complete list of what the auditor looks for, and the signal each check runs on:
| Check | What it looks at | Severity |
|---|---|---|
| Duplicate invoice | Same customer, currency and total within 7 days | High |
| Duplicate bill | Same vendor, currency and total within 7 days | High |
| Duplicate payment | Two payments on the same invoice, same amount, within 7 days | High |
| Unusually large invoice | A statistical outlier against the workspace's own history | Medium |
| Unusually large expense | The same statistical rule, applied to bills | Medium |
| Missing VAT | A positive subtotal and zero tax in a VAT country, unless every line is zero-rated or exempt | Medium |
| Future-dated entry | A posted or reversed journal entry dated after today | Medium |
| Negative cash or bank balance | A cash or bank account below zero | High |
| Receivable or payable 90+ days overdue | Pulled straight from the aging report | Medium |
| Stale draft invoice | Still a draft more than 30 days after creation | Low |
| Missing VAT registration number | Invoices issued in a VAT country with no TRN on file | Medium |
| Unreconciled bank lines | 10 or more imported lines still unmatched | Low |
| Inventory that doesn't tie to the ledger or its own movements (if active) | A gap between the stock subledger and the GL account, or between pool balances and recorded movements | High |
| Negative stock on hand (if active) | An item's quantity on hand below zero | High |
| Stock value with no quantity, or quantity with no cost basis (if active) | Value stranded at zero quantity, or quantity carrying no cost | High / Medium |
| Stock on a retired item (if active) | A balance still sitting on an item marked inactive | Medium |
| A sale that relieved no cost (if active) | A sale movement that reduced quantity without reducing the pool's value | Medium |
| Stock at or below its reorder point (if active) | A quantity nearing the level set for that item | Low |
| Stock untouched for 180+ days (if active) | An item with no movement in a long stretch | Low |
| Expired or expiring batch (if active) | A lot past its expiry, or within 90 days of it, still on hand | High / Medium |
The statistical check — on invoices and expenses alike — does not compare an amount to a fixed number we picked; it compares it to your own workspace's entire distribution. The upper quartile and interquartile range of its recorded amounts are computed, and anything past the upper quartile by three interquartile ranges gets flagged. The check does not even run until a workspace has at least five documents to compare against — below that, every number looks normal by definition.
"Ask your books": a fixed set of skills, not an open chat
The assistant is not a general chatbot pointed at your database. It is routed to exactly one of eleven fixed skills: revenue, expenses, profit, cash, receivables, payables, VAT owed, top customers, overdue invoices, who owes you, and help. Every answer is computed from a real, pre-defined query against your actual books — never a free-form query the model builds itself in whatever direction it chooses.
Routing happens in two stages. First, a bilingual keyword match that runs with no model at all — a question containing "profit" or "ربح" reaches the profit skill directly. If that match fails and a model key is configured, the model is asked to pick exactly one skill from that same fixed list — and any choice outside the eleven is rejected outright. Either way, the model never writes the answer text itself; the answer is a pre-written bilingual template, filled with real numbers pulled from your books.
And it is read-only. Nothing in the assistant's or the auditor's code posts an entry, sends an invoice, or changes a category. Every finding names the specific record it concerns in plain text — an invoice number, an account code, a contact name — and the top findings on the dashboard link through to the relevant part of the app; deciding what to do about it, and doing it, stays yours.
What it deliberately does not do
- No free-form querying, ever. The assistant is limited to eleven pre-defined skills, and the auditor to a fixed list of checks — neither has a path to anything those lists don't already expose.
- No automatic action. No correction, no recategorization, no journal entry posts itself because of a finding. Every finding names the record it concerns; nothing about that record changes unless you go and change it yourself.
- Minimized data reaches the model. When the model is asked to write the narrative paragraph over the auditor's findings, it receives only the check codes, their severity and their count — no customer name, no invoice number, no amount. It is told this explicitly in the prompt itself: you have no customer names or invoice numbers, and must not invent any.
- Works with zero API key. Every rule in the auditor and the keyword routing in the assistant run with no external call at all; a configured key only adds a narrative paragraph on top of the auditor's results and a fallback classifier for an ambiguous question in the assistant — nothing more.
Bilingual by design, not by translation
Every auditor finding carries a title and a detail in Arabic and English together, written side by side in the source itself — not English text translated at render time. Every assistant skill has its own standalone Arabic template, and time phrases — "today," "this month," "last month" — are read directly off the Arabic question itself, not off an English translation of it first. And when the model composes the narrative paragraph in Arabic, it is explicitly asked to write it in Arabic from the start, not to translate an English draft.
Where findings show up, and in what order
Findings are ranked most severe first — high, then medium, then low. Every finding's detail text names the specific record it concerns — an invoice number, an account code, a contact name — rather than a generic description. On the dashboard, the top four findings each carry a link into the relevant part of the app — invoices, expenses, bank reconciliation — to start from; the full auditor page lists every finding with that same detail text, and tracking down the record it names from there is still a manual step today.
Frequently asked questions
Is the AI auditor a chatbot that can access anything in my books?
No. Detection is a deterministic rule engine over a fixed list of checks, and the assistant is limited to eleven pre-defined, read-only skills. Neither has a free-form query path — both are bounded to exactly what those lists expose.
Does the auditor work if I don't have an AI key configured?
Yes. Every auditor check and the assistant's keyword routing run with zero API key. A configured key only adds a narrative paragraph on top of the auditor's results and a fallback classifier for an ambiguous question in the assistant.
What counts as a "duplicate" invoice?
The same customer, the same currency and the same total amount, with issue dates within seven days of each other. Matching runs on exactly those four signals — no guessing, and no text comparison of the invoice description.
Can the AI auditor fix or change anything on its own?
No. It is read-only. Every finding names the record it concerns in its own text, but nothing about that record changes unless you go and change it yourself. No automatic correction, no recategorization, no journal entry posts itself.
What data does the language model actually see?
For the auditor's narrative paragraph, the model receives only check codes, their severity and their count — no customer names, invoice numbers or amounts, and it is told this explicitly in the prompt. The assistant's classifier sees only your question text, to pick one skill from a fixed list — no query beyond that skill is ever run.
Does the assistant actually answer in Arabic, or is it translated?
Natively. Every skill has its own standalone Arabic template, and time phrases are read directly off the Arabic question rather than a translation of it. When the model is used for an Arabic narrative paragraph, it is asked to compose it in Arabic from the start, not translate an English draft.