Nathan Henderson, CPA
Personal site for projects and writing.

Treasurer flash report

Public accountingpython
2026-05-17

Turns standard Sage 50 exports into a plain-English flash report a board can actually read.

Preview of the Treasurer Flash Report sample output

What I built

  • Normalizes Sage 50 workbook quirks including comparative spacer columns, Excel serial dates, and sparse ledger rows.
  • Combines financial summary, cash position, major variances, significant transactions, and decisions needed into one report.
  • Accepts safe Markdown treasurer notes so the finance narrative stays close to the numbers.

Context

Non-profit finance workflow ยท Volunteer treasurers and NPO finance teams

Stack

Python / pandas / openpyxl / WeasyPrint / HTML

Outcomes

  • Parses Sage 50 balance sheet, income statement, trial balance, general ledger, and cheque log exports.
  • Generates an email-friendly HTML report with cash summary, variance commentary, notable transactions, and treasurer notes.
  • Keeps PDF generation optional so parsing and report validation can be tested independently.

The tool takes monthly Excel exports and produces an email-friendly HTML report, with optional PDF output, focused on cash position, financial result, major variances, significant transactions, risks, and decisions needed. Treasurer notes can be added in safe Markdown so the finance narrative stays close to the numbers.

The hard part is not the final layout. It is making Sage 50 exports reliable enough to summarize: comparative reports have extra headers and blank spacer columns, dates can arrive as Excel serial numbers, and general ledger exports are sparse account trees rather than clean tables.