Invoicing and light accounting for freelancers and small firms: invoices and estimates, expense capture, time tracking and the reports an accountant asks for at year end.
Build me invoicing that replaces FreshBooks — and know exactly why this is ALMOST. Invoices and time tracking are buildable. Two things are not: **sales tax rules for the places you invoice, kept current by somebody else**, and **bank feeds with reconciliation**, which is where the accounting half actually lives. The first is a subscription to a tax service or a lot of reading. The second needs a banking data provider, and in most countries that is a contract rather than an API key. STACK - Node 20+ with Fastify, server-rendered HTML - SQLite through better-sqlite3, WAL mode - PDF from HTML with a paged-CSS renderer - One payment provider, hosted checkout - Caddy in front THE DATA MODEL - clients, contacts, projects, tasks - entries: id, user_id, project_id, task_id, started_at, ended_at, duration_seconds, is_billable, is_locked, invoice_id, notes - rates: id, scope, scope_id, user_id, hourly_cents, currency, effective_from — an entry bills at the rate in force when the work happened - expenses: id, project_id, client_id, category, amount_cents, currency, incurred_on, receipt_path, is_billable, markup_percent, invoice_id, tax_cents - estimates, invoices, credit_notes, lines, payments - number_sequences: business_id, kind, year, last_number - bank_transactions: id, account_id, external_id, posted_on, amount_cents, currency, description, counterparty, category_id, matched_kind, matched_id, is_reconciled - Amounts in integer cents with a currency. Never a float NUMBERING AND IMMUTABILITY - Sequential with no gaps, per business, per document kind, per year, allocated inside the transaction that issues the document. In most countries this is a legal requirement rather than a preference - A draft has no number; the number is taken at issue - An issued invoice is never edited or deleted — a mistake is voided with a reason and corrected by a credit note referencing it - The PDF generated once at issue and stored with its hash TAX, HONESTLY - Per-line rates with totals broken out by rate, which most authorities require - Reverse charge for cross-border business customers, with the required sentence printed and both registration numbers shown - Zero-rated and exempt stored as different things - The rate is copied onto the line at issue; changing a rate later must never alter a document already issued - Rates as data with an effective date, so a change is a new row rather than an edit. Maintaining them is your job now — write in the README which jurisdictions you have covered and when you last checked, and take advice BANK FEEDS AND RECONCILIATION - If you can get a feed, import transactions with a stable external id and match them: exact amount and date against an invoice or an expense first, then fuzzy by amount and counterparty, proposed for a human to confirm. Never auto-match on amount alone - If you cannot, import a bank export as CSV with a mapping step and a dry run. That covers most small businesses and needs no contract - Reconciliation state per transaction, and a report of what is unmatched — which is the report an accountant asks for THE REST - Timers and a weekly timesheet writing the same rows, one running timer per person enforced by a partial unique index - Expense capture with a receipt photo, EXIF stripped, stored by hash - A client portal at a token URL: documents, balance, and a pay button. No account, because requiring a login is how an invoice goes unpaid for a fortnight - Reminders before and after the due date, each recorded so nobody is chased twice in a day - Recurring invoices from a template, idempotent so the worker can run twice - Reports: profit and loss, by client, by month, by tax rate, and an aged-debtors list — the report that gets you paid - Export every document as PDF and every row as CSV, per period, in one command OPERATIONS - .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SMTP_URL, SESSION_SECRET, PROVIDER_KEY, PROVIDER_WEBHOOK_SECRET - Migrations on boot, each once; nightly backup covering the database and the PDFs, with a tested restore - Health endpoint WHAT MATTERS MOST Numbering, immutability, and the reconciliation report. Build the sequence allocation and the stored PDF first and try to break them — two invoices in the same instant, a void, a year boundary.
What you lose
- Sales tax rules for the places you invoice, kept current by someone else
- Payment processing, dunning and automatic late reminders
- Bank feeds and reconciliation, which is where the accounting actually happens
- Reports your accountant asks for, in the format they expect
- Audit-safe numbering and immutability that a tax authority will accept
If you would rather not build
- Wave — free invoicing, paid payments
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $21/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Invoice Ninja
$0Invoicing, quotes, payments and recurring billing, self-hostable.
invoiceninja/invoiceninjafree · open source
Crater
$0Simple invoicing with clients, estimates and payments, with mobile apps.
crater-invoice-inc/craterfree · open source
Why this verdict
our own opinion · changed only by a person
53/100
Verdict kinda at 53: sequential numbering, immutability and credit notes are the parts a build usually gets wrong, and the prompt makes them the centre. What stays with the vendor is tax rules that change without warning and the bank reconciliation half.
History
tracked since 9 Aug 2026 · nothing is ever overwritten
Questions about FreshBooks
answered from the record above
Is FreshBooks free?
No — the plan we track is $21 a month. Plus at about $21/month billed monthly for one user and 50 clients; extra team members are billed per seat.
Can you replace FreshBooks by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 53 out of 100, build time a weekend. Read what you lose before you decide.
How much does FreshBooks cost?
$21 a month on Plus — $252 a year. Recorded 9 Aug 2026.
What do you lose by replacing FreshBooks?
Sales tax rules for the places you invoice, kept current by someone else; Payment processing, dunning and automatic late reminders; Bank feeds and reconciliation, which is where the accounting actually happens; Reports your accountant asks for, in the format they expect; Audit-safe numbering and immutability that a tax authority will accept. If any of those carry weight for you, keep paying.
Is there an open-source alternative to FreshBooks?
Yes: Invoice Ninja, Crater. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

