Salta al contingut principal

Beancount Setup for Startups

A practical, copy-pasteable baseline to run startup books in plain text. Works for pre-seed through Series A. This is not legal or tax advice.


beancount-setup-for-startups

Running a startup means wearing many hats, and one of the most critical is "bookkeeper." Before you can afford expensive software or a full-time accountant, you need a system that's accurate, auditable, and won't lock you into a proprietary ecosystem. Enter Beancount: an open-source, plain-text accounting system.

Using Beancount means your financial ledger lives in text files, right alongside your code in a Git repository. It's version-controlled, transparent, and infinitely customizable. This guide provides a complete, copy-pasteable setup to get your startup's books running from incorporation through your Series A, built on sound, accrual-based accounting principles.

1) What you’ll set up

This guide will walk you through creating a complete, professional-grade accounting setup. By the end, you will have:

  • A single-source-of-truth ledger managed in Git (main.beancount), giving you a complete, auditable history of your company's finances.
  • Fava for beautiful reports and graphs. Fava is a web interface for Beancount that turns your text files into interactive income statements, balance sheets, and cash flow analysis.
  • A structure for importers that you can add later to automate transaction entry from your bank, credit card, PayPal, and Stripe accounts. We'll start manually to learn the system, then automate.
  • An accrual-ready chart of accounts designed for modern startups, with built-in support for deferred revenue, prepaid expenses, and payroll liabilities.
  • Primitives for seed financing, including clear examples for recording SAFE notes (as either liability or equity) and convertible notes with interest.

2) Project structure (drop into your repo)

Start by creating this directory structure inside your company's Git repository. This organization keeps your ledger clean and scalable.

/ledger
main.beancount
/includes
accounts.beancount
opening-balances.beancount
policies.beancount
/documents
/bank
/invoices
/receipts
/importers # optional; add when you automate CSV ingestion
bank_importer.py
card_importer.py
  • main.beancount: The central file that pulls everything together.
  • /includes: Holds your chart of accounts, opening balances, and accounting policies.
  • /documents: A place to store PDFs of bank statements, invoices, and receipts for a clean audit trail.
  • /importers: Where your future Python scripts for parsing bank CSVs will live.

3) Minimal, sane main.beancount

This is the entry point for your ledger. It sets a few global options and includes the other component files. Copy this content into ledger/main.beancount and customize the title.

option "title" "Acme, Inc. Ledger"
option "operating_currency" "USD"
option "documents" "ledger/documents"

include "includes/accounts.beancount"
include "includes/opening-balances.beancount"
include "includes/policies.beancount"

; If you later add importers, you’ll add plugin lines here.
; plugin "beancount.plugins.implicit_prices"

4) Starter chart of accounts (accrual‑first)

Your chart of accounts is the complete list of categories for your company's financial transactions. This starter template is built for accrual accounting, which gives a far more accurate picture of your company's health than cash-based accounting.

Put this in includes/accounts.beancount. Feel free to remove any accounts you don't need right away.

; --- Assets ---
1970-01-01 open Assets:Bank:Checking USD
1970-01-01 open Assets:Bank:Savings USD
1970-01-01 open Assets:AR USD ; Accounts Receivable
1970-01-01 open Assets:Prepaid:Software USD
1970-01-01 open Assets:Prepaid:Insurance USD
1970-01-01 open Assets:Deposits USD ; Security deposits
1970-01-01 open Assets:Equipment USD
1970-01-01 open Assets:Intangibles USD
1970-01-01 open Assets:Crypto:BTC BTC
1970-01-01 open Assets:Other

; --- Liabilities ---
1970-01-01 open Liabilities:AP USD ; Accounts Payable
1970-01-01 open Liabilities:CreditCard:Corporate USD
1970-01-01 open Liabilities:DeferredRevenue USD
1970-01-01 open Liabilities:Payroll:Withholding USD
1970-01-01 open Liabilities:Payroll:EmployerTaxes USD
1970-01-01 open Liabilities:SalesTax:CA USD
1970-01-01 open Liabilities:SAFE USD
1970-01-01 open Liabilities:NotesPayable USD
1970-01-01 open Liabilities:Other

; --- Equity ---
1970-01-01 open Equity:CommonStock USD
1970-01-01 open Equity:APIC USD ; Additional Paid-in Capital
1970-01-01 open Equity:SAFE USD ; If you classify SAFEs as equity
1970-01-01 open Equity:RetainedEarnings USD
1970-01-01 open Equity:OpeningBalances USD

