Beancount.io LogoBeancount.io

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.


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}.

13) What to track outside the ledger (keep links)

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.