Sales summaries · measured on a copy of live data

Restaurant Books That Balance

Every trading day, each restaurant's books should show the money taken and the money earned agreeing to the penny. On roughly one day in sixteen they did not. This is what was wrong, what it was costing, and what the fix is worth — measured by running the real job over ninety days of real trading.

Period 10 May – 7 Aug 2026 Restaurants 210 Restaurant-days 18,900 Nothing live was changed
Books as they stand $70,276.50 1,191 days that don't balance
Same period, after the fix $2,379.45 122 days that don't balance
1,069days brought into balance
0days broken by the change
0correct days altered
96.6%of the discrepancy removed

Put plainly: on nine days out of ten that were wrong, the books now close. Of the 122 days still open, only 32 are worth more than ten cents — the rest are till rounding.

What an unbalanced day costs

A day that does not balance cannot be signed off. Someone has to open it, compare it against the till, and work out which figure is missing — and until they do, that restaurant's period is not closed.

Across these ninety days that was 1,191 restaurant-days needing investigation — about thirteen every single day. After the fix it is 122 across the whole period, and only 32 of those are worth more than ten cents: roughly one day every third day that genuinely needs a human.

The second cost is subtler and worse. Where the two records of a duplicated restaurant traded figures between them, the same day could reconcile differently depending on when you looked. That is not a number anyone can defend in a review, and it is the reason R2 is a requirement rather than a nicety.

~13restaurant-days a day needing investigation, before
~1.4restaurant-days a day, after
90%less manual reconciliation

What the business needs from this

Four requirements. Everything below is judged against them.

R1
A day's books must balance. Money taken must equal money earned, to the penny. A day that doesn't balance can't be signed off, and someone has to work out why by hand.
R2
Each restaurant's records must stay its own. A payment or refund must belong to one restaurant and stop moving. Figures that change owner between reports can't be reconciled.
R3
Cancelling an order must not delete another restaurant's money. Removing a voided order should affect that order only.
R4
When the numbers can't be trusted, that must show. A silently plausible figure is worse than a visibly wrong one.

What was going wrong

Two records for one restaurant, fighting over the same money — R2, R3

Ten restaurants were set up twice in the system, as two separate customer records, and both were importing from the same till. Because the two records competed for the same payments and refunds, a refund could belong to one record in the morning and the other by the afternoon. Over time this had moved 3,387 refunds, 4,069 payouts and 2,628 cash-drawer shifts between records. Nineteen pairs have been affected historically; ten still share a till today.

It also meant a single card payment could be attached to both records' copies of an order. That is the R3 hazard: the nightly job removes orders the till reports as voided, and removing an order removes its payments — so cancelling one restaurant's order could quietly delete the other's payment. In a sample of 20,000 orders, 11,469 payments had two owners.

Refunded tips still counted as income — R1

When a guest was refunded, the tip came back too. The summary kept crediting the original tip, so the day showed income the restaurant no longer had.

Service charges collected but never recorded as earned — R1

A catering fee or auto-gratuity is charged inside the customer's card payment, so it arrived as money taken — but nothing recorded it as money earned. Every order carrying one left the day short by exactly that amount. This was the single largest cause.

Refunds arriving for restaurants whose sales were never imported — R4

A handful of records receive refunds while none of their sales reach the system. Those days cannot balance, because half the transaction is not there. This one is deliberately left visible rather than fixed — see below.

What the fix is worth

The real nightly job was run over the same ninety days twice — once as it behaves today, once with the fixes on — against the same copy of live data. These are measured outcomes, not estimates.

StageDays not balancingCleanDiscrepancy
Books as they stand1,19193.70%$70,276.50
Counting refunded tips correctly89095.29%$67,032.09
Recording service charges as earned12299.35%$2,379.45
ChangeDays fixedDays brokenCorrect days alteredMoney involved
Refunded tips30100$4,027.21
Service charges76800$64,752.64
Both together1,06900$67,897.05
Nothing that was already right was touched

Of 18,900 restaurant-days, 17,827 came out identical — not just still balancing, but line for line the same figures. Every day that changed was already wrong. This was checked at the level of individual lines (category, amount to the cent, and which account it posts to), not just each day's bottom line, because a day can keep balancing while the figures inside it move.

What it looks like on a real day

Three days from the period. In each case the correction equals the discrepancy exactly — which is what you would expect if the fix is recording something real that was recorded nowhere.

