Convert Cost Management data to FOCUS Convert existing Cost Management actual and amortized datasets to FOCUS.
On this page
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 usage1 |
BillingAccountId | EA: BillingAccountId MCA: BillingProfileId | None |
BillingAccountName | EA: BillingAccountName MCA: BillingProfileName | None |
BillingCurrency | EA: BillingCurrencyCode MCA: BillingCurrency | None |
BillingPeriodEnd | BillingPeriodEndDate | Add 1 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 1 day for the exclusive end date |
ChargePeriodStart | Date | None |
CommitmentDiscountCategory | BenefitId | If BenefitId contains “/microsoft.capacity/” (case-insensitive), Usage ; if 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 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 refunds1. |
InvoiceIssuerName | PartnerName | If PartnerName is empty, use Microsoft . |
ListCost | EA: Not available MCA: PaygCostInBillingCurrency | None |
ListUnitPrice | EA: PayGPrice MCA: 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 PricingBlockSize2 |
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 file3 |
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 | EA: Not available MCA: ProductId | None |
SkuPriceId | Not available | None |
SubAccountId | SubscriptionId | None |
SubAccountName | SubscriptionName | None |
Tags | Tags | Wrap in { and } if needed |
1. 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
.
2. Quantity in Cost Management is the consumed (usage) quantity.
3. While RegionName is a direct mapping of ResourceLocation, Cost Management and FinOps toolkit reports do additional 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, please start a thread in discussions. If you believe you’ve found a bug, please create an issue.
If you have feedback about FOCUS, please 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 this the most useful spec it can be. To learn more about FOCUS or to contribute to the project, visit focus.finops.org.
🧐 See also
- How to update existing reports to FOCUS
- How to compare FOCUS with actual/amortized cost
- Data dictionary
- Generating a unique ID
- Known issues
- Common terms
🧰 Related tools
- 🏦 FinOps hubs – Open, extensible, and scalable cost reporting.
- 📊 Power BI reports – Accelerate your reporting with Power BI starter kits.
- 🖥️ PowerShell module – Automate and manage FinOps solutions and capabilities.
- 🌐 Open data – Data available for anyone to access, use, and share without restriction.