FlowParse
Reporting 10 August 2026 17 min read

Variance analysis that people actually read

Somewhere in most organisations there is a monthly document with a column headed “variance” and a column headed “commentary”, and the commentary column says things like “higher than budget due to increased spend”. It is produced carefully, distributed widely, and read by almost nobody. This is about why, and what to write instead.

FlowParse
flowparse.io

The commentary column

There is a particular kind of sentence that appears in variance commentary everywhere, and it always has the same shape: a restatement of the number, followed by a paraphrase of the category name. “Travel costs exceeded budget owing to higher travel expenditure.” It is not wrong. It is simply information-free, and it is written in enormous quantities every month.

It happens for an understandable reason. The person filling in the cell often does not know why the number moved, has thirty cells to fill, and has learned that a plausible sentence gets accepted while an empty cell gets chased. The system rewards filling the cell, so the cell gets filled.

Fixing it is not a writing problem. It is a design problem: fewer cells, better data underneath them, and a shared vocabulary for causes so that the sentence has somewhere useful to go.

Why the report goes unread

Ask people why they skip the variance pack and the answers are consistent, and none of them are about the analysis being wrong.

It is too long. Thirty explained lines is not thirty times as useful as one; it is less useful, because the reader has to do the prioritisation the report should have done.

It arrives too late. Commentary on a month that ended three weeks ago describes a situation that has already moved on. Late information is not half as valuable as timely information — for decision-making it is often worth nothing.

It cries wolf. If most red cells turn out to be timing, readers learn to ignore red. That learning is rational, permanent, and it costs you the one month when red meant something.

It cannot be checked. When a reader doubts a number and has no way to look underneath it, the doubt is unresolvable, and unresolvable doubt turns into disengagement rather than into a question.

FlowParse
flowparse.io

The number is not the message

The variance figure is already in the table. Repeating it in prose adds nothing. The commentary exists to supply the three things the table cannot: the cause, whether it repeats, and what if anything should happen.

Commentary that adds nothingCommentary that does
Over budget due to increased spendAnnual licence renewed in full this month; budget phased evenly. Neutral over the year.
Higher than forecastSupplier raised unit rates in April; same volume. Recurs monthly from here.
Marketing overspendCampaign brought forward from Q3 at the board's request. Q3 will be correspondingly light.
Under budgetTwo roles unfilled. Recruitment paused pending the reorganisation; salary underspend will not reverse.
Timing differenceInvoice received 29th, paid 2nd. Reverses next month; no change to the annual total.
VariousThree unrelated items, none individually material. Detail available on request.

The right-hand column is not longer in any meaningful sense — one sentence each. What it contains is a cause and a consequence, and it is the consequence that turns commentary into something a reader can act on. “Recurs monthly from here” changes a decision; “higher than forecast” does not.

The last row is worth noticing. “Various” with an honest admission that nothing was individually material is a legitimate entry. Manufacturing a story for an immaterial line is worse than declining to.

Four causes worth naming

Almost every variance is one of four things. Publishing that vocabulary at the top of the report changes behaviour more than any analytical improvement, because budget holders start classifying their own variances before anyone asks.

CauseMeansReverses?Action
TimingRight amount, wrong monthYesNote it; phase better next year
PriceSame quantity, different rateNoRenegotiate, substitute, or accept
VolumeDifferent quantity, same rateDependsCheck it tracks activity
UnplannedSomething not in the budgetUsually notDecide: absorb, or reforecast

The “reverses” column is the one readers scan first once they know it exists, because it is the only column that says whether this is a problem or a wobble.

Timing, the majority of what you will see

In a monthly report against an evenly phased budget, timing is the single largest source of variance and the least interesting. It is also the one that does the most damage when left unlabelled, because it trains readers that red means nothing.

Timing variances come from three places. Annual and quarterly payments hit one month against a budget spread across twelve. Payment terms move a cost into the following month. And pay dates near a month end occasionally put two payroll runs into one period.

All three are predictable. The best response is not better commentary but a better-phased budget: put the annual premium in the month it is paid, and the variance never appears. That is an hour of work at budget time that removes a recurring monthly distraction for a year.

Where phasing is impractical, flag the line once and carry the flag forward. After the second month, a recurring flagged timing item can drop off the exception list automatically — which is the point at which the report starts getting shorter rather than longer.

Price and volume, separated

Combining price and volume into a single number is the most common analytical shortcut in variance reporting, and it destroys the information that would have made the variance actionable.

The two lead to opposite responses. A price variance is a supplier conversation: renegotiate, substitute, or accept and reforecast. A volume variance is an activity question: are we doing more because the business grew, or because something is being consumed wastefully? Reported together as “materials over budget”, neither conversation happens.

Separating them needs quantities, not just totals, which is why this analysis is easy on some lines and impossible on others. Where the underlying documents carry quantities and unit prices — supplier invoices, in particular — the split is straightforward, and our line-item extraction covers getting those fields out of the documents rather than re-keying them.

