Receipt Scanning
Receipt Scanning
Receipt scanning uses AI to read a photo or PDF of a receipt and fill in the expense details for you — vendor, date, amount, taxes, and more — so you don't have to type them in. It also handles bank statements for reconciling foreign-currency transactions.
How a scan works
- Upload a receipt image or PDF from the expense report.
- The AI reads the file and returns the extracted fields plus a confidence level (high / medium / low).
- Review the extracted values, correct anything that's off, and save them onto a line item.
| Property | Value |
|---|---|
| Accepted formats | JPG, PNG, GIF, WebP, PDF |
| Maximum file size | 10 MB |
| Modes | Receipt (default) and Bank statement |
| Confidence | high / medium / low (low-confidence scans are rejected) |
What "receipt" mode extracts
| Field | Notes |
|---|---|
| Vendor | Merchant name |
| Date | YYYY-MM-DD |
| Description | Short summary |
| Expense type | One of the standard expense categories |
| Currency | Detected currency |
| Amount before tax | Pre-tax subtotal |
| GST / PST / HST / QST | Canadian taxes; US/foreign sales tax maps to PST |
| Gratuity | Tip, if present |
| Total | Grand total |
| Line items | Individual purchases on the receipt |
| Payment method | e.g. card, cash |
| Card last four | If shown on the receipt |
| Foreign amount + exchange rate | Optional, for foreign-currency receipts |
What "bank statement" mode extracts
Bank-statement mode is built for reconciliation: it pulls a foreign-currency transaction, the CAD equivalent, and the exchange rate so a foreign charge can be matched to its home-currency value.
Saving the file as a receipt
When you scan, you can pass the report you're working on:
- If you pass a draft report's id, the uploaded file is also saved as a receipt on that report.
- Otherwise, only the extracted data is returned — nothing is stored.
There is also a bulk receipt scanner for processing several receipts at once.
Scan limits per plan
| Plan | Scans per month |
|---|---|
| Free | 20 |
| Pro | 100 |
| Business | 500 |
| Enterprise | Unlimited |
- Reset. The counter resets at the start of your billing period — the Stripe invoice date for paid orgs, the 1st of the month for Free.
- Override. A per-organization override can raise the limit above the plan default.
See limits & usage for how usage is tracked across features.
Which AI provider runs the scan
The provider is configurable — Claude by default, or OpenAI. If the active provider fails, the system automatically falls back to the other. Either way, scanning requires:
- Receipt scanning enabled in expense settings, and
- An AI key configured.
Receipt privacy
Receipts are never served from a public URL. When an image is displayed, the app mints a short-lived, single-view token per view, so the underlying file stays private and links can't be shared or guessed.
If the service is temporarily unavailable, the token can't be minted and receipt images won't render until it recovers.
Troubleshooting
| Message / symptom | Cause | Fix |
|---|---|---|
Monthly receipt scan limit reached (N/N) | You've used all scans for the period (each scan counts whether saved or not) | Wait for the reset, or upgrade your plan; an admin can apply a per-org override |
Receipt scanning is not enabled | The feature is off in expense settings | An admin must enable receipt scanning |
No AI provider configured | No AI key is set | An admin must configure an AI key |
Could not read this receipt. Please ensure the image is clear… | The scan came back low-confidence | Retake the photo in good light, flat and in focus; the quota slot for this scan is refunded |
File too large. Maximum size is 10MB. | File exceeds the size cap | Compress or re-photograph the receipt |
Invalid file type | Unsupported format | Use JPG, PNG, GIF, WebP, or PDF |
Failed to generate receipt token. | Our systems are temporarily unable to mint the per-view token | Receipt images won't render until the service recovers; data is unaffected |