Skip to main content

Model a public company in Beancount

Turn a public company's balance sheet and income statement into a balanced Beancount ledger using the Open Ledger conventions, with a worked PepsiCo quarter and a starter template.

Turn a filing's balance sheet and income statement into a balanced Beancount ledger with the same conventions every Open Ledger company uses.

This guide walks one real PepsiCo quarter end to end. The numbers match the PepsiCo Q2 2026 earnings release. Every figure stays in millions of US dollars (MUSD).

What you get

You finish with a ledger that asserts the period-end balance sheet and records the income statement as one zero-sum transaction. bea check passes. Income-statement and balance-sheet reports match the filing's published totals. The same pattern powers every company on the Open Ledger and every post under the open-ledger tag.

Pick the unit and fiscal year

Set operating_currency to a millions unit that matches the filing. Use MUSD for US-dollar reporters. Use MEUR, MJPY, or another M<CCY> form when the filing reports in that currency.

One MUSD means USD 1,000,000. A balance of 25998 MUSD means about $26.0 billion of cash.

Put each fiscal period in its own file under a year directory. Name annual files FY2025/FY2025.bean. Name quarterly files FY2026/FY2026Q2.bean. Include them from main.bean oldest first.

Open the chart of accounts

main.bean holds options, account opens, and includes. It holds no balances and no income entries.

Open every account on 1970-01-01 in MUSD. Keep the core names identical across companies so readers can diff one ledger against another.

option "title" "PepsiCo, Inc. Financial Statements FY2021-FY2026Q2"
option "operating_currency" "MUSD"
 
; Currency convention:
;   MUSD = Millions of USD (custom unit for readability)
;   1 MUSD = USD 1,000,000
;   Example: "1000 MUSD" means USD 1,000,000,000
;   All figures sourced from PepsiCo, Inc. annual reports / filings.
;   Fiscal years end Dec 31 (52/53-week year; Dec 31 shown).
 
; ── ASSETS ──────────────────────────────────────────────────────────────────
1970-01-01 open Assets:Current:Cash                        MUSD
1970-01-01 open Assets:Current:ShortTermInvestments        MUSD
1970-01-01 open Assets:Current:AccountsReceivable          MUSD
1970-01-01 open Assets:Current:Other                       MUSD
1970-01-01 open Assets:NonCurrent:PropertyPlantEquipment   MUSD
1970-01-01 open Assets:NonCurrent:Goodwill                 MUSD
1970-01-01 open Assets:NonCurrent:IntangibleAssets         MUSD
1970-01-01 open Assets:NonCurrent:Other                    MUSD
 
; ── LIABILITIES ─────────────────────────────────────────────────────────────
1970-01-01 open Liabilities:Current:AccountsPayable        MUSD
1970-01-01 open Liabilities:Current:ShortTermDebt          MUSD
1970-01-01 open Liabilities:Current:DeferredRevenue        MUSD
1970-01-01 open Liabilities:Current:Other                  MUSD
1970-01-01 open Liabilities:NonCurrent:LongTermDebt        MUSD
1970-01-01 open Liabilities:NonCurrent:Other               MUSD
 
; ── EQUITY ──────────────────────────────────────────────────────────────────
1970-01-01 open Equity:OpeningBalance                      MUSD  ; FY2021 initialization
1970-01-01 open Equity:Adjustments                         MUSD  ; year-over-year BS differences
1970-01-01 open Equity:CommonStockAndAPIC                  MUSD
1970-01-01 open Equity:RetainedEarnings                    MUSD
1970-01-01 open Equity:OtherComprehensiveIncome            MUSD
 
; ── INCOME ──────────────────────────────────────────────────────────────────
1970-01-01 open Income:Revenue                             MUSD
1970-01-01 open Income:OtherNet                            MUSD  ; net other income (interest income, etc.)
 
; ── EXPENSES ────────────────────────────────────────────────────────────────
1970-01-01 open Expenses:CostOfRevenue                     MUSD
1970-01-01 open Expenses:ResearchAndDevelopment            MUSD
1970-01-01 open Expenses:SellingGeneralAdministrative      MUSD
1970-01-01 open Expenses:OtherNet                          MUSD
1970-01-01 open Expenses:IncomeTax                         MUSD
 
