[Release] Email Receipt Matcher

Hey all,

Im sure some of you might remember the Flux integration Monzo had, and then a few receipt web apps spawned from this, however nothing was self hosted from what I could find.

I ended up building a small self-hosted app that fills that gap for me. It runs in the background, scans Gmail for receipt/order confirmation emails, and matches them to the corresponding Monzo transaction. It can then use OpenRouter to generate receipt data, and then submits the line items through the Monzo Receipts API so they show up natively in the app.

A few things I tried to get right:

  • It only auto-submits when it’s confident in the match. Anything ambiguous gets queued for manual review so you can approve or skip it yourself

  • For anything it can’t match automatically, there’s a manual match flow - paste a Gmail URL, it parses the receipt, and you pick the transaction yourself

  • It parses email body content but also handles attached invoices and PDFs, so it works for things like utility bills or SaaS subscriptions that send a PDF rather than a formatted email

  • Where a receipt doesn’t already exist as a PDF, it generates one from the parsed data — so there’s always something attached to the transaction

  • It handles multiple Gmail accounts and multiple Monzo accounts

  • You can run it on a schedule (I have mine run every evening) or trigger it manually

  • Notifications via Apprise (Slack, Discord, ntfy, etc.) so you know when it’s done

It’s running fine for me but I’m sure there are edge cases I haven’t hit yet - different email formats, merchants I don’t shop at, that kind of thing. I’d genuinely love to know if it works (or doesn’t work) for other people.

It’s all open source if anyone wants to try it or poke around the code: GitHub - greghesp/monzo-receipts: Automatically match Monzo transactions to Gmail receipts using OAuth — self-hosted with Docker Ā· GitHub

Docker image is on Docker Hub so it should be straightforward to spin up if you already run a home server or NAS. Happy to help if you get stuck.

Full disclaimer: Whilst I can code, I originally made this work within Claude Cowork as a scheduled job. As things got more complex, I gave Claude Code my Skill.md file and let it run with it using Superpowers

6 Likes

There is/was(?) also Unfurler

That was it. I had quite a few issues with it though, it had limited support and after exploring the APIs, I wasn’t a fan of giving cloud service access to my Bank, even if it is read only.

Figured I could support every merchant by passing email content through some AI models, and self hosting with your own Monzo Client and Gmail client was more private and secure

Also didn’t take too long with Claude :sweat_smile:

The outcome in Monzo is the same, with the edition of receipt PDFs too. It’s reasonably light on token consumption too

2 Likes

This looks really cool and will definitely be giving it a try.

To confirm, this is self-hosted, with the only connections being Gmail and Monzo via official APIs, plus optional OpenRouter.ai?

Correct

I’d love to do this, but the last time I tried to do something with docker it all went awry. I don’t use it in my day-to-day, so the first snag and I struggle.

Still, I may give it a go at the weekend, see how I get on…