Validate FOCUS data

This document helps you validate FOCUS data by comparing it to actual and amortized cost data from Cost Management. The goal of this article is to help you familiarize yourself with and transition to FOCUS data with confidence. To learn more about FOCUS, refer to the FOCUS overview.

The comparisons in this document are focused on costs, prices, and quantities to facilitate validating numbers across datasets. For details about text and dates, refer to Updating reports to use FOCUS columns.

FOCUS includes both actual and amortized data in a single dataset. So, there are more rows in FOCUS than you find in either the actual or amortized cost datasets. However, there are fewer records than actual and amortized datasets together since many records are duplicated across actual and amortized datasets.


Compare FOCUS with actual cost

The following mapping can be used to compare FOCUS with an actual cost data in Cost analysis or other cost API or export.

Actual cost column FOCUS column Notes
BenefitId CommitmentDiscountId Avoid using ReservationId in Cost Management. Prefer BenefitId to include savings plans and map to the fully qualified ID. Actual cost is 0 for commitment usage.
BillingPeriodEndDate + 1 day BillingPeriodEnd FOCUS uses exclusive end dates (for example, Feb 1 instead of Jan 31).
BillingPeriodStartDate BillingPeriodStart
ChargeType == "Usage" ChargeCategory == "Usage"
and CommitmentDiscountStatus != "Unused"
FOCUS categorizes unused commitments in the usage charge category.
ChargeType == "Purchase" ChargeCategory == "Purchase"
and ChargeClass == null
FOCUS categorizes refunds into the individual charge categories.
ChargeType == "Refund" ChargeClass == "Correction" FOCUS categorizes refunds into the individual charge categories.
ChargeType == "RoundingAdjustment" ChargeCategory == "Adjustment"
CostInBillingCurrency BilledCost FOCUS BilledCost maps to actual cost that is on the invoice. BilledCost can't be compared to the amortized cost dataset.
Date ChargePeriodStart FOCUS has separate start and end times for the date of the charge. Generally, you only need the start time.
PayGPrice * Quantity (EA)
PaygCostInBillingCurrency (Microsoft Customer Agreement (MCA) only)
ListCost
PayGPrice (EA)
PayGPrice * ExchangeRate (MCA)
ListUnitPrice FOCUS prices use the billing currency while actual/amortized prices use the pricing currency for MCA.
PricingModel == "OnDemand" PricingCategory == "Standard"
PricingModel == "Spot" PricingCategory == "Dynamic"
PricingModel == "Reservation" PricingCategory == "Committed" and CommitmentDiscountType == "Reservation" FOCUS PricingCategory merges all commitments. Use CommitmentDiscountType or CommitmentDiscountCategory to differentiate commitment discount types. Actual cost is 0 for commitment usage.
PricingModel == "SavingsPlan" PricingCategory == "Committed" and CommitmentDiscountType == "Savings Plan" FOCUS PricingCategory merges all commitments. Use CommitmentDiscountType or CommitmentDiscountCategory to differentiate commitment discount types. Actual cost is 0 for commitment usage.
PricingModel == "Reservation" or PricingModel == "SavingsPlan" PricingCategory == "Committed" FOCUS PricingCategory merges all commitments. Actual cost is 0 for commitment usage.
ProductId (MCA) SkuId
Quantity ConsumedQuantity FOCUS ConsumedQuantity is only available for usage. There might be cases where ConsumedQuantity differs from actual/amortized Quantity due to inconsistent units between Quantity and UnitOfMeasure.
Quantity PricingQuantity / x_PricingBlockSize FOCUS PricingQuantity is based on the pricing block size, if applicable, while actual/amortized Quantity isn't. There might be cases where PricingQuantity differs from actual/amortized Quantity due to inconsistent units between Quantity and UnitOfMeasure.
SubscriptionId SubAccountId FOCUS subaccount maps to subscriptions.
UnitPrice (EA)

UnitPrice * ExchangeRate (MCA)
ContractedUnitPrice / x_PricingBlockSize FOCUS ContractedUnitPrice is based on the pricing block size while actual/amortized UnitPrice isn't. In many cases, they're the same when x_PricingBlockSize is 1, but they differ if pricing block size is larger. FOCUS prices use the billing currency while actual/amortized prices use the pricing currency for MCA.
UnitPrice * Quantity (EA)

UnitPrice * Quantity * ExchangeRate (MCA)
ContractedCost FOCUS prices use the billing currency while actual/amortized prices use the pricing currency for MCA.
UnitOfMeasure PricingUnit FOCUS PricingUnit is parsed out of UnitOfMeasure. For an exact match, refer to x_PricingUnitDescription. FOCUS ConsumedUnit matches PricingUnit while the quantities might differ based on x_PricingBlockSize.

Compare FOCUS with amortized cost

The following mapping can be used to compare FOCUS with an amortized cost data in Cost analysis or other cost API or export.

