Receipt organizer
A serverless organizer that turns a photo of a receipt into a tidy expense record. Staff forward or snap a receipt; the system reads the vendor, date, total, and tax, sorts it into the right expense category, flags anything unclear for a quick human check, and files it where the bookkeeper needs it. No more shoebox of receipts at tax time. Seven posts on the same system — one diagram at a time — with an engineering reference at the end.
-
01
A receipt organizer on AWS for a few dollars a month
The whole system on one page — a capture, a reader, and a filing piece, plus the four results they share for every receipt.
-
02
How a receipt gets captured
Three lanes feed one queue — forward a receipt by email, snap a photo on a phone shortcut, or drag a file onto a simple web page. Each stores the original and queues it for reading.
-
03
How a receipt gets read
Textract reads vendor, date, total, and tax with a confidence score each; the reader checks the threshold, looks for duplicates, and picks one of four results: filed, needs-review, duplicate, reject. Numbers are never guessed.
-
04
How a receipt gets categorized
Four gates between the read fields and a filed expense: a vendor-hint lookup, a Bedrock Haiku 4.5 pick from your own chart of accounts, a sanity check, and the review gate that sends the unsure ones to a human.
-
05
How a receipt reaches the books
Three actions on a review card: approve (file as-is), correct (fix a field or category, then file, and teach a vendor hint), and reject (set aside). Every action is logged, and every record links to its image.
-
06
What the receipt organizer costs
A few dollars a month at SMB volume. The cost grows with receipts, not a daily sweep — Textract reads each one and Bedrock categorizes it, a couple of cents apiece.
-
07
Engineering reference: the receipt organizer architecture
Same system, drawn purely for engineers. Service names, resource identifiers, region, Bedrock model IDs, Lambda inventory, IAM scopes, the SES inbound rule set, the SQS and Function URL config, and the DynamoDB schemas.
Frequently asked questions
- What is a receipt organizer?
- A small serverless system that turns a photo of a receipt into a tidy expense record. Staff forward or snap a receipt; the system reads the vendor, date, total, and tax, sorts it into the right expense category from your own chart of accounts, flags anything unclear for a quick human check, and files the clean record where the bookkeeper needs it. No more shoebox of receipts at tax time.
- How much does it cost to run?
- About $3/month at typical small-business volume (around 200 receipts a month). The fixed cost is essentially zero. The cost grows with the number of receipts because Textract reads each one and Bedrock Haiku 4.5 categorizes it — both a couple of cents per receipt. At 2,000 receipts a month the bill lands around $26.
- Which AWS services does it use?
- Lambda (Python 3.14, arm64) with Function URLs for the upload and review endpoints, SQS for the intake queue (with a dead-letter queue), Textract for reading receipts, DynamoDB on-demand, S3 (with versioning), SES inbound for the email-forward lane, Secrets Manager and Parameter Store for config, CloudWatch Logs (7-day retention), AWS Budgets, and Bedrock (Claude Haiku 4.5 via Global cross-Region inference) for categorizing each receipt and the monthly summary. No API Gateway, no NAT Gateway, no always-on compute, no Knowledge Base.
- Where does the expense sheet live?
- In a Google Sheet in a Drive folder. One row per filed receipt with date, vendor, total, tax, category, who submitted it, and a link to the stored image. The original images are filed in S3 by month, so every record links back to its proof in one click. The chart of accounts, vendor hints, tax rules, and confidence threshold live in a short rules doc in the same folder.
- Does the organizer use AI?
- Sparingly, and never on the money fields. Amazon Textract reads each receipt and pulls the vendor, date, total, and tax with a confidence score per field. Bedrock Haiku 4.5 fires once per receipt to pick a category from your chart of accounts — and only when a vendor hint doesn’t already cover it — plus once a month for a spend summary. The totals and tax are gated on Textract’s own confidence, not a model’s guess.
- What stops a wrong number reaching the books?
- A confidence threshold in the rules doc. Every field Textract reads comes with a score; if the total, tax, or category is below the threshold, the receipt goes to the bookkeeper’s review queue instead of filing — with the image, the read fields, and an Approve button. A duplicate check on vendor, date, and total stops the same purchase being claimed twice. Nothing unclear files silently.
- What happens when the bookkeeper reviews a receipt?
- Three buttons on every review card: Approve files the receipt as-is; Correct opens a pre-filled modal to fix a field or category, then files (and can teach a new vendor hint so the next similar receipt files on its own); Reject sets it aside as a non-expense. Every action is recorded in the
ro-auditDynamoDB table with timestamp, receipt, action, by-user, and a before-and-after snapshot, so changes are reversible and the trail is auditable for years.