Getting Started
This guide walks you through your first ingestion and dashboard session after installation.
1. Configure your accounts
Edit config/accounts.yaml to define your bank accounts. At minimum you need one account:
accounts: - name: "My Checking Account" source_type: ing currency: AUD account_type: checking file_prefix: my_checkingThe file_prefix maps statement filenames to accounts. A file named my_checking_2025-01.pdf will be matched to “My Checking Account”.
See the accounts config guide for credit cards, source-of-truth setup, and more.
2. Configure categories and rules
Edit config/categories.yaml. The example file has sensible defaults for Australian expenses (groceries, transport, utilities, etc.). Add regex rules for merchants you use frequently:
rules: - type: regex pattern: "WOOLWORTHS|COLES |ALDI" category: GroceriesRules are matched top-to-bottom and first match wins. Put more specific patterns above generic ones.
3. Configure tax (optional)
If you want ATO tax reporting, edit config/tax.yaml with your business details, rental properties, and WFH deductions. See the tax config guide.
4. Initialise the database
ledger initThis creates the SQLite database at data/ledger.db and loads categories and accounts from your config files.
5. Drop in your first statements
Place statement files in the appropriate staging/ subfolder:
| Source | Folder | Accepted files |
|---|---|---|
| ING PDF | staging/ing/ | *.pdf |
| ING CSV | staging/ing-csv/ | *.csv |
| PayPal CSV | staging/paypal/ | *.csv |
| Bankwest PDF | staging/bankwest/ | *.pdf |
| Bankwest CSV | staging/bankwest-csv/ | *.csv |
| HSBC PDF | staging/hsbc/ | *.pdf |
| Coles Mastercard PDF | staging/coles/ | *.pdf |
| Amex CSV | staging/amex/ | *.csv |
| Airbnb CSV | staging/airbnb/ | *.csv |
6. Ingest
Preview what will happen without writing to the database:
ledger ingest --dry-runWhen you are happy, run the real ingest:
ledger ingestEach processed file is moved from staging/ to data/archive/ so it will not be re-imported.
The ETL pipeline for each transaction:
- Parse — extract date, description, amount from the source format
- Dedup — SHA-256 hash prevents re-importing the same transaction
- Source-of-truth — payments to credit cards from your bank account are auto-marked as transfers
- Categorise — regex rules assign a category (or “Uncategorized”)
- Tag — multiple tags applied for sub-classification
- Insert — written to SQLite with full audit trail
7. Start the dashboard
python -m apiOpen http://localhost:5050 in your browser. You will see:
- Dashboard — monthly income vs expenses chart, category breakdown, budget tracking
- Transactions — searchable, filterable list of all transactions
- Spreadsheet — financial year view with outgoing/incoming/rental tabs
- Tax — ATO return view with structured sections
8. Fix uncategorized transactions
In the Transactions view, filter by category “Uncategorized”. Click a transaction to change its category. The system learns from manual overrides — next time the same merchant description appears, it will auto-categorise.
You can also add regex rules to config/categories.yaml for bulk matching, then re-initialise:
ledger initNext steps
- Set up business splits for tax deductions
- Understand the source-of-truth system to prevent double-counting
- Learn about all CLI commands
- Browse the API reference