Amortized cost column FOCUS column Notes
BenefitId CommitmentDiscountId Avoid using ReservationId in Cost Management. Prefer BenefitId to include savings plans and map to the fully qualified ID.
BillingPeriodEndDate + 1 day BillingPeriodEnd FOCUS uses exclusive end dates (for example, February 1 instead of January 31).
BillingPeriodStartDate BillingPeriodStart
ChargeType == "Usage" ChargeCategory == "Usage"
and CommitmentDiscountStatus != "Unused"
FOCUS categorizes unused commitments in the usage charge category.
ChargeType == "Usage"
or ChargeType == "UnusedReservation"
or ChargeType == "UnusedSavingsPlan"
ChargeCategory == "Usage" FOCUS categorizes unused commitments in the usage charge category.
ChargeType == "Purchase" ChargeCategory == "Purchase"
and ChargeClass == null
and ServiceName != "Azure Savings Plan for Compute"
and ServiceName != "Azure Reservations"
FOCUS categorizes commitment purchases and all refunds in the purchase charge category.
ChargeType == "Refund" ChargeClass == "Correction" FOCUS categorizes refunds into the individual charge categories.
ChargeType == "RoundingAdjustment" ChargeCategory == "Adjustment"
ChargeType == "UnusedReservation" CommitmentDiscountStatus == "Unused" and CommitmentDiscountType == "Reservation" FOCUS separates the commitment discount status and type in separate columns.
ChargeType == "UnusedSavingsPlan" CommitmentDiscountStatus == "Unused" and CommitmentDiscountType == "Savings Plan" FOCUS separates the commitment discount status and type in separate columns.
ChargeType == "UnusedReservation"
or ChargeType == "UnusedSavingsPlan"
CommitmentDiscountStatus == "Unused" FOCUS separates the commitment discount status and type in separate columns.
CostInBillingCurrency EffectiveCost FOCUS EffectiveCost maps to amortized cost. EffectiveCost can't be compared to the actual cost dataset.
Date ChargePeriodStart FOCUS has separate start and end times for the date of the charge. Generally, you only need the start time.
PayGPrice * Quantity (EA)

PaygCostInBillingCurrency (MCA only)
ListCost
PayGPrice (EA)

PayGPrice * ExchangeRate (MCA)
ListUnitPrice FOCUS prices use the billing currency while actual/amortized prices use the pricing currency for MCA.
PricingModel == "OnDemand" PricingCategory == "Standard"
PricingModel == "Spot" PricingCategory == "Dynamic"
PricingModel == "Reservation" PricingCategory == "Committed" and CommitmentDiscountType == "Reservation" FOCUS PricingCategory merges all commitments. Use CommitmentDiscountType or CommitmentDiscountCategory to differentiate commitment discount types.
PricingModel == "SavingsPlan" PricingCategory == "Committed" and CommitmentDiscountType == "Savings Plan" FOCUS PricingCategory merges all commitments. Use CommitmentDiscountType or CommitmentDiscountCategory to differentiate commitment discount types.
PricingModel == "Reservation" or PricingModel == "SavingsPlan" PricingCategory == "Committed" FOCUS PricingCategory merges all commitments.
ProductId (MCA) SkuId
Quantity ConsumedQuantity FOCUS ConsumedQuantity is only available for usage. There might be cases where ConsumedQuantity differs from actual/amortized Quantity due to inconsistent units between Quantity and UnitOfMeasure.
Quantity PricingQuantity / x_PricingBlockSize FOCUS PricingQuantity is based on the pricing block size, if applicable, while actual/amortized Quantity isn't. There might be cases where PricingQuantity differs from actual/amortized Quantity due to inconsistent units between Quantity and UnitOfMeasure.
SubscriptionId SubAccountId FOCUS subaccount maps to subscriptions.
UnitPrice (EA)
UnitPrice * ExchangeRate (MCA)
ContractedUnitPrice / x_PricingBlockSize FOCUS ContractedUnitPrice is based on the pricing block size while actual/amortized UnitPrice isn't. In many cases, they're the same when x_PricingBlockSize is 1, but they differ if pricing block size is larger. FOCUS prices use the billing currency while actual/amortized prices use the pricing currency for MCA.
UnitPrice * Quantity (EA)

UnitPrice * Quantity * ExchangeRate (MCA)
ContractedCost FOCUS prices use the billing currency while actual/amortized prices use the pricing currency for MCA.
UnitOfMeasure PricingUnit FOCUS PricingUnit is parsed out of UnitOfMeasure. For an exact match, refer to x_PricingUnitDescription. FOCUS ConsumedUnit matches PricingUnit while the quantities might differ based on x_PricingBlockSize.

Feedback about FOCUS columns

If you have feedback about our mappings or about our full FOCUS support plans, start a thread in FinOps toolkit discussions. If you believe you have a bug, create an issue.

If you have feedback about FOCUS, create an issue in the FOCUS repository. We also encourage you to consider contributing to the FOCUS project. The project is looking for more practitioners to help bring their experience to help guide efforts and make it the most useful spec it can be. To learn more about FOCUS or to contribute to the project, visit focus.finops.org.


Related resources:

Related products:

Related solutions: