Skip to content

Series · 7 parts Published July 17, 2026

Budget variance reporter

A small system that compares actuals against budget each month, works out which variances are real rather than timing, pulls the transactions behind each one, and produces a short report naming the three or four that matter. It never adjusts a budget and never explains a number away. Seven posts on the same system — one diagram at a time — with a cost breakdown and an engineering reference at the end.

  1. 01

    A budget variance reporter on AWS for a few dollars a month

    The whole system on one page — a comparer, a timing filter and a reporter — plus the observation that makes it useful: most variance is timing, and timing resolves itself.

  2. 02

    How the period data arrives

    Why the transaction level is non-negotiable, what a period export has to contain, and how a restated period is absorbed without corrupting the history you already reported.

  3. 03

    How the budget gets shaped

    Why dividing an annual budget by twelve manufactures variances, three cheap ways to shape a line so it does not, and the lines where flat genuinely is right.

  4. 04

    How timing gets filtered out

    Four tests that separate a real variance from a difference in when something landed, and why a filtered variance is shown as filtered rather than hidden altogether.

  5. 05

    How the variance report reads

    One page, four lines, the transactions under each — and why the most interesting variance is the one with no single transaction behind it.

  6. 06

    What the budget variance reporter costs

    About $2 a month. One Bedrock read per period is the only line that grows; the queue, the table, the mail and the storage are rounding errors. Plus the three ways the bill could surprise you.

  7. 07

    Engineering reference: the budget variance reporter architecture

    Same system, drawn purely for engineers. Service names, region, Lambda inventory, IAM scopes, the schemas and the exact model id.

What is a budget variance reporter?
A small serverless system that compares each month’s actuals against budget, separates real variances from timing differences, pulls the transactions behind the ones that matter, and produces a short report. It reports; it never adjusts a budget or reclassifies a transaction.
Why not just read the management accounts?
Because a management accounts pack is forty lines and most of them are noise. The work is not producing the numbers — your accounting software already does that — it is working out which three or four of the forty deserve a conversation, and why.
What is a timing difference?
A variance caused by when something was posted rather than by anything real: an invoice that arrived a week late, a quarterly payment landing in a different month than budgeted, an accrual reversing. They look identical to real overspend in a single month and resolve themselves over two or three.
Does it need our accounting system’s API?
It needs a nominal transaction export per period, which every accounting package can produce on a schedule. An API is nicer; a scheduled CSV works.
What does it cost to run?
A couple of dollars a month. It runs once a period over a few thousand rows. See part six.
All posts