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 with Open Ledger conventions and a PepsiCo example.

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 models PepsiCo’s quarterly income statement and a partial balance-sheet excerpt from the PepsiCo Q2 2026 earnings release. Use the 12-week column ending June 13, 2026 on printed page A-1 (PDF page 6), and the same-date balance sheet on A-4 (PDF page 9). The release was published July 9, 2026. Every figure stays in millions of US dollars (MUSD).

What you get​

You finish with five balance assertions and one zero-sum income-statement transaction. bea check passes. The income statement reproduces consolidated net income; the balance-sheet excerpt covers current assets and one combined current-liability line. It is not a complete company balance sheet. 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 10251 MUSD means $10.251 billion of cash.

The reported quarter contains 12 weeks, or 84 days, through June 13, 2026. Counting inclusively gives March 22–June 13, 2026. Use those fiscal dates rather than April–June. The balance sheet’s prior-year column is December 27, 2025; do not replace fiscal year ends with December 31.

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. FY2026Q2 income statement and partial balance sheet"
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
;   Source: PepsiCo Q2 2026 earnings release, A-1 and A-4.
;   Fiscal quarter: 2026-03-22 through 2026-06-13 (12 weeks).
;   Partial balance sheet: current assets and combined payables only.
 
; ── 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  ; opening balances when needed
1970-01-01 open Equity:Adjustments                         MUSD  ; balancing offset for this statement model
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"

The chart provides account names for other companies and later extensions. Unused accounts do not imply a reported zero. Only the accounts posted below have amounts mapped in this example. …:Other accounts need an explicit source line or residual calculation; they are not a license to invent a split.

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 carry negative balances. These five assertions map the June 13, 2026 column on A-4:

AccountSource mapping (MUSD)
Assets:Current:CashCash and cash equivalents: 10,251
Assets:Current:ShortTermInvestmentsShort-term investments: 465
Assets:Current:AccountsReceivableAccounts and notes receivable, net: 13,496
Assets:Current:OtherTotal current assets 32,775 − 10,251 − 465 − 13,496 = 8,563; inventories 6,734 + prepaid and other current assets 1,829
Liabilities:Current:OtherCombined accounts payable and other current liabilities: −24,504

The release does not split the last line into standalone accounts payable and other liabilities. Keep the aggregate together; do not post an invented amount to Liabilities:Current:AccountsPayable.

; PepsiCo, Inc. FY2026Q2 — 2026-03-22 through 2026-06-13; MUSD
; Source: https://investors.pepsico.com/docs/pepsico-5v9wci20/media/Files/investors/q2-2026-earnings-release.pdf
; A-4, 2026-06-13 column: partial balance-sheet snapshot
2026-06-12 pad Assets:Current:Cash                        Equity:Adjustments
2026-06-13 balance Assets:Current:Cash                     10251 MUSD
 
2026-06-12 pad Assets:Current:ShortTermInvestments        Equity:Adjustments
2026-06-13 balance Assets:Current:ShortTermInvestments     465 MUSD
 
2026-06-12 pad Assets:Current:AccountsReceivable          Equity:Adjustments
2026-06-13 balance Assets:Current:AccountsReceivable       13496 MUSD
 
2026-06-12 pad Assets:Current:Other                       Equity:Adjustments
2026-06-13 balance Assets:Current:Other                    8563 MUSD  ; 32775 - 10251 - 465 - 13496 = 6734 + 1829
 
2026-06-12 pad Liabilities:Current:Other                  Equity:Adjustments
2026-06-13 balance Liabilities:Current:Other               -24504 MUSD  ; combined payables and other current liabilities

Beancount checks a balance at the start of its date. The prior-day pads create synthetic snapshot entries, not actual cash movements on June 12. This example has no later asset or liability postings on June 13, so the asserted amounts also remain its closing balances.

This excerpt omits noncurrent assets, short-term debt and the remaining liabilities and equity. A complete model must map those lines too, including treasury stock and noncontrolling interests. The filing’s complete totals are assets 112,189 = liabilities 89,919 + equity 22,270 MUSD; the excerpt does not reproduce those totals. Equity:Adjustments is a balancing offset, not reported shareholders’ equity. Start each period file with a banner naming the company, fiscal window, unit and 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: -24181 + 11070 + 9088 + 171 + 848 + 3004 = 0
 
2026-06-13 * "PepsiCo, Inc." "FY2026Q2 Income Statement"
  Income:Revenue                         -24181 MUSD
  Expenses:CostOfRevenue                   11070 MUSD
  Expenses:SellingGeneralAdministrative     9088 MUSD
  Expenses:OtherNet                         171 MUSD  ; 230 expense - 59 pension income
  Expenses:IncomeTax                        848 MUSD
  Equity:Adjustments                       3004 MUSD  ; consolidated net income offset

Map A-1’s quarterly column as follows: revenue 24,181 minus cost of sales 11,070 gives gross profit 13,111. Subtract selling, general and administrative expenses of 9,088 to get operating profit 4,023; the impairment line is zero. The release does not disclose a separate quarterly R&D line, so leave Expenses:ResearchAndDevelopment unused.

Pension and retiree medical benefits income of 59 offsets net interest expense and other of 230. Post their net expense, 171, to Expenses:OtherNet. This gives pretax income of 3,852. Tax of 848 leaves consolidated net income of 3,004 MUSD. If the same aggregation instead yields net income in another period, use Income:OtherNet for the aggregate and leave Expenses:OtherNet unused.

The release also reports net income attributable to PepsiCo of 2,981 MUSD. The bridge is 3,004 − 23 attributable to noncontrolling interests = 2,981. This transaction models the consolidated measure; the 23 is an allocation of profit, not another expense. Do not substitute 2,981 as its balancing offset.

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-03-22 - 2026-06-13'

Open the same file in Fava to browse the balance sheet and income statement. Check arithmetic and source agreement separately: the ; Check: comment sums to zero, each posted amount matches its mapped source, and the report shows consolidated net income of 3,004 MUSD. A wrong revenue amount can still balance if the offset is also wrong. Only after extending this excerpt into a complete model should its balance-sheet totals equal the filing’s totals.

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 the real PepsiCo excerpt as public-company-starter.bean, then run bea --file public-company-starter.bean check. It combines the three Beancount fences above, separately from the fictional live template. Cash ends at 10251 MUSD, combined payables and other current liabilities at -24504 MUSD, Revenue at -24181 MUSD, and Income Tax at 848 MUSD. The five pads offset 32775 − 24504 = 8271 MUSD to Equity:Adjustments; adding the consolidated profit offset leaves -5267 MUSD there. That offset is not a filing line. The download is a partial balance-sheet example, not PepsiCo’s full ledger. Replace its figures and fiscal dates with your own source mappings.

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