Where only a payment total exists, say so. “Price and volume cannot be separated from bank data alone” is an honest sentence, and it is also a quiet argument for capturing the invoices rather than only the payments.

Genuinely unplanned

The residual category, and the one that most deserves attention: something happened that the budget did not contemplate at all.

These are worth reporting individually rather than folding into a category total, because the decision they demand is different. A timing variance needs a note. A price variance needs a conversation. An unplanned cost needs a decision about whether it is absorbed within the existing budget or the forecast changes.

They are also the best evidence for next year’s contingency line. Keeping a running list of unplanned items across the year gives you a defensible number at the next budget round, instead of the round percentage most organisations pick because it sounds prudent. The budget-building guide covers how that list feeds back in.

FlowParse
flowparse.io

The underspend trap

Favourable variances get skipped. There is limited time, red cells feel urgent, and an underspend looks like it takes care of itself. This is the most reliable way to miss something important.

An underspend can be a delay. The project has not started. The cost is coming, and it will arrive compressed into fewer months.

An underspend can be a missing invoice.The work happened, the document has not arrived, and the cost lands next month on top of next month’s own.

An underspend can be a capability problem. A training budget unspent for eight consecutive months is not a saving; it is a signal about how the organisation is operating, and it will not show up anywhere else.

An underspend can be a genuine saving. It happens, it is worth naming, and it is worth distinguishing loudly from the three cases above so that it can actually be recognised.

Sentence patterns that work

Commentary improves fastest when people have a pattern to fill rather than a blank cell to fear. Four patterns cover nearly everything.

Timing:“[What] paid in [month] against a budget phased [how]. Neutral over the year.”

Price:“[Supplier] increased rates by [extent] from [date]; volume unchanged. Recurs from here.”

Volume:“[Activity] ran [higher/lower] than planned; unit rates unchanged. Tracks the [revenue/output] line.”

Unplanned:“[What happened], not in budget. [Absorbed within category / forecast increased by X].”

Each names a cause and states a consequence. That is the whole specification. Give budget holders these four patterns and the quality of the commentary changes in one cycle, without anyone being trained in financial writing.

How long the exception list should be

Short enough to finish before the meeting. In practice that means five or six lines, which is a statement about attention rather than about materiality.

Getting there requires a threshold with two conditions: a cash floor and a percentage of the line’s budget, applied together. The cash floor stops small lines generating alarm; the percentage stops a genuine problem hiding inside a big number. Either test alone produces a list nobody reads.

Set the numbers so a normal month yields five or six rows, then leave them alone for a year. Thresholds adjusted mid-year become a lever for making an uncomfortable month look calmer, which is exactly the failure they exist to prevent.

Everything below the threshold still belongs in the report — as the table, without commentary. The table is context; the exception list is the message. Conflating the two is how a two-page report becomes a fifteen-page pack.

Traceability changes the meeting

The first ten minutes of a typical budget meeting are spent establishing whether the numbers can be trusted. Was that cost double-counted? Is that department’s figure net of the recharge? Did last month’s number change?

Those minutes are not a failure of the participants. They are a rational response to a report that cannot be interrogated. When a variance opens onto the individual payments beneath it, the question takes fifteen seconds and the meeting moves on to the business.

This is why the underlying data layer matters more than the analytical layer. A sophisticated variance model over untraceable data produces sophisticated numbers that get argued with. A plain comparison over data where every row records its source document and account produces plain numbers that get acted on. The mechanics are on the period comparison page, and the reporting layer on budget versus actual.

FlowParse
flowparse.io

Period versus cumulative

A single month is noisy. Year to date is smooth but slow to reveal a change. Reporting only one of them guarantees a systematic error in how the report is read.

Show both, side by side, and the pattern between them becomes the most informative thing on the page. A month over budget while the year to date is on plan is almost always timing. A month on plan while the year to date drifts is a slow leak that no single month would have flagged.

The second pattern is the one that costs organisations money, precisely because no individual month ever looked wrong enough to discuss. A cumulative column is the only place it becomes visible.

Where the year is long enough for the original plan to have gone stale, add a third column for the current forecast — and keep the original budget visible beside it. Replacing the budget with the forecast makes every variance disappear and takes the information with it.

Materiality in practice

“Material” is one of those words that sounds precise and is used to mean whatever the speaker needs it to mean. In variance reporting it has a workable definition: material is anything that would change a decision if you knew about it.

That definition is useful because it immediately rules things out. A variance that is large but entirely outside anyone’s control changes no decision and can be noted once rather than explained monthly. A variance that is small but signals a recurring price rise changes a decision — someone should call the supplier — and deserves a line despite its size.

SituationPasses a threshold?Worth explaining?
Annual premium in the month it is paidYes, easilyOnce, then flag it and stop
Small recurring price riseNoYes — it compounds all year
Large one-off, already approvedYesNo — the decision was already taken
Underspend from an unfilled roleOften yesYes — it will not reverse
Three unrelated small itemsOnly in aggregateAs one line, honestly labelled

