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

InputFOCUSAWS CUR 2.0Azure cost detailsGoogle Cloud export
PositionSkuPriceIdline_item_usage_typeMeterIdsku.id
QuantityPricingQuantityline_item_usage_amountQuantityusage.amount_in_pricing_units
Unit pricePricingCurrencyEffectiveCost / PricingQuantity, PricingCurrencyListUnitPriceline_item_unblended_rate, pricing_public_on_demand_rateEffectivePrice, PayGPriceprice.effective_price, price.list_price
Line typeChargeCategory, ChargeClassline_item_line_item_typeChargeType, PricingModelcost_type
CurrencyBillingCurrency, PricingCurrencyline_item_currency_codePricingCurrency, ExchangeRatePricingToBillingcurrency, 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:

EffectWhat triggers itWho explains
Volumemore or less usagethe team that steers the usage
Mixother instance types, regions, storage classesteam and architecture
Pricelist price change, commitment started or expired, new contractwhoever owns commitments and contracts
Scopenew account, moved subscription, changed rulewhoever maintains allocation
Exchange ratethe provider's rate departs from the planning ratefinance

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).