Schema CPA

Financial Statement Extraction Into Structured Rows

By Schema CPAPublished Updated

Financial statement extraction turns each line of a balance sheet or income statement into one structured row: the label as printed, a normalized label, the amount, the period, its level in the hierarchy and whether it is a detail line or a subtotal. You can trust the rows once every subtotal foots and the statements agree with each other.

What financial statement extraction captures from each line

Financial statement extraction captures five facts from every printed line, plus where it came from: the label, the amount, the period, the line's level in the statement's outline, and its type (detail, subtotal or total). The source page number rides along so anyone can go back to the printed figure in one step.

A row that carries only a label and an amount is a list of numbers, not a statement. The level and type fields keep the structure. "Total current assets" is a subtotal at level one that should equal the sum of the level-two detail lines above it. Without those two fields, a spreadsheet user cannot tell a total from a detail line, and summing a column counts every total twice.

The period field matters as soon as a statement shows comparatives. Many business statements print two columns, such as December 31, 2026 and December 31, 2025. Each column produces its own row per line, so one printed line with two amounts becomes two records with different periods. A balance sheet period is a point in time. An income statement period is a span, such as the twelve months ended December 31, 2026, and the record should say which.

An example extraction record

This record comes from a fictional balance sheet for Alder Creek Supply LLC, an example client. The label, figures and page are made up for illustration.

FieldExample value
Label as printedTrade receivables, less allowance
Normalized labelAccounts receivable, net
Amount72,000
PeriodAs of 2026-12-31
Level2 (under Current assets)
Line typeDetail
Page2 of 6

Keep the printed label even after normalizing it. The printed wording is the evidence. The normalized label is the firm's interpretation, and a reviewer needs to see both to judge whether the match was right.

Classifying pages before financial statement extraction

Page classification sorts a statement package into its parts before any figure is read: cover and accountant's report, balance sheet, income statement, statement of cash flows, statement of equity, notes and supplementary schedules. Each page type has its own layout and its own rows, so extraction runs page type by page type.

The SEC's Beginners' Guide to Financial Statements describes the differences that make classification possible. A balance sheet gives detail on assets, liabilities and shareholders' equity at one point in time. An income statement shows revenue earned over a period and the costs tied to it. The cash flow statement reports inflows and outflows of cash. Those differences show up on the page: a balance sheet heading usually says "as of" a date, while an income statement or cash flow statement usually says "for the year ended".

Notes pages look different again. They are mostly prose with small embedded tables, such as a debt maturity schedule or a lease table. Treat a note table as its own small extraction with its own period, not as more lines of the balance sheet.

Classification also catches packages that arrive out of order or incomplete. A client PDF might hold the income statement for 2026 and the balance sheet for 2025 because someone printed the wrong file. Checking the period on each page before extraction catches that mismatch before it reaches a spreadsheet.

Schema CPA reads balance sheets and income statements, along with general ledgers and trial balances, and sorts each page by document type and period before export to Excel or CSV. The document categories on the homepage list everything it reads.

How are financial statement line labels normalized after extraction?

Label normalization maps each printed label to one standard name, so "Trade receivables, less allowance", "A/R, net" and "Accounts receivable (net)" all land on the same row. A firm keeps a mapping table from printed labels to its own chart of standard lines and reviews any label that does not match an existing entry.

The mapping table has three columns: printed label, standard label and the date someone approved the mapping. Approval matters because a wrong mapping repeats every period. If "Due from shareholder" is mapped to accounts receivable once, it will sit inside receivables for every later year, and any ratio built on receivables will be wrong too.

Match on more than the words. Position and sign help. A line that sits under current liabilities and reads "Customer deposits" is a liability, not revenue, even though the word "customer" also appears in revenue labels. A line printed in parentheses on an income statement is usually an expense or a contra item.

New labels should stop the line, not guess. When a client renames an account or adds one, the safest result is a row flagged as unmapped, with the printed label kept. A reviewer then decides whether it is a new standard line or a new name for an old one. The post on financial spreading software covers how standard templates depend on this mapping when statements feed a loan file.

Keep a per-client override where needed. Two clients can use the same words for different things, such as "Other income" that is interest for one and rental income for the other. A client-level mapping wins over the firm-wide one.

How do you verify extracted financial statement figures?

Verification proves the extraction with arithmetic the statements already contain. Every subtotal must equal the sum of its detail lines, every total must equal the sum of its subtotals, and the balance sheet must balance. Then the statements must agree with each other, such as net income flowing into retained earnings.