; --- Income (negative balances) ---
1970-01-01 open Income:Revenue:SaaS USD
1970-01-01 open Income:Revenue:Services USD
1970-01-01 open Income:Other USD

; --- Expenses ---
1970-01-01 open Expenses:COGS USD
1970-01-01 open Expenses:Payroll:Wages USD
1970-01-01 open Expenses:Payroll:EmployerTaxes USD
1970-01-01 open Expenses:Benefits USD
1970-01-01 open Expenses:Contractors USD
1970-01-01 open Expenses:Software:Subscriptions USD
1970-01-01 open Expenses:Cloud USD
1970-01-01 open Expenses:Rent USD
1970-01-01 open Expenses:Meals USD
1970-01-01 open Expenses:Travel USD
1970-01-01 open Expenses:Marketing USD
1970-01-01 open Expenses:Legal USD
1970-01-01 open Expenses:Accounting USD
1970-01-01 open Expenses:Insurance USD
1970-01-01 open Expenses:BankFees USD
1970-01-01 open Expenses:Taxes:Income USD
1970-01-01 open Expenses:Taxes:Sales USD
1970-01-01 open Expenses:Other USD

Notes

  • Income accounts are negative because they represent credits in double-entry accounting. Don't worry about this; Fava automatically flips the signs in reports, so your revenue will show up as a positive number on the income statement.
  • Keep narrow, purposeful categories to start. It's much easier to add new accounts later than it is to clean up a messy, overly-granular chart of accounts.

5) Opening balances (first day)

The first transaction in your ledger sets the stage. It records the initial state of your accounts on the day you start tracking. Put this transaction in includes/opening-balances.beancount, adjusting the date and amounts to reflect your actual starting position.

2025-01-01 * "Opening balances"
Assets:Bank:Checking 5,000.00 USD
Liabilities:CreditCard:Corporate -500.00 USD
Equity:OpeningBalances -4,500.00 USD

This entry establishes that the company started with $5,000 in the bank and a $500 balance on its credit card. The Equity:OpeningBalances account is a special account used to ensure the transaction balances to zero, as required by double-entry accounting.


6) Common startup transactions (copy‑paste)

Here are recipes for the most common financial events in an early-stage startup. Copy, paste, and adapt them for your own use.

Founder stock purchase (simple, currency‑only)

When founders purchase their initial shares at par value, the cash comes into the company and is recorded as equity. Your cap table (Carta, Pulley, or a spreadsheet) is the source of truth for share counts; the ledger just books the dollars.

2025-01-05 * "Founder stock purchase @ par"
Assets:Bank:Checking 800.00 USD
Equity:CommonStock -0.80 USD
Equity:APIC -799.20 USD
; 8,000,000 common @ $0.0001 — counts maintained off-ledger

(Optional) Track your own shares as a commodity

If you want the ledger to track the number of shares issued, you can define your stock as a "commodity." This is more complex but provides a more complete in-ledger record.

2025-01-05 commodity ACME
name: "Acme, Inc. Common"

2025-01-05 * "Founder share issuance"
Assets:Bank:Checking 800.00 USD
Equity:APIC -799.20 USD
Equity:CommonStock -8,000,000 ACME {0.0001 USD}

SAFE cash in (choose classification)

A SAFE (Simple Agreement for Future Equity) can be treated as either a liability or a form of equity (specifically, "mezzanine equity"). Consult with your accountant to choose the right approach and be consistent.

; (A) Equity classification (mezzanine)
2025-02-01 * "Post-money SAFE — SeedFund"
Assets:Bank:Checking 500,000.00 USD
Equity:SAFE -500,000.00 USD

; (B) Liability classification (until conversion)
2025-02-01 * "Post-money SAFE — SeedFund"
Assets:Bank:Checking 500,000.00 USD
Liabilities:SAFE -500,000.00 USD

When a priced round closes, you will reclassify the SAFE balance to Preferred Stock and Additional Paid-in Capital based on the closing documents.

Convertible note with accrued interest

Unlike a SAFE, a convertible note is unambiguously a liability that accrues interest. You'll record the initial cash and then book the interest expense periodically (e.g., quarterly).

