Know whether the books actually closed

Signing off on the fifth is a decision. Whether material value stopped moving after it is a measurement, and taking it by hand across a group of entities is rarely anyone's priority. These controls run over every entity's general ledger and surface the exceptions worth a controller's attention.

app.reporting.apbuddy.io/app/anomalies
The Anomaly Scan screen showing posting lag by entity for September: journals, value, median and 90th-percentile lag, the share of value posted on time, and a lag distribution bar for each entity. Tabs show counts for duplicates, missed recurring entries and outliers.
  1. 1 Each detector has its own tab, with a count of findings for the period.
  2. 2 Share of value posted within the on-time window, which defaults to five days.
  3. 3 Late value by bucket: 5 to 30, 30 to 60, and over 60 days.

The real app, showing a sample group. Figures and entity names are invented.

At a glance

Control Threshold
Close lag 5 days, configurable
Duplicate journals Within 14 days
Missed recurring entries 4 of the prior 5 months
Amount outliers Over 3σ, 12-month baseline
Unmapped balances Any unmapped balance
FX rate coverage No rate within 60 days

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.

On time
Posted within 5 calendar days of period end; the window is configurable
Late buckets
Up to 30, 30 to 60, and over 60 days after period end
Measured
By count and by value, per entity, per period
Statistics
Mean, median, p90, p99 and worst-case lag

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.

Match
Same account, same net amount, same description (case and spacing ignored)
Window
Posted within 14 days of each other
Looks back
The last four months of journals
Excluded
Cash receipts and payments, where repetition is normal; zero-value lines; 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
An account with no journals in the latest complete month
Pattern required
Posted in at least 4 of the 5 months before it

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.

Baseline
Mean and standard deviation of absolute line values, per account, over the trailing 12 months
Minimum history
10 lines before an account is judged at all
Flags
Current-month lines more than 3 standard deviations above the mean

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.

Treatment
Excluded from consolidated totals
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.

Checked
Every currency and period combination in the data
Fallback
A month with no rate takes the latest rate from the previous 60 days; an average rate falls back to spot. Neither is flagged
When no rate applies
A warning on the consolidated reports with the gap count and the untranslated exposure per currency, and totals marked as understated
In CSV exports
Consolidated P&L and balance sheet exports state how many entities the total covers

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. A total you know to be understated, and by how much exposure, is more useful than one withheld entirely — provided the report says so.

Questions CFOs ask

What is close lag and why does it matter? +

Close lag is the gap between the accounting period a journal belongs to and the date it was actually entered. It matters because it measures whether your books stopped moving after you closed them. A month signed off on the fifth, but still receiving material entries on the fortieth, was not really closed on the fifth — and every report issued in between was provisional without saying so.

How do you detect duplicate invoices across multiple companies? +

By running the check across every entity's journals at once rather than one ledger at a time. Lines are matched on the same account, the same net amount and the same normalised description within a fourteen-day window. Cross-entity duplicates are the ones per-entity review cannot find, because no single ledger contains both halves.

Can you spot a missing accrual before it becomes a prior-period adjustment? +

Yes — by looking for absence rather than error. Any account that posted in four of the previous five months and has nothing in the current one is flagged. Omissions do not announce themselves the way wrong numbers do, so pattern-breaks are the only reliable signal.

Does this replace an audit or internal controls? +

No. These are detective controls that run continuously over the general ledger and surface exceptions for a human to judge. They shorten the distance between an error being made and someone noticing it. They do not test design effectiveness, they do not provide assurance, and they are not a substitute for a properly designed control environment.

Does it change anything in Xero? +

No. Everything is read through the Xero API and nothing is written back. The detectors run over a copy of the journal data, so there is no possibility of a control altering the ledger it is checking.

See it run on your own ledger

The fastest way to judge these is to point them at a month you have already closed and see what they find.

Book a call →