Receipt capture
Upload the receipt. That’s the whole job.
No writing on the paper, no reference code, no filename convention, no zip folder. The reference, the naming, the stamped copy for Finance and the manifest are all the system’s work — and the file you uploaded is never altered.
Four ways in
Built in the priority order below. Every one of them ends in the same place: an untouched original in storage and a draft line bound to it.
Camera
Requesting the camera…
The frame straight off the sensor is stored as the immutable original. Deskewing produces a separate derived copy for reading — no rotation is ever baked into the archived bytes.
Forward a receipt by email
Forward to the address below and the attachments become draft lines. A message with no attachment is parsed from its body for an e-receipt.
No attachment needed — the message is the receipt.
0 / 1200Sample receipts
Unmatched receipts
A receipt that isn’t bound to a line yet waits here with a prompt. It is never silently dropped, and the fix is never “rename the file”.
Review and confirm
No amount read off a receipt is ever silently accepted. Every line needs its amounts confirmed, and any handwritten note answered, before it can leave draft.
Mileage
No receipt exists for a trip, so this is its own flow. The commute subtraction is shown on screen, and the rate comes from the effective-dated table — never a constant.
From your employee record.
Export bundle
receipts-manifest.csv ties every reference to its filename, checksum
and line. This is what replaces the hand-assembled zip folder — and it is the
only place canonical_filename is ever materialised.
Acceptance checks
The fourteen criteria, executed against the real pipeline on a scratch report — not a description of them. Criterion 14 measures this page’s own layout, so resize the window and re-run to test 375px and 1440px.