Footing checks run inside one statement. Cross-statement checks run between statements. Both are cheap to run in a spreadsheet once the rows carry level and type, and both catch the misreads that matter, such as a transposed digit or a dropped line.

Example balance sheet and its checks

This fictional balance sheet for Alder Creek Supply LLC, as of December 31, 2026, shows the rows the checks below run against. All figures are examples.

LineLevelTypeAmount
Cash2Detail48,000
Accounts receivable, net2Detail72,000
Inventory2Detail95,000
Total current assets1Subtotal215,000
Equipment, net1Detail135,000
Total assets0Total350,000
Accounts payable2Detail41,000
Accrued expenses2Detail9,000
Current portion of long-term debt2Detail20,000
Total current liabilities1Subtotal70,000
Long-term debt, less current portion1Detail110,000
Total liabilities1Subtotal180,000
Member capital2Detail50,000
Retained earnings2Detail120,000
Total equity1Subtotal170,000
Total liabilities and equity0Total350,000

Footing and cross-statement checklist

  1. Current assets foot: 48,000 + 72,000 + 95,000 = 215,000.
  2. Total assets foot: 215,000 + 135,000 = 350,000.
  3. Current liabilities foot: 41,000 + 9,000 + 20,000 = 70,000.
  4. Total liabilities foot: 70,000 + 110,000 = 180,000.
  5. Equity foots: 50,000 + 120,000 = 170,000.
  6. The balance sheet balances: 180,000 + 170,000 = 350,000, matching total assets. The SEC guide states the rule as assets equal liabilities plus shareholders' equity.
  7. Retained earnings roll forward: in this example, the prior-year balance of 102,000, plus 2026 net income of 38,000 from the income statement, less member distributions of 20,000, equals 120,000.
  8. Cash agrees with the ending cash on the statement of cash flows, when one is included.
  9. Each comparative column passes checks 1 to 6 on its own.

A failed check points to the line. If current assets came out at 214,000, one of three detail lines was misread, and the page reference on each record shows where to look. Scanned statements fail more often than digital ones; the post on where financial statement OCR misreads figures covers the usual causes.

Financial statement extraction edge cases: notes, schedules and restated years

Notes, supporting schedules and restated comparatives are the three places where financial statement extraction most often goes wrong. Notes add detail that does not appear on the face of the statements, schedules repeat face figures in a different breakdown, and restated years replace figures a firm may already hold from last year's package.

Notes carry figures that never reach the face. The SEC guide says footnotes cover items such as significant accounting policies and income tax detail. A debt note might split long-term debt into a term loan and an equipment note. Extract note tables into their own rows, tied to the face line they explain, and check that the parts add to the face amount. A debt note listing 85,000 and 45,000 should add to the 130,000 of total debt on the face (20,000 current plus 110,000 long-term in the example above).

Supplementary schedules cause double counting. A schedule of operating expenses often lists the same totals as the income statement in more detail. If both are extracted into one table without a page type, expenses appear twice. Keep schedule rows separate and use them only to check the face.

Restated comparatives replace history. When this year's package shows a prior-year column that differs from last year's package, the prior year was restated or reclassified. Keep both versions with their source package and date. The post on multi-year financial statement comparison covers which version a comparison should use.

Hierarchy is the last edge case. Some statements indent three or four levels, and some print subtotals without a "Total" label. Getting levels right for those layouts is its own topic, covered in the post on keeping balance sheet line hierarchy and subtotals in Excel.

PDF financial statements to Excel at volume across a client list

Moving PDF financial statements to Excel at volume means running the same steps for every client each period: collect the package, classify its pages, extract rows, map labels, run the checks and export one workbook layout. A fixed layout lets the firm compare clients and periods without rebuilding anything.

Pick one output shape and keep it. A long table with one row per line per period (client, period, printed label, standard label, amount, level, type, page) works for any statement and any number of years. Pivot it into a side-by-side view when someone needs to read it, but store the long version.

Run the checks before anyone reads the numbers. A queue of packages that failed a footing or cross-statement check is the work list. Packages that pass go straight to whoever needs them.

Track what has not arrived as carefully as what has. A client who sends a balance sheet without an income statement leaves the retained earnings check impossible to run. Write-up and monthly engagements feel this most, since statements arrive in a steady run; the post on write-up work automation covers where extraction fits in a monthly cycle.

Know where plain text capture stops. Reading characters off a page is the first step, not the whole job. The difference between reading text and understanding a document's structure is covered in OCR vs intelligent document processing.

For a firm collecting statement packages from many clients, Schema CPA gives each client one upload link, sorts every page by type and period and exports rows to Excel or CSV. To try it on your own client files, get started.

All posts in Ledgers and financial statements