Rows two and three are the ones a purely numerical threshold gets backwards. The small compounding price rise is exactly what an automated exception list will miss, and the large approved one-off is exactly what it will surface every month until someone silences it manually.

This is the argument for a person reading the exception list before it goes out. Not to rewrite it — to add the one line the threshold could not have known about, and to remove the one it should not have raised. Five minutes, and it is the difference between a report that behaves like a colleague and one that behaves like an alert system.

It is also why materiality should be reviewed once a year rather than tuned continuously. A threshold adjusted whenever it produces an inconvenient result has stopped measuring anything, and everyone involved will know it.

The variance that keeps coming back

Some lines are over budget every single month. By the fourth month the commentary has become a copy of the third, and by the sixth nobody reads that row at all. This is a specific failure with a specific fix.

A variance that recurs is not a variance any more. It is a budget that was wrong. Continuing to report it monthly as an exception wastes attention and, worse, teaches readers that the exception list contains permanent furniture.

The correct response depends on which of the four causes it is. Recurring timing means the phasing is wrong: fix the phasing at the next budget round and the variance disappears without any change to the business. Recurring price means the rate assumption is wrong: reforecast, and say by how much. Recurring volume means the activity assumption is wrong, which is usually the most interesting of the three because it says something about the business rather than about the spreadsheet.

In all three cases the budget itself stays as it was set. That is worth being firm about, because the temptation to quietly adjust it is strongest exactly here. Reforecast in a separate column, leave the original commitment visible, and let the growing gap between them be the signal — it is one of the more honest numbers a management pack can carry.

Practically, mark the row as a known recurring item and drop it from the exception list after the second appearance, with a single standing note at the foot of the report. The list gets shorter every month instead of longer, which is the behaviour that keeps it being read.

If several lines are permanently out, the problem is not the reporting at all — it is that the budget was built badly, most often by taking last year’s actual and adding a percentage without stripping the one-offs first. No amount of monthly commentary compensates for that, and pretending otherwise consumes a year.

Underneath all of this sits an unglamorous point that is easy to lose among the writing advice. The quality of variance commentary is capped by the quality of the data it describes. A team working from untraceable aggregates cannot name a cause reliably, because they cannot see whether the movement was one large payment or forty small ones — and those two situations demand completely different sentences. Every improvement described on this page is cheap once the underlying transactions are in one place with consistent categories, and close to impossible before that. If the commentary in your organisation is weak, the fix is more likely to be in how the data gets assembled than in how the sentences get written.

Tone, and the blame problem

Variance reporting sits close to performance management, and the closer it sits, the worse the information gets. If explaining an overspend feels like mounting a defence, the explanations will be optimised for defence rather than accuracy.

The symptoms are recognisable. Causes become vague. Costs get moved between categories to smooth a line. Genuinely unplanned items acquire elaborate justifications. None of this is dishonesty exactly — it is a predictable response to what the process rewards.

Keeping the two separate is mostly a matter of language. Report causes, not people. Treat timing and price as facts. Reserve judgement for the decisions the variance prompts, not for the variance itself. A budget holder who can say “I got this wrong” in a report without consequence is giving you far better information than one who cannot.

The meeting itself

A well-built variance report makes the meeting shorter, and a short meeting is worth designing for deliberately.

Circulate the pack in advance and do not present it. Reading a document aloud to people who can read consumes most of the available time and produces no discussion. Start instead with the first exception line.

Go through the exception list only. The full table is context and does not need narrating. Six lines, each with one sentence already written, and the discussion is about what to do rather than about what happened.

End with decisions and owners, recorded where next month’s report can pick them up. A variance discussion that produces no recorded decision will produce the same discussion next month, which is how a monthly meeting becomes a ritual.

What to automate and what not to

The mechanical parts of variance reporting are almost entirely automatable, and the interpretive parts are almost entirely not. Confusing the two produces either a report nobody trusts or a process nobody has time for.

Automate

  • Assembling every account into one dataset
  • Checking the statement series for gaps
  • Excluding internal transfers
  • Applying the category list
  • Calculating variances and applying thresholds
  • Carrying forward flagged timing items

Do not automate

  • Deciding which of the four causes applies
  • Judging whether an underspend is good news
  • Writing the consequence half of the sentence
  • Deciding whether to absorb or reforecast
  • Choosing what belongs in the meeting
  • Anything that will be quoted in a decision

The left-hand column is where the time goes today, and it is the column that requires no judgement whatsoever. Moving it takes the preparation from days to hours, and — more usefully — moves the report earlier in the month, which is the single change that most affects whether it gets read.

FlowParse
flowparse.io

Frequently asked questions

Get the report out earlier

Most of the delay is assembly, not analysis. Convert every account for last month in one pass and see how much of the fifteenth you get back.

Related