Two screens, one drawer, and £44 between them
The till said the drawer should hold £60, the office said £16, and the drawer held £56. Each screen had counted what the other never read. Now they agree.
A cash drawer is the simplest number in a venue. Whatever was in it before service, plus what came in, less what went out. Two of our screens work that number out: the till’s own cash summary, which the person closing the counter reads, and the office cash-up, which the manager reconciles against the next morning. Last week we put one day’s trade through both and they disagreed by £44.
What the day looked like
One venue, one day. A £20 cash sale, £4 of it refunded in cash, £50 paid in, £10 paid out. The drawer should hold £56 more than its float. The till said £60. The office said £16. Neither was right, and they were wrong in opposite directions.
The till added up every cash sale and never subtracted a refund. The office subtracted refunds but had never heard of paid-ins and paid-outs: the table those movements live in did not appear anywhere in its code. Each screen was blind to exactly the thing the other counted. Put them side by side and the gap is not a rounding error, it is two different definitions of the same drawer.
Why the till had got away with it
The till’s mistake was hiding behind a coincidence. When a cash sale is refunded in full, the sale stops counting as paid, so leaving refunds out gives the right answer by accident: nothing in, nothing out. It is only the partial refund, where the sale stays paid and £4 of it has gone back across the counter, that exposes the gap. A bug that is right on the common case is the one that survives, because the common case is what everyone checks.
Fixing one would have made it worse
We fixed both in the same release, on purpose. Fix the till alone and the two screens still disagree, just by a different amount, and a manager who has learned to trust one of them has no way of knowing which. The office now reads paid-ins and paid-outs alongside everything else it already read. The till subtracts cash refunds on the day they were given back and shows them as their own line, so the person closing up can see what was taken off and why.
One thing we deliberately kept apart: the declared float is not a movement. It is a statement about what was in the drawer before trading. A paid-in is something that happened during trading, with a note and a name against it. A venue that recorded its float as a paid-in would count it twice, which is why the screen names each thing it counted rather than folding them into one figure. If the summary says £50 paid in and £10 paid out, you can go and find the £50.
Nobody had been caught by it yet
On the live system no venue had recorded a paid-in or a cash count, so nobody had reconciled against either wrong figure. That is luck, not design, and it is the reason the test we wrote pins the agreement rather than either number: the two screens must say the same thing about the same drawer, counting every way cash moves. We proved it bites by breaking each side separately and watching it name the disagreement.