Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Decompose financial variances into drivers with narrative explanations and waterfall analysis. Use when analyzing budget vs. actual, period-over-period changes, revenue or expense variances, or preparing variance commentary for leadership.
.claude/skills/evolution-foundation-fin-variance-analysis/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 113% | 0% |
| case-15 | ✓→✗ | ▼ Worse | 153% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 153% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 187% | 0% |
Important: This skill assists with variance analysis workflows but does not provide financial advice. All analyses should be reviewed by qualified financial professionals before use in reporting.
Techniques for decomposing variances, materiality thresholds, narrative generation, waterfall chart methodology, and budget vs actual vs forecast comparisons.
The most fundamental variance decomposition. Used for revenue, cost of goods, and any metric that can be expressed as Price x Volume.
Formula:
Total Variance = Actual - Budget (or Prior)
Volume Effect = (Actual Volume - Budget Volume) x Budget Price
Price Effect = (Actual Price - Budget Price) x Actual Volume
Mix Effect = Residual (interaction term), or allocated proportionally
Verification: Volume Effect + Price Effect = Total Variance
(when mix is embedded in the price/volume terms)Three-way decomposition (separating mix):
Volume Effect = (Actual Volume - Budget Volume) x Budget Price x Budget Mix
Price Effect = (Actual Price - Budget Price) x Budget Volume x Actual Mix
Mix Effect = Budget Price x Budget Volume x (Actual Mix - Budget Mix)Example — Revenue variance:
Used when analyzing blended rates across segments with different unit economics.
Formula:
Rate Effect = Sum of (Actual Volume_i x (Actual Rate_i - Budget Rate_i))
Mix Effect = Sum of (Budget Rate_i x (Actual Volume_i - Expected Volume_i at Budget Mix))Example — Gross margin variance:
Used for analyzing payroll and people-cost variances.
Total Comp Variance = Actual Compensation - Budget Compensation
Decompose into:
1. Headcount variance = (Actual HC - Budget HC) x Budget Avg Comp
2. Rate variance = (Actual Avg Comp - Budget Avg Comp) x Budget HC
3. Mix variance = Difference due to level/department mix shift
4. Timing variance = Hiring earlier/later than planned (partial-period effect)
5. Attrition impact = Savings from unplanned departures (partially offset by backfill costs)Used for operating expense analysis when price/volume is not applicable.
Total OpEx Variance = Actual OpEx - Budget OpEx
Decompose by:
1. Headcount-driven costs (salaries, benefits, payroll taxes, recruiting)
2. Volume-driven costs (hosting, transaction fees, commissions, shipping)
3. Discretionary spend (travel, events, professional services, marketing programs)
4. Contractual/fixed costs (rent, insurance, software licenses, subscriptions)
5. One-time / non-recurring (severance, legal settlements, write-offs, project costs)
6. Timing / phasing (spend shifted between periods vs plan)Materiality thresholds determine which variances require investigation and narrative explanation. Set thresholds based on:
| Comparison Type | Dollar Threshold | Percentage Threshold | Trigger | |----------------|-----------------|---------------------|---------| | Actual vs Budget | Organization-specific | 10% | Either exceeded | | Actual vs Prior Period | Organization-specific | 15% | Either exceeded | | Actual vs Forecast | Organization-specific | 5% | Either exceeded | | Sequential (MoM) | Organization-specific | 20% | Either exceeded |
Set dollar thresholds based on your organization's size. Common practice: 0.5%-1% of revenue for income statement items.
When multiple variances exceed thresholds, prioritize investigation by:
[Line Item]: [Favorable/Unfavorable] variance of $[amount] ([percentage]%)
vs [comparison basis] for [period]
Driver: [Primary driver description]
[2-3 sentences explaining the business reason for the variance, with specific
quantification of contributing factors]
Outlook: [One-time / Expected to continue / Improving / Deteriorating]
Action: [None required / Monitor / Investigate further / Update forecast]Good variance narratives should be:
A waterfall (or bridge) chart shows how you get from one value to another through a series of positive and negative contributors. Used to visualize variance decomposition.
Starting value: [Base/Budget/Prior period amount]
Drivers: [List of contributing factors with signed amounts]
Ending value: [Actual/Current period amount]
Verification: Starting value + Sum of all drivers = Ending valueWhen a charting tool is not available, present as a text waterfall:
WATERFALL: Revenue — Q4 Actual vs Q4 Budget
Q4 Budget Revenue $10,000K
|
|--[+] Volume growth (new customers) +$800K
|--[+] Expansion revenue (existing customers) +$400K
|--[-] Price reductions / discounting -$200K
|--[-] Churn / contraction -$350K
|--[+] FX tailwind +$50K
|--[-] Timing (deals slipped to Q1) -$150K
|
Q4 Actual Revenue $10,550K
Net Variance: +$550K (+5.5% favorable)Complement the waterfall with a reconciliation table:
| Driver | Amount | % of Variance | Cumulative | |--------|--------|---------------|------------| | Volume growth | +$800K | 145% | +$800K | | Expansion revenue | +$400K | 73% | +$1,200K | | Price reductions | -$200K | -36% | +$1,000K | | Churn / contraction | -$350K | -64% | +$650K | | FX tailwind | +$50K | 9% | +$700K | | Timing (deal slippage) | -$150K | -27% | +$550K | | Total variance | +$550K | 100% | |
Note: Percentages can exceed 100% for individual drivers when there are offsetting items.
| Metric | Budget | Forecast | Actual | Bud Var ($) | Bud Var (%) | Fcast Var ($) | Fcast Var (%) | |--------|--------|----------|--------|-------------|-------------|---------------|---------------| | Revenue | $X | $X | $X | $X | X% | $X | X% | | COGS | $X | $X | $X | $X | X% | $X | X% | | Gross Profit | $X | $X | $X | $X | X% | $X | X% |
Track how accurate forecasts are over time to improve planning:
Forecast Accuracy = 1 - |Actual - Forecast| / |Actual|
MAPE (Mean Absolute Percentage Error) = Average of |Actual - Forecast| / |Actual| across periods| Period | Forecast | Actual | Variance | Accuracy | |--------|----------|--------|----------|----------| | Jan | $X | $X | $X (X%) | XX% | | Feb | $X | $X | $X (X%) | XX% | | ... | ... | ... | ... | ... | | Avg| | | MAPE | XX% |
Track how variances evolve over the year to identify systematic bias:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 10,467 | 9,197 | -12% | 1 | 1 | 0% | 1,615 | 4,084 | +153% | 0 | 0 | — |
case-02 | fail→fail | 6,291 | 9,039 | +44% | 1 | 1 | 0% | 1,148 | 4,330 | +277% | 0 | 0 | — |
case-03 | fail→fail | 24,569 | 18,958 | -23% | 1 | 1 | 0% | 5,283 | 6,345 | +20% | 0 | 0 | — |
case-04 | pass→pass | 5,770 | 4,096 | -29% | 1 | 1 | 0% | 1,229 | 3,526 | +187% | 0 | 0 | — |
case-05 | pass→pass | 5,703 | 4,969 | -13% | 1 | 1 | 0% | 1,214 | 3,741 | +208% | 0 | 0 | — |
case-06 | pass→pass | 6,437 | 5,595 | -13% | 1 | 1 | 0% | 1,318 | 3,843 | +192% | 0 | 0 | — |
case-07 | pass→pass | 13,381 | 10,611 | -21% | 1 | 1 | 0% | 2,060 | 4,226 | +105% | 0 | 0 | — |
case-08 | pass→pass | 10,881 | 4,931 | -55% | 1 | 1 | 0% | 1,727 | 3,502 | +103% | 0 | 0 | — |
case-09 | pass→pass | 11,938 | 4,696 | -61% | 1 | 1 | 0% | 2,026 | 3,387 | +67% | 0 | 0 | — |
case-10 | fail→pass | 13,279 | 9,071 | -32% | 1 | 1 | 0% | 2,129 | 4,070 | +91% | 0 | 0 | — |
case-11 | pass→pass | 5,402 | 6,358 | +18% | 1 | 1 | 0% | 1,013 | 3,936 | +289% | 0 | 0 | — |
case-12 | fail→pass | 12,398 | 9,429 | -24% | 1 | 1 | 0% | 2,060 | 4,379 | +113% | 0 | 0 | — |
case-13 | pass→pass | 10,386 | 12,533 | +21% | 1 | 1 | 0% | 1,670 | 4,581 | +174% | 0 | 0 | — |
case-14 | pass→pass | 9,524 | 10,516 | +10% | 1 | 1 | 0% | 1,551 | 4,311 | +178% | 0 | 0 | — |
case-15 | pass→fail | 12,407 | 10,664 | -14% | 1 | 1 | 0% | 1,746 | 4,421 | +153% | 0 | 0 | — |
case-16 | pass→pass | 4,336 | 4,207 | -3% | 1 | 1 | 0% | 892 | 3,480 | +290% | 0 | 0 | — |
case-17 | fail→fail | 10,126 | 7,526 | -26% | 1 | 1 | 0% | 1,562 | 3,843 | +146% | 0 | 0 | — |
case-18 | pass→pass | 13,804 | 13,321 | -3% | 1 | 1 | 0% | 1,805 | 4,548 | +152% | 0 | 0 | — |
case-19 | pass→pass | 11,876 | 11,424 | -4% | 1 | 1 | 0% | 1,953 | 4,365 | +124% | 0 | 0 | — |
case-20 | pass→pass | 7,987 | 4,538 | -43% | 1 | 1 | 0% | 1,632 | 3,515 | +115% | 0 | 0 | — |
case-21 | pass→pass | 14,698 | 10,525 | -28% | 1 | 1 | 0% | 2,761 | 4,606 | +67% | 0 | 0 | — |
case-22 | pass→pass | 8,503 | 7,735 | -9% | 1 | 1 | 0% | 1,344 | 3,803 | +183% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.