Skip to main content
DoneThat

AI Adoption GuideFinanceReport

Variance report with driver attribution

ML decomposes plan-vs-actual variance into volume, price, and mix drivers with commentary.

Finance processPlanBudgetInvoiceCollectPayCloseReportAudit

By Don, DoneThat’s AI coach · updated

Freeze the plan and actuals before you name a driver

A variance line is only as trustworthy as the two snapshots it compares. Lock the plan version and the actuals cut before any model names volume, price, or mix. If either side can still move, the attribution is a draft, not a report.

FP&A already knows this from close. The plan is a named version, not "latest forecast." Actuals are a dated extract: GL, subledger, or commercial actuals that finance has accepted. Until both are frozen, a driver label is a guess about a moving target.

Planning and consolidation platforms such as Anaplan, Datarails, Vena, and Workday are the usual homes for those versions. Treat them as the system of record for the numbers, not as the author of the story. Pull the locked plan and the locked actuals from the same grain you will attribute: product family, channel, region, or cost center. Do not mix a SKU-level actuals file with a category-level plan and then ask a model to invent the missing slice.

If the grain does not match, stop. Re-cut the actuals or restate the plan. Attribution that papers over a grain mismatch will look precise and still be wrong.

The same discipline applies when last month's commentary is reused. Commentary is not a source. Only the locked plan and locked actuals are sources. A sentence from last pack can prompt a question. It cannot fill a driver cell.

Agree the allowed drivers before lock, not after. A driver-tree assumption suggestions tree is the in-scope list. Lock then tells you which of those drivers are actually populated in this period.

Cite volume, price, or mix from those locked sources

Once both sides are frozen, decompose the total variance into the drivers those sources actually contain. Volume needs a quantity on plan and a quantity on actuals. Price needs a rate or ASP on both sides, or a revenue and quantity pair from which a rate is derived at the same grain. Mix needs a composition: shares across SKUs, channels, or customers that exist on both the plan and the actuals.

If a driver is present, cite it. The citation is the field, the version, and the grain, not a paragraph. A volume line that cannot point to plan units and actual units is not a volume line.

Work a single product family as a check, not as a scorecard. Suppose family A closed with a revenue miss against the locked plan. The extract has plan units, actual units, plan ASP, and actual ASP at family grain. Volume and price can be named. The extract does not carry SKU shares inside the family. Mix cannot be named. The mix cell stays empty. That emptiness is the correct output.

Do not back into mix as a residual. Residual is unexplained, not mix. Calling the leftover mix is how invented mix percents enter the pack.

If quantity exists on one side only, volume is incomplete. If rate exists on one side only, price is incomplete. Incomplete drivers stay blank. The total variance can still be shown as a total. The total does not need a full waterfall to be honest.

The tree says which drivers are in scope. The locked files say which of those drivers are populated. Scope is not evidence.

Keep the mix line blank when mix is not in the data

Mix is the driver teams invent most often. Mix requires a weighted shift in composition at a defined grain. Without plan mix and actual mix at that grain, there is no mix effect to report.

Two failure modes sit here.

Attributing without a driver: the model, or the analyst, assigns volume, price, or mix because the waterfall template has three columns. A template is not a source. If mix is missing, the column is empty. If price is missing, the column is empty. Filling the column to make the waterfall add up trains the committee to trust a balancing figure.

Inventing a mix percent: someone takes unexplained variance, divides by plan revenue, and labels the ratio mix. That percent has no cited composition. It should never appear as a mix driver. If you need a placeholder for unexplained, label it unexplained and keep it out of the mix cell.

When mix is available, cite the composition tables: plan share by SKU (or channel, or customer cohort) and actual share at the same list. If the lists differ, you have a mapping problem, not a mix insight. Map or exclude. Do not average unlike members into a fake mix.

Empty cells are a quality signal. They tell the next reader what the sources could not support. Filling them to look complete is the quality failure.

Write the variance story after the table, not inside the model

The decomposition is evidence. The commentary is judgment. FP&A owns the commentary.

A model can draft sentence stems from cited drivers: volume down at family grain, price up at the same grain, mix not in source. That draft is a prompt. It is not the board line. Someone who knows the business decides whether the volume miss is a delayed deal, a lost logo, a shipment timing cut, or a definitional mismatch with bookings. The table cannot know that.

Do not let generated commentary smuggle in a driver the table left blank. If mix is empty, the narrative must not say adverse mix. If price is empty, the narrative must not say discounting. Commentary may raise a hypothesis in plain language ("we should check discounting in channel X") only if it is labeled as a question, not as a cited driver.

This is also where treating the decomposition as the board story fails. A waterfall that adds to the total is not an explanation of why the quarter happened. Boards need the cited drivers plus the operating context FP&A is willing to stand behind. Hand the cited table to whoever drafts the pack, then write. The board-pack narrative draft is the place that story belongs, after attribution, not instead of it.

Keep the variance report boring on purpose: locked versions, cited drivers, blanks where the source is silent, a named owner on the commentary. Boring is auditable.

Keep forecast updates and anomaly flags off this table

Adjacent work should stay adjacent. A ML rolling revenue forecast can change next month's plan. It must not quietly rewrite this month's locked plan after attribution has started. Budget anomaly flagging can tell you which lines deserve a look before you decompose. It does not name volume, price, or mix. Flag first if you use flags. Then lock, cite, and write.

The operating sequence is the control: lock plan and actuals, decompose only with cites, leave blanks, FP&A writes the story. Skip a step and you either attribute without a driver, invent mix, or ship a waterfall as if it were the minutes. None of those belong in a quality outcome.

Separate the artifacts. The variance report is a quality-controlled table: total variance, cited volume, cited price, cited mix, unexplained if you show it, empty where you cannot cite. The board narrative is a short argument that uses that table and does not exceed it.

If leadership wants a fuller story, they get it from FP&A, with hypotheses marked as hypotheses. They do not get a generated mix percent to make the bars fill the slide.

Is this worth automating for you?

Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.

DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.

Measure the baseline first