Open-source · self-hosted expense management

Snap a receipt.
It files itself.

Expensable reads the receipt, routes it through approvals, and exports a clean batch to your accounting system — running entirely on your own server. No per-seat SaaS bill.

MIT licensed Postgres · Redis optional Your data stays yours
expensable · receipts
A receipt opened in Expensable: the scanned Tim Hortons receipt on the left, with merchant, date, currency, total, category and HST tax already filled in on the right.

How it works

Receipt to books, in three moves.

01

Capture

Snap a photo, forward an email, or text it to your company number. Expensable reads the merchant, date, amounts, tax and currency — and suggests a category.

02

Approve

Reports route by your rules: auto-approve small ones, single sign-off, or two-person review with escalation. Nothing slips through unreviewed.

03

Export

Finance pulls a clean, reconciled batch for your accounting system — with tax broken out and input-tax credits tallied for the period.

What it does

Everything an expense workflow needs — and nothing rented.

The full loop, from a crumpled receipt to a reconciled export, lives on your own infrastructure.

Reads receipts for you

OCR extracts merchant, date, totals, tax and currency, then suggests a category — no manual typing.

Multi-currency

Foreign receipts convert to your home currency at the transaction-date rate, and the rate is recorded for audit.

Approval routing

Thresholds, single or dual sign-off, and escalation — configured to match how your team actually approves spend.

Exports to your books

Sage Intacct, a configurable CSV engine with QuickBooks/Xero/NetSuite presets, and live API sync to QuickBooks Online, Xero, Sage Intacct, and NetSuite — post approved reports straight into your ledger as bills, no CSV import.

Capture anywhere

Web upload, email-to-inbox, or SMS. Receipts land in the same queue however they arrive — SMS and email are optional.

Full audit trail

A read-only history of every decided report — who approved it, when, the tax reclaimed, and whether it's been exported.

See it in action

Built to be looked at, not just filed into.

Real screens from the app — from the finance dashboard to the auditor's read-only ledger.

Finance dashboard

Where the money went, at a glance.

Spend by category, top merchants, and a monthly trend line — plus the tax paid and input-tax credits you can reclaim for any period.

  • Filter by month, quarter, year, or a custom range
  • Reclaimable ITCs totalled automatically
  • One click to a print-ready report
expensable · finance
Expensable finance dashboard: total spend $2,940.19, 40 receipts, tax paid and reclaimable ITCs, with bar charts for spend by category and top merchants and a monthly trend line.

Auditor view

A read-only ledger auditors can trust.

Every decided report for the year in one table — owner, status, receipts, CAD amount, who approved it, and whether it's been exported and paid.

  • Approved and rejected history, by calendar year
  • GST/HST and QST input-tax credits summarised
  • Nothing editable — a true system of record
expensable · audit
Expensable audit view: nine decided reports for 2026 totalling $2,927.76, shown in a read-only table with owner, status, receipt count, amount, decision date and approver.

Expense report

Each report, itemised and complete.

Line by line: merchant, date, total, business reason, category and entity — with a green check the moment a receipt has everything it needs to submit.

  • Missing reason or category flagged before submit
  • Report status visible at the top at all times
  • Multi-entity ready for groups of companies
expensable · report
An approved April expense report for Carol totalling $478.69 with six receipts, each showing merchant, date, total and green checks for reason and category.

Why self-host

The case for owning your expense stack.

Your data stays yours

Receipts, amounts and approvals live in your Postgres, on your server. Nothing is shipped to a vendor you have to trust.

No per-seat bill

Add the whole company without watching a meter. You pay for the server you already run, and nothing more.

Read the source

MIT licensed and open. Read exactly what happens to a receipt before you trust the app with one — and change it if you need to.

Get started

Up and running in five commands.

You'll need Node 22 and Postgres 16. Redis is optional — without it, background jobs run on a Postgres-backed queue.

# clone, then let the installer do the rest
git clone https://github.com/hriday/expensable
cd expensable
./scripts/install.sh   # checks Node + Postgres, writes .env, migrates
npm run dev            # → http://localhost:3000

Docker Compose

The batteries-included path — app, Postgres and Redis in one file.

Bare metal / systemd

Node and Postgres on a plain VM — no Docker, no Redis. Run scripts/install.sh, then follow bare-metal.md for systemd.

One-click PaaS

Blueprints for Render, Railway and Fly are in the repo.

Full deploy, reverse-proxy, backup and integration guides live in docs/deploy.

Built with

Next.js 15PrismaPostgresBullMQAuth.jsTailwindTypeScript

Own your expenses.

Clone it, read it, run it on your own box. A live demo is coming soon.