include "FY2026/FY2026Q2.bean"

Assets:Current:Other and the other …:Other leaves absorb residuals. Modeled line items plus that residual always reconcile to the filing's subtotal.

Assert the balance sheet with pad and balance

Pad from Equity:Adjustments on the day before period end. Assert the filing's value on the period-end date. Write one pad and balance pair per account.

Assets carry positive balances. Liabilities and equity carry negative balances. Residual lines keep a comment that names the filing subtotal they reconcile to.

2026-06-29 pad Assets:Current:Cash                        Equity:Adjustments
2026-06-30 balance Assets:Current:Cash                     25998 MUSD
 
2026-06-29 pad Assets:Current:ShortTermInvestments        Equity:Adjustments
2026-06-30 balance Assets:Current:ShortTermInvestments     15600 MUSD
 
2026-06-29 pad Assets:Current:AccountsReceivable          Equity:Adjustments
2026-06-30 balance Assets:Current:AccountsReceivable       10398 MUSD
 
2026-06-29 pad Assets:Current:Other                       Equity:Adjustments
2026-06-30 balance Assets:Current:Other                    15604 MUSD  ; current assets residual (67600 total current)
 
2026-06-29 pad Liabilities:Current:AccountsPayable        Equity:Adjustments
2026-06-30 balance Liabilities:Current:AccountsPayable     -8318 MUSD

Cover the whole statement the same way: every asset and liability account, plus Equity:CommonStockAndAPIC, Equity:RetainedEarnings, and Equity:OtherComprehensiveIncome. Start each period file with a banner that names the company, the period, the unit, and the source URL.

Record the income statement as one transaction

Date the transaction on the fiscal period end. Income postings are negative. Expense postings are positive. Equity:Adjustments absorbs net income so the entry sums to zero.

Put the arithmetic check in a comment above the transaction. The check must evaluate to zero before you trust the entry.

; Check: -23000 + 10350 + 400 + 8740 + 230 + 688 + 2592 = 0 ✓
 
2026-06-30 * "PepsiCo, Inc." "FY2026Q2 Income Statement"
  Income:Revenue                         -23000 MUSD
  Expenses:CostOfRevenue                   10350 MUSD
  Expenses:ResearchAndDevelopment          400 MUSD
  Expenses:SellingGeneralAdministrative    8740 MUSD
  Expenses:OtherNet                        230 MUSD
  Expenses:IncomeTax                       688 MUSD
  Equity:Adjustments                      2592 MUSD  ; net income offset

Revenue is 23,000 MUSD. Net income is 2,592 MUSD. When other income nets positive, post it to Income:OtherNet instead of Expenses:OtherNet. Never use both in one period.

Validate and read the reports

Run a check on the root ledger:

bea --file main.bean check

A clean ledger exits 0 with no output. Prefer bea --json --no-input --file main.bean check when you want machine-readable validity and require data.valid: true.

Read the income statement for the company's fiscal window, not a calendar quarter that happens to share the label:

bea --json --no-input --file main.bean report income-statement --time '2026-04-01 - 2026-06-30'

Open the same file in Fava to browse the balance sheet and income statement. Confirm three things against the filing: the ; Check: comment sums to zero, total assets equal total liabilities plus equity, and net income in the transaction equals the filing's net income.

Start from the template

Clone the shape before you invent a new chart. The live template below is a fictional Example Industries Inc. FY2025 ledger in MUSD. It uses the same account names, pad and balance pattern, and single income-statement transaction.

Open Example Industries Inc. public-company template in a new tab

Download this pattern as public-company-starter.bean, then run bea --file public-company-starter.bean check. The file matches the chart, pad/balance, and income-statement fences above: Cash ends at 25998 MUSD, Accounts Payable at -8318 MUSD, Revenue at -23000 MUSD, Income Tax at 688 MUSD, and Equity:Adjustments at -56690 MUSD after the pads and the net-income offset. Replace PepsiCo's amounts with figures from your filing and keep the account names.

Browse every real company on the Open Ledger. Copy the template's structure, then replace the fictional amounts with figures from your filing.

Where to go next

Source: https://beancount.io/docs/model-a-public-company-in-beancount