A catering fee — NGPA, 4 JuneBeforeAfter
Service chargesnot recorded1,344.86
Card payments16,914.2616,914.26
Day out by1,344.860.00

The guests paid the catering fee inside their card payments. Nothing in the books said the restaurant had earned it, so the day was short by exactly the fee.

A refunded tip — NGFL, 19 MayBeforeAfter
Tips238.4670.42
Card refunds168.04168.04
Day out by−168.040.00

Guests were refunded $168.04, tips included. The books kept crediting the full original tip. The corrected figure matches the refund to the penny.

One restaurant, two records — 11 MayRecord ARecord B
Orders that day221221
Refunds that daynone2 — $2,232.29
Day out by2,232.290.00

The same restaurant, twice in the system. Both records held the same 221 orders, but the refunds existed only once. The record without them showed the sales being returned and no refunds against them, and was out by exactly what its twin was holding. Across its whole history that record held 158,535 orders and five refunds.

Making the duplicated restaurants whole

The duplicated restaurants needed more than the arithmetic fixes, and this is the part with a real choice in it.

Orders were always recorded per customer record, so both copies of a restaurant built their own order history. Refunds and payouts were not — only one record ever held each of them. So one copy shows returns with no refunds against them, and the other looks fine.

Rather than invent duplicate records, the fix asks the till again. Once each record carries its own identity, replaying ninety days of history means each one imports its own copy and the two sets of books converge on their own — no code inventing figures that someone then has to trust.

423days out of balance on these records, before
3days out of balance, after
$18,508discrepancy before
$649discrepancy after

The alternative was to retire one record of each pair. That was measured too, and it is worse: it leaves 279 days and $7,790.54 open, and it forces a decision about whose trading history to abandon. Replaying instead leaves 122 days and $2,379.45, and no record is lost.

A capped import, found while doing this

The refund import asked the till for a restaurant's refunds and read only the first page of the answer. The till sends a hundred at a time, so any location with more than a hundred refunds silently returned a hundred — and the response looked complete. This was quietly truncating the nightly refund import for every busy location, not only the duplicated ones. Now fixed.

What is left, and what it is

Remaining discrepancyDaysAmount
Real trading days — small, mostly rounding106$1,151.80
Refunds for restaurants whose sales never arrive16$1,227.65

Of the 106 trading days, only three are on the duplicated restaurants, and all three are understood: two are a day where the till recorded $6,358.99 of card payments against $6,059.57 of orders — a genuine gap in the till's own figures, not a fault in the books — and one is an auto-gratuity booked as a service charge. The remaining 103 days come to $502.96 spread across 190 restaurants, mostly a few cents each.

That $502.96 has been identical every time this was measured, across several rebuilds with deliberately different preparation. It is the floor this work reaches.

The 16 remaining days belong to two restaurants — NG4S and NGPS — that receive refunds while none of their sales are imported. Their books cannot close until the sales arrive. These are deliberately left visibly out of balance (R4). The arithmetic could be made to agree in one line, and that change was written, measured and then removed: an unbalanced day is the only signal anyone gets that a restaurant's sales are missing. Closing it would remove the alarm and leave the fire.

What rollout costs, and what it risks

StepCostRisk
Deploy the changeminutesNone on its own — the two accounting changes are off per restaurant by default
Re-label existing records~38 minRuns with imports paused; newest month first, so stopping early is safe
Replay 90 days for the 10 duplicated restaurants~5.9 hrsOvernight job; reads from the till only
Recompute the books, then switch on per restaurant~25 minReversible — switching a restaurant back off restores today's behaviour exactly

The whole sequence is one overnight maintenance window. No customer record is retired and no trading history is discarded. The accounting changes go on a few restaurants at a time, and switching one back off is the rollback.

Three decisions needed

Accounting
Which revenue account service charges post to. Currently 49000 Service Income, chosen so the work could be measured. It affects how revenue is reported, never whether a day balances. Needs sign-off before switching any restaurant on.
Operations
Why NG4S and NGPS receive refunds but no sales. 160 refunds worth $4,347.68 predate any order for these restaurants. Replaying their history from the till is the cheap first thing to try — it is what resolved seven similar cases.
Reporting
Ten restaurants remain in the system twice, by design. Each copy now keeps complete, correct books. If any report adds figures across customer records, one restaurant's takings would be counted twice at that layer. Worth confirming before this ships.