Close lag — did the books actually close?
Every journal carries two dates: the period it hits, and when someone actually keyed it into Xero. The gap between them is your real close lag.
Entries are bucketed as on-time, 5–30 days late, 30–60, or 60+, by count and by value. The on-time window defaults to five calendar days from period end and is configurable. Mean, median, p90, p99 and worst-case lag are tracked per entity per period.
A clean close is not “we signed off on the 5th”. It is whether material value stopped moving after you did. If a quarter of your posted value lands 30+ days after period end, last month's numbers are still changing — and anyone reading them is reading a draft.
Duplicate journals
The same cost, entered twice, in two entities or twice in one.
Matches journal lines sharing the same account, the same net amount and the same normalised description, posted within 14 days of each other. Cash receipt and payment journals are excluded, since legitimate repetition there is normal, as are zero-value lines and lines with no description.
Duplicates are hardest to spot precisely where they matter most — across entity boundaries, where no single ledger shows both halves. Running one detector over every entity's journals finds what per-entity review structurally cannot.
Missed recurring entries
The accrual that has posted every month for a year, and didn't this month.
Flags any account that posted in at least four of the prior five months but has nothing in the current one.
Omission is invisible by construction. A wrong number gets queried; a missing one just makes the month look better. This is the control that catches a forgotten accrual before it becomes a prior-period adjustment.
Amount outliers
An entry far outside what this account normally carries.
For each account, the mean and standard deviation of absolute line values are computed over a trailing twelve months, requiring at least ten observations before the account is judged at all. Current-period lines beyond three standard deviations are flagged, with the z-score shown.
Not every outlier is an error, and the tool does not pretend otherwise. It surfaces the handful worth two minutes of a controller's attention, ranked, instead of asking someone to eyeball a general ledger.
Unmapped balances
Accounts sitting outside the group chart of accounts.
Any account with no mapping to a group account is excluded from consolidated totals and reported separately, with its value and the entity it belongs to.
This is a design decision worth stating plainly: a mapping gap understates the consolidation visibly rather than silently. A new account added in a subsidiary does not quietly disappear from the group P&L — it appears on a list demanding attention.
FX rate coverage
Periods and currencies with no rate on file.
Every currency and period combination present in the data is checked against the stored rates, and gaps are reported with the absolute exposure they affect. Be aware of what this does and does not do today: an unrated row currently contributes zero to the consolidated total rather than the total being withheld, so the figure is understated while the gap is flagged beside it.
A missing rate is the quietest possible error — the affected entity contributes nothing and the group total simply comes out lower, with no failure anywhere. Detection is what stops that being invisible. Suppressing the total outright would be better still, and that change is in progress.