Skip to content

Invoice numbering: why this is more important than it sounds

The first time the Belastingdienst asked me about a missing invoice number, I had to look it up myself. I had been on the same billing tool for years and never noticed that the sequence had skipped 2023-0147 three months earlier, somewhere between a duplicate draft I voided and a Tuesday morning I have no memory of.

The controller did not care about the explanation. He cared about the gap. By the time he pointed at it the burden of proof was on me, not on him, and I spent half a day digging through deleted-items logs to put together a written reply. My accountant charged me an hour to translate it into something formal. The detour traced back to one line of database logic in my billing tool that should never have allowed the gap in the first place, and at the time I was angry at the tool. Looking back I am more annoyed at myself, because for fifteen years of running businesses I had never bothered to check whether my numbers were continuous.

The thing is, in the EU they have to be. The Dutch Belastingdienst, the German Finanzamt, the French DGFiP all want the same thing for the same reason. A continuous, gap-free, immutable sequence of invoice numbers. They are not curious about your aesthetic preferences. They want a sequence they can verify against the bookkeeping at any moment, and any gap in it is something you owe them an explanation for.

That is the part most modern billing apps skip. They generate numbers from a counter that increments when you create a draft, which works fine until you delete a draft, or duplicate one, or hit some edge case the software does not handle. Some tools reuse the skipped number, some do not. A few let you edit the number by hand, which sounds nice until you forget you did it. None of those choices are wrong in isolation. They just do not match what the tax office expects, and that mismatch stays invisible until somebody emails you about it.

When I started building Rozuro the first thing I wrote was the numbering logic, because I knew exactly what I wanted: a strict server-side counter, atomic, that cannot skip. Drafts get their own series that never bleeds into the real one. Once an invoice is sent it is immutable, and if you need to correct it you issue a credit note that references the original. The original stays on the books. This is how bookkeeping has worked for about a century. Somewhere along the way invoicing software started cutting corners on it, and the people on the receiving end of those corners are the same freelancers who eventually get the controller email.

In Rozuro you cannot turn this off. The moment you give people a setting to relax the rules, somebody will, and then somewhere down the line they come back asking why their audit went sideways. Better to take the choice off the table.

The point of all this is the conversation you do not have to have later. When the controller comes round, he asks about a number, you point at the sequence, the sequence is continuous, the meeting moves on. The invoice numbering itself does not impress anyone. The fifteen minutes you saved during the audit does.

If you have your own audit stories I would genuinely like to hear them — contact us.

Love, Marten.