The Invoice We Reprinted Was Not The One We Sent

by Serguey Shinder

A customer rang in the autumn of 2023 about a credit she believed she was owed on an order from March 2021, and to settle it we did the obvious thing and reprinted the invoice. She had kept the original attachment and read hers out at the same time. The totals matched to the penny. Almost nothing else did.

Her copy listed a line called Standard Pallet Delivery at fourteen pounds fifty. Ours called the same line Pallet Delivery Zone B at fifteen pounds ninety, showed a tax code that did not exist in 2021, and carried a registered office we had moved out of in the summer of 2022. Neither document was a forgery. Both had been produced by the same system from the same order, thirty months apart.

Our invoice lines stored a product identifier, a quantity and a total. Everything a human actually reads on that page, the description, the unit price, the rate, the address block, was fetched at the moment of printing from the tables that hold those things now. For a screen showing today's orders that is an entirely ordinary way to build something. For a document whose only job is to state what happened on one particular Tuesday it is quietly ruinous, because it means our account of the past was rewritten every time somebody renamed a product or published a new price list.

We wrote a comparison over the four previous years, re-rendering every invoice and diffing it against the file we had emailed at the time. Of about ninety thousand documents, some nineteen thousand now differed visibly. Four hundred and twelve differed in a number. Two of those were already in front of solicitors, which is how I came to spend a February explaining to our own finance director why our system could produce two truthful versions of the same invoice.

What we do now is dull. Anything that issues a document writes down what it asserted, in columns on the line itself, at the moment it is issued: the description as printed, the unit price, the rate applied, the address we claimed. The product table prices today's orders and does nothing else. It duplicates data, which offended me for a fortnight, and storage stopped being the constraint that justified the alternative long before I started.

The distinction I had never needed a name for, and now reach for constantly, is between a row that describes a thing and a row that describes an event. A thing is allowed to change, because the row is trying to keep up with the world. An event has to remember, because its entire value is that it does not move. Almost every argument I have sat in since about whose figures are right has turned out to be somebody joining one of those to the other and expecting history to hold still.

– Serguey Asael Shinder

Leave a Reply