FreshBooks

freshbooks.comcontributed by Samuele Ongaro

ALMOST

A weekend of work, and real gaps remain.

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.

Promptfree, for everyone, and the only version there is
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

PlanBilled monthlyBilled yearlyLast 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

$0

Invoicing, quotes, payments and recurring billing, self-hostable.

invoiceninja/invoiceninjafree · open source

Crater

$0

Simple 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

Interest · last 30 dayspeak 1/day
views0130 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

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

All 18 in Time tracking & invoicing

Not sending yet

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

Esc