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 == nulland 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 content
Related resources:
- How to update existing reports to FOCUS
- How to convert Cost Management data to FOCUS
- Microsoft Cost Management FOCUS dataset
Related products:
Related solutions:
- FinOps toolkit Power BI reports
- FinOps hubs
- FinOps toolkit PowerShell module
- FinOps toolkit open data