FinOps Open Cost + Usage Specification Learn about the new billing data specification that will make it easier to understand and optimize cost and usage across any cloud, SaaS, or on-prem provider.
On this page
The FinOps Open Cost and Usage Specification (FOCUS) is a groundbreaking initiative to define a common format for billing data that empowers organizations to better understand cost and usage patterns and optimize spending and performance across multiple cloud, SaaS, and even on-premises service offerings.
FOCUS will provide organizations with a consistent, clear, and accessible view of their cost data explicitly designed for FinOps needs such as allocation, analytics, monitoring, and optimization. As the new ālanguageā of FinOps, FOCUS will enable practitioners to collaborate more efficiently and effectively with peers throughout the organization and even maximize transferability and onboarding for new team members, getting people up and running quicker. Paired with the FinOps Framework, practitioners will be armed with the tools needed to build a streamlined FinOps practice that maximizes the value of the cloud.
š¤ Why FOCUS?
Why organizations need FOCUS
The variety and flexibility of Microsoft cloud services allows you to build amazing things while only paying for what you need, when you need it. And with this flexibility comes varying operational models where services are billed and can be tuned differently based on a variety of factors. When services are billed differently, their cost and usage data tends to differ as well, making it challenging to allocate, analyze, monitor, and optimize consistently. Of course, this goes beyond just Microsoftās cloud services. Organizations often rely on software as a service (SaaS) products, licensed software, on-premises infrastructure, or even other clouds, exacerbating the problem with each provider sharing data in proprietary formats.
FOCUS solves this problem by establishing a provider and service agnostic data specification that addresses some of the biggest challenges organizations face in managing the value of their cloud investmentsāunderstanding and quantifying the business value of their spending. FOCUS will enable organizations to spend more time driving value and less struggling to understand data caused by inconsistencies between and unfamiliarity with different services and providers.
Why Microsoft believes in FOCUS
But why would Microsoft want to join other cloud providers and SaaS vendors to promote a common billing data specification? Because consistent cloud billing promotes the innovation and experimentation that Azure is built to provide. Building and optimizing applications in Azure in an iterative way using modern architectures is easier when you clearly understand how youāre billed and can weigh cost equally amongst other business priorities in building those systems. Better collaboration between business, technical, and finance teams will make your organization more productive overall, which maps back to our core mission to empower every person and every organization on the planet to achieve more.
Widespread adoption of FOCUS will make allocating, analyzing, monitoring, and optimizing costs across providers as easy as using a single provider, enabling you to do more with less. FinOps skills become more portable than ever, and practitioners, vendors, and consultants will become more efficient and effective when moving to an organization that uses different clouds or SaaS products. Without having to spend time learning proprietary data formats, organizations can focus on value-added FinOps capabilities that help deliver real value.
Our adoption of FOCUS removes a barrier to cloud adoption and helps organizations make better data-driven decisions about their cloud use that translates to business value on top of the Microsoft cloud.
š Benefits
FOCUS is the best version of cost and usage data you can get from Cost Management. Some of the benefits youāll see with FOCUS compared to actual and amortized cost data include:
-
š° Save 30% on storage and compute costs
FOCUS combines billed (actual) and amortized costs in a single row, which results in 49% fewer rows compared to actual and amortized datasets together. Factoring in new FOCUS columns, the total data size is ~30% smaller than actual and amortized datasets, which is a direct savings on storage costs. Youāll also save on compute costs since youāll be processing fewer rows. Exact compute savings will vary depending on your solution.
-
š Designed to handle multiple accounts and clouds
Whether youāre using multiple clouds or you have multiple account types in a single cloud (e.g., EA and MCA), FOCUS aligns your cost data into a single schema with consistent terminology that makes it easy to understand and optimize your costs across all your accounts.
-
š Easier to learn and aligned with the FinOps Framework
FOCUS is the new ālanguageā of FinOps. All FinOps Framework guidance will be updated to use FOCUS terminology and also include FOCUS queries and examples. This will make it easier to understand and implement FinOps best practices without requiring an extra layer of translation from cloud-agnostic guidance to cloud-specific implementation details. FOCUS enables cloud-agnostic patterns and guidance to go deeper and help you accomplish more with less effort.
-
šŖŖ Clean, human-readable display names
FOCUS uses clean, human-readable display names for all names, types, and categories. Friendly display names are available for services, resource types, regions, pricing, commitment discounts, and more.
-
š² Uniquely identify the exact price-point
FOCUS includes an identifier for the specific SKU price-point used for each charge (SkuPriceId). This is a unique identifier for the SKU inclusive of all pricing variations, like tiering and discounts, which is not currently available in actual or amortized datasets. Each charge also includes the unit prices you need to understand how you are or could be charged. List (or retail) unit price is what you would pay per unit without any negotiated discounts, your on-demand unit price is after negotiated discounts are applied, your effective (or amortized) unit price shows the conceptual price after pre-purchase commitment discounts were applied, and your billed unit price represents what was or will be invoiced.
-
š¹ Easier to quantify cost savings
In addition to unit prices, FOCUS also includes columns to identify the specific pricing model used for each charge with list, on-demand, effective, and billed cost which makes it easier to quantify cost savings from negotiated and commitment discounts.
-
š All prices and costs in a consistent currency
FOCUS uses the billing currency for all prices and costs, which makes it easier to verify costs within the cost and usage data. Note this will differ from the prices in the native Cost Management datasets, which use the pricing currency.
-
š” Organize and differentiate costs by service, resource, and SKU
FOCUS clearly delineates between services, resources, and SKUs, which makes it easier to organize and differentiate costs. Service categorization is consistent across providers and offers a new perspective as it groups all resources consumed for a specific service together, regardless of the underlying product or SKU (e.g., bandwidth and compute costs both fall under the Virtual Machines service).
-
š More consistent regions
The FOCUS dataset in Cost Management provides an extra layer of data cleansing to ensure regions are consistent with Azure Resource Manager. This means youāll see the same region names in FOCUS as you do in the Azure portal and Azure Resource Manager APIs.
-
š Simpler date logic
FOCUS uses exclusive end dates and industry standard ISO 8601 date formats for billing and charge periods, which makes it easier to filter and compare dates. This is especially useful when comparing to other dates, like the current date, since you donāt have to guess about time zones or time of day.
-
š·ļø Tags and SKU details are provided in a consistent JSON format
If you have an Enterprise Agreement account, you may know that tags are not formatted as JSON in actual and amortized datasets. FOCUS fixes this by providing tags and SKU details (AdditionalInfo) in a consistent JSON format.
-
šļø Identify and break usage down to discrete units
FOCUS provides discrete pricing and usage units for each charge to help you understand how youāre being charged compared to real-world usage units. This accounts for different pricing strategies like block pricing and makes it easier to verify pricing and usage quantities by providing data in separate columns.
ā¶ļø Getting started
FOCUS 1.0 preview covers the resources you deployed, the internal SKUs each resource used, the type of charge, how much you used or purchased, how it was priced, and the specific
- Billing details related to invoicing, like the provider you used, who generated the invoice (invoice issuer), and the billing period for the invoice.
- Resource details about what you deployed with the provider, like the service, resource type, region, and tags.
- SKU details about the product you used or purchased, like the publisher and SKU identifiers.
- Charge details that describe and categorize the charge, like the type, description, frequency, and amount used or purchased.
- Discount details that summarize the pricing model, like the pricing category and commitment discount details.
- Pricing + costs that include the raw details about how each charge is priced, like the pricing quantity, unit price, and cost.
Resources are identified by a ResourceId and ResourceName and organized into their respective ServiceName and ServiceCategory. ServiceCategory enables you to organize your costs into a top-level set of categories consistent across cloud providers, which makes it especially interesting. You can also see additional details, like a friendly ResourceType label, the Region a resource was deployed to, and any Tags that were applied to the resource.
Behind the scenes, resources use one or more products to enable their core capabilities. FOCUS refers to these as SKUs. Use of these SKUs is ultimately what you are charged for. Each SKU has a PublisherName of the company who developed the SKU, a SkuId that identifies the SKU that was used, and a SkuPriceId that identifies the specific price-point for the SKU, inclusive of all pricing variations like tiering and discounts.
All charges include a ChargeCategory and ChargeSubcategory to describe what kind of charge it is (such as usage or purchase), the ChargePeriodStart and ChargePeriodEnd dates the charge applied to, the ChargeFrequency to know how often you can expect to see this charge, and a high-level ChargeDescription to explain what the row represents. They also include a specific UsageQuantity and UsageUnit in distinct units based on what was used or purchased.
Each charge has a PricingCategory that indicates how the charge was priced and, if a commitment discount was applied, they include CommitmentDiscountCategory and CommitmentDiscountType for friendly provider-agnostic and provider-specific labels for the type of commitment discount, CommitmentDiscountId to identify which commitment discount was applied to usage, and the CommitmentDiscountName of that instance.
Since prices are determined based on the billing relationship, you can also find the BillingAccountId and BillingAccountName that invoices are generated against, the BillingPeriodStart and BillingPeriodEnd dates the invoice applies to, the InvoiceIssuerName for the company responsible for invoicing, and the ProviderName of the cloud, SaaS, on-prem, or other provider you used. Please note the ābilling accountā term in FOCUS refers to the scope at which an invoice is generated and not the top-level, root account. For organizations with a Microsoft Customer Agreement (MCA) account, this maps to your billing profile and not your Microsoft billing account. Within each billing account, you also have a SubAccountId and SubAccountName for the subscription within the billing account.
Last but not least you also have the price and cost details. Each charge has a BillingCurrency that all prices and costs use, which may be different than how the provider prices charges. As an example, most MCA accounts are priced in USD and may be billed in another currency like Yen or Euros.
Please note that since FOCUS relies on the billing currency, the prices shown in FOCUS datasets may not match native Cost Management schemas.
Each charge includes the PricingQuantity and PricingUnit based on how the SKU was priced (which may be in chunks or āblocksā of units) and a set of unit prices for the cost of each individual pricing unit (based on the SkuPriceId) and the total cost based on the pricing quantity. Currently, FOCUS includes the ListUnitPrice and ListCost for the public retail or market prices without discounts, EffectiveCost after commitment discount purchases have been amortized, and BilledCost that was or will be invoiced.
Perhaps the biggest difference between FOCUS and native schemas is that FOCUS combines āactualā and āamortizedā cost into a single datasets. This saves you time and money with a smaller dataset size compared to managing both datasets separately. Data size is on par with the amortized cost data except with less than 100 more rows for commitment discount purchases and refunds.
Beyond these, each provider can include additional columns prefixed with x_ to denote them as external columns that are not part of the FOCUS schema but provide useful details about your cost and usage. Microsoft Cost Management provides the same details within its FOCUS dataset as the native schemas by utilizing this prefix. FinOps toolkit reports add to these columns with additional details to facilitate reporting and optimization goals.
š Mapping to FOCUS
Use the following sections to either generate FOCUS-compliant data from existing datasets or to update existing reporting to leverage FOCUS columns.
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ā, or āTaxā, same value; if āUnusedReservationā or āUnusedSavingsPlanā, Usage ; otherwise, Adjustment |
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 |
ChargeSubcategory | ChargeType | If āUsageā and PricingModel is āReservationā or āSavingsPlanā, Used Commitment ; if āUnusedReservationā or āUnusedSavingsPlanā, Unused Commitment ; if āRefundā, Refund ; if āRoundingAdjustmentā, Rounding Error ; otherwise, Other . |
CommitmentDiscountCategory | BenefitId | If BenefitId contains ā/microsoft.capacity/ā (case-insensitive), Usage ; if contains ā/microsoft.billingbenefits/ā, use Spend ; otherwise, null |
CommitmentDiscountId | BenefitId | None |
CommitmentDiscountName | BenefitName | None |
CommitmentDiscountType | BenefitId | If BenefitId contains ā/microsoft.capacity/ā (case-insensitive), Reservation ; if contains ā/microsoft.billingbenefits/ā, Savings Plan ; otherwise, null |
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ā, On-Demand ; if āSpotā, Dynamic ; if āReservationā or āSavings Planā, Commitment Discount ; otherwise, Other |
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 |
Region | 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 |
UsageQuantity | Quantity | None |
UsageUnit | UnitOfMeasure | Map using Pricing units data file |
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 usage quantity.
3. While Region 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.
How to update existing reports to FOCUS
Use the following table to update existing automation and reporting solutions to use FOCUS.
Column | Value(s) | How to update |
---|---|---|
AccountName | (All) | Use x_AccountName |
AccountOwnerId | (All) | Use x_AccountOwnerId |
AdditionalInfo | (All) | Use x_SkuDetails |
CostInBillingCurrency | (All) | For actual cost, use BilledCost; otherwise, use EffectiveCost |
BenefitId | (All) | Use CommitmentDiscountId |
BenefitName | (All) | Use CommitmentDiscountName |
BillingAccountId | (All) | EA: Use BillingAccountId MCA: Use x_BillingAccountId |
BillingAccountName | (All) | EA: Use BillingAccountName MCA: Use x_BillingAccountName |
BillingCurrencyCode | (All) | Use BillingCurrency |
BillingProfileId | (All) | EA: Use x_BillingProfileId MCA: Use BillingAccountId |
BillingProfileName | (All) | EA: Use x_BillingProfileName MCA: Use BillingAccountName |
BillingPeriodEndDate | (All) | Use BillingPeriodEnd and change comparisons to use less than (< ) rather than less than or equal to (<= ) |
BillingPeriodStartDate | (All) | Use BillingPeriodStart |
ChargeType | āUsageā, āPurchaseā, āTaxā | Use ChargeCategory |
ChargeType | āUnusedReservationā | Use ChargeSubcategory = āUnused Commitmentā and CommitmentDiscountType = āReservationā |
ChargeType | āUnusedSavingsPlanā | Use ChargeSubcategory = āUnused Commitmentā and CommitmentDiscountType = āSavings Planā |
ChargeType | āRefundā | Use ChargeSubcategory = āRefundā |
ChargeType | āRoundingAdjustmentā | Use ChargeSubcategory = āRounding Errorā |
CostAllocationRuleName | (All) | Use x_CostAllocationRuleName |
CostCenter | (All) | Use x_CostCenter |
CostInUsd | (All) | For actual cost, use x_BilledCostInUsd; otherwise, use x_EffectiveCostInUsd |
CustomerName | (All) | Use x_CustomerName |
CustomerTenantId | (All) | Use x_CustomerId |
Date | (All) | Use ChargePeriodStart |
DepartmentName | (All) | Use x_InvoiceSectionName |
EffectivePrice | (All) | Use x_EffectiveUnitPrice |
ExchangeRatePricingToBilling | (All) | Use x_BillingExchangeRate |
ExchangeRateDate | (All) | Use x_BillingExchangeRateDate |
Frequency | āOneTimeā | Use ChargeFrequency = āOne-Timeā |
Frequency | āRecurringā | Use ChargeFrequency = āRecurringā |
Frequency | āUsageBasedā | Use ChargeFrequency = āUsage-Basedā |
InvoiceId | (All) | Use x_InvoiceId |
InvoiceSectionId | (All) | Use x_InvoiceSectionId |
InvoiceSectionName | (All) | Use x_InvoiceSectionName |
IsAzureCreditEligible | (All) | Use x_SkuIsCreditEligible |
Location | (All) | Use Region |
MeterCategory | (All) | To group resources, use ServiceName; to group meters, use x_SkuMeterCategory |
MeterId | (All) | Use x_SkuMeterId |
MeterName | (All) | Use x_SkuMeterName |
MeterRegion | (All) | Use x_SkuRegion |
MeterSubcategory | (All) | Use x_SkuMeterSubcategory |
OfferId | (All) | Use x_SkuOfferId |
PartnerEarnedCreditApplied | (All) | Use x_PartnerCreditApplied |
PartnerEarnedCreditRate | (All) | Use x_PartnerCreditRate |
PartnerName | (All) | Use InvoiceIssuerName or x_PartnerName |
PartnerTenantId | (All) | Use x_InvoiceIssuerId |
PartNumber | (All) | Use x_SkuPartNumber |
ProductName | (All) | Use ChargeDescription |
ProductOrderId | (All) | Use x_SkuOrderId |
ProductOrderName | (All) | Use x_SkuOrderName |
PaygCostInBillingCurrency | (All) | Use ListCost |
PayGPrice | (All) | Use ListUnitPrice / x_BillingExchangeRate |
PricingCurrency | (All) | Use x_PricingCurrency |
PricingModel | āOnDemandā | Use PricingCategory = āOn-Demandā |
PricingModel | āReservationā | For all commitments, use PricingCategory = āCommitment Discountā; for savings plan only, use CommitmentDiscountCategory = āUsageā |
PricingModel | āSavingsPlanā | For all commitments, use PricingCategory = āCommitment Discountā; for savings plan only, use CommitmentDiscountCategory = āSpendā |
PricingModel | āSpotā | Use PricingCategory = āDynamicā or x_PricingSubcategory = āSpotā |
ProductId | (All) | Use SkuId |
Quantity | (All) | Use UsageQuantity |
ResellerMpnId | (All) | Use x_ResellerId |
ResellerName | (All) | Use x_ResellerName |
ReservationId | (All) | Use CommitmentDiscountId; split by ā/ā and use last segment for the reservation GUID |
ReservationName | (All) | Use CommitmentDiscountName |
ResourceGroupName | (All) | Use x_ResourceGroupName |
ResourceLocationNormalized | (All) | Use Region |
ResourceType | (All) | For friendly names, use ResourceType; otherwise, use x_ResourceType |
ServiceFamily | (All) | To group resources, use ServiceCategory; to group meters, use x_SkuServiceFamily |
ServicePeriodEnd | (All) | Use x_ServicePeriodEnd |
ServicePeriodStart | (All) | Use x_ServicePeriodStart |
SubscriptionId | (All) | For a unique value, use SubAccountId; for the subscripion GUID, use x_SubscriptionId |
SubscriptionName | (All) | Use SubAccountName or x_SubscriptionName |
Tags | (All) | Use Tags but donāt wrap in curly braces ({} ) |
Term | (All) | Use x_SkuTerm |
UnitOfMeasure | (All) | For the exact value, use x_PricingUnitDescription; for distinct units, use PricingUnit or UsageUnit; for the block size, use x_PricingBlockSize |
Generating a unique ID per row
Use the following columns in the Cost Management FOCUS dataset to generate a unique ID:
- BillingAccountId
- ChargePeriodStart
- CommitmentDiscountId
- Region
- ResourceId
- SkuPriceId
- SubAccountId
- Tags
- x_AccountId
- x_CostCenter
- x_InvoiceSectionId
- x_SkuDetails
- x_SkuMeterId
- x_SkuOfferId
- x_SkuPartNumber
ā ļø Important notes about FOCUS support
Please note the following when using FinOps toolkit reports that align to the FOCUS schema:
- For FinOps hubs,
BilledCost
is missing reservation and savings plan purchases and refunds and cannot be used for invoice reconciliation.- FinOps hubs v0.0.1 only supports amortized cost data. Support for actual (billed) cost data will be added in a future release.
BillingAccountId
andBillingAccountName
may be confusing for Microsoft Customer Agreement accounts, where the billing profile is used.- We are looking for feedback about this to understand if it is a problem and determine the best way to address it.
BillingPeriodEnd
andChargePeriodEnd
are exclusive, which is ideal for filtering, but may be confusing.- We are looking for feedback about this to understand if it is a problem and determine the best way to address it.
InvoiceIssuerName
is not accounting for Cloud Solution Provider partners.- FinOps hubs v0.0.1 only supports Enterprise Agreement accounts. Support for Microsoft Customer Agreement and Microsoft Partner Agreement accounts will be added in a future release.
- For the Cost Management connector,
PricingUnit
andUsageUnit
both include the pricing block size. Region
can include values that are not regions, such asUnassigned
.- This is an underlying service issue and must be resolved by the service that is referencing invalid Azure locations in their usage data.
Region
usesGlobal
to indicate a global service.- FOCUS is considering whether to use
Global
or not. This will be finalized by FOCUS 1.0.
- FOCUS is considering whether to use
ServiceName
andServiceCategory
are using a custom mapping that may not account for all services yet.- We will update this list to account for all services soon. This will require ongoing work to keep up with the pace at which Microsoft is enabling new services.
- Please let us know if you find any missed services or if you have any feedback about the mapping.
ServiceName
usesAzure Savings Plan for Compute
for savings plan records due to missing service details.- This is an underlying data issue and must be resolved by the service that generates the data.
ServiceName
attempts to map Azure Kubernetes Service (AKS) charges based on a simple resource group name check, which may catch false positives.- We will update the resource group check to be more targeted soon.
- Please let us know if you find any false positives.
- If we find we are unable to accurately identify AKS charges, we will fall back to the service name for the actual resource (e.g., Load Balancer).
- For the Cost Management connector,
SkuPriceId
is not set due to the connector not having the data to populate the value.
If you have feedback about our mappings or about our full FOCUS support plans, please leave a comment within the FOCUS schema release discussion. If you believe youāve found a bug, please create an issue.
If you have feedback about FOCUS, please 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.
š§° 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.