Variance analysis splits a budget variance, the difference between actual or forecast cost and the budget for the same scope, period and cost basis, into its causes: volume, price, mix, scope and exchange rate. The amount alone says only that a budget was missed. The split says who can respond: more usage belongs to the team that caused it, a different unit price to whoever owns commitments and contracts, an exchange-rate effect to finance.
How it works
Actual and budget compare only when four things match: the scope (the same accounts, projects or tags), the period, the cost basis and the currency. Which cost basis produces which figure is explained in list, billed, effective and amortized cost. A variance can also be split only as far as the budget itself goes. A budget that names one amount per scope holds no planned quantities or prices; against such an amount, scope, special items and exchange rate can be separated, but volume, price and mix only against the drivers of a plan such as a driver-based forecast sets out.
For each price position i, meaning a SKU at its price, q is the quantity in the pricing unit, p the unit price in the pricing currency on the budget's cost basis (where no column provides it, cost divided by quantity) and k the rate from pricing currency to budget currency; B stands for budget, A for actual. Q is the sum of quantities within a group sharing one unit, such as instance hours, and m = q / Q is a position's share of it.
Variance V = Σ qA·pA·kA − Σ qB·pB·kB
Volume effect VM = (QA − QB) · Σ mB·pB · kB
Mix effect VX = QA · Σ (mA − mB)·pB · kB
Price effect VP = Σ qA·(pA − pB) · kB
Exchange-rate effect VK = Σ qA·pA · (kA − kB)
Check VM + VX + VP + VK = V
The order decides which effect takes the interaction terms: volume at the planned price, price at the actual quantity, exchange rate last. It stays the same from month to month; otherwise amounts migrate between effects while nothing has changed. Mix is defined only within a group sharing one unit; across services with different units, the analysis stays at volume and price per position. The planning rate kB is the rate at which the budget was set (budget exchange rate).
Three blocks sit outside the formulas. The scope effect covers accounts, projects or subscriptions that appear only in the actual or only in the budget, and changed allocation rules; only the shared scope is split. Special items are credits, refunds, upfront payments, taxes and corrections to closed billing periods, kept apart by line type. The residual is whatever no rule explains, and it stands as a line of its own.
For cost, a variance above budget is unfavourable and one below it favourable. Each effect carries its own sign, and a favourable total can hide an unfavourable volume variance offset by a new commitment in the price effect.
Where the inputs come from
| Input | FOCUS | AWS CUR 2.0 | Azure cost details | Google Cloud export |
|---|---|---|---|---|
| Position | SkuPriceId | line_item_usage_type | MeterId | sku.id |
| Quantity | PricingQuantity | line_item_usage_amount | Quantity | usage.amount_in_pricing_units |
| Unit price | PricingCurrencyEffectiveCost / PricingQuantity, PricingCurrencyListUnitPrice | line_item_unblended_rate, pricing_public_on_demand_rate | EffectivePrice, PayGPrice | price.effective_price, price.list_price |
| Line type | ChargeCategory, ChargeClass | line_item_line_item_type | ChargeType, PricingModel | cost_type |
| Currency | BillingCurrency, PricingCurrency | line_item_currency_code | PricingCurrency, ExchangeRatePricingToBilling | currency, currency_conversion_rate |
In FOCUS, ListUnitPrice and ContractedUnitPrice are in the billing currency, the columns prefixed PricingCurrency in the pricing currency. The contracted unit price excludes commitment discounts; on an effective basis the unit price only comes from PricingCurrencyEffectiveCost divided by PricingQuantity. ContractedCost and ListCost must equal the unit price times PricingQuantity whenever both values are present. SkuPriceId stays consistent over time and carries neither the price amount nor the currency, which makes it the key for comparing prices across two periods; ChargeClass = Correction marks corrections to closed periods. On AWS, line_item_unblended_rate is zero on EC2 and RDS lines with an RI discount (DiscountedUsage), so the unit price there comes from cost divided by quantity on the budget's cost basis. Microsoft computes cost as EffectivePrice times Quantity, under a Microsoft Customer Agreement in the pricing currency and then times ExchangeRatePricingToBilling. Google fills price.effective_price in the detailed export from 13 April 2023, but in the standard export only from 15 July 2025; cost divided by currency_conversion_rate gives the amount in US dollars. How the providers fill FOCUS is shown in FOCUS columns and the providers' mapping.
What it means for your cost
Not every variance needs an explanation. A threshold built from two conditions keeps the review short: a variance is explained when V, ignoring its sign, exceeds a share t of the budget and at the same time an amount T, both set per scope in advance. The share alone flags small budgets over small amounts; the amount alone flags large budgets over small shares. The FinOps Foundation's Budgeting capability names acceptable variance between budget and actual by maturity: at most 20 percent at Crawl, 15 at Walk and 12 at Run. It also lists Percentage Variance of Budgeted vs. Forecasted CSP Cloud Spend there as a KPI, the variance between budget and forecast.
Each effect has someone who explains it:
| Effect | What triggers it | Who explains |
|---|---|---|
| Volume | more or less usage | the team that steers the usage |
| Mix | other instance types, regions, storage classes | team and architecture |
| Price | list price change, commitment started or expired, new contract | whoever owns commitments and contracts |
| Scope | new account, moved subscription, changed rule | whoever maintains allocation |
| Exchange rate | the provider's rate departs from the planning rate | finance |
The same split applies to forecast against budget. On actuals it explains the past; on the forecast it shows mid-month which effect is pushing the period over the amount while someone can still intervene. The comparison with the previous month follows the same effects and is covered in period comparison; where and when variances are discussed is described in the monthly cloud cost review.
Where it goes wrong
- Cost basis switched. Symptom: a commitment purchase shows up as a large unfavourable variance. Cause: the budget runs on effective cost, the actual on billed cost.
- Price read from the unblended rate. Symptom: on AWS the price effect jumps although no price changed. Cause: EC2 and RDS lines with an RI discount carry an unblended rate of zero, so a change in coverage reads as a price change.
- Mix hidden in volume. Symptom: instance hours are on plan, cost is above it. Cause: the analysis runs at service level, where more expensive types appear as volume.
- Exchange rate read as consumption. Symptom: the variance is unfavourable in euros and absent in dollars. Cause: the budget has no planning rate, so VK sits inside volume and price.
- Order switched. Symptom: amounts move between volume and price while nothing changed. Cause: the effects were calculated in a different order one month.
- A new account read as extra usage. Symptom: a team explains a volume variance it did not cause. Cause: an added account was not separated as a scope effect.
- Residual spread. Symptom: the effects always add up exactly. Cause: the unexplained residual was distributed over the effects instead of standing as its own line.
Sources
Read on 2026-10-16. FOCUS 1.4 Pricing Quantity, List Unit Price, Contracted Unit Price, Pricing Currency List Unit Price, Pricing Currency Effective Cost, List Cost, Contracted Cost, SKU Price ID, Charge Category, Charge Class, Billing Currency and Pricing Currency; AWS CUR 2.0 line item columns and pricing columns; Microsoft Understand usage details fields; Google Cloud Structure of Standard data export; FinOps Foundation Budgeting (CC BY 4.0).