Published on Nov. 17, 2025

Django Ledger v0.8.3

Transaction Matching and a New Data Import Experience

by Miguel Sanda

Miguel Sanda
v0.8.3 Image

After several weeks of work, I’ve just released Django Ledger 0.8.3. This is one of the larger updates I’ve shipped in a while, and the main focus is on two areas that users have asked for repeatedly: better transaction matching and a much cleaner way to import data, including credit card statements.

Here’s what changed.

Transaction Matching

Matching imported transactions against existing ledger entries is now more accurate and configurable.

  • The matching engine dynamically builds candidate querysets for transfers and debt payments.
  • A new setting, DJANGO_LEDGER_MATCH_DAYS_WINDOW (default 7 days), lets you control how far back or forward the system looks for matches.
  • When multiple possible matches exist, the interface shows clear messages instead of silently picking one.
  • StagedTransactionModel gained three new fields:
    • matched_transaction_model (one-to-one to the actual TransactionModel)
    • matched_transaction (boolean flag)
    • notes (free-text field for extra context)
  • The matched_transaction_model column is indexed for faster lookups.

Forms and formsets (TransactionModelForm, StagedTransactionModelFormSet, etc.) were refactored for consistent labels, help text, and dynamic field visibility, especially when splitting or bundling transactions.

Data Import Interface

The old import templates were showing their age, so I replaced them entirely.

  • Removed the three legacy templates (data_import_job_txs*.html) and introduced modular, reusable ones:
    • includes/staged_txs_form_card.html – card-based forms for each staged transaction
    • import_job_txs.html – single source for the main import table and actions
    • staged_tx_update.html – dedicated page for editing parent/child groups with live JavaScript filtering
  • Added ImportJobModelResetView – one-click way to clear matches and start over without losing the imported rows.
  • New annotations on import jobs (txs_imported_count, txs_pending, ready_to_match) make progress tracking immediate.
  • Credit card imports (CSV from Chase, Amex, etc.) now map cleanly to LIABILITY_CL_CREDIT_LINE accounts and suggest matches against the corresponding liability.

The UI uses collapsible cards for parent/child relationships, color-coded tags for income/expense/transfer, and responsive layouts that work on tablets and phones.

Smaller Improvements

  • Added light/dark theme toggle (persisted in localStorage)
  • Expanded GROUP_DEBT_PAYMENT to include ASSET_CA_CASH
  • Cleaned up imports, type hints, and view code across the board
  • Minor layout tweaks (wider side menu, clearer navigation labels)

Compatibility

Everything is backward compatible except the template paths – if you overrode the old data_import_job_txs*.html files, you’ll need to switch to the new structure. The default matching behavior is unchanged unless you set the new DJANGO_LEDGER_MATCH_DAYS_WINDOW.

Thanks for using the project.

Miguel November 17, 2025

Any Questions? Send me a Message!