Inside our two-second receipt OCR
Receipt photos are a uniquely hostile input: thermal paper that fades in weeks, curled edges, greasy fingerprints, and a photographer who is usually walking. Our first pipeline achieved 91% field accuracy in the lab — and 64% in the wild.
The breakthrough was not a bigger model. It was accepting that the photo is only half the signal. The merchant's name on the receipt is often truncated ('7-ELEVEN ST' or 'WELLCOME 12'), but combined with time, currency, and the user's history, the full identity becomes obvious.
So the pipeline runs in two passes. First, a vision model transcribes every character verbatim — no guessing, no 'helpful' completion. Then a second model reasons over that transcript with context: is this total or subtotal? Is 'DEPARTURE' a vendor or a header? Should a faded character be a 3, an 8, or honestly a '?'.
Verbatim-first matters more than it sounds. An OCR that confidently invents a plausible number is worse than one that admits uncertainty, because the invented number silently poisons your books. Our rule: a '?' is a feature, a hallucination is a bug.
Today the median end-to-end time from photo to filed receipt is 1.8 seconds, with 98.7% field accuracy across the eleven writing systems we see most. The remaining 1.3% is why we keep the 'reply wrong to correct' loop one message away.