Variance Bridge Analyzer
When to use
Use whenever actuals diverge from plan and someone needs to know why, not just by how much — replacing a variance report that states "revenue missed by $400K" with no explanation of whether that came from selling less, selling for less, or a mix of both.
What it does
Decomposes revenue variance into volume effect (the impact of selling more or fewer units than planned, at planned price) and price effect (the impact of realizing a different price than planned, at actual volume) per product via a bundled calculator, with the two effects reconciling exactly to the total variance — no unexplained residual.
Method
- Gather plan and actual volume and price by product — the bridge only works at this level of granularity; a single blended company-wide number can't be decomposed into volume and price effects meaningfully.
- Run the bundled calculator (
scripts/variance_bridge.py), which computes volume effect as the change in units times planned price, and price effect as the change in price times actual units — a standard, consistent sequencing convention that ensures the two effects sum exactly to the total variance.
- Check that the bridge reconciles. Volume effect plus price effect should equal the total variance exactly, for every product and in total — if it doesn't, an input is wrong; the whole value of a bridge is that it ties out.
- Read the ratio between volume and price effect to characterize the story: if one effect is more than 1.5x the other, it's primarily a volume story or primarily a price story; if they're closer in size, both levers need investigating.
- Investigate the actual driver behind whichever effect dominates — a volume story might trace to a specific lost account, a channel underperforming, or a competitive loss; a price story might trace to discounting, a mix shift toward lower-priced products, or list price execution failing.
- Report the bridge, not just the conclusion. Showing the product-level table lets a skeptical reader verify the story themselves rather than trusting a one-line summary.
- Carry the finding into the next forecast cycle — if this month's miss was a volume problem in one specific product, next month's forecast should reflect that reality, not just extrapolate the prior plan forward.
Inputs
- Plan and actual volume by product
- Plan and actual price by product
- Config saved as JSON matching the format documented at the top of
scripts/variance_bridge.py
Output format
Product-level table of plan revenue, actual revenue, volume effect, price effect, and total variance; company-level totals; a plain-language read on whether the variance is primarily a volume story, a price story, or both.
Example
A $9,400 total revenue miss looks like a small, uniform shortfall until the bridge shows it's actually two very different stories: Product A grew volume but gave back price (net positive $4,500), while Product B lost significant volume with price roughly on plan (net negative $13,900). The real finding is Product B's volume loss, not a company-wide pricing problem the blended number might have suggested.
Common pitfalls
- Reporting variance as a single dollar figure with no breakdown, leaving leadership unable to act on the finding.
- Computing volume and price effects with an inconsistent sequencing convention, so they don't reconcile to the actual total variance.
- Stopping at "volume was the driver" without tracing to the specific account, channel, or product behind the volume miss.
1---2name: variance-bridge-analyzer3description: Decomposes a budget-to-actual revenue variance into price and volume effects per product via a bundled calculator that reconciles exactly to the total variance, so "we missed by $400K" becomes a specific, actionable story instead of one unexplained number. Use whenever the user needs to explain why actuals differ from plan, is preparing a variance explanation for leadership, or has a variance reported as a single dollar figure with no breakdown of what actually drove it.4---56# Variance Bridge Analyzer78## When to use9Use whenever actuals diverge from plan and someone needs to know why, not just by how much — replacing a variance report that states "revenue missed by $400K" with no explanation of whether that came from selling less, selling for less, or a mix of both.1011## What it does12Decomposes revenue variance into volume effect (the impact of selling more or fewer units than planned, at planned price) and price effect (the impact of realizing a different price than planned, at actual volume) per product via a bundled calculator, with the two effects reconciling exactly to the total variance — no unexplained residual.1314## Method151. **Gather plan and actual volume and price by product** — the bridge only works at this level of granularity; a single blended company-wide number can't be decomposed into volume and price effects meaningfully.162. **Run the bundled calculator** (`scripts/variance_bridge.py`), which computes volume effect as the change in units times planned price, and price effect as the change in price times actual units — a standard, consistent sequencing convention that ensures the two effects sum exactly to the total variance.173. **Check that the bridge reconciles.** Volume effect plus price effect should equal the total variance exactly, for every product and in total — if it doesn't, an input is wrong; the whole value of a bridge is that it ties out.184. **Read the ratio between volume and price effect** to characterize the story: if one effect is more than 1.5x the other, it's primarily a volume story or primarily a price story; if they're closer in size, both levers need investigating.195. **Investigate the actual driver behind whichever effect dominates** — a volume story might trace to a specific lost account, a channel underperforming, or a competitive loss; a price story might trace to discounting, a mix shift toward lower-priced products, or list price execution failing.206. **Report the bridge, not just the conclusion.** Showing the product-level table lets a skeptical reader verify the story themselves rather than trusting a one-line summary.217. **Carry the finding into the next forecast cycle** — if this month's miss was a volume problem in one specific product, next month's forecast should reflect that reality, not just extrapolate the prior plan forward.2223## Inputs24- Plan and actual volume by product25- Plan and actual price by product26- Config saved as JSON matching the format documented at the top of `scripts/variance_bridge.py`2728## Output format29Product-level table of plan revenue, actual revenue, volume effect, price effect, and total variance; company-level totals; a plain-language read on whether the variance is primarily a volume story, a price story, or both.3031## Example32A $9,400 total revenue miss looks like a small, uniform shortfall until the bridge shows it's actually two very different stories: Product A grew volume but gave back price (net positive $4,500), while Product B lost significant volume with price roughly on plan (net negative $13,900). The real finding is Product B's volume loss, not a company-wide pricing problem the blended number might have suggested.3334## Common pitfalls35- Reporting variance as a single dollar figure with no breakdown, leaving leadership unable to act on the finding.36- Computing volume and price effects with an inconsistent sequencing convention, so they don't reconcile to the actual total variance.37- Stopping at "volume was the driver" without tracing to the specific account, channel, or product behind the volume miss.