New to OtterLedger? Read the Documentation
45 Guides Available Quick Start Guide
Learn AI Categorization View Guide
Have Questions? Check the FAQ
New to OtterLedger? Read the Documentation
45 Guides Available Quick Start Guide
Learn AI Categorization View Guide
Have Questions? Check the FAQ

PDF Statement Import

Guide 48: PDF Statement Import

Extract transactions, dates, and balances directly from your bank statement PDFs


Overview

Instead of manually typing statement dates, balances, and transactions, you can upload a PDF bank or credit card statement and let OtterLedger extract everything automatically. The AI-powered PDF parser reads your statement, pulls out the statement period, opening and closing balances, and every transaction line -- then feeds it all into either the reconciliation workflow or the import wizard.

What you'll learn:

  • Supported statement types and formats
  • Importing a PDF through the reconciliation workflow
  • Importing a PDF through File > Import
  • How the parser template system works
  • Understanding sign conventions and the Flip Signs button
  • Working with multi-section statements
  • Troubleshooting common PDF parsing issues

Time required: 5-10 minutes per statement (most of it is automated)


Prerequisites

  • At least one account already created in OtterLedger
  • A PDF statement downloaded from your bank or credit card provider
  • One of the following AI parsing engines configured:
Parser Engine Setup Location Notes
Python PDF Extractor (recommended) Runs automatically when the PDF service is running Fast, free, handles most structured PDFs
Google Gemini Settings > AI Configuration > Gemini API key Best accuracy for complex or unusual statements
OpenAI Settings > AI Configuration > OpenAI API key Excellent for multi-page statements
Local LLM (Ollama) Settings > AI Configuration > Local LLM Privacy-focused; may struggle with complex layouts

Tip: You do not need all of these configured. OtterLedger tries them in order -- Python extractor first, then cloud AI, then local LLM -- and uses the first one that succeeds. For most bank statements, the Python extractor alone is sufficient.


Supported Statement Types

OtterLedger's PDF parser works with statements from virtually any bank or credit card company. The parser identifies the statement format by structure, not by bank name, so it adapts to different layouts automatically.

Statement Type Examples Notes
Checking account Chase, Bank of America, Wells Fargo Deposits, withdrawals, checks
Savings account Any bank savings statement Interest, transfers
Credit card Discover, Amex, Capital One, Citi Purchases, payments, fees, rewards
Mortgage / Loan Loan servicer statements Principal/interest/escrow breakdowns extracted
HELOC Home equity line statements Draws, payments, interest

What Gets Extracted

When you upload a PDF statement, OtterLedger extracts:

  • Statement period -- start and end dates
  • Opening balance -- balance at the beginning of the period
  • Closing balance -- balance at the end of the period
  • Bank name and account number (last 4 digits)
  • Account type (Checking, Credit Card, etc.)
  • All transactions -- date, description, and amount for each line
  • Loan breakdowns -- principal, interest, and escrow portions for loan statements
  • Parser confidence score -- how confident the engine is in the extraction

Workflow 1: PDF Import via Reconciliation

This is the most common workflow. You attach a PDF statement when starting reconciliation, and OtterLedger auto-fills the statement date, balances, and pre-matches transactions for you.

Step 1: Start Reconciliation

  1. Go to Banking in the sidebar
  2. Select the account you want to reconcile
  3. Click Reconcile

[Screenshot: Account card with Reconcile button highlighted]

Step 2: Attach Your PDF Statement

In the Start Reconciliation dialog:

  1. Click Attach Statement (or drag and drop the PDF onto the dialog)
  2. Select your PDF file from the file picker
  3. OtterLedger immediately begins parsing

[Screenshot: Start Reconciliation dialog with Attach Statement button]

You will see a progress indicator: "Extracting statement information..."

Step 3: Review Extracted Data

Once parsing completes, OtterLedger displays a summary line showing what it found:

Chase • Credit Card • ****1234 • Jan 1, 2026 - Jan 31, 2026 • Balance: $1,171.00 • 47 transactions • Parser: chase_credit