2025-03-01 * "Convertible Note — 6% annual"
Assets:Bank:Checking 250,000.00 USD
Liabilities:NotesPayable -250,000.00 USD

2025-06-30 * "Accrue note interest Q2"
Expenses:Interest 3,750.00 USD
Liabilities:NotesPayable -3,750.00 USD
; 250,000 * 6% * 0.25 = 3,750

Annual SaaS sale (deferred revenue + monthly recognition)

This is a cornerstone of accrual accounting. When a customer prepays for a year, you don't earn all that revenue at once. You book it to a liability (DeferredRevenue) and then recognize 1/12th of it each month.

2025-03-10 * "Annual subscription — AcmeCo — INV-001"
Assets:AR 1,200.00 USD
Liabilities:DeferredRevenue -1,200.00 USD
narration: "SaaS annual prepay"

2025-03-20 * "Payment INV-001"
Assets:Bank:Checking 1,200.00 USD
Assets:AR -1,200.00 USD

; Recognize month 1/12 (repeat monthly or script it)
2025-04-01 * "Revenue recognition 1/12 — INV-001"
Liabilities:DeferredRevenue 100.00 USD
Income:Revenue:SaaS -100.00 USD

Prepaid expense and amortization

This is the inverse of deferred revenue. When you prepay for a service (like annual software or insurance), you record it as an asset (Prepaid) and then "amortize" or expense a portion of it each month.

2025-03-01 * "Annual software prepaid"
Assets:Prepaid:Software 1,200.00 USD
Assets:Bank:Checking -1,200.00 USD

2025-04-01 * "Amortize prepay 1/12"
Expenses:Software:Subscriptions 100.00 USD
Assets:Prepaid:Software -100.00 USD

Payroll (net cash, with withholdings + employer taxes)

A payroll entry has several parts: the gross wage expense, the employer's tax expense, the net cash paid to employees, and the liability for taxes you've withheld that must be remitted to the government.

2025-04-15 * "Payroll — Apr 15"
Expenses:Payroll:Wages 15,000.00 USD
Expenses:Payroll:EmployerTaxes 1,200.00 USD
Liabilities:Payroll:Withholding -4,000.00 USD
Assets:Bank:Checking -12,200.00 USD

Sales tax collection and remittance (example CA)

When you collect sales tax, it's not your money. It's a liability you owe to the state. You record the liability when you make the sale and clear it when you remit the tax.

2025-05-10 * "Invoice #123 — CA taxable"
Assets:AR 1,088.75 USD
Income:Revenue:SaaS -999.00 USD
Liabilities:SalesTax:CA -89.75 USD

2025-06-05 * "Payment #123"
Assets:Bank:Checking 1,088.75 USD
Assets:AR -1,088.75 USD

2025-07-20 * "Remit CA sales tax Q2"
Liabilities:SalesTax:CA 89.75 USD
Assets:Bank:Checking -89.75 USD

FX and crypto (lightweight)

Beancount handles multiple currencies natively. Use price directives to record exchange rates and the {} cost syntax for specific transactions.

2025-03-01 price EUR 1.0832 USD

2025-03-02 * "AWS EU charge"
Expenses:Cloud 90.00 EUR
Liabilities:CreditCard:Corporate -90.00 EUR

2025-03-05 * "Buy BTC for testing"
Assets:Crypto:BTC 0.0200 BTC {3400.00 USD}
Assets:Bank:Checking -3,400.00 USD

7) Using Fava (reports in one command)

Fava is the brilliant web interface that makes Beancount data come alive. It's the reward for your careful data entry.

  • Install: $ pip install fava
  • Run: $ fava ledger/main.beancount
  • Useful views: Income Statement, Balance Sheet, Journal (for filtering by account/tag), and Query (for custom SQL-like queries).

Quick Fava filters:

  • account:DeferredRevenue: Show all activity in your deferred revenue account.
  • tag:#invoice-001: Tag transactions related to a specific invoice and filter for them.
  • from:2025-01-01 to:2025-12-31: Focus on a specific financial period.

8) Monthly close checklist (15–45 min)

