How to Turn Receipt Photos into an Expense List
A grounding skill for turning receipt photos into an expense list. Upload the slips, demand merchant, date, total, currency, and category from the image only, and refuse rows ChatGPT, Claude, or Gemini cannot see.
Anyone sitting on a camera roll of slips can turn receipt photos into an expense list in 15 minutes: upload the images, extract only what is on the paper, mark UNKNOWN where the ink fails, and stop at a dated table. Run it in ChatGPT, Claude, or Gemini before the model invents a vendor you never paid.
A receipt is evidence. A guessed merchant is fan fiction with a currency symbol.
This is a grounding skill, the same family as studying a PDF without fake quotes. The photo is the file. If you cannot see the field, the model cannot claim it.
If you want the reusable-loop pattern first, read what a skill prompt actually is, then lock the law below.
Ground the list to the photos
State the law in the first message, before “make me a spreadsheet.” A first-message spreadsheet is how tax lines get invented.
1. Upload the photos. Number them. State the law.
Upload every slip you want in this list. In the same message:
“These images are the only source. For each photo, extract merchant, date, total, currency, and payment method only if they are visible. If a field is unreadable, write UNKNOWN. Do not use training knowledge. Do not complete a logo from memory. Do not add tips that are not printed.”
Number the files in the instruction: Receipt 1, Receipt 2. Names stop the model from merging two coffees into one “cafe.”
2. One row per photo, five fields, no story
Ask for a table, not a travel memoir.
- Photo id
- Merchant as printed
- Date as printed
- Total plus currency
- Category you will name in the next step, left blank for now
Instruct: “No paragraph under the table. No ‘looks like a work lunch.’ If two photos are the same slip, mark DUPLICATE and keep both rows until I drop one.”
All three models will fill a smudged total if you skip UNKNOWN.
3. You assign categories. The model does not infer your chart.
Send your category list. Short. Yours.
“Office, travel, meal, software, other. Assign one per row. If you are not sure, write OTHER. Do not create a new category. Do not split a row unless I name a split rule.”
A model-made category is a story. Other is a bucket you can refile later.
4. Spot-check two totals and one date
Open the two worst photos, not the crisp ones. Compare the table to the paper.
If a total is off, mark that row FAIL and demand a reread of that photo only. Do not let the model “adjust for tax.” Adjustments are how a $14 coffee becomes $18.20 of fiction.
If a date is localized wrong — 03/04 vs 04/03 — freeze a date format in the next message: “ISO dates only. If the slip is ambiguous, UNKNOWN.”
5. Totals, then stop
Ask for a sum by category and a grand total of the known numbers only.
“Do not include UNKNOWN totals in the sum. List the UNKNOWN rows under the sum. Do not estimate them. Do not convert currencies unless I give a rate.”
Then stop. Do not ask “what else did I spend.” That prompt is a hallucination request.
Save the extract-UNKNOWN-category loop in the Promptcrates tools for reusable skills. Browse the Promptcrates library if you want a starting skill instead of a blank chat. The photos change. The law does not.
Do not upload slips that show full card numbers or client names. Hosted models are not a shoe box.
Reusable skill card
Trigger: You have a pile of receipt photos and you are about to ask ChatGPT, Claude, or Gemini to “just make a spreadsheet.”
Input: Numbered photos, the five-field law, your category list, and a date format.
Output: One row per photo, UNKNOWN where the slip is silent, your categories only, a sum that excludes UNKNOWN, a DUPLICATE tag if two images match.
Stop: After the category sum. No estimated totals. No extra vendors. No “you might have missed” appendix.
Takeaways
- The photo is the source. No visible field, no claim.
- One row per slip. UNKNOWN beats a guessed total.
- You own the category list. The model does not invent a chart of accounts.
- Spot-check the ugly photos. Crisp ones hide nothing.
- Save the law as a skill. Leave card numbers off the upload.
Frequently Asked Questions
Can I paste a bank export instead of photos?
Yes, but keep the same law. If a field is not in the export, write UNKNOWN. Do not let the model fill a merchant from memory.
What if the photo is blurry on the total?
UNKNOWN on the total. Do not estimate. A guessed total is a fake receipt.
Should I use Gemini because it reads images faster?
Fast is useful for a first pass. Still spot-check two totals. Speed does not excuse an invented tax line.
Can the model split one receipt into two categories?
Only if you name the split rule first. Otherwise one receipt is one row. Splits without a rule are creative accounting.
What about personal receipts I should not upload?
Do not upload them to a hosted model. Transcribe the four fields yourself or run a local model, then apply the same UNKNOWN law.