How receipts are verified
The six deterministic checks applied to every receipt, in order, and what each rejection reason means.
When a customer sends a photo or PDF of a transfer, it is treated as a receipt. This page describes exactly what happens to it — because "AI checks the receipt" is not a useful description of something that decides where money goes.
What happens first
The file is downloaded from WhatsApp, hashed, and stored in a private bucket. Private matters: receipts carry account numbers and names, and they are never reachable by URL. The dashboard signs a short-lived link per view, and refuses to sign anything outside your own shop's folder.
Processing happens after the message is acknowledged, so a slow read never causes WhatsApp to retry the delivery.
Which order it attaches to
In order:
- An
FB-…reference in the receipt's own caption. - An
FB-…reference in the customer's last few messages. - The most recent order of theirs that is awaiting payment or in review.
A receipt that matches none of those — paid against an order that already expired, or a forwarded image that was never a receipt for you — raises an alert instead of silently attaching to the wrong order.
The six checks
Every check is deterministic. None of them is a judgement call, and none of them is made by a language model. They run in this order and the first failure wins, so the reason you see is the first thing that was actually wrong.
Duplicate image
The file's hash has been seen before. The same screenshot sent twice, for two different orders, is the oldest trick there is.
Duplicate reference
The transaction reference on the receipt already appears on another payment. One transfer cannot settle two orders.
Currency
The currency on the receipt is not the order's currency. Sensible aliases
are accepted — Rs, Rs., INR and ₹ all read as one currency — and a
receipt showing no currency at all is not treated as a mismatch.
Date
The transfer is dated before the order existed. A receipt cannot predate the thing it pays for.
Amount
The amount does not cover what is due.
Recipient account
The destination account is not yours.
Pass all six and the payment is marked auto-matched. Fail any and it is marked needs review, carrying the specific reason.
What is read from the image
Amount, currency, reference, transfer date and time, recipient, sender, and a confidence score. Reading is a vision model; judging is the six checks above, which operate on what was read.
If reading fails or comes back below the confidence floor, checks 3 to 6 are skipped and the payment goes to you for review. Checks 1 and 2 — the duplicate checks — run regardless, on every plan, because they need no reading at all.
The extraction prompt is built per shop, carrying your country and time zone. This is not cosmetic: assuming one country's clock skewed an Indian receipt's timestamp by two and a half hours, straight into check 4.
When it is not a receipt at all
A sticker, a photo of a dog, a forwarded meme. If the reader concludes it is not a receipt, the payment record is removed entirely — no alert, no card, no noise. You are not asked to adjudicate a picture of a dog.
Plan differences
| Starter | Pro | Business | |
|---|---|---|---|
| Duplicate image and reference checks | Yes | Yes | Yes |
| Reading amount, reference, date from the image | — | Yes | Yes |
| Checks 3 to 6 | — | Yes | Yes |
| Your approval is final | Yes | Yes | Yes |
On Starter, receipts arrive for your decision with the duplicate checks already done. The reading and the four content checks are the paid part.

