Double-Entry Ledger
Every dollar that moves through Freebo posts to a real accounting ledger.
Shipped February 3, 2026
✦ Key takeaways
- Freebo runs Formance, an open-source double-entry ledger, as its financial source of truth. Not a spreadsheet, not a database tally — a real accounting system.
- Every ledger transaction uses Numscript, Formance’s domain-specific language for financial moves. Debits and credits always balance.
- Financial events queue in Redis and post to the ledger asynchronously — so a Formance hiccup never blocks a customer’s booking from completing.
Most booking software accounts for money in a database column: add a reservation, increment a revenue total. Subtract a refund, decrement the total. That works until you need to answer a hard question — “What exactly happened to this $200 and why does the Stripe balance not match my reports?”
Freebo runs a double-entry accounting ledger — Formance — behind every financial event. Double-entry accounting means every debit has a corresponding credit. Money doesn’t disappear into “misc”; it moves from one clearly defined account to another, and both sides of the ledger always balance.
What posts to the ledger
| Event | Ledger entry |
|---|---|
| Booking confirmed | Revenue recognized, AR debited |
| Payment captured | AR credited, cash debited |
| Refund issued | Cash credited, AR debited |
| Platform fee collected | Fee revenue recognized |
| Stripe payout received | Cash moved to operating account |
- Booking completes
The reservation is created in Freebo’s database. A ledger event is emitted and queued in Redis.
- Ledger worker processes the queue
The LedgerWorker picks up the event and posts the double-entry transaction to Formance via Numscript.
- Outstanding balance is computed from ledger
When Freebo needs to show you what’s owed or what’s been paid, it queries Formance — not a SQL sum. The number is always accurate.
Can I export ledger data for my accountant?
Does a Formance outage prevent customers from booking?
Shipped in Operator payouts, reconciled · February 2026