At the end of each month, run through this checklist to ensure your books are accurate and up-to-date. This discipline makes tax time and investor diligence a breeze.

  • Bank/credit cards: Import or manually enter all transactions. Reconcile balances against your statements.
  • AR/AP: Post all issued invoices and received bills; mark paid items as cleared.
  • Revenue: Post the monthly revenue recognition entries for all prepaid contracts.
  • Prepaids: Amortize 1/12th (or the appropriate fraction) of all prepaid expenses.
  • Payroll: Book the journal entry from your payroll provider's report.
  • Sales tax: Book your sales tax liability for the month.
  • Seed instruments: Accrue interest on any convertible notes.
  • Sanity checks:
    • Does your Income Statement revenue roughly match your expected MRR/ARR?
    • Do your burn rate and runway align with your financial plan?
    • Does $ bean-check run without errors? Do Fava's reports look correct?
  • Commit to Git with a terse, consistent note (e.g., close: 2025-04).

9) Metadata & documents (make audits easy)

Your ledger should be self-documenting. Use metadata and link to source documents to create a bulletproof audit trail. Future you (and your accountant) will thank you.

  • Add metadata like payee:, narration:, invoice:, customer:, or link: to transactions for clarity.
  • Attach source PDFs (invoices, receipts, bank statements) to your ledger/documents/ folder and link them using the document: metadata tag.
  • Use tags (#payroll, #saas, #vendor-aws, #invoice-001) for easy filtering and analysis.

Example:

2025-03-10 * "Annual subscription — AcmeCo" #saas #invoice-001
payee: "AcmeCo"
invoice: "INV-001"
document: "documents/invoices/INV-001.pdf"
Assets:AR 1,200.00 USD
Liabilities:DeferredRevenue -1,200.00 USD

10) Import later (when you have time)

Start by entering transactions manually for the first month or two. This is the best way to learn the system and your own spending patterns. Once you're comfortable, you can write simple Python importers to automate the process and reduce toil.

A typical importer order of battle:

  1. Bank CSV → Assets:Bank:Checking
  2. Credit Card CSV → Liabilities:CreditCard:Corporate
  3. Stripe/PayPal Payout reports → Revenue and cash mapping

Keep your importers in /ledger/importers and review their generated transactions like you would any other code change.


11) Policies (put in includes/policies.beancount)

This file is where you document your accounting decisions for consistency. It's a simple text file, but it's crucial for maintaining discipline.

  • Accrual basis; recognize SaaS revenue pro-rata.
  • Functional currency is USD; record FX at the daily rate or transaction rate.
  • Capitalization threshold (e.g., items over $2,500 become an Assets:Equipment item; otherwise, they are expensed immediately).
  • Travel/Meals: Business purpose must be documented in the narration field.
  • Equity recording: Explicitly state whether you are using the currency-only or share-commodity method.
  • SAFEs/notes: Document your chosen classification (Liability or Equity).

Example policies.beancount:

; Policy: Accrual basis, revenue deferred and recognized monthly.
; Policy: USD functional currency. FX gains/losses are derived from cost/price data.
; Policy: Capitalize tangible assets over $2,500 with a 3-year straight-line depreciation.
; Policy: SAFEs are recorded as Liabilities until conversion in a priced round.

12) Quick troubleshooting

  • Revenue looks negative in the Journal: This is correct! Income is a credit. Fava reports will display it as a positive number.
  • Balances not zeroing: You likely have an incomplete transaction. A transaction's postings must sum to zero. Use Fava's Journal view to find the culprit. As a temporary measure, you can add a balancing leg to an Equity:Suspense account to make the file valid, then investigate and fix the root cause.
  • FX mismatches: Make sure you have price directives for the relevant dates or that you specify the cost basis in your operating currency, like 90.00 EUR {97.49 USD}.

Beancount is for your financial transactions, but some things are better managed in dedicated systems. The key is to link to them from your ledger.

  • Cap Table: Use Carta, Pulley, or a spreadsheet. Link to the signed closing documents from your financing transactions in Beancount.
  • Board Consents, Equity Plan, 409A Reports: Store these in a secure location and add link: metadata to relevant equity transactions.
  • Tax Returns: Store the final PDFs and link to them from a year-end closing transaction.

Copy‑ready starter file (all‑in‑one)

If you prefer to start with a single file before expanding to the include structure, you can simply paste the contents of the files from the sections above into one large main.beancount. You can always refactor it later as your ledger grows.

This framework provides a solid, scalable foundation for your startup's finances. By keeping your books in plain text under version control, you gain unparalleled transparency and control, setting your company up for financial discipline from day one.