</>CodeWithKarani

UpeoXpense: Snap a Receipt on WhatsApp, Get an ERPNext Expense in Seconds

Karani GeoffreyKarani Geoffrey7 min read

Every business has the same quiet leak. Somebody buys fuel, pays for airtime, picks up printer cartridges, settles a supplier in cash. They get a receipt. The receipt goes into a pocket, a glovebox, a wallet, a shoebox. Then at month-end somebody sits down with a pile of curling paper and types it all into the system, badly, from memory, three weeks late.

That is not an accounting problem. It is a capture problem. The data was perfect at the moment of purchase and it degraded every day after that.

UpeoXpense now closes that gap in the only place your team already lives: WhatsApp. Snap a photo of the receipt, send it, and AI reads it and turns it into a proper expense record in your ERPNext system - in seconds, at the moment it happened.

Snap the receipt Send on WhatsApp AI AI reads it Expense in ERPNext the whole trip takes seconds, not weeks
Capture at the moment of spend, in the app your team already has open.

Why WhatsApp is the right front door

Most expense tools fail in Kenya for an unglamorous reason: nobody installs them. You buy licences, run a training session, and three weeks later the driver, the site supervisor and the sales rep are back to sending photos to the accountant on WhatsApp anyway.

So UpeoXpense stops fighting that. WhatsApp is already installed, already understood, and already where the receipt photo was going to be sent. The difference is that now the photo does not land in a chat thread that somebody has to manually clear - it lands in your books.

The best capture tool is the one your team is already using at 7pm on a Friday at a petrol station. That is not your ERP login page.

What the AI actually does with the photo

This is the part that used to be a human typing. The AI reads the image and pulls out the fields an expense record needs - the merchant, the date, the total, the tax component, the currency - and maps them into a structured entry rather than an attachment somebody still has to interpret later.

one photo Merchant Total Kileleshwa Date 22 July 2026 Amount KES 4,500.00 Tax VAT split out Posted to ERPNext expense structured, not just attached
The difference between a receipt you have stored and a receipt you have actually recorded.

That distinction matters more than it sounds. Plenty of tools will happily store a picture of a receipt. Storage is not accounting. Until the amount, the date and the tax are sitting in fields your ledger understands, you do not have a number you can report on, budget against, or claim.

It lands in ERPNext, not another silo

UpeoXpense is built on ERPNext and Frappe, which is the whole point. The expense does not live in a separate app you have to reconcile at month-end. It lands in the same system that already holds your accounts, your cost centres, your projects and your approval roles.

That means the boring but essential things come for free: an audit trail, role-based permissions, and expenses that tie back to real accounting heads instead of a spreadsheet column somebody invented. If you already run ERPNext, this is an extension of the system you trust, not a second source of truth to argue with.

What changes on the ground

Before Receipts pile up Pockets, gloveboxes, chat threads Typed in weeks later From memory, if at all Numbers you cannot trust After Captured at the till One photo on WhatsApp Recorded in seconds Straight into ERPNext Books that match reality
The work does not get faster. It stops being work at all.

For a finance lead, the win is not really speed. It is that spending becomes visible while it is still happening. A budget you review three weeks after the money left is a history lesson. A budget that updates as receipts arrive is a control.

See it in action

Here is the full demo - a receipt photo sent on WhatsApp becoming an ERPNext expense:

Where AI belongs in your accounting

A fair question: do you want AI anywhere near your books? My answer is that this is exactly the right job for it, and for a specific reason. Reading a receipt is a perception task - turning a messy photo into structured fields. That is what these models are genuinely good at. It is not being asked to decide whether an expense is legitimate, approve it, or post to a ledger unsupervised.

The human stays where humans belong: reviewing, approving, and owning the final number. The AI just removes the typing. If you are thinking about where AI fits in your own operations, that division of labour is the pattern worth copying - and it is the same argument I make in this piece on not being rushed into AI before you are ready. Capture is a low-risk, high-return first rung.

Who this is for

  • Businesses with people who spend in the field - drivers, technicians, site supervisors, sales teams.
  • Finance teams tired of the month-end pile who want expenses to arrive continuously instead of in one painful batch.
  • Organisations that need a clean audit trail - NGOs and project-funded teams especially, where every shilling has to be traceable to a document.
  • Anyone already running ERPNext who wants expense capture to feed the system they already use.

