Ex expensable GitHub ↗
Self-hosted expense management

Snap a receipt.
It files itself.

Expensable reads the receipt — merchant, date, tax, currency, the GL category — then walks it through approvals and out to your accounting system. You run the whole thing on your own server. No per-seat SaaS bill.

Get it running → Read the source MIT-licensed · Postgres · Docker or bare-metal
expensable · receipts · tim hortons
A scanned Tim Hortons receipt on the left; on the right, the extracted merchant, date, currency, total, category and HST tax with a reclaimable ITC flag, all filled in automatically.
The scan on the left, the parsed fields on the right — merchant, date, CAD total, HST $1.43 flagged reclaimable. Correct anything before you submit.
What it is

An expense app you host yourself.

Employees photograph or forward receipts. Expensable extracts the details, converts foreign currencies, and files each one against your GL categories, entities and departments. Managers approve; finance exports a clean batch to the accounting system. Same workflow the SaaS tools sell — running on a box you control, with the data staying in your Postgres.

It started as an in-house tool and was rebuilt, generically, to give away. It's MIT-licensed and there's no hosted tier to upsell you into — you clone it, you run it, it's yours.

On the books

What's in the box.

01

AI receipt capture

Photo, PDF, or a forwarded email. It pulls merchant, date, line items, totals, tip, and tax — and suggests the GL category. Blurry or unreadable? It's flagged, not silently dropped.

02

Sales tax it actually understands

Canadian GST/HST/PST/QST out of the box, plus US sales tax and VAT. Reclaimable input tax credits are tracked per line with the registration number, so finance isn't re-keying tax at export.

03

Multi-currency, with the rate on record

A receipt in USD becomes USD 412.50 → CAD 579.02 against your home currency, and the exchange rate used is stored with the receipt for the auditor who asks six months later.

04

Approvals that match your policy

Auto-approve the small stuff, single sign-off, or two-person dual approval — with escalation when someone sits on it. Managers get a queue, not an inbox.

05

Intake from wherever people are

Web upload, an email-to-inbox address, or a text message to your company number. The receipt shows up filed and ready to review.

06

Export to your accounting system

Approved reports export as a Sage Intacct batch today, CSV mapped to your dimensions — with QuickBooks, Xero and NetSuite adapters on the roadmap.

Approvals

Everything the approver needs, on one screen.

The receipt, the reason, the category, the tax, the amount in your home currency — then Approve or Reject. No downloading attachments, no cross-referencing a spreadsheet.

Dual approval, escalation windows and auto-approve thresholds are all configurable per company.

expensable · approvals · july team meals
An approval screen: a report titled July team meals from Alice Anderson for $12.43 CAD, showing the receipt, category, reason and HST, with Approve and Reject buttons.
Bob's approval queue, opened to Alice's report — one click to Approve.
expensable · sign in
The Expensable sign-in screen with an email and password form and a Forgot password link.
Adaptive sign-in — the page shows only the methods you've configured.
Access

Sign-in your way, without a public sign-up.

Microsoft Entra, Google, any generic OIDC provider, or plain email-and-password — turn on the ones you want and the login page adapts. Access is invite-and-domain gated by default, so nobody wanders in.

Argon2id password hashing · one account per verified email · session revocation built in.

Install

Up and running in five commands.

You'll need Node 22 and Postgres 16. Redis is optional. The Compose file brings up the database for local work; on a server you point it at your own.

Quick start~/expensable
# clone it
git clone https://github.com/hriday/expensable
cd expensable

# configure — then set a real AUTH_SECRET
cp .env.example .env
openssl rand -base64 32   # → paste into AUTH_SECRET

# bring up postgres (+ redis) for local dev
docker compose -f docker-compose.dev.yml up -d

# install, migrate, run
npm ci --legacy-peer-deps
npx prisma migrate deploy
npm run dev
open http://localhost:3000MIT · no license key

Then sign in, open Admin → Configuration, and import your categories, entities and approval rules. A fresh install ships with no company data.

Run it anywhere

Docker, a bare VM, or one-click PaaS.

Expensable doesn't insist on a stack. Ship it with Docker Compose, or run it straight on a VM with systemd and no Redis at all — the job queue falls back to Postgres. Blueprints for Render, Railway and Fly are in the repo.

No Redis required

Set QUEUE_DRIVER=auto with no Redis configured and background jobs run on a Postgres-backed queue, inside the web process. One box, one database, done.

Your data stays put

Receipts on your disk, records in your Postgres, secrets in your .env. Nothing phones home. Field-level encryption for banking details is built in.

Still in beta

Interfaces can still change between releases. The test suite runs in CI on every push, and the source is open — you can see exactly how it works before running it.