Skip to main content
reliable receipt scanning

More resilient receipt scanning

Receipt scan jobs now use PostgreSQL-backed progress and bounded retries, helping scans recover from API interruptions without duplicate saved drafts.

Published October 1, 2026
A synthetic receipt scanned into a $12.34 draft, ready for review before confirmation.

Reliable receipt scanning should not depend on one API process staying alive. Xpenser now stores accepted scan jobs and their progress in PostgreSQL, so an API restart does not erase the work that was already accepted.

What changes when you scan

The existing scan screen still shows progress and lets you review every suggested transaction. If a recoverable interruption occurs, a scan can retry automatically, up to three attempts total. The browser also gives a briefly unavailable API more time to reconnect instead of failing after only a few missed polls.

Saved scan results are protected against duplicate writes. If an attempt saved its drafts before it stopped, the recovered job reuses that result. Nothing confirms drafts or creates transactions without your review.

What retries cannot guarantee

If image analysis completed but its result was not saved, the AI request may run again and may incur another charge. The system does not promise exactly-once processing. Keep the scan page open: restoring its review state after refreshing the page is not part of this change.

For self-hosted deployments, the workers use the existing PostgreSQL database. No additional queue service is needed. Recurring email-report checks also use persisted schedules while retaining their existing weekly and monthly delivery rules.

Explore Xpenser's open-source expense tracking or try the receipt scanner from the Capture page after signing in.

Start hosted, then self-host when ready

Create a hosted xpenser account for the public instance, or review the MIT licensed source and run your own deployment from Docker Compose.