The following fields are automatically populated:

Field What Happens
Statement Date Set to the statement's end date
Statement Balance Set to the extracted closing balance
Beginning Balance Loaded from your last reconciliation (OtterLedger validates it against the PDF's opening balance)
Parsed Transactions Stored internally for matching in the next step

[Screenshot: Start Reconciliation dialog after PDF parsing, showing extracted metadata]

Step 4: Verify and Start

Review the auto-filled values. If everything looks correct, click Start.

OtterLedger will:

  1. Create a reconciliation session with the extracted dates and balances
  2. Load your unreconciled transactions from the register
  3. Automatically match register transactions against statement transactions
  4. Mark high-confidence matches as cleared
  5. Generate suggestions for unmatched items

[Screenshot: Reconciliation screen with AI-matched transactions]

Tip: If you are reconciling a credit card or loan, OtterLedger automatically detects the account type and applies the correct sign convention. See the "Handling Sign Conventions" section below for details.

Validation Warnings

OtterLedger runs several checks after parsing your PDF. You may see these warnings:

Warning Meaning What to Do
Wrong Statement The PDF's ending balance matches your last reconciled balance -- you likely attached the previous month's statement Attach the correct (most recent) statement
Balance Mismatch The PDF's opening balance does not match OtterLedger's expected beginning balance Verify you have the right statement; edit the beginning balance if needed
Duplicate Statement This statement period was already reconciled You cannot reconcile the same statement twice
Skipped Period There is a gap between this statement and your last reconciliation Reconcile the missing month(s) first, or proceed if intentional
Out of Order This statement is dated before your last reconciliation Unusual, but allowed -- proceed with caution

Workflow 2: PDF Import via File Import

You can also import transactions from a PDF statement without going through reconciliation. This is useful if you just want to add transactions to an account without reconciling.

Step 1: Open the Import Wizard

  1. Go to File > Import
  2. Click Select File
  3. Choose your PDF statement
  4. Click Next

[Screenshot: Import wizard with PDF file selected]

Step 2: Review Extracted Metadata

OtterLedger analyzes the PDF and shows:

  • File type: Bank Statement (PDF)
  • Bank name and account number
  • Statement date range
  • Number of transactions found
  • Opening and closing balances
  • Parse confidence score
  • Which parser engine was used

[Screenshot: Import wizard metadata review]

Step 3: Account Mapping

Map the imported transactions to an OtterLedger account:

  1. If the PDF includes bank/account info, OtterLedger suggests a matching account
  2. Select or confirm the Target Account
  3. Click Next

Step 4: Preview and Import

OtterLedger shows all extracted transactions with:

  • Duplicate detection against existing transactions
  • Suggested categories (if AI categorization is enabled)
  • Friendly payee names (cleaned from raw bank descriptions)

Review the transactions and click Import to add them to your account.

Note: For ongoing account management, the reconciliation workflow (Workflow 1) is preferred because it also verifies your balances. The File Import workflow is best for initial setup or backfilling history.


The Parser Template System

OtterLedger uses an intelligent template system to improve parsing accuracy over time for each bank.

How It Works

  1. Bank Fingerprinting -- When you upload a PDF, the Python extractor identifies a "fingerprint" based on the bank's statement layout (headers, column positions, formatting patterns)
  2. Template Lookup -- OtterLedger checks its local database for a parser template matching that fingerprint
  3. Custom Parser Execution -- If a template exists, it runs the bank-specific Python parser for high accuracy
  4. Fallback -- If no template exists, it falls through to the general-purpose AI pipeline (cloud LLM or local LLM)

Parser Lifecycle

Templates go through a lifecycle as OtterLedger learns your bank's format:

Status Meaning
Draft Newly generated parser, not yet verified
Testing Being validated against statement data
Production Verified and actively used for this bank
Published Shared to community (future feature)

What This Means for You

  • The first time you upload a statement from a new bank, parsing may use a cloud AI provider and take a few seconds longer
  • Subsequent statements from the same bank use the bank-specific template and parse faster with higher accuracy
  • Templates are stored locally -- your statement data never leaves your machine (unless you use a cloud AI provider)
  • Each parser tracks its success rate and confidence score

Tip: If a parser template consistently produces incorrect results, you can use the Statement Extractor wizard (under Tools) to generate an improved parser for that bank.


Handling Sign Conventions

Different banks use different conventions for positive and negative amounts on statements. A purchase on a credit card might appear as a positive number on the statement (money you owe) but needs to be negative in OtterLedger (an expense). OtterLedger handles this automatically, but it helps to understand how.

How Auto Sign Detection Works

OtterLedger reads amounts exactly as they appear on the statement:

Statement Convention Example How OtterLedger Reads It
Trailing minus for credits 1,234.56- Negative amount (-1234.56)
Parentheses for debits (500.00) Negative amount (-500.00)
Separate debit/credit columns Debit: 50.00 Negative; Credit column is positive
Plain positive numbers 125.00 Positive amount (125.00)

NegateStatementAmounts (Automatic for Liability Accounts)

For credit cards, loans, and other liability accounts, the statement's sign convention is typically the opposite of what OtterLedger uses internally. OtterLedger automatically enables a setting called NegateStatementAmounts for these accounts, which flips all parsed values (balances and transactions) by multiplying by -1.

Account Type NegateStatementAmounts Why
Checking / Savings Off (disabled) Statement signs match OtterLedger convention
Credit Card On (enabled) Statement shows charges as positive; OL needs them negative
Mortgage / Loan On (enabled) Statement shows balance owed as negative; OL needs it positive
HELOC On (enabled) Same as other liability accounts

This happens once, automatically, at parse time. You do not need to think about it for most statements.

The "Flip Signs" Button

If auto-detection gets the sign wrong -- for example, your payments appear as expenses instead of credits, or your difference is way off -- you can manually toggle the signs.

The reconciliation screen provides several flip options:

Button What It Does
Flip Balance Signs Inverts both the statement balance and beginning balance (multiplies both by -1)
Flip Statement Balance Inverts only the statement balance
Flip Beginning Balance Inverts only the beginning balance
Invert Amount (per transaction) In the Advanced Reconciliation view, flips the sign of a single statement transaction

When to use Flip Signs:

  • Your difference is exactly double the statement balance (sign is inverted)
  • All transactions show the opposite sign (charges appear as payments and vice versa)
  • You see a balance mismatch warning that the numbers are right but the signs are wrong

Warning: Only use the Flip Signs button when the amounts are correct but the signs (positive/negative) are wrong. If the amounts themselves are incorrect, the issue is with the PDF parsing, not the sign convention.

How the Sign Pipeline Works (For Reference)

PDF Statement
  |
  v
Parser extracts raw values (signs as printed on statement)
  |
  v
NegateStatementAmounts? --> Yes (liability) --> Multiply all values by -1
                        --> No  (asset)     --> Keep values as-is
  |
  v
Values stored in reconciliation session (no further transformations)
  |
  v
Reconciliation screen displays values as-is from session

The key principle: there is exactly one sign transformation, applied once at parse time. After that, values flow through the system unchanged.


Multi-Section Statements

Many credit card statements have multiple sections: Purchases, Payments, Credits, Fees, Interest Charges, and so on. OtterLedger's parser handles these automatically.

How Multi-Section Parsing Works

  1. The parser identifies section headers in the PDF (e.g., "PURCHASES", "PAYMENTS AND CREDITS", "FEES")
  2. Transactions are extracted from each section independently
  3. All transactions are merged into a single list with correct signs
  4. The parser validates that the sum of all sections matches the statement's balance change

What You See

You do not need to do anything special for multi-section statements. All transactions appear in a single unified list in the reconciliation view, regardless of which section they came from on the original statement.

If the parser extracts a transaction type, it is stored as metadata:

  • debit -- charges, purchases, fees
  • credit -- payments, refunds, rewards

Loan Statement Sections

For mortgage and loan statements, the parser also extracts payment breakdowns:

Component Description
Principal Amount applied to reducing the loan balance
Interest Finance charge for the period
Escrow Taxes and insurance held in escrow (if applicable)

These breakdowns appear as separate synthetic line items in the reconciliation view, making it easy to match against your register entries for principal, interest, and escrow.


Troubleshooting PDF Issues

Q: "Extracting statement information..." hangs or takes very long

A: This usually means the Python PDF service is not running or no AI provider is available.

  • Check the status bar at the bottom of the app -- it shows whether the PDF service is active
  • Verify you have at least one AI provider configured in Settings > AI Configuration
  • The Python extractor is fastest; cloud AI providers (Gemini, OpenAI) take 5-15 seconds; local LLM may take 30+ seconds

Q: "Could not extract statement information"

A: The parser could not read the PDF format.

  • Ensure the PDF is a native PDF (text-based), not a scanned image
  • Try a different statement format if your bank offers one
  • If you have a cloud AI provider configured, it may handle the format better than the Python extractor alone
  • Some older or unusual statement layouts may not be supported yet

Q: Transactions are missing from the parsed results

A:

  • Multi-page statements sometimes lose transactions at page boundaries
  • Check if the transaction count in the extraction summary matches your statement
  • Cloud AI providers (Gemini, OpenAI) generally handle multi-page PDFs better than local LLM
  • You can always add missing transactions manually during reconciliation

Q: Amounts are wrong (e.g., running balance used instead of transaction amount)

A: Some statement formats have the transaction amount and running balance in adjacent columns, and the parser may pick the wrong one.

  • Check the extraction summary for a balance validation warning -- it will say if the calculated ending balance does not match
  • Try re-parsing with a different AI provider (Settings > AI Configuration)
  • Use the Statement Extractor wizard to generate a corrected parser template for this bank

Q: The statement date or balance is wrong

A:

  • You can manually edit the Statement Date and Statement Balance fields in the Start Reconciliation dialog after parsing
  • The auto-filled values are a convenience -- they are not locked
  • If this happens consistently for a particular bank, consider generating a custom parser template

Q: Sign convention is wrong (charges showing as payments)

A:

  • Use the Flip Balance Signs button in the reconciliation screen
  • For individual transactions, use the Invert Amount button in the Advanced Reconciliation view
  • If this happens every time for a particular account, the NegateStatementAmounts setting may need to be toggled -- this is saved per account and persists for future reconciliations

Q: "Wrong statement" warning appears but I have the right PDF

A: This warning triggers when the PDF's ending balance matches your last reconciled beginning balance. Possible causes:

  • You accidentally attached last month's statement (most common)
  • Your last reconciliation has an incorrect balance
  • The PDF parser extracted the wrong balance field
  • Edit the Statement Balance field manually if needed

Q: PDF is password-protected

A: OtterLedger cannot parse password-protected PDFs. Remove the password protection first using your PDF reader's security settings, then try again.


Tips and Best Practices

  1. Use the reconciliation workflow -- Attaching the PDF during reconciliation is the most efficient path because it auto-fills dates, balances, and matches transactions all at once

  2. Download PDFs directly from your bank -- Avoid scanning paper statements. Native (text-based) PDFs parse far more accurately than scanned images

  3. Keep the Python PDF service running -- It is the fastest parser and handles most statements without needing a cloud API key. The status bar shows its status

  4. Let templates build up -- After your first statement from each bank, OtterLedger saves a parser template. Subsequent months parse faster and more accurately

  5. Check the confidence score -- If the extraction summary shows a low confidence or a balance validation warning, review the parsed data carefully before proceeding

  6. Use cloud AI for complex statements -- If the Python extractor struggles with a particular bank's format, configure a Gemini or OpenAI API key for better results on complex layouts

  7. One statement at a time -- Reconcile each month's statement individually, in order. Do not skip months

  8. Save your PDFs -- OtterLedger stores the PDF with the reconciliation record, but keeping your own backup is good practice


What's Next?

Now that you can import PDF statements:


Need help? Visit the OtterLedger community at github.com/openledger or check the FAQ.