For developers: it is free, and the source is open

Here is the part I am happiest about. UpeoXpense is free. Not free-for-five-users, not a trial that starts a sales call on day fourteen. It is released under the MIT licence, and the entire application - the WhatsApp webhook, the AI extraction, the approval dashboard, the ledger posting - is on GitHub:

github.com/Upeosoft-Limited/upeoXpense

Clone it, read it, run it on your own bench, fork it for a client, rip out the parts you disagree with. No licence keys, no seat counting, no per-receipt fee waiting at the bottom of a pricing page.

Why give it away? Because the hard part of this problem was never the code - it is getting a business to change how it captures spend. If an ERPNext implementer in Lagos or Kampala or Dar can install this in an afternoon and hand their client working receipt capture, that is a win for everyone, including us. Africa does not need another closed accounting silo. It needs building blocks it owns.

What is actually in the box

It is a proper Frappe app - Python 3.10+ on the backend, Vue 3 for the approval dashboard - so it installs into your bench the way every other Frappe app does and lives inside your site rather than beside it. No sidecar service to babysit, no second database to reconcile.

Here is the whole pipeline, from the moment a driver hits send:

1 Webhook receives the message A WhatsApp gateway posts the image to your site over HTTPS 2 Hash it before you trust it SHA-256 catches the exact resend; perceptual hashing catches the reshoot 3 Vision model reads the paper Vendor, date, totals, VAT, tax ID - with retries and exponential backoff 4 Confirm in the same chat The sender replies OK, NO, or a corrected amount. No login, no app. 5 A human approves it Manager dashboard at /upeoxpense - the Vue 3 front end 6 Journal Entry hits the ledger Posted into ERPNext accounts, with the document trail intact
Six stages. Only one of them is AI - and it never gets the last word.

A few decisions in there are worth stealing even if you never install the app:

  • Deduplicate before you spend a token. The same receipt gets sent twice constantly - once by the driver, once by the supervisor who took a photo of the same slip. Exact hashing catches the forward; perceptual hashing catches the second photo taken at a slightly different angle. Both run before the model is ever called, which is also the cheapest place to catch fraud.
  • Confirmation lives in the channel the user is already in. The instant you make somebody open a portal to verify an amount, you have lost them. A reply of OK is a confirmation loop with a completion rate you can actually live with.
  • Retry with backoff, always. Vision APIs time out. Gateways rate-limit. A receipt that silently vanishes because of one 503 is worse than no system at all, because now the team does not trust it.
  • Localisation is not a translation string. KRA PIN validation, 16% VAT handling, eTIMS awareness and M-Pesa as a payment method are in there because a Kenyan receipt is not a US receipt with different words on it. If you are adapting this for another market, that is the layer to rewrite.

Running it yourself

You will need a Frappe Bench on v15 or v16 with ERPNext and HRMS installed, Employee records whose phone numbers match the WhatsApp numbers that will be sending receipts, and a publicly reachable HTTPS URL so the gateway can deliver webhooks. Then it is the usual dance:

# From your bench directory
bench get-app https://github.com/Upeosoft-Limited/upeoXpense

# ERPNext and HRMS must already be installed on the site
bench --site yoursite.local install-app upeo_xpense

bench build --app upeo_xpense
bench --site yoursite.local enable-scheduler

Two honest caveats, because I would rather you hear them from me than discover them at 11pm. The app is free; the two services it leans on are not. You supply your own Anthropic API key for the vision extraction, and a WhatsApp gateway account for the messaging leg. Those are your accounts, your keys, your bill - which is also the point: nothing routes through us, and your receipts never sit on somebody else's platform. Check the README for the current, canonical setup steps before you start.

And if you extend it - a new tax regime, a different gateway, a better extraction prompt - send the pull request. That is what the licence is for.

Getting started

UpeoXpense is built and supported by Upeosoft. If you run ERPNext, or you are considering it, and receipts are currently reaching your books by shoebox, we can show you the WhatsApp-to-ERPNext flow on your own setup.

Reach out on consult@upeosoft.com or call 0116 888 777, or see the rest of what we build at upeosoft.com.

#AI#Receipt Scanning#WhatsApp#ERPNext#Expense Management#Automation#Open Source#Frappe
Keep reading

Related articles