Convert Cost Management data to FOCUS
This document provides guidance for converting Cost Management actual and amortized datasets to the FinOps Open Cost and Usage Specification (FOCUS). To learn more about FOCUS, refer to the FOCUS overview.
How to convert Cost Management data to FOCUS
The following mapping is assuming you have all amortized cost rows and only commitment purchases and refunds from the actual cost dataset.
FOCUS column | Cost Management column | Transform |
---|---|---|
BilledCost | CostInBillingCurrency | Use 0 for amortized commitment usage¹ |
BillingAccountId | • Enterprise Agreement: BillingAccountId • Microsoft Customer Agreement: BillingProfileId |
None |
BillingAccountName | • Enterprise Agreement: BillingAccountName • Microsoft Customer Agreement: BillingProfileName |
None |
BillingCurrency | • Enterprise Agreement: BillingCurrencyCode • Microsoft Customer Agreement: BillingCurrency |
None |
BillingPeriodEnd | BillingPeriodEndDate | Add one day for the exclusive end date |
BillingPeriodStart | BillingPeriodStartDate | None |
ChargeCategory | ChargeType | If "Usage", "Purchase", "Credit", or "Tax", same value; if "UnusedReservation" or "UnusedSavingsPlan", then Usage ; if "Refund", "Purchase"; otherwise, Adjustment |
ChargeClass | ChargeType | If "Refund", then use Correction |
ChargeDescription | ProductName | None |
ChargeFrequency | Frequency | If "OneTime", One-Time ; if "Recurring", Recurring ; if "UsageBased", Usage-Based ; otherwise, Other |
ChargePeriodEnd | Date | Add one day for the exclusive end date |
ChargePeriodStart | Date | None |
CommitmentDiscountCategory | BenefitId | If BenefitId contains "/microsoft.capacity/" (case-insensitive), Usage ; if it contains "/microsoft.billingbenefits/", use Spend ; otherwise, null |
CommitmentDiscountId | BenefitId | None |
CommitmentDiscountName | BenefitName | None |
CommitmentDiscountStatus | ChargeType | If "UnusedReservation" or "UnusedSavingsPlan", then Unused ; else if PricingModel == "Reservation" or "SavingsPlan", then Used ; otherwise, null |
CommitmentDiscountType | BenefitId | If BenefitId contains "/microsoft.capacity/" (case-insensitive), Reservation ; if it contains "/microsoft.billingbenefits/", Savings Plan ; otherwise, null |
ConsumedQuantity | Quantity | If ChargeType == "Usage", then Quantity; otherwise, null |
ConsumedUnit | UnitOfMeasure | If ChargeType == "Usage", then map using Pricing units data file ; otherwise, null |
ContractedCost | UnitPrice * Quantity | Map UnitOfMeasure using Pricing units data file and divide Quantity by the PricingBlockSize |
ContractedUnitPrice | UnitPrice | None |
EffectiveCost | CostInBillingCurrency | Use 0 for commitment purchases and refunds¹. |
InvoiceIssuerName | PartnerName | If PartnerName is empty, use Microsoft . |
ListCost | • Enterprise Agreement: Not available • Microsoft Customer Agreement: PaygCostInBillingCurrency |
None |
ListUnitPrice | • Enterprise Agreement: PayGPrice • Microsoft Customer Agreement: PayGPrice * ExchangeRate |
None |
PricingCategory | PricingModel | If "OnDemand", then Standard ; if "Spot", then Dynamic ; if "Reservation" or "Savings Plan", then Committed ; otherwise, null |
PricingQuantity | Quantity | Map UnitOfMeasure using Pricing units data file and divide Quantity by the PricingBlockSize² |
PricingUnit | UnitOfMeasure | Map using Pricing units data file |
ProviderName | Microsoft |
None |
PublisherName | PublisherName | None |
RegionId | focus:RegionName | Lowercase and remove spaces |
RegionName | ResourceLocation | Map using Regions data file³ |
ResourceId | ResourceId | None |
ResourceName | ResourceName | None |
ResourceType | ResourceType | Map using Resource types data file |
ServiceCategory | ResourceType | Map using Services data file |
ServiceName | ResourceType | Map using Services data file |
SkuId | • Enterprise Agreement: Not available • Microsoft Customer Agreement: ProductId |
None |
SkuPriceId | Not available | None |
SubAccountId | SubscriptionId | None |
SubAccountName | SubscriptionName | None |
Tags | Tags | Wrap in { and } if needed |
¹ BilledCost should copy cost from all rows except commitment usage that has a PricingModel of "Reservation" or "SavingsPlan" which should be 0
. EffectiveCost should copy cost from all amortized dataset rows; commitment purchases and refunds from the actual cost dataset should be 0
.
² Quantity in Cost Management is the consumed (usage) quantity.
³ While RegionName is a direct mapping of ResourceLocation, Cost Management and FinOps toolkit reports do more data cleansing to ensure consistency in values based on the Regions data file.
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:
Related products:
Related solutions: