There is 1 receipt printer on a shelf in the office. A white box, 80mm paper. Last year I bought the same model as the café that first took KAZENA Order, and put it there. What I am writing about today is how carefully I measured that single printer, and how far I then carried the number I had measured.
In KAZENA Order the guest orders from their own phone. The order comes out on paper from the printer in the kitchen. The paper carries the table number, the time, the item name, the quantity and any note. The kitchen reads it and cooks from it. What decides whether that paper can be read is not the width of the paper but how many characters fit on 1 line. Only when the item name and the quantity sit on the same line can anyone tell what to make and how many.
The measuring was careful. I printed a line that was nothing but digits and counted the characters on the paper itself. 48 columns, in the small font we use. The cut command worked, and each ticket came off separately. The logo printed at 384 dots wide with nothing clipped. I still think that 48 is a real number. About that single printer.
The supported list became 5 models after that. We did not choose them. A café already owns the machine it owns, and going inside the product as a distributor means facing the machines that are already in the room. I took a single layout built at 48 columns and shipped it as it was for all 5 models. In the handover document I wrote: verified on the real device.
16 days later a café called. An item ordered as 2 had come out as 1. The person in the kitchen had misread the paper, and when they showed me the paper I could see that misreading it was the natural thing to do.
2 of the 5 models take 58mm paper, where a line is 32 columns. Our line puts the item name on the left and pushes the quantity over to the right. It is pushed right across 48 columns of space, so on 32-column paper the name uses up the line and the quantity drops to the next one. On the line below the drop sits the next item's name. The quantity was laid out so that it read as the quantity of the item underneath it.
I recounted. 2 shops use those 2 models, and over 16 days 2,460 tickets came out of them. 410 of those had at least 1 wrapped line. Mistakes in the kitchen that we could confirm came to 6, and that is only what the café had written down. The rest cannot be counted. The part that cannot be counted weighs more than the 6.
There was another one. 1 of the 5 models ignores the cut command silently. It returns no error, it simply does not cut. The paper comes out continuous, so the staff were tearing it by hand. Sometimes the tear took the first line of the next ticket with it.
The third is the one that stayed with me. 1 model has 48 columns written in its specification sheet and prints 42 on paper. The font setting it ships with from the factory was not the one the sheet assumed. Which means that if I had read the specification sheet instead of the paper, I would have made the same mistake. The paper is the only document telling the truth.
The fix was to change where the numbers live. The columns in a line, whether the cut command is honoured, the image width — each is held in a row per model. That row also carries which model it was measured on and when it was measured. The layout takes its column count from the row. There is no bare 48 anywhere. When I asked the engineer on the KAZENA side, the layout part had been written for a single model from the beginning. Neither side had put the assumption where it could be seen.
We changed how the line is built as well. The quantity goes first. If something has to wrap, let it be the tail of the item name. The number does not move. And a model does not go on the supported list until paper printed by that physical machine is in an envelope in the office. We moved 2 models back to unverified and bought 2 printers. It came to 8,900 pesos. The remaining 1 model is still unverified, and the screen says unverified. The café using that model gets told we have not checked it yet, instead of being sold a guess.
I estimated 2 days and it took 6. Building the rows per model took 4 hours. The rest was getting hold of printers, going to the 2 shops, and laying the tickets out one at a time. The number 48 was never wrong. What was wrong was the sentence I wrote after it, and that sentence had no scope. A measured value means nothing without what it was measured on attached to it. Now a number inside our code does not travel without the thing it was measured against.