Variance analysis: budget vs actual with a driver-based forecast for a small company
Variance analysis made useful: build the budget from drivers, then split the budget vs actual gap into volume, mix, price and FX. A worked monthly example.
Variance analysis compares actual results with the budget and explains the gap, and a budget vs actual review is only useful if it tells you which assumption missed, not just by how much. Two habits make that possible. First, build the plan from drivers (customers, units per customer, price, unit costs) instead of "last year plus 10%". Second, when the month closes, split the gap into volume, mix, price and currency effects that add up exactly to the total. Then "we missed by 55 thousand" becomes "the discount cost 112 thousand, extra volume won back 52, the exchange rate flattered us by 17", and each line has an owner. Below: a one-month variance analysis example from a small online school, from plan to bridge.
Step 1: build the plan from drivers
A driver-based forecast starts from the operational numbers that cause the money and lets the sheet compute the money. For Klasna, an online tutoring school, one month is a chain:
lessons=active learners×lessons per learnercontribution per lesson=0.975×price−tutor payout−video (USD)×USD rate
(0.975 because the payment provider keeps 2.5% of what families pay.) Fixed costs come from drivers too: one support coordinator per started 400 active learners, plus salaries, office and the month's marketing.
September's plan:
Driver
Plan
Active learners
920
Lessons per learner
6.1
Lessons
5,612
Average price
650 UAH
Tutor payout
415 UAH
Video + AI
0.75 USD at 42.00 UAH
Contribution per lesson
187.25 UAH
Contribution
1,050,847 UAH
The working: 650−16.25−415−31.50=187.25 and 5,612×187.25=1,050,847. Sales are 5,612×650=3,647,800 UAH. Fixed costs of 1,022,000 (three coordinators 114,000, team 600,000, office and tools 88,000, marketing 220,000) leave a planned operating profit of just 28,847 UAH. September is a thin month.
A total like "last year + 10%" can't be argued with, because nobody can say what has to be true for it. Every driver here has an owner: marketing for learners, pricing for the price, the tutor agreement for the payout.
Klasna's planned contribution of 1,050,847 UAH is lessons times contribution per lesson, built from six drivers such as 920 active learners and a 650 UAH price, each with an owner
Step 2: budget vs actual, compared on the right line
September closes. The CEO's headline: "Sales 3,709,960 against 3,647,800, we beat the plan by 62,160!" The head of finance looks one line lower: contribution came in at 996,149.75, 54,697.25 below plan. If fixed costs landed on plan, the thin planned profit of 28,847 turned into a loss of about 25,850.
Selling more and earning less is exactly what variance analysis is for. Judge the month on contribution, never on sales alone.
Step 3: split the budget variance into causes
Klasna sells English, maths and programming, in Ukraine (UAH) and to EU families (EUR). Four effects explain the gap:
Volume: 5,890 lessons were delivered instead of 5,612. Value the extra 278 at the plan's average contribution: 278×187.25=+52,055.50.
Mix: which lessons came. A back-to-school promo pulled families toward English in Ukraine, the row that leaves the least (168.13 per lesson at plan prices, against 195.50–240.50 elsewhere), while programming fell by 120 lessons. Value each row's actual lessons at its own plan contribution, subtract all actual lessons at the plan average: −11,557.50.
Price, at plan exchange rates: English in Ukraine went from 615 to 585, 3,640×(−30)×0.975=−106,470; a programming deal cost 400×(−15)×0.975=−5,850. Total −112,320.
FX: the euro rose from 45 to 47 UAH and the dollar from 42 to 43.50. EU families paid 12,180 EUR: 12,180×2×0.975=+23,751. The USD video bill: 5,890×0.75×1.50=−6,626.25. Net +17,124.75.
Step
UAH
Plan contribution
1,050,847.00
Volume
+52,055.50
Mix
−11,557.50
Price
−112,320.00
FX
+17,124.75
Actual contribution
996,149.75
The bridge closes exactly: 52,055.50−11,557.50−112,320+17,124.75=−54,697.25. If yours doesn't close, a piece is double-counted or missing.
Step 4: read it and act
Separate performance from luck. Volume, mix and price together are −71,822. The weaker hryvnia hid about a quarter of that, and it can reverse next month.
Judge the promo on contribution. The discount cost 106,470 on all 3,640 English lessons, including families who would have come anyway. Even if every one of the 454 extra English lessons came from the promo, they leave at most 454×168.13=76,328.75. Net: −30,141.25 in the best case.
Feed the forecast. Replace September's assumed drivers with actuals (realized price, mix, rates), ask the owners whether the next months still hold, and add a month at the end. That's a rolling forecast: always twelve months ahead.
Honest limits
One month is thin evidence. Some promo families may stay for months; check their later lessons before calling the promo a failure.
The split depends on the order. Price is computed at plan rates and FX on actual volumes; another order shifts small amounts between lines. Pick one convention and keep it.
Contribution isn't everything. This bridge leaves out fixed costs; review them separately (a coordinator hired early is a fixed-cost variance).
A driver sheet can still be wrong. It is easier to argue with, not automatically right. Stress-test the drivers that matter most with scenarios and sensitivity.
Key takeaways
Build the budget from drivers with owners, not from last year's totals.
Compare actual with plan on contribution, not sales.
Split the gap into volume, mix, price and FX, and make the bridge add up.
Keep currency effects apart from the team's performance.
Update the drivers every month: the forecast rolls.
FAQ
What is the difference between a budget and a forecast?
A budget is the plan you commit to and measure against; a forecast is your current best estimate, updated as months close. The variance between them shows which assumptions moved.
How do you calculate a budget variance?
Actual minus budget, line by line, for the same period: Klasna's September contribution variance is 996,149.75 − 1,050,847 = −54,697.25 UAH. On revenue and profit lines a negative number is unfavourable; on cost lines a positive one is. The total tells you how much; the volume, mix, price and FX split tells you why.
What is a mix variance?
The effect of selling a different combination of products at the same total volume. If more sales come from low-margin rows, contribution falls even when the number of units is on plan.
How often should a small company do budget vs actual?
Monthly, as soon as the books close. Quarterly is too late to change anything in a seasonal business.