FOCUS Specification v1.1

Copyright © 2024 – FinOps Open Cost and Usage Specification (FOCUS) a Series of the Joint Development Foundation Projects, LLC. Linux Foundation  trademark, and document use rules apply.

Status of This Document

This section describes the status of this document at the time of its publication.

This is a published release of the FinOps Open Cost and Usage Specification.

This document was produced by a group operating under the Joint Development Foundation Projects agreement. FOCUS maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information.

Document Use License

Copyright (c) Joint Development Foundation Projects, LLC, FinOps Open Cost and Usage Specification (FOCUS) Series and its contributors. The materials in this repository are made available under the Creative Commons Attribution 4.0 International license (CC-BY-4.0), available at [ https://creativecommons.org/licenses/by/4.0/legalcode](https://creativecommons.org/licenses/by/4.0/legalcode).

Shield:
CC BY 4.0

This work is made available under: Creative Commons Attribution 4.0 International License.


CC BY 4.0

THESE MATERIALS ARE PROVIDED “AS IS.” The parties expressly disclaim any warranties (express, implied, or otherwise), including implied warranties of merchantability, non-infringement, fitness for a particular purpose, or title, related to the materials. The entire risk as to implementing or otherwise using the materials is assumed by the implementer and user. IN NO EVENT WILL THE PARTIES BE LIABLE TO ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF ACTION OF ANY KIND WITH RESPECT TO THIS DELIVERABLE OR ITS GOVERNING AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR NOT THE OTHER MEMBER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This document is governed by the Patent Policy Option 4: W3C Mode: See project charter.

Abstract

FOCUS is an open-source specification for billing data. It defines a common schema for billing data, aligns terminology with the FinOps Framework and defines a minimum set of requirements for billing data. The specification provides clear guideline for billing data generators to produce FinOps-serviceable data. The specification enables FinOps practitioners to perform common FinOps capabilities such as chargeback, cost allocation, budgeting and forecasting etc. using a generic set of instructions, regardless of the origin of the FOCUS compatible dataset.

Working Group

Maintainers

Thanks to the following FOCUS Maintainers for their leadership and contributions to the FOCUS Release v1.1 specification.

  • Alex Hullah (Goldman Sachs)
  • Christopher Harris (Datadog)
  • Irena Jurica (Neos)
  • Joaquin Prado (FinOps Foundation)
  • Karl Kraft (Walmart)
  • Larry Advey (Twilio)
  • Michael Flanakin (Microsoft)
  • Riley Jenkins (Domo)
  • Shawn Alpay (Envisor / FinOps Foundation)
  • Udam Dewaraja (FinOps Foundation)
  • Zach Erdman (Amazon Web Services)

Contributors

Thanks to the following FOCUS members for their contributions to the FOCUS Release v1.1 specification.

  • Adam Schwartz (Ernst & Young)
  • Andrew Qu (Everest)
  • Arun Ramakrishnan (Oracle)
  • Erik Peterson (CloudZero)
  • George Parker (Salesforce)
  • Graham Murphy (Australian Retirement Trust)
  • Janine Pickard-Green (MagicOrange Group Limited)
  • John Grubb (Platform.sh)
  • Joseph John (Microsoft)
  • Marc Perreaut (Amadeus)
  • Rob Martin (FinOps Foundation)
  • Rupa Patel (Google)
  • Sanjna Srivatsa (VMWare)
  • Sonal Garg (Kyndryl)
  • Tim Wright (Google)

Steering Committee Members

Thanks to the following FOCUS Steering Committee members for their leadership on the FOCUS specification.

  • Anne Johnston (Capital One)
  • Michael Flanakin (Microsoft)
  • Mike Fuller (FinOps Foundation)
  • Roy Wolman (Amazon Web Services)
  • Sarah McMullin (Google)
  • Tim O’Brien (Walmart)

Table of Contents

1. Introduction

This section is non-normative.

FOCUS aims to establish a community-driven specification for consumption-based billing data. Due to the lack of a broadly adopted specification, infrastructure and services
providers
have resorted to proprietary billing schemas and terminology. The lack of conformance amongst the billing data generators has forced FinOps practitioners to employ disparate, best-effort schemes which each practitioner must develop individually for each provider to perform essential FinOps capabilities such as chargeback, cost allocation, budgeting and forecasting.

The FOCUS specification’s schema definition and FinOps-aligned terminology provide a clear guide for producing FinOps-serviceable billing datasets. Datasets conforming to FOCUS enable FinOps practitioners to perform common FinOps capabilities, like the ones mentioned above, using a generic set of instructions, regardless of the origin of the dataset.

1.1. Background and History

This project is supported by the FinOps Foundation. This work initially started under the Open Billing working group under the FinOps Foundation. The decision was made in Jan 2023 to begin to migrate the work to a newly formed project under the Linux Foundation called the FinOps Open Cost and Usage Specification (FOCUS) to better support the creation of a specification.

1.2. Intended Audience

This specification is designed to be used by three major groups:

      • Billing data generators: Infrastructure and services providers that bill based on consumption, such as (but not limited to):
      • FinOps tool providers: Organizations that provide tools to assist with FinOps
      • FinOps practitioners: Organizations and individuals consuming billing data for doing FinOps

1.3. Scope

The FOCUS working group will develop an open-source specification for billing data. The schema will define data
dimensions
,
metrics
, a set of attributes about billing data, and a common lexicon for describing billing data.

1.4. Design Principles

The following principles were considered while building the specification.

1.4.1. FOCUS is an iterative, living specification

      • Incremental iterations of the specification released regularly will provide higher value to practitioners and allow feedback as the specification develops. The goal is not to get to a complete, finished specification in one pass.

1.4.2. Working backward with ease of adoption

      • Aim to work backward from essential FinOps capabilities that practitioners need to perform to prioritize the dimensions, metrics and attributes of the cost and usage data that should be defined in the specification to fulfill that capability.
      • Be FinOps scenario-driven. Define columns that answer scenario questions; don’t look for scenarios to fit a column, each column must have a use case.
      • Don’t add dimensions or metrics to the specification just because it can be added.
      • When defining the specification, consideration should be made to existing data already in the major providers’ (AWS, GCP, Azure, OCI) datasets.
      • As long as it solves the FinOps use case, there should be a preference to align with data that is already present in a majority of the major providers.
      • Strive for simplicity. However, prioritize accuracy, clarity, and consistency.
      • Strive to build columns that serve a single purpose, with clear and concise names and values.
      • The specification should allow data to be presented free from jargon, using simple understandable terms, and be approachable.
      • Naming and terms used should be carefully considered to avoid using terms for which the definition could be confused by the reader. If a term must be used which has either an unclear or multiple definitions, it should be clarified in the glossary.
      • The specification should provide all of the data elements necessary for the Capabilities.

1.4.3. Provider-neutral approach by default

      • While the schema, naming, terminology, and attributes of many providers are reviewed during development, this specification aims to be provider-neutral.
      • Contributors must take care to ensure the specification examines how each decision relates to each of the major cloud providers and SaaS vendors, not favoring any single one.
      • In some cases, the approach may closely resemble one or more provider’s implementations, while in other cases, the approach might be new. In all cases, the FOCUS group (community composed of FinOps practitioners, Cloud and SaaS providers and FinOps vendors) will attempt to prioritize enabling FinOps Capabilities and alignment with the FinOps Framework.

1.4.4. Extensibility

      • The initial specification aims to introduce a common schema and terminology for billing datasets produced by Cloud Service Providers (CSPs).
      • The specification, however, aims to be extensible to SaaS products and other types of cost datasets.
      • Future versions of the specification will look to expand the content to support a broader set of prioritized FinOps capabilities.

1.5. Design Notes

1.5.1. Optimize for data analysis

      • Optimize columns for data analysis at scale and avoid the requirement of splitting or parsing values.
      • Avoid complex JSON structures when an alternative columnar structure is possible.
      • Facilitate the inclusion of data necessary for a system of record for cost and usage data to consume.

1.5.2. Consistency helps with clarity

      • Where possible, use consistent names that will naturally create associations between related columns in the specification.
      • Column naming must strictly follow the column naming conventions.
      • Use established standards (e.g., ISO8601 for dates, ISO4217 for currency).

1.6. Typographic Conventions

The keywords “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this specification are to be interpreted as described in BCP14 [ RFC2119][ RFC8174] when, and only when, they appear in all capitals, as shown here.

1.7. FOCUS Feature level

Under each column defined in the FOCUS specification, there exists a ‘Feature level’ designation that describes the column as ‘Mandatory’, ‘Conditional’, or ‘Optional’. Feature level is designated based on the following criteria described in the normative requirements in each column definition:

      • If the existence of a column is described with MUST with no conditions of when it applies, then the feature level is designated as ‘Mandatory’.
      • If the existence of a column is described as MUST with conditions of when it applies, then the feature level is designated as ‘Conditional’.
      • If the existence of a column is described as RECOMMENDED, then the feature level is designated as ‘Recommended’.
      • If the existence of a column is described as MAY, then the feature level is designated as ‘Optional’.

1.8. Conformance Checkers and Validators

There are no current resources available to test for specification conformance or validators to run on sample data. When one becomes available, this section of the specification will be updated with details.

2. Columns

The FOCUS specification defines a group of columns that provide qualitative values (such as dates, resource, and provider information) categorized as “dimensions” and quantitative values (numeric values) categorized as “metrics” that can be used for performing various FinOps capabilities. Metrics are commonly used for aggregations (sum, multiplication, averaging etc.) and statistical operations within the dataset. Dimensions are commonly used to categorize, filter, and reveal details in your data when combined with metrics. The Columns are presented in Alphabetical order.

2.1. Availability Zone

An
availability zone
is a provider-assigned identifier for a physically separated and isolated area within a Region that provides high availability and fault tolerance. Availability Zone is commonly used for scenarios like analyzing cross-zone data transfer usage and the corresponding cost based on where
resources
are deployed.

The AvailabilityZone column is RECOMMENDED to be present in a
FOCUS dataset
when the provider supports deploying resources or services within an availability zone. This column MUST be of type String and MAY contain null values when a charge is not specific to an availability zone.

2.1.1. Column ID

AvailabilityZone

2.1.2. Display Name

Availability Zone

2.1.3. Description

A provider-assigned identifier for a physically separated and isolated area within a Region that provides high availability and fault tolerance.

2.1.4. Content constraints

Constraint Value
Column type Dimension
Feature level Recommended
Allows nulls True
Data type String
Value format <not specified>

2.1.5. Introduced (version)

0.5

2.2. Billed Cost

The
billed cost
represents a charge serving as the basis for invoicing, inclusive of the impacts of all reduced rates and discounts while excluding the
amortization
of relevant purchases (one-time or recurring) paid to cover future eligible charges. This cost is denominated in the Billing Currency. The Billed Cost is commonly used to perform FinOps capabilities that require cash-basis accounting such as cost allocation, budgeting, and invoice reconciliation.

The BilledCost column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column MUST be of type Decimal, MUST conform to Numeric Format, and be denominated in the BillingCurrency. The sum of the BilledCost for
rows
in a given
billing period
MUST match the sum of the invoices received for that billing period for a
billing account
.

2.2.1. Column ID

BilledCost

2.2.2. Display Name

Billed Cost

2.2.3. Description

A charge serving as the basis for invoicing, inclusive of all reduced rates and discounts while excluding the amortization of upfront charges (one-time or recurring).

2.2.4. Content constraints

Constraint Value
Column type Metric
Feature level Mandatory
Allows nulls False
Data type Decimal
Value format Numeric Format
Number range Any valid decimal value

2.2.5. Introduced (version)

0.5

2.3. Billing Account ID

A Billing Account ID is a provider-assigned identifier for a
billing account
. Billing accounts are commonly used for scenarios like grouping based on organizational constructs, invoice reconciliation and cost allocation strategies.

The BillingAccountId column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values. BillingAccountId MUST be a globally unique identifier within a provider.

See Appendix: Grouping constructs for resources or services for details and examples of the different grouping constructs supported by FOCUS.

2.3.1. Column ID

BillingAccountId

2.3.2. Display Name

Billing Account ID

2.3.3. Description

The identifier assigned to a billing account by the provider.

2.3.4. Content constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type String
Value format <not specified>

2.3.5. Introduced (version)

0.5

2.4. Billing Account Name

A Billing Account Name is a display name assigned to a
billing account
. Billing accounts are commonly used for scenarios like grouping based on organizational constructs, invoice reconciliation and cost allocation strategies.

The BillingAccountName column MUST be present in a
FOCUS dataset
and MUST NOT be null when the provider supports assigning a display name for the billing account. This column MUST be of type String. BillingAccountName MUST be unique within a customer when a customer has more than one billing account.

See Appendix: Grouping constructs for resources or services for details and examples of the different grouping constructs supported by FOCUS.

2.4.1. Column ID

BillingAccountName

2.4.2. Display Name

Billing Account Name

2.4.3. Description

The display name assigned to a billing account.

2.4.4. Content constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls True
Data type String
Value format <not specified>

2.4.5. Introduced (version)

0.5

2.5. Billing Currency


Billing currency
is an identifier that represents the currency that a charge for
resources
or
services
was billed in. Billing Currency is commonly used in scenarios where costs need to be grouped or aggregated.

The BillingCurrency column MUST be present in a
FOCUS dataset
. BillingCurrency MUST match the currency used in the invoice generated by the invoice issuer. This column MUST be of type String and MUST NOT contain null values. BillingCurrency MUST conform to Currency Code Format requirements.

2.5.1. Column ID

BillingCurrency

2.5.2. Display Name

Billing Currency

2.5.3. Description

Represents the currency that a charge was billed in.

2.5.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type String
Value format Currency Code Format

2.5.5. Introduced (version)

0.5

2.6. Billing Period End

Billing Period End represents the
exclusive
end date and time of a
billing period
. For example, a time period where BillingPeriodStart is ‘2024-01-01T00:00:00Z’ and BillingPeriodEnd is ‘2024-02-01T00:00:00Z’ includes charges for January, since BillingPeriodStart is
inclusive
, but does not include charges for February since BillingPeriodEnd is exclusive.

The BillingPeriodEnd column MUST be present in a
FOCUS dataset
. This column MUST be of type Date/Time Format, MUST be an exclusive value, and MUST NOT contain null values. The sum of the BilledCost column for
rows
in a given billing period MUST match the sum of the invoices received for that billing period for a
billing account
.

2.6.1. Column ID

BillingPeriodEnd

2.6.2. Display Name

Billing Period End

2.6.3. Description

The
exclusive
end date and time of a
billing period
.

2.6.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type Date/Time
Value format Date/Time Format

2.6.5. Introduced (version)

0.5

2.7. Billing Period Start

Billing Period Start represents the
inclusive
start date and time of a
billing period
. For example, a time period where BillingPeriodStart is ‘2024-01-01T00:00:00Z’ and BillingPeriodEnd is ‘2024-02-01T00:00:00Z’ includes charges for January, since BillingPeriodStart is inclusive, but does not include charges for February since BillingPeriodEnd is
exclusive
.

The BillingPeriodStart column MUST be present in a
FOCUS dataset
, MUST be of type Date/Time Format, MUST be an inclusive value, and MUST NOT contain null values. The sum of the BilledCost metric for
rows
in a given billing period MUST match the sum of the invoices received for that billing period for a
billing account
.

2.7.1. Column ID

BillingPeriodStart

2.7.2. Display Name

Billing Period Start

2.7.3. Description

The
inclusive
start date and time of a
billing period
.

2.7.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type Date/Time
Value format Date/Time Format

2.7.5. Introduced (version)

0.5

2.8. Capacity Reservation ID

A Capacity Reservation ID is the identifier assigned to a
capacity reservation
by the provider. Capacity Reservation ID is commonly used for scenarios to allocate charges for capacity reservation usage.

The CapacityReservationId column adheres to the following requirements:

      • CapacityReservationId MUST be present in a
        FOCUS dataset
        when the provider supports capacity reservations and MUST be of type String.
      • CapacityReservationId SHOULD NOT be null when a charge is related to a capacity reservation.
      • CapacityReservationId MUST NOT be null when a charge represents the unused portion of a capacity reservation.
      • CapacityReservationId MUST be null when a charge is not related to a capacity reservation.
      • CapacityReservationId MUST ensure global uniqueness within the provider and SHOULD be a fully-qualified identifier.

2.8.1. Column ID

CapacityReservationId

2.8.2. Display Name

Capacity Reservation ID

2.8.3. Description

The identifier assigned to a capacity reservation by the provider.

2.8.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.8.5. Introduced (version)

1.1

2.9. Capacity Reservation Status

Capacity Reservation Status indicates whether the charge represents either the consumption of the
capacity reservation
identified in the CapacityReservationId column or when the capacity reservation is unused.

The CapacityReservationStatus column adheres to the following requirements:

      • CapacityReservationStatus MUST be present in a
        FOCUS dataset
        when the provider supports capacity reservations and MUST be of type String.
      • CapacityReservationStatus MUST be null when CapacityReservationId is null.
      • CapacityReservationStatus MUST NOT be null when CapacityReservationId is not null and ChargeCategory is “Usage”.
      • CapacityReservationStatus MUST be one of the allowed values.
      • CapacityReservationStatus MUST label all unused capacity reservation charges and MUST label used capacity reservation charges if the provider supports it.

2.9.1. Column ID

CapacityReservationStatus

2.9.2. Display Name

Capacity Reservation Status

2.9.3. Description

Indicates whether the charge represents either the consumption of a capacity reservation or when a capacity reservation is unused.

2.9.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format Allowed Values

Allowed values:

Value Description
Used Charges that utilized a specific amount of a capacity reservation.
Unused Charges that represent the unused portion of a capacity reservation.

2.9.5. Introduced (version)

1.1

2.10. Charge Category

Charge Category represents the highest-level classification of a charge based on the nature of how it is billed. Charge Category is commonly used to identify and distinguish between types of charges that may require different handling.

The ChargeCategory column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column is of type String and MUST be one of the allowed values.

2.10.1. Column ID

ChargeCategory

2.10.2. Display Name

Charge Category

2.10.3. Description

Represents the highest-level classification of a charge based on the nature of how it is billed.

2.10.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type String
Value format Allowed values

Allowed values:

Value Description
Usage Positive or negative charges based on the quantity of a service or resource that was consumed over a given period of time including refunds.
Purchase Positive or negative charges for the acquisition of a service or resource bought upfront or on a recurring basis including refunds.
Tax Positive or negative applicable taxes that are levied by the relevant authorities including refunds. Tax charges may vary depending on factors such as the location, jurisdiction, and local or federal regulations.
Credit Positive or negative charges granted by the provider for various scenarios e.g promotional credits or corrections to promotional credits.
Adjustment Positive or negative charges the provider applies that do not fall into other category values.

2.10.5. Introduced (version)

0.5

2.11. Charge Class

Charge Class indicates whether the row represents a correction to a previously invoiced
billing period
. Charge Class is commonly used to differentiate corrections from regularly incurred charges.

The ChargeClass column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST be “Correction” when the row represents a correction to a previously invoiced billing period. ChargeClass MUST be null when it is not a correction or when it is a correction within the current billing period.

2.11.1. Column ID

ChargeClass

2.11.2. Display Name

Charge Class

2.11.3. Description

Indicates whether the row represents a correction to a previously invoiced billing period.

2.11.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls True
Data type String
Value format Allowed values

Allowed values:

Value Description
Correction Correction to a previously invoiced billing period (e.g., refunds and credit modifications).

2.11.5. Introduced (version)

1.0

2.12. Charge Description

A Charge Description provides a high-level context of a
row
without requiring additional discovery. This column is a self-contained summary of the charge’s purpose and price. It typically covers a select group of corresponding details across a billing dataset or provides information not otherwise available.

The ChargeDescription column MUST be present in a
FOCUS dataset
, MUST be of type String, and SHOULD NOT be null. Providers SHOULD specify the length of this column in their publicly available documentation.

2.12.1. Column ID

ChargeDescription

2.12.2. Display Name

Charge Description

2.12.3. Description

Self-contained summary of the charge’s purpose and price.

2.12.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls True
Data type String
Value format <not specified>

2.12.5. Introduced (version)

1.0-preview

2.13. Charge Frequency

Charge Frequency indicates how often a charge will occur. Along with the charge period related columns, the Charge Frequency is commonly used to understand recurrence periods (e.g., monthly, yearly), forecast upcoming charges, and differentiate between one-time and recurring fees for purchases.

The ChargeFrequency column is RECOMMENDED be present in a
FOCUS dataset
and MUST NOT be null. This column is of type String and MUST be one of the allowed values. When ChargeCategory is “Purchase”, ChargeFrequency MUST NOT be “Usage-Based”.

2.13.1. Column ID

ChargeFrequency

2.13.2. Display Name

Charge Frequency

2.13.3. Description

Indicates how often a charge will occur.

2.13.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Recommended
Allows nulls False
Data type String
Value format Allowed values

Allowed values:

Value Description
One-Time Charges that only happen once and will not repeat. One-time charges are typically recorded on the hour or day when the cost was incurred.
Recurring Charges that repeat on a periodic cadence (e.g., weekly, monthly) regardless of whether the product or service was used. Recurring charges typically happen on the same day or point within every period. The charge date does not change based on how or when the service is used.
Usage-Based Charges that repeat every time the service is used. Usage-based charges are typically recorded hourly or daily, based on the granularity of the cost data for the period when the service was used (referred to as charge period). Usage-based charges are not recorded when the service is not used.

2.13.5. Introduced (version)

1.0-preview

2.14. Charge Period End

Charge Period End represents the
exclusive
end date and time of a
charge period
. For example, a time period where ChargePeriodStart is ‘2024-01-01T00:00:00Z’ and ChargePeriodEnd is ‘2024-01-02T00:00:00Z’ includes charges for January 1, since ChargePeriodStart is
inclusive
, but does not include charges for January 2 since ChargePeriodEnd is exclusive.

ChargePeriodEnd MUST be present in a
FOCUS dataset
, MUST be of type Date/Time, MUST be an exclusive value, and MUST NOT contain null values. ChargePeriodEnd MUST match the ending date and time boundary of the effective period of the charge.

2.14.1. Column ID

ChargePeriodEnd

2.14.2. Display Name

Charge Period End

2.14.3. Description

The
exclusive
end date and time of a charge period.

2.14.4. Content constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type Date/Time
Value format Date/Time Format

2.14.5. Introduced (version)

0.5

2.15. Charge Period Start

Charge Period Start represents the
inclusive
start date and time within a
charge period
. For example, a time period where ChargePeriodStart is ‘2024-01-01T00:00:00Z’ and ChargePeriodEnd is ‘2024-01-02T00:00:00Z’ includes charges for January 1, since ChargePeriodStart is inclusive, but does not include charges for January 2 since ChargePeriodEnd is
exclusive
.

ChargePeriodStart MUST be present in a
FOCUS dataset
, MUST be of type Date/Time, MUST be an inclusive value, and MUST NOT contain null values. ChargePeriodStart MUST match the beginning date and time boundary of the effective period of the charge.

2.15.1. Column ID

ChargePeriodStart

2.15.2. Display Name

Charge Period Start

2.15.3. Description

The
inclusive
start date and time within a
charge period
.

2.15.4. Content constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type Date/Time
Value format Date/Time Format

2.15.5. Introduced (version)

0.5

2.16. Commitment Discount Category

Commitment Discount Category indicates whether the
commitment discount
identified in the CommitmentDiscountId column is based on usage quantity or cost (aka “spend”). The CommitmentDiscountCategory column is only applicable to commitment discounts and not
negotiated discounts
.

The CommitmentDiscountCategory column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String, MUST be null when CommitmentDiscountId is null, and MUST NOT be null when CommitmentDiscountId is not null. The CommitmentDiscountCategory MUST be one of the allowed values.

2.16.1. Column ID

CommitmentDiscountCategory

2.16.2. Display Name

Commitment Discount Category

2.16.3. Description

Indicates whether the commitment discount identified in the CommitmentDiscountId column is based on usage quantity or cost (aka “spend”).

2.16.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format Allowed Values

Allowed values:

Value Description
Spend Commitment discounts that require a predetermined amount of spend.
Usage Commitment discounts that require a predetermined amount of usage.

2.16.5. Introduced (version)

1.0-preview

2.17. Commitment Discount ID

A Commitment Discount ID is the identifier assigned to a
commitment discount
by the provider. Commitment Discount ID is commonly used for scenarios like chargeback for commitments and savings per commitment discount. The CommitmentDiscountId column is only applicable to commitment discounts and not
negotiated discounts
.

The CommitmentDiscountId column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String and MUST NOT contain null values when a charge is related to a commitment discount. When a charge is not associated with a commitment discount, the column MUST be null. CommitmentDiscountId MUST ensure global uniqueness within the provider and SHOULD be a fully-qualified identifier.

2.17.1. Column ID

CommitmentDiscountId

2.17.2. Display Name

Commitment Discount ID

2.17.3. Description

The identifier assigned to a commitment discount by the provider.

2.17.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.17.5. Introduced (version)

1.0-preview

2.18. Commitment Discount Name

A Commitment Discount Name is the display name assigned to a
commitment discount
. The CommitmentDiscountName column is only applicable to commitment discounts and not
negotiated discounts
.

The CommitmentDiscountName column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String. The CommitmentDiscountName value MUST be null if the charge is not related to a commitment discount and MAY be null if a display name cannot be assigned to a commitment discount. CommitmentDiscountName MUST NOT be null if a display name can be assigned to a commitment discount.

2.18.1. Column ID

CommitmentDiscountName

2.18.2. Display Name

Commitment Discount Name

2.18.3. Description

The display name assigned to a commitment discount.

2.18.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.18.5. Introduced (version)

1.0-preview

2.19. Commitment Discount Quantity

Commitment Discount Quantity is the amount of a
commitment discount
purchased or accounted for in commitment discount related
rows
that is denominated in Commitment Discount Units. The aggregated Commitment Discount Quantity across purchase records, pertaining to a particular Commitment Discount ID during its
term
, represents the total Commitment Discount Units acquired with that commitment discount. For committed usage, the Commitment Discount Quantity is either the number of Commitment Discount Units consumed by a row that is covered by a commitment discount or is the unused portion of a commitment discount over a charge period. Commitment Discount Quantity is commonly used in commitment discount analysis and optimization use cases and only applies to commitment discounts, not
negotiated discounts
.

When CommitmentDiscountCategory is “Usage” (usage-based commitment discounts), the Commitment Discount Quantity reflects the predefined amount of usage purchased or consumed. If
commitment discount flexibility
is applicable, this value may be further transformed based on additional, provider-specific requirements. When CommitmentDiscountCategory is “Spend” (spend-based commitment discounts), the Commitment Discount Quantity reflects the predefined amount of spend purchased or consumed.

The CommitmentDiscountQuantity column adheres to the following requirements:

      • CommitmentDiscountQuantity MUST be present in a
        FOCUS dataset
        when the provider supports commitment discounts.
      • CommitmentDiscountQuantity MUST be of type Decimal and MUST conform to Numeric Format requirements.
      • CommitmentDiscountQuantity MAY be null or any valid decimal value if
        CommitmentDiscountId
        is not null and
        ChargeClass
        is “Correction”.

In cases where the ChargeCategory is “Purchase”, CommitmentDiscountId is not null, and ChargeClass is not “Correction”, the following applies:

      • When ChargeFrequency is “One-Time”, and CommitmentDiscountId is not null, CommitmentDiscountQuantity MUST be the positive quantity of CommitmentDiscountUnits, paid fully or partially upfront, that is eligible for consumption over the commitment discount’s
        term.
      • When ChargeFrequency is “Recurring”, and CommitmentDiscountId is not null, CommitmentDiscountQuantity MUST be the positive quantity of CommitmentDiscountUnits that is eligible for consumption for each charge period that corresponds with the purchase.

In cases where the ChargeCategory is “Usage”, CommitmentDiscountId is not null, and ChargeClass is not “Correction”, the following applies:

      • When CommitmentDiscountStatus is “Used”, CommitmentDiscountQuantity MUST be the positive, metered quantity of CommitmentDiscountUnits that is consumed over the row’s
        charge period.
      • When CommitmentDiscountStatus is “Unused”, CommitmentDiscountQuantity MUST be the remaining, positive, unused quantity of CommitmentDiscountUnits for the row’s
        charge period.

CommitmentDiscountQuantity MUST be null in all other cases.

2.19.1. Column ID

CommitmentDiscountQuantity

2.19.2. Display Name

Commitment Discount Quantity

2.19.3. Description

The amount of a commitment discount purchased or accounted for in commitment discount related rows that is denominated in Commitment Discount Units.

2.19.4. Usability Constraints

Aggregation: When aggregating Commitment Discount Quantity for commitment utilization calculations, it’s important to exclude commitment discount purchases (i.e. when ChargeCategory is “Purchase”) that are paid to cover future eligible charges (e.g., commitment discount). Otherwise, when accounting for all upfront or accrued purchases, it’s important to exclude commitment discount usage (i.e. when ChargeCategory is “Usage”). This exclusion helps prevent double counting of these quantities in the aggregation.

2.19.5. Content constraints

Constraint Value
Column type Metric
Feature level Conditional
Allows nulls True
Data type Decimal
Value format Numeric Format
Number range Any valid decimal value

2.19.6. Introduced (version)

1.1

2.20. Commitment Discount Status

Commitment Discount Status indicates whether the charge corresponds with the consumption of a
commitment discount
identified in the CommitmentDiscountId column or the unused portion of the committed amount. The CommitmetnDiscountStatus column is only applicable to commitment discounts and not
negotiated discounts
.

The CommitmentDiscountStatus column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String, MUST be null when CommitmentDiscountId is null, and MUST NOT be null when CommitmentDiscountId is not null and Charge Category is “Usage”. CommitmentDiscountStatus MUST be one of the allowed values.

2.20.1. Column ID

CommitmentDiscountStatus

2.20.2. Display name

Commitment Discount Status

2.20.3. Description

Indicates whether the charge corresponds with the consumption of a commitment discount or the unused portion of the committed amount.

2.20.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format Allowed Values

Allowed values:

Value Description
Used Charges that utilized a specific amount of a commitment discount.
Unused Charges that represent the unused portion of the commitment discount.

2.20.5. Introduced (version)

1.0

2.21. Commitment Discount Type

Commitment Discount Type is a provider-assigned name to identify the type of
commitment discount
applied to the
row
. The CommitmentDiscountType column is only applicable to commitment discounts and not
negotiated discounts
.

The CommitmentDiscountType column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String, MUST be null when CommitmentDiscountId is null, and MUST NOT be null when CommitmentDiscountId is not null.

2.21.1. Column ID

CommitmentDiscountType

2.21.2. Display Name

Commitment Discount Type

2.21.3. Description

A provider-assigned identifier for the type of commitment discount applied to the row.

2.21.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.21.5. Introduced (version)

1.0-preview

2.22. Commitment Discount Unit

Commitment Discount Unit represents the provider-specified measurement unit indicating how a provider measures the Commitment Discount Quantity of a
commitment discount
. The CommitmentDiscountUnit column is only applicable to commitment discounts and not
negotiated discounts
.

The CommitmentDiscountUnit column adheres to the following requirements:

      • CommitmentDiscountUnit MUST be present in a
        FOCUS dataset
        when the provider supports
        commitment discounts
        .
      • CommitmentDiscountUnit MUST be of type String, and the units of measure used in CommitmentDiscountUnit SHOULD adhere to the values and format requirements specified in the UnitFormat attribute.
      • The CommitmentDiscountUnit MUST be the same across all rows where CommitmentDiscountQuantity has the same CommitmentDiscountId.
      • CommitmentDiscountUnit MAY be null if CommitmentDiscountId is not null and ChargeClass is “Correction”.
      • CommitmentDiscountUnit MUST NOT be null when CommitmentDiscountId is not null and ChargeClass is not “Correction”.
      • CommitmentDiscountUnit MUST be null in all other cases.

In cases where the CommitmentDiscountUnit is not null, the following applies:

      • The CommitmentDiscountUnit MUST represent the unit used to measure the commitment discount.
      • When accounting for
        commitment discount flexibility
        , the CommitmentDiscountUnit value SHOULD reflect this consideration.

2.22.1. Column ID

CommitmentDiscountUnit

2.22.2. Display Name

Commitment Discount Unit

2.22.3. Description

The provider-specified measurement unit indicating how a provider measures the Commitment Discount Quantity of a commitment discount.

2.22.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format Unit Format

2.22.5. Introduced (version)

1.1

2.23. Consumed Quantity

The Consumed Quantity represents the volume of a metered SKU associated with a
resource
or
service
used, based on the Consumed Unit. Consumed Quantity is often derived at a finer granularity or over a different time interval when compared to the Pricing Quantity (complementary to Pricing Unit) and focuses on resource and service consumption, not pricing and cost.

The ConsumedQuantity column adheres to the following requirements:

      • ConsumedQuantity MUST be present in a
        FOCUS dataset
        when the provider supports the measurement of usage.
      • ConsumedQuantity MUST be of type Decimal and MUST conform to Numeric Format requirements.
      • ConsumedQuantity MUST NOT be null and MUST be a valid positive decimal value if ChargeCategory is “Usage”, CommitmentDiscountStatus is not “Unused”, and ChargeClass is not “Correction”.
      • ConsumedQuantity MAY be null or any valid decimal value if ChargeCategory is “Usage”, CommitmentDiscountStatus is not “Unused”, and ChargeClass is “Correction”.
      • ConsumedQuantity MUST be null in all other cases.

2.23.1. Column ID

ConsumedQuantity

2.23.2. Display Name

Consumed Quantity

2.23.3. Description

The volume of a metered SKU associated with a resource or service used, based on the Consumed Unit.

2.23.4. Content constraints

Constraint Value
Column type Metric
Feature level Conditional
Allows nulls True
Data type Decimal
Value format Numeric Format
Number range Any valid decimal value

2.23.5. Introduced (version)

1.0

2.24. Consumed Unit

The Consumed Unit represents a provider-specified measurement unit indicating how a provider measures usage of a metered SKU associated with a
resource
or
service
. Consumed Unit complements the Consumed Quantity metric. It is often listed at a finer granularity or over a different time interval when compared to Pricing Unit (complementary to Pricing Quantity), and focuses on resource and service consumption, not pricing and cost.

The ConsumedUnit column adheres to the following requirements:

      • ConsumedUnit MUST be present in a
        FOCUS dataset
        when the provider supports the measurement of usage.
      • ConsumedUnit MUST be of type String, and the units of measure used in ConsumedUnit SHOULD adhere to the values and format requirements specified in the UnitFormat attribute.
      • ConsumedUnit MUST NOT be null if ChargeCategory is “Usage”, CommitmentDiscountStatus is not “Unused”, and ChargeClass is not “Correction”.
      • ConsumedUnit MAY be null if ChargeCategory is “Usage”, CommitmentDiscountStatus is not “Unused”, and ChargeClass is “Correction”.
      • ConsumedUnit MUST be null in all other cases.

2.24.1. Column ID

ConsumedUnit

2.24.2. Display Name

Consumed Unit

2.24.3. Description

Provider-specified measurement unit indicating how a provider measures usage of a metered SKU associated with a resource or service.

2.24.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format Unit Format recommended

2.24.5. Introduced (version)

1.0

2.25. Contracted Cost

Contracted Cost represents the cost calculated by multiplying
contracted unit price
and the corresponding Pricing Quantity. Contracted Cost is denominated in the Billing Currency and is commonly used for calculating savings based on negotiation activities, by comparing it with List Cost. If
negotiated discounts
are not applicable, the Contracted Cost defaults to the List Cost.

The ContractedCost column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column MUST be of type Decimal, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. When ContractedUnitPrice is present and not null, multiplying the ContractedUnitPrice by PricingQuantity MUST produce the ContractedCost, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.

In cases where the ContractedUnitPrice is present and null, the following applies:

      • The ContractedCost of a charge calculated based on other charges (e.g., when the ChargeCategory is “Tax”) MUST be calculated based on the ContractedCost of those related charges.
      • The ContractedCost of a charge unrelated to other charges (e.g., when the ChargeCategory is “Credit”) MUST match the BilledCost.

2.25.1. Column ID

ContractedCost

2.25.2. Display Name

Contracted Cost

2.25.3. Description

Cost calculated by multiplying contracted unit price and the corresponding Pricing Quantity.

2.25.4. Usability Constraints

Aggregation: When aggregating Contracted Cost for savings calculations, it’s important to exclude either Charge Category “Purchase” charges (one-time and recurring) that are paid to cover future eligible charges (e.g., Commitment Discount) or the covered Charge Category “Usage” charges themselves. This exclusion helps prevent double counting of these charges in the aggregation. Which set of charges to exclude depends on whether cost are aggregated on a billed basis (exclude covered charges) or accrual basis (exclude Purchases for future charges). For instance, charges categorized as Charge Category “Purchase” and their related Charge Category “Tax” charges for a Commitment Discount might be excluded from an accrual basis cost aggregation of Contracted Cost. This is because the “Usage” and “Tax” charge records provided during the term of the commitment discount already specify the Contracted Cost. Purchase charges that cover future eligible charges can be identified by filtering for Charge Category “Purchase” records with a Billed Cost greater than 0 and an Effective Cost equal to 0.

2.25.5. Content Constraints

Constraint Value
Column type Metric
Feature level Mandatory
Allows nulls False
Data type Decimal
Value format Numeric Format
Number range Any valid decimal value

2.25.6. Introduced (version)

1.0

2.26. Contracted Unit Price

The Contracted Unit Price represents the agreed-upon unit price for a single Pricing Unit of the associated SKU, inclusive of
negotiated discounts
, if present, while excluding negotiated
commitment discounts
or any other discounts. This price is denominated in the Billing Currency. The Contracted Unit Price is commonly used for calculating savings based on negotiation activities. If negotiated discounts are not applicable, the Contracted Unit Price defaults to the List Unit Price.

The ContractedUnitPrice column MUST be present in a
FOCUS dataset
when the provider supports negotiated pricing concepts. This column MUST be a Decimal within the range of non-negative decimal values, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. It MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. When ContractedUnitPrice is present and not null, multiplying ContractedUnitPrice by PricingQuantity MUST equal ContractedCost, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.

2.26.1. Column ID

ContractedUnitPrice

2.26.2. Display Name

Contracted Unit Price

2.26.3. Description

The agreed-upon unit price for a single Pricing Unit of the associated SKU, inclusive of negotiated discounts, if present, while excluding negotiated commitment discounts or any other discounts.

2.26.4. Usability Constraints

Aggregation: Column values should only be viewed in the context of their row and not aggregated to produce a total.

2.26.5. Content Constraints

Constraint Value
Column type Metric
Feature level Conditional
Allows nulls True
Data type Decimal
Value format Numeric Format
Number range Any valid non-negative decimal value

2.26.6. Introduced (version)

1.0

2.27. Effective Cost

Effective Cost represents the
amortized
cost of the
charge
after applying all reduced rates, discounts, and the applicable portion of relevant, prepaid purchases (one-time or recurring) that covered this charge. The amortized portion included should be proportional to the Pricing Quantity and the time granularity of the data. Since amortization breaks down and spreads the cost of a prepaid purchase, to subsequent eligible charges, the Effective Cost of the original prepaid charge is set to 0. Effective Cost does not mix or “blend” costs across multiple charges of the same service. This cost is denominated in the Billing Currency. The Effective Cost is commonly utilized to track and analyze spending trends.

This column resolves two challenges that are faced by practitioners:

      1. Practitioners need to amortize relevant purchases, such as upfront fees, throughout the commitment and distribute them to the appropriate reporting groups (e.g.
        tags
        ,
        resources
        ).
      2. Many
        commitment discount
        constructs include a recurring expense for the commitment for every
        billing period
        and must distribute this cost to the resources using the commitment. This forces reconciliation between the initial commitment

        row
        per period and the actual usage rows.

The EffectiveCost column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column MUST be of type Decimal, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. EffectiveCost MUST be 0 when ChargeCategory is “Purchase” and the purchase is intended to cover future eligible charges. The aggregated EffectiveCost for a billing period may not match the charge received on the invoice for the same billing period.

In cases where the ChargeCategory is not “Usage” or “Purchase”, the following applies:

      • The EffectiveCost MUST be calculated based on the EffectiveCost of the related charges if the charge is calculated based on other charges (e.g. ChargeCategory is “Tax”).
      • The EffectiveCost MUST match the BilledCost if the charge is unrelated to other charges (e.g. ChargeCategory is “Credit”).
      • When CommitmentDiscountStatus is “Unused”, the EffectiveCost MUST be the total committed cost consumed for the given charge period minus related usage charges.

2.27.1. Column ID

EffectiveCost

2.27.2. Display Name

Effective Cost

2.27.3. Description

The amortized cost of the charge after applying all reduced rates, discounts, and the applicable portion of relevant, prepaid purchases (one-time or recurring) that covered this charge.

2.27.3.1. Concerning Granularity and Distribution of Recurring Fee

Providers should distribute the commitment purchase amount instead of including a row at the beginning of a period so practitioners do not need to manually distribute the fee themselves.

2.27.3.2. Concerning Amortization Approaches

Eligible purchases should be amortized using a methodology determined by the provider that reflects the needs of their customer base and is proportional to the Pricing Quantity and the time granularity of the row. Should a practitioner desire to amortize relevant purchases using a different approach, the practitioner can do so using the Billed Cost for the line item representing the initial purchase.

2.27.4. Content constraints

Constraint Value
Column type Metric
Feature level Mandatory
Allows nulls False
Data type Decimal
Value format Numeric Format
Number range Any valid decimal value

2.27.5. Introduced (version)

0.5

2.28. Invoice Issuer

An Invoice Issuer is an entity responsible for invoicing for the
resources
or
services
consumed. It is commonly used for cost analysis and reporting scenarios.

The InvoiceIssuer column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values.

See Appendix: Origination of cost data section for examples of Provider, Publisher and Invoice Issuer values that can be used for various purchasing scenarios.

2.28.1. Column ID

InvoiceIssuerName

2.28.2. Display Name

Invoice Issuer

2.28.3. Description

The name of the entity responsible for invoicing for the resources or services consumed.

2.28.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type String
Value format <not specified>

2.28.5. Introduced (version)

0.5

2.29. List Cost

List Cost represents the cost calculated by multiplying the
list unit price
and the corresponding Pricing Quantity. List Cost is denominated in the Billing Currency and is commonly used for calculating savings based on various rate optimization activities, by comparing it with Contracted Cost, Billed Cost and Effective Cost.

The ListCost column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column MUST be of type Decimal, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. When ListUnitPrice is present and not null, multiplying the ListUnitPrice by PricingQuantity MUST produce the ListCost, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.

In cases where the ListUnitPrice is present and is null, the following applies:

      • The ListCost of a charge calculated based on other charges (e.g., when the ChargeCategory is “Tax”) MUST be calculated based on the ListCost of those related charges.
      • The ListCost of a charge unrelated to other charges (e.g., when the ChargeCategory is “Credit”) MUST match the BilledCost.

2.29.1. Column ID

ListCost

2.29.2. Display Name

List Cost

2.29.3. Description

Cost calculated by multiplying List Unit Price and the corresponding Pricing Quantity.

2.29.4. Usability Constraints

Aggregation: When aggregating List Cost for savings calculations, it’s important to exclude either Charge Category “Purchase” charges (one-time and recurring) that are paid to cover future eligible charges (e.g., Commitment Discount) or the covered Charge Category “Usage” charges themselves. This exclusion helps prevent double counting of these charges in the aggregation. Which set of charges to exclude depends on whether cost are aggregated on a billed basis (exclude covered charges) or accrual basis (exclude Purchases for future charges). For instance, charges categorized as Charge Category “Purchase” and their related Charge Category “Tax” charges for a Commitment Discount might be excluded from an accrual basis cost aggregation of List Cost. This is because the “Usage” and “Tax” charge records provided during the term of the commitment discount already specify the List Cost. Purchase charges that cover future eligible charges can be identified by filtering for Charge Category “Purchase” records with a Billed Cost greater than 0 and an Effective Cost equal to 0.

2.29.5. Content Constraints

Constraint Value
Column type Metric
Feature level Mandatory
Allows nulls False
Data type Decimal
Value format Numeric Format
Number range Any valid decimal value

2.29.6. Introduced (version)

1.0-preview

2.30. List Unit Price

The List Unit Price represents the suggested provider-published unit price for a single Pricing Unit of the associated SKU, exclusive of any discounts. This price is denominated in the Billing Currency. The List Unit Price is commonly used for calculating savings based on various rate optimization activities.

The ListUnitPrice column MUST be present in a
FOCUS dataset
when the provider publishes unit prices exclusive of discounts. This column MUST be a Decimal within the range of non-negative decimal values, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. It MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. When ListUnitPrice is present and is not null, multiplying ListUnitPrice by PricingQuantity MUST equal ListCost, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.

2.30.1. Column ID

ListUnitPrice

2.30.2. Display Name

List Unit Price

2.30.3. Description

The suggested provider-published unit price for a single Pricing Unit of the associated SKU, exclusive of any discounts.

2.30.4. Usability Constraints

Aggregation: Column values should only be viewed in the context of their row and not aggregated to produce a total.

2.30.5. Content Constraints

Constraint Value
Column type Metric
Feature level Conditional
Allows nulls True
Data type Decimal
Value format Numeric Format
Number range Any valid non-negative decimal value

2.30.6. Introduced (version)

1.0-preview

2.31. Pricing Category

Pricing Category describes the pricing model used for a charge at the time of use or purchase. It can be useful for distinguishing between charges incurred at the
list unit price
or a reduced price and exposing optimization opportunities, like increasing
commitment discount
coverage.

The PricingCategory column adheres to the following requirements:

      • PricingCategory MUST be present in a
        FOCUS dataset
        when the provider supports more than one pricing category across all SKUs and MUST be of type String.
      • PricingCategory MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory.
      • PricingCategory MUST be one of the allowed values.
      • PricingCategory MUST be “Standard” when pricing is predetermined at the agreed upon rate for the billing account.
      • PricingCategory MUST be “Committed” when the charge is subject to an existing commitment discount and is not the purchase of the commitment discount.
      • PricingCategory MUST be “Dynamic” when pricing is determined by the provider and may change over time, regardless of predetermined agreement pricing.
      • PricingCategory MUST be “Other” when there is a pricing model but none of the allowed values apply.

2.31.1. Column ID

PricingCategory

2.31.2. Display Name

Pricing Category

2.31.3. Description

Describes the pricing model used for a charge at the time of use or purchase.

2.31.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format Allowed values

Allowed values:

Value Description
Standard Charges priced at the agreed upon rate for the billing account, including
negotiated discounts
. This pricing includes any flat rate and volume/tiered pricing but does not include dynamic pricing or reduced pricing due to the application of a commitment discount. This does include the purchase of a commitment discount at agreed upon rates.
Dynamic Charges priced at a variable rate determined by the provider. This includes any product or service with a unit price the provider can change without notice, like interruptible or low priority resources.
Committed Charges with reduced pricing due to the application of the commitment discount specified by the Commitment Discount ID.
Other Charges priced in a way not covered by another pricing category.

2.31.5. Introduced (version)

1.0-preview

2.32. Pricing Quantity

The Pricing Quantity represents the volume of a given SKU associated with a
resource
or
service
used or purchased, based on the Pricing Unit. Distinct from Consumed Quantity (complementary to Consumed Unit), it focuses on pricing and cost, not resource and service consumption.

The PricingQuantity column MUST be present in a
FOCUS dataset
. This column MUST be of type Decimal and MUST conform to Numeric Format requirements. The value MAY be negative in cases where ChargeClass is “Correction”. This column MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. When unit prices are not null, multiplying PricingQuantity by a unit price MUST produce a result equal to the corresponding cost metric, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.

2.32.1. Column ID

PricingQuantity

2.32.2. Display Name

Pricing Quantity

2.32.3. Description

The volume of a given SKU associated with a resource or service used or purchased, based on the Pricing Unit.

2.32.4. Usability Constraints

Aggregation: When aggregating Pricing Quantity for commitment utilization calculations, it’s important to exclude commitment discount purchases (i.e. when ChargeCategory is “Purchase”) that are paid to cover future eligible charges (e.g., Commitment Discount). Otherwise, when accounting for all upfront or accrued purchases, it’s important to exclude commitment discount usage (i.e. when ChargeCategory is “Usage”). This exclusion helps prevent double counting of these quantities in the aggregation.

2.32.5. Content Constraints

Constraint Value
Column type Metric
Feature level Mandatory
Allows nulls True
Data type Decimal
Value format Numeric Format
Number Range Any valid decimal value

2.32.6. Introduced (version)

1.0-preview

2.33. Pricing Unit

The Pricing Unit represents a provider-specified measurement unit for determining unit prices, indicating how the provider rates measured usage and purchase quantities after applying pricing rules like
block pricing
. Common examples include the number of hours for compute appliance runtime (e.g. Hours), gigabyte-hours for a storage appliance (e.g., GB-Hours), or an accumulated count of requests for a network appliance or API service (e.g., 1000 Requests). Pricing Unit complements the Pricing Quantity metric. Distinct from the Consumed Unit, it focuses on pricing and cost, not
resource
and
service
consumption, often at a coarser granularity.

The PricingUnit column MUST be present in a
FOCUS dataset
. This column MUST be of type String. It MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. Units of measure used in PricingUnit SHOULD adhere to the values and format requirements specified in the UnitFormat attribute.

The PricingUnit value MUST be semantically equal to the corresponding pricing measurement unit value provided in:

      • The provider-published
        price list
      • The invoice, when the invoice includes a pricing measurement unit

2.33.1. Column ID

PricingUnit

2.33.2. Display Name

Pricing Unit

2.33.3. Description

Provider-specified measurement unit for determining unit prices, indicating how the provider rates measured usage and purchase quantities after applying pricing rules like block pricing.

2.33.4. Content constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls True
Data type String
Value format Unit Format

2.33.5. Introduced (version)

1.0-preview

2.34. Provider

A Provider is an entity that makes the
resources
or
services
available for purchase. It is commonly used for cost analysis and reporting scenarios.

The Provider column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values.

See Appendix: Origination of cost data section for examples of Provider, Publisher and Invoice Issuer values that can be used for various purchasing scenarios.

2.34.1. Column ID

ProviderName

2.34.2. Display Name

Provider

2.34.3. Description

The name of the entity that made the resources or services available for purchase.

2.34.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type String
Value format <not specified>

2.34.5. Introduced (version)

0.5

2.35. Publisher

A Publisher is an entity that produces the
resources
or
services
that were purchased. It is commonly used for cost analysis and reporting scenarios.

The Publisher column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values.

See Appendix: Origination of cost data section for examples of Provider, Publisher and Invoice Issuer values that can be used for various purchasing scenarios.

2.35.1. Column ID

PublisherName

2.35.2. Display Name

Publisher

2.35.3. Description

The name of the entity that produced the resources or services that were purchased.

2.35.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type String
Value format <not specified>

2.35.5. Introduced (version)

0.5

2.36. Region ID

A Region ID is a provider-assigned identifier for an isolated geographic area where a
resource
is provisioned or a
service
is provided. The region is commonly used for scenarios like analyzing cost and unit prices based on where resources are deployed.

The RegionId column MUST be present in a
FOCUS dataset
when the provider supports deploying resources or services within a region and MUST be of type String. RegionId MUST NOT be null when a resource or service is operated in or managed from a distinct region by the Provider and MAY contain null values when a resource or service is not restricted to an isolated geographic area.

2.36.1. Column ID

RegionId

2.36.2. Display Name

Region ID

2.36.3. Description

Provider-assigned identifier for an isolated geographic area where a resource is provisioned or a service is provided.

2.36.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.36.5. Introduced (version)

1.0

2.37. Region Name

Region Name is a provider-assigned display name for an isolated geographic area where a
resource
is provisioned or a
service
is provided. Region Name is commonly used for scenarios like analyzing cost and unit prices based on where resources are deployed.

The RegionName column MUST be present in a
FOCUS dataset
when the provider supports deploying resources or services within a region and MUST be of type String. RegionName MUST NOT be null when a resource or service is operated in or managed from a distinct region by the Provider and MAY contain null values when a resource or service is not restricted to an isolated geographic area.

2.37.1. Column ID

RegionName

2.37.2. Display Name

Region Name

2.37.3. Description

The name of an isolated geographic area where a resource is provisioned or a service is provided.

2.37.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.37.5. Introduced (version)

1.0

2.38. Resource ID

A Resource ID is an identifier assigned to a
resource
by the provider. The Resource ID is commonly used for cost reporting, analysis, and allocation scenarios.

The ResourceId column MUST be present in a
FOCUS dataset
when the provider supports billing based on provisioned resources. This column MUST be of type String. The ResourceId value MAY be a nullable column as some cost data
rows
may not be associated with a resource. ResourceId MUST appear in the cost data if an identifier is assigned to a resource by the provider. ResourceId SHOULD be a fully-qualified identifier that ensures global uniqueness within the provider.

2.38.1. Column ID

ResourceId

2.38.2. Display Name

Resource ID

2.38.3. Description

Identifier assigned to a resource by the provider.

2.38.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.38.5. Introduced (version)

0.5

2.39. Resource Name

The Resource Name is a display name assigned to a
resource
. It is commonly used for cost analysis, reporting, and allocation scenarios.

The ResourceName column MUST be present in a
FOCUS dataset
when the provider supports billing based on provisioned resources. This column MUST be of type String. The ResourceName value MAY be a nullable column as some cost data
rows
may not be associated with a resource or because a display name cannot be assigned to a resource. ResourceName MUST NOT be null if a display name can be assigned to a resource. Resources not provisioned interactively or only have a system-generated ResourceId MUST NOT duplicate the same value as the ResourceName.

2.39.1. Column ID

ResourceName

2.39.2. Display Name

Resource Name

2.39.3. Description

Display name assigned to a resource.

2.39.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.39.5. Introduced (version)

0.5

2.40. Resource Type

Resource Type describes the kind of
resource
the charge applies to. A Resource Type is commonly used for scenarios like identifying cost changes in groups of similar resources and may include values like Virtual Machine, Data Warehouse, and Load Balancer.

The ResourceType column MUST be present in a
FOCUS dataset
when the provider supports billing based on provisioned resources and supports assigning a type for resources. This column MUST be of type String and MUST NOT be null when a corresponding ResourceId is not null. When a corresponding ResourceId value is null, the ResourceType column value MUST also be null.

2.40.1. Column ID

ResourceType

2.40.2. Display Name

Resource Type

2.40.3. Description

The kind of resource the charge applies to.

2.40.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.40.5. Introduced (version)

1.0-preview

2.41. Service Category

The Service Category is the highest-level classification of a
service
based on the core function of the service. Each service should have one and only one category that best aligns with its primary purpose. The Service Category is commonly used for scenarios like analyzing costs across providers and tracking the migration of workloads across fundamentally different architectures.

The ServiceCategory column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column is of type String and MUST be one of the allowed values.

2.41.1. Column ID

ServiceCategory

2.41.2. Display Name

Service Category

2.41.3. Description

Highest-level classification of a service based on the core function of the service.

2.41.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type String
Value format Allowed Values

Allowed values:

Service Category Description
AI and Machine Learning Artificial Intelligence and Machine Learning related technologies.
Analytics Data processing, analytics, and visualization capabilities.
Business Applications Business and productivity applications and services.
Compute Virtual, containerized, serverless, or high-performance computing infrastructure and services.
Databases Database platforms and services that allow for storage and querying of data.
Developer Tools Software development and delivery tools and services.
Multicloud Support for interworking of multiple cloud and/or on-premises environments.
Identity Identity and access management services.
Integration Services that allow applications to interact with one another.
Internet of Things Development and management of IoT devices and networks.
Management and Governance Management, logging, and observability of a customer’s use of cloud.
Media Media and entertainment streaming and processing services.
Migration Moving applications and data to the cloud.
Mobile Services enabling cloud applications to interact via mobile technologies.
Networking Network connectivity and management.
Security Security monitoring and compliance services.
Storage Storage services for structured or unstructured data.
Web Services enabling cloud applications to interact via the Internet.
Other New or emerging services that do not align with an existing category.

2.41.5. Introduced (version)

0.5

2.42. Service Name

A
service
represents an offering that can be purchased from a provider (e.g., cloud virtual machine, SaaS database, professional services from a systems integrator). A service offering can include various types of usage or other charges. For example, a cloud database service may include compute, storage, and networking charges.

The Service Name is a display name for the offering that was purchased. The Service Name is commonly used for scenarios like analyzing aggregate cost trends over time and filtering data to investigate anomalies.

The ServiceName column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values.

2.42.1. Column ID

ServiceName

2.42.2. Display Name

Service Name

2.42.3. Description

An offering that can be purchased from a provider (e.g., cloud virtual machine, SaaS database, professional services from a systems integrator).

2.42.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Mandatory
Allows nulls False
Data type String
Value format <not specified>

2.42.5. Introduced (version)

0.5

2.43. Service Subcategory

The Service Subcategory is a secondary classification of the Service Category for a
service
based on its core function. The Service Subcategory (in conjunction with the Service Category) is commonly used for scenarios like analyzing spend and usage for specific workload types across providers and tracking the migration of workloads across fundamentally different architectures.

The ServiceSubcategory column adheres to the following requirements:

      • ServiceSubcategory is RECOMMENDED to be present in a
        FOCUS dataset
        and MUST NOT be null.
      • ServiceSubcategory is of type String and MUST be one of the allowed values.
      • Each ServiceSubcategory value MUST have one and only one parent ServiceCategory as specified in the allowed values below.
      • Though a given service can have multiple purposes, each service SHOULD have one and only one ServiceSubcategory that best aligns with its primary purpose.

2.43.1. Column ID

ServiceSubcategory

2.43.2. Display Name

Service Subcategory

2.43.3. Description

Secondary classification of the Service Category for a service based on its core function.

2.43.4. Content Constraints

Constraint Value
Column type Dimension
Feature level Recommended
Allows nulls False
Data type String
Value format Allowed Values

Allowed values:

Service Category Service Subcategory Service Subcategory Description
AI and Machine Learning AI Platforms Unified solution that combines artificial intelligence and machine learning technologies.
AI and Machine Learning Bots Automated performance of tasks such as customer service, data collection, and content moderation.
AI and Machine Learning Generative AI Creation of content like text, images, and music by learning patterns from existing data.
AI and Machine Learning Machine Learning Creation, training, and deployment of statistical algorithms that learn from and perform tasks based on data.
AI and Machine Learning Natural Language Processing Generation of human language, handling tasks like translation, sentiment analysis, and text summarization.
AI and Machine Learning Other (AI and Machine Learning) AI and Machine Learning services that do not fall into one of the defined subcategories.
Analytics Analytics Platforms Unified solution that combines technologies across the entire analytics lifecycle.
Analytics Business Intelligence Semantic models, dashboards, reports, and data visualizations to track performance and identify trends.
Analytics Data Processing Integration and transformation tasks to prepare data for analysis.
Analytics Search Discovery of information by indexing and retrieving data from various sources.
Analytics Streaming Analytics Real-time data stream processes to detect patterns, trends, and anomalies as they occur.
Analytics Other (Analytics) Analytics services that do not fall into one of the defined subcategories.
Business Applications Productivity and Collaboration Tools that facilitate individuals managing tasks and working together.
Business Applications Other (Business Applications) Business Applications services that do not fall into one of the defined subcategories.
Compute Containers Management and orchestration of containerized compute platforms.
Compute End User Computing Virtualized desktop infrastructure and device / endpoint management.
Compute Quantum Compute Resources and simulators that leverage the principles of quantum mechanics.
Compute Serverless Compute Enablement of compute capabilities without provisioning or managing servers.
Compute Virtual Machines Computing environments ranging from hosts with abstracted operating systems to bare-metal servers.
Compute Other (Compute) Compute services that do not fall into one of the defined subcategories.
Databases Caching Low-latency and high-throughput access to frequently accessed data.
Databases Data Warehouses Big data storage and querying capabilities.
Databases Ledger Databases Immutable and transparent databases to record tamper-proof and cryptographically secure transactions.
Databases NoSQL Databases Unstructured or semi-structured data storage and querying capabilities.
Databases Relational Databases Structured data storage and querying capabilities.
Databases Time Series Databases Time-stamped data storage and querying capabilities.
Databases Other (Databases) Database services that do not fall into one of the defined subcategories.
Developer Tools Developer Platforms Unified solution that combines technologies across multiple areas of the software development lifecycle.
Developer Tools Continuous Integration and Deployment CI/CD tools and services that support building and deploying code for software and systems.
Developer Tools Development Environments Tools and services that support authoring code for software and systems.
Developer Tools Source Code Management Tools and services that support version control of code for software and systems.
Developer Tools Quality Assurance Tools and services that support testing code for software and systems.
Developer Tools Other (Developer Tools) Developer Tools services that do not fall into one of the defined subcategories.
Identity Identity and Access Management Technologies that ensure users have appropriate access to resources.
Identity Other (Identity) Identity services that do not fall into one of the defined subcategories.
Integration API Management Creation, publishing, and management of application programming interfaces.
Integration Messaging Asynchronous communication between distributed applications.
Integration Workflow Orchestration Design, execution, and management of business processes and workflows.
Integration Other (Integration) Integration services that do not fall into one of the defined subcategories.
Internet of Things IoT Analytics Examination of data collected from IoT devices.
Internet of Things IoT Platforms Unified solution that combines IoT data collection, processing, visualization, and device management.
Internet of Things Other (Internet of Things) Internet of Things (IoT) services that do not fall into one of the defined subcategories.
Management and Governance Architecture Planning, design, and construction of software systems.
Management and Governance Compliance Adherance to regulatory standards and industry best practices.
Management and Governance Cost Management Monitoring and controlling expenses of systems and services.
Management and Governance Data Governance Management of the availability, usability, integrity, and security of data.
Management and Governance Disaster Recovery Plans and procedures that ensure systems and services can recover from disruptions.
Management and Governance Endpoint Management Tools that configure and secure access to devices.
Management and Governance Observability Monitoring, logging, and tracing of data to track the performance and health of systems.
Management and Governance Support Assistance and expertise supplied by providers.
Management and Governance Other (Management and Governance) Management and governance services that do not fall into one of the defined subcategories.
Media Content Creation Production of media content.
Media Gaming Development and delivery of gaming services.
Media Media Streaming Multimedia delivered and rendered in real-time on devices.
Media Mixed Reality Technologies that blend real-world and computer-generated environments.
Media Other (Media) Media services that do not fall into one of the defined subcategories.
Migration Data Migration Movement of stored data from one location to another.
Migration Resource Migration Movement of resources from one location to another.
Migration Other (Migration) Migration services that do not fall into one of the defined subcategories.
Mobile Other (Mobile) All Mobile services.
Multicloud Multicloud Integration Environments that facilitate consumption of services from multiple cloud providers.
Multicloud Other (Multicloud) Multicloud services that do not fall into one of the defined subcategories.
Networking Application Networking Distribution of incoming network traffic across application-based workloads.
Networking Content Delivery Distribution of digital content using a network of servers (CDNs).
Networking Network Connectivity Facilitates communication between networks or network segments.
Networking Network Infrastructure Configuration, monitoring, and troubleshooting of network devices.
Networking Network Routing Services that select paths for traffic within or across networks.
Networking Network Security Protection from unauthorized network access and cyber threats using firewalls and anti-malware tools.
Networking Other (Networking) Networking services that do not fall into one of the defined subcategories.
Security Secret Management Information used to authenticate users and systems, including secrets, certificates, tokens, and other keys.
Security Security Posture Management Tools that help organizations configure, monitor, and improve system security.
Security Threat Detection and Response Collect and analyze security data to identify and respond to potential security threats and vulnerabilities.
Security Other (Security) Security services that do not fall into one of the defined subcategories.
Storage Backup Storage Secondary storage to protect against data loss.
Storage Block Storage High performance, low latency storage that provides random access.
Storage File Storage Scalable, sharable storage for file-based data.
Storage Object Storage Highly available, durable storage for unstructured data.
Storage Storage Platforms Unified solution that supports multiple storage types.
Storage Other (Storage) Storage services that do not fall into one of the defined subcategories.
Web Application Platforms Integrated environments that run web applications.
Web Other (Web) Web services that do not fall into one of the defined subcategories.
Other Other (Other) Services that do not fall into one of the defined categories.

2.43.5. Introduced (version)

1.1

2.44. SKU ID

A SKU ID is a unique identifier that defines a provider-supported construct for organizing properties that are common across one or more
SKU Prices
. SKU ID can be referenced on a catalog or
price list
published by a provider to look up detailed information about the SKU. The composition of the properties associated with the SKU ID may differ across providers. Some providers may not support the
SKU
construct and instead associate all such properties directly with the SKU Price. SKU ID is commonly used for analyzing cost based on SKU-related properties above the pricing constructs.

The SkuId column MUST be present in a
FOCUS dataset
when the provider publishes a SKU list. This column MUST be of type String. It MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. SkuId MUST equal SkuPriceId when a provider does not support an overarching SKU ID construct.

2.44.1. Column ID

SkuId

2.44.2. Display Name

SKU ID

2.44.3. Description

A unique identifier that defines a provider-supported construct for organizing properties that are common across one or more SKU Prices.

2.44.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.44.5. Introduced (version)

1.0-preview

2.45. SKU Meter

The SKU Meter describes the functionality being metered or measured by a particular SKU in a charge.

Providers often have billing models in which multiple SKUs exist for a given service to describe and bill for different functionalities for that service. For example, an object storage service may have separate SKUs for functionalities such as object storage, API requests, data transfer, encryption, and object management. This field helps practitioners understand which functionalities are being metered by the different SKUs that appear in a
FOCUS dataset
.

The SkuMeter column adheres to the following requirements:

      • SkuMeter MUST be present in a FOCUS dataset when when the provider includes a SkuId.
      • SkuMeter MUST be of type String.
      • SkuMeter MUST be null when SkuId is null.
      • SkuMeter SHOULD NOT be null when SkuId is not null.
      • SkuMeter SHOULD remain consistent over time for a given SkuId.

2.45.1. Examples

Compute Usage, Block Volume Usage, Data Transfer, API Requests

2.45.2. Column ID

SkuMeter

2.45.3. Display Name

SKU Meter

2.45.4. Description

Describes the functionality being metered or measured by a particular SKU in a charge.

2.45.5. Content Constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.45.6. Introduced (version)

1.1

2.46. SKU Price Details

The SKU Price Details column represents a list of relevant properties shared by all charges with the same SKU Price ID. These properties provide qualitative and quantitative details about the service represented by a SKU Price ID. This can enable practitioners to calculate metrics such as total units of a service when it is not directly billed in those units (e.g. cores) and thus enables FinOps capabilities such as unit economics. These properties can also help a practitioner understand the specifics of a SKU Price ID and differentiate it other SKU Price IDs.

The SkuPriceDetails column adheres to the following requirements:

      • The SkuPriceDetails column MUST be in KeyValueFormat.
      • The key for a property SHOULD be formatted in PascalCase.
      • The properties (both keys and values) contained in the SkuPriceDetails column MUST be shared across all charges having the same SkuPriceId, subject to the below provisions.
        • Additional properties (key-value pairs) MAY be added to SkuPriceDetails going forward for a given SkuPriceId.
        • Properties SHOULD NOT be removed from SkuPriceDetails for a given SkuPriceId, once they have been included.
        • Individual properties (key-value pairs) SHOULD NOT be modified for a given SkuPriceId and SHOULD remain consistent over time.
      • The key for a property SHOULD remain consistent across comparable SKUs having that property and the values for this key SHOULD remain in a consistent format.
      • The SkuPriceDetails column MUST NOT contain properties which are not applicable to the corresponding SkuPriceId.
      • The SkuPriceDetails column MAY contain properties which are already captured in other dedicated columns.
      • If a property has a numeric value, it MUST represent the value for a single PricingUnit.
      • The SkuPriceDetails column MUST be present in a
        FOCUS dataset
        when the provider includes a SkuPriceId.

        • The SkuPriceDetails column MAY be null when SkuPriceId is not null.
        • The SkuPriceDetails column MUST be null when SkuPriceId is null.

2.46.1. Examples


				
					
					{
				
				
					
					"OperationClass"
					:
					"A"
					,
				
				
					
					"PricingTier"
					:
					2
					,
				
				
					
					"CoreHours"
					:
					4
					,
				
				
					
					"PreimumProcessing"
					:
					true
					,
				
				
					
					}
				
			

2.46.2. Column ID

SkuPriceDetails

2.46.3. Display Name

SKU Price Details

2.46.4. Description

A set of properties of a SKU Price ID which are meaningful and common to all instances of that SKU Price ID.

2.46.5. Content Constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type JSON
Value format Key-Value Format

2.46.6. Introduced (version)

1.1

2.47. SKU Price ID

A SKU Price ID is a unique identifier that defines the unit price used to calculate the charge. SKU Price ID can be referenced on a
price list
published by a provider to look up detailed information, including a corresponding list unit price. The composition of the properties associated with the SKU Price ID may differ across providers. SKU Price ID is commonly used for analyzing cost based on pricing properties such as Terms and Tiers.

The SkuPriceId column adheres to the following requirements:

      • SkuPriceId MUST be present in a
        FOCUS dataset
        when the provider publishes a SKU price list and MUST be of type String.
      • SkuPriceId MUST define a single unit price used for calculating the charge.
      • ListUnitPrice MUST be associated with the SkuPriceId in the provider published price list.
      • SkuPriceId MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory.
      • A given value of SkuPriceId MUST be associated with one and only one SkuId, except in cases of commitment discount flexibility.
      • If a provider does not have a SkuPriceId and wants to include information in columns linked to SkuPriceId such as ListUnitPrice or SkuPriceDetails, the SkuId MAY be used in the SkuPriceId column as long as it adheres to the above conditions.

2.47.1. Column ID

SkuPriceId

2.47.2. Display Name

SKU Price ID

2.47.3. Description

A unique identifier that defines the unit price used to calculate the charge.

2.47.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.47.5. Introduced (version)

1.0-preview

2.48. Sub Account ID

A Sub Account ID is a provider-assigned identifier assigned to a
sub account
. Sub Account ID is commonly used for scenarios like grouping based on organizational constructs, access management needs, and cost allocation strategies.

The SubAccountId column MUST be present in a
FOCUS dataset
when the provider supports a sub account construct. This column MUST be of type String. If a charge does not apply to a sub account, the SubAccountId column MUST be null.

See Appendix: Grouping constructs for resources or services for details and examples of the different grouping constructs supported by FOCUS.

2.48.1. Column ID

SubAccountId

2.48.2. Display Name

Sub Account ID

2.48.3. Description

An ID assigned to a grouping of
resources
or
services
, often used to manage access and/or cost.

2.48.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.48.5. Introduced (version)

0.5

2.49. Sub Account Name

A Sub Account Name is a display name assigned to a
sub account
. Sub account Name is commonly used for scenarios like grouping based on organizational constructs, access management needs, and cost allocation strategies.

The SubAccountName column MUST be present in a
FOCUS dataset
when the provider supports a sub account construct. This column MUST be of type String. If a charge does not apply to a sub account, the SubAccountName column MUST be null.

See Appendix: Grouping constructs for resources or services for details and examples of the different grouping constructs supported by FOCUS.

2.49.1. Column ID

SubAccountName

2.49.2. Display Name

Sub Account Name

2.49.3. Description

A name assigned to a grouping of
resources
or
services
, often used to manage access and/or cost.

2.49.4. Content constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type String
Value format <not specified>

2.49.5. Introduced (version)

0.5

2.50. Tags

The Tags column represents the set of tags assigned to
tag sources
that also account for potential provider-defined or user-defined tag evaluations. Tags are commonly used for scenarios like adding business context to cost and usage data to identify and accurately allocate charges. Tags may also be referred to by providers using other terms such as labels.

A tag becomes
finalized
when a single value is selected from a set of possible tag values assigned to the tag key. When supported by a provider, this can occur when a tag value is set by provider-defined or user-defined rules.

The Tags column adheres to the following requirements:

      • The Tags column MUST be present in a
        FOCUS dataset
        when the provider supports setting user or provider-defined tags.
      • The Tags column MUST contain user-defined and provider-defined tags.
      • The Tags column MUST only contain finalized tags.
      • The Tags column MUST be in KeyValueFormat.
      • A Tag key with a non-null value for a given resource SHOULD be included in the tags column.
      • A Tag key with a null value for a given resource MAY be included in the tags column depending on the provider’s tag finalization process.
      • A Tag key that does not support a corresponding value, MUST have a corresponding true (boolean) value set.
      • If Tag finalization is supported, providers MUST publish tag finalization methods and semantics within their respective documentation.
      • Providers MUST NOT alter user-defined Tag keys or values.

Provider-defined Tags additionally adhere to the following requirements:

      • Provider-defined tags MUST be prefixed with a provider-specified tag key prefix.
      • Providers SHOULD publish all provider-specified tag key prefixes within their respective documentation.

2.50.1. Provider-Defined vs. User-Defined Tags

This example illustrates three different tagging scenarios. The first two illustrate when the provider supports both keys and values, while the third is for supporting keys only. The first tag is user-defined and doesn’t have a provider prefix. The second tag is provider-defined and has a prefix of acme/, which is reserved by the provider. The third tag has a tag key of baz and its value is assigned the boolean value true since the tag doesn’t support a value.


				
					
					{
				
				
					
					"foo"
					:
					"bar"
					,
				
				
					
					"acme/foo"
					:
					"bar"
					,
				
				
					
					"baz"
					:
					true
					,
				
				
					
					}
				
			

2.50.2. Finalized Tags

Within a provider, tag keys may be associated with multiple values, and potentially defined at different levels within the provider, such as accounts, folders,
resource
and other resource grouping constructs. When finalizing, providers must reduce these multiple levels of definition to a single value where each key is associated with exactly one value. The method by which this is done and the semantics are up to each provider but must be documented within their respective documentation.

As an example, let’s assume 1
sub account
exists with 1 virtual machine with the following details, and tag inheritance favors Resources over Sub Accounts.

      • Sub Account
        • id: my-sub-account
        • user-defined tags: team:ops, env:prod
      • Virtual Machine
        • id: my-vm
        • user-defined tags: team:web

The table below represents a finalized dataset with these resources. It also shows the finalized state after all resource-oriented, tag inheritance rules are processed.

ResourceType ResourceId Tags
Sub Account my-sub-account { “team”: “ops”, “env”: “prod” }
Virtual Machine my-vm { “team”: “web”, “env”: “prod” }

Because the the Virtual Machine Resource did not have an env tag, it inherited tag, env:prod (italicized), from its parent sub account. Conversely, because the Virtual Machine Resource already has a team tag ( team:web), it did not inherit team:ops from its parent sub account.

2.50.3. Column ID

Tags

2.50.4. Display Name

Tags

2.50.5. Description

The set of tags assigned to tag sources that account for potential provider-defined or user-defined tag evaluations.

2.50.6. Content Constraints

Constraint Value
Column type Dimension
Feature level Conditional
Allows nulls True
Data type JSON
Value format Key-Value Format

2.50.7. Introduced (version)

1.0-preview

3. Attributes

Attributes are requirements that apply across a
FOCUS dataset
instead of an individual column level. Requirements on data content can include naming conventions, data types, formatting standardizations, etc. Attributes may introduce high-level requirements for data granularity, recency, frequency, etc. Requirements defined in attributes are necessary for servicing FinOps capabilities accurately using a standard set of instructions regardless of the origin of the data.

3.1. Column Naming and Ordering

Column IDs provided in cost data following a consistent naming and ordering convention reduce friction for FinOps practitioners who consume the data for analysis, reporting, and other use cases.

All columns defined in the FOCUS specification MUST follow the naming and ordering requirements listed below.

3.1.1. Attribute ID

ColumnNamingAndOrdering

3.1.2. Attribute Name

Column Naming and Ordering

3.1.3. Description

Naming and ordering convention for columns appearing in a
FOCUS dataset
.

3.1.4. Requirements

3.1.4.1. Column Names
      • All columns defined by FOCUS MUST follow the following rules:
        • Column IDs MUST use Pascal case.
        • Column IDs MUST NOT use abbreviations.
        • Column IDs MUST be alphanumeric with no special characters.
        • Columns that have an ID and a Name MUST have the Id or Name suffix in the Column ID. Display Name for a Column MAY avoid the Name suffix if there are no other columns with the same name prefix.
        • Column IDs SHOULD NOT use acronyms.
        • Column IDs SHOULD NOT exceed 50 characters to accommodate column length restrictions of various data repositories.
      • All custom columns MUST be prefixed with a consistent x_ prefix to identify them as external, custom columns and distinguish them from FOCUS columns to avoid conflicts in future releases.
      • Columns that have an ID and a Name MUST have the Id or Name suffix in the Column ID. Display Name for a Column MAY avoid the Name suffix if it is considered superfluous.
      • Columns with the Category suffix MUST be normalized.
      • Custom (e.g., provider-defined) columns SHOULD follow the same rules listed above for FOCUS columns.

3.1.4.2. Column Order
      • All FOCUS columns SHOULD be first in the provided dataset.
      • Custom columns SHOULD be listed after all FOCUS columns and SHOULD NOT be intermixed.
      • Columns MAY be sorted alphabetically, but custom columns SHOULD be after all FOCUS columns.

3.1.5. Exceptions

      • Identifiers will use the “Id” abbreviation since this is a standard pattern across the industry.
      • Product offerings that incur charges will use the “Sku” abbreviation because it is a well-understood term both within and outside the industry.

3.1.6. Introduced (version)

0.5

3.2. Currency Code Format

Columns that contain currency information in cost data following a consistent format reduce friction for FinOps practitioners who consume the data for analysis, reporting, and other use cases.

All columns capturing a currency value, defined in the FOCUS specification, MUST follow the requirements listed below. Custom currency-related columns SHOULD also follow the same formatting requirements.

3.2.1. Attribute ID

CurrencyCodeFormat

3.2.2. Attribute Name

Currency Code Format

3.2.3. Description

Formatting for currency columns appearing in a
FOCUS dataset
.

3.2.4. Requirements

Currency-related columns MUST be represented as a three-letter alphabetic code as dictated in the governing document ISO 4217:2015.

3.2.5. Exceptions

None

3.2.6. Introduced (version)

0.5

3.3. Date/Time Format

Columns that provide date and time information conforming to specified rules and formatting requirements ensure clarity, accuracy, and ease of interpretation for both humans and systems.

All columns capturing a date/time value, defined in the FOCUS specification, MUST follow the formatting requirements listed below. Custom date/time-related columns SHOULD also follow the same formatting requirements.

3.3.1. Attribute ID

DateTimeFormat

3.3.2. Attribute Name

Date/Time Format

3.3.3. Description

Rules and formatting requirements for date/time-related columns appearing in a
FOCUS dataset
.

3.3.4. Requirements

      • Date/time values MUST be in UTC (Coordinated Universal Time) to avoid ambiguity and ensure consistency across different time zones.
      • Date/time values format MUST be aligned with ISO 8601 standard, which provides a globally recognized format for representing dates and times (see ISO 8601-1:2019 governing document for details).
      • Values providing information about a specific moment in time MUST be represented in the extended ISO 8601 format with UTC offset (‘YYYY-MM-DDTHH:mm:ssZ’) and conform to the following guidelines:
        • Include the date and time components, separated with the letter ‘T’
        • Use two-digit hours (HH), minutes (mm), and seconds (ss).
        • End with the ‘Z’ indicator to denote UTC (Coordinated Universal Time)

3.3.5. Exceptions

None

3.3.6. Introduced (version)

0.5

3.4. Discount Handling

A discount is a pricing construct where providers offer a reduced price for
services
. Providers may have many types of discounts, including but not limited to commercially
negotiated discounts
,
commitment discounts
when you agree to a certain amount of usage or spend, and bundled discounts where you receive free or discounted usage of one product or service based on the usage of another. Discount Handling is commonly used in scenarios like verifying discounts were applied and calculating cost savings.

Some discount offers can be purchased from a provider to get reduced prices. The most common example is a commitment discount, where you “purchase” a commitment to use or spend a specific amount within a period. When a commitment isn’t fully utilized, the unused amount reduces the potential savings from the discount and can even result in paying higher costs than without the discount. Due to this risk, unused commitment amounts need to be clearly identifiable at a granular level. To facilitate this, unused commitments are recorded with a separate row for each charge period where the commitment was not fully utilized. To show the impact of purchased discounts on each discounted row, discount purchases need the purchase amount to be amortized over the
term
the discount is applied to (e.g., 1 year) with each
charge period
split and applied to each row that received the discount.

Amortization is a process used to break down and spread purchase costs over a period of time or term of use. When a purchase is applicable to resources, like commitment discounts, the amortized cost of a resource takes the initial payment and term into account and distributes it out based on the resource’s usage, attributing the prorated cost for each unit of billing. Amortization enables users of billing data to distribute purchase charges to the appropriate audience in support of cost allocation efforts. Discount Handling for purchased commitments is commonly used for scenarios like calculating utilization and implementing chargeback for the purchase amount.

While providers may use different terms to describe discounts, FOCUS identifies a discount as being a reduced price applied directly to a row. Any price or cost reductions that are awarded after the fact are identified as a “Credit” Charge Category. One example might be when a provider offers a reduced rate after passing a certain threshold of usage or spend.

All rows defined in FOCUS MUST follow the discount handling requirements listed below.

3.4.1. Attribute ID

DiscountHandling

3.4.2. Attribute Name

Discount Handling

3.4.3. Description

Indicates how to include and apply discounts to usage charges or rows in a FOCUS dataset.

3.4.4. Requirements

      • All applicable discounts SHOULD be applied to each row they pertain to and SHOULD NOT be negated in a separate row.
      • All discounts applied to a row MUST apply to the entire charge.
        • Multiple discounts MAY apply to a row, but they MUST apply to the entire charge covered by that row.
        • If a discount only applies to a portion of a charge, then the discounted portion of the charge MUST be split into a separate row.
        • Each discount MUST be identifiable using existing FOCUS columns.
          • Rows with a commitment discount applied to them MUST include a CommitmentDiscountId.
          • If a provider applies a discount that cannot be represented by a FOCUS column, they SHOULD include additional columns to identify the source of the discount.
      • Purchased discounts (e.g., commitment discounts) MUST be amortized.
        • The BilledCost MUST be 0 for any row where the commitment covers the entire cost for the charge period.
        • The EffectiveCost MUST include the portion of the amortized purchase cost that applies to this row.
        • The sum of the EffectiveCost for all rows where CommitmentDiscountStatus is “Used” or “Unused” for each CommitmentDiscountId over the entire duration of the commitment MUST be the same as the total BilledCost of the commitment discount.
        • The CommitmentDiscountId and ResourceId MUST be set to the ID assigned to the commitment discount. ChargeCategory MUST be set to “Purchase” on rows that represent a purchase of a commitment discount.
        • CommitmentDiscountStatus MUST be “Used” for ChargeCategory “Usage” rows that received a reduced price from a commitment. CommitmentDiscountId MUST be set to the ID assigned to the discount. ResourceId MUST be set to the ID of the resource that received the discount.
        • If a commitment is not fully utilized, the provider MUST include a row that represents the unused portion of the commitment for that charge period. These rows MUST be represented with CommitmentDiscountStatus set to “Unused” and ChargeCategory set to “Usage”. Such rows MUST have their CommitmentDiscountId and ResourceId set to the ID assigned to the commitment discount.
      • Credits that are applied after the fact MUST use a ChargeCategory of “Credit”.

3.4.5. Exceptions

None

3.4.6. Introduced (version)

1.0-preview

3.5. Key-Value Format

Columns that provide Key-Value information are often used in place of separate columns for enumerating data which would be inherently sparse and/or without predetermined keys. This consolidates related information and provides more consistency in the schema. Key-value pairs are also referred to as name-value pairs, attribute-value pairs, or field-value pairs.

All key-value related columns defined in the FOCUS specification MUST follow the key-value formatting requirements listed below.

3.5.1. Attribute ID

KeyValueFormat

3.5.2. Attribute Name

Key-Value Format

3.5.3. Description

Rules and formatting requirements for columns appearing in a
FOCUS dataset
that convey data as key-value pairs.

3.5.4. Requirements

      • Key-Value Format columns MUST contain a serialized JSON string, consistent with the ECMA 404 definition of an object.
      • Keys in a key-value pair MUST be unique within an object.
      • Values in a key-value pair MUST be one of the following types: number, string, true, false, or null.
      • Values in a key-value pair MUST NOT be an object or an array.

3.5.5. Exceptions

None

3.5.6. Introduced (version)

1.0-preview

3.6. Null Handling

Cost data
rows
that don’t have a value that can be presented for a column must be handled in a consistent way to reduce friction for FinOps practitioners who consume the data for analysis, reporting, and other use cases.

All columns defined in the FOCUS specification MUST follow the null handling requirements listed below. Custom columns SHOULD also follow the same formatting requirements.

3.6.1. Attribute ID

NullHandling

3.6.2. Attribute Name

Null Handling

3.6.3. Description

Indicates how to handle columns that don’t have a value.

3.6.4. Requirements

      • Columns MUST use NULL when there isn’t a value that can be specified for a nullable column.
      • Columns MUST NOT use empty strings or placeholder values such as 0 for numeric columns or “Not Applicable” for string columns to represent a null or not having a value, regardless of whether the column allows nulls or not.

3.6.5. Exceptions

None

3.6.6. Introduced (version)

0.5

3.7. Numeric Format

Columns that provide numeric values conforming to specified rules and formatting requirements ensure clarity, accuracy, and ease of interpretation for humans and systems. The FOCUS specification does not require a specific level of precision for numeric values. The level of precision required for a given column is determined by the provider and should be part of a data definition published by the provider.

All columns capturing a numeric value, defined in the FOCUS specification, MUST follow the formatting requirements listed below. Custom numeric value capturing columns SHOULD adopt the same format requirements over time.

3.7.1. Attribute ID

NumericFormat

3.7.2. Attribute Name

Numeric Format

3.7.3. Description

Rules and formatting requirements for numeric columns appearing in a
FOCUS dataset
.

3.7.4. Requirements

      • Columns with a Numeric value format MUST contain a single numeric value.
      • Numeric values MUST be expressed as an integer value, a decimal value, or a value expressed in scientific notation. Fractional notation MUST NOT be used.
      • Numeric values expressed using scientific notation MUST be expressed using E notation “mEn” with a real number m and an integer n indicating a value of “m x 10^n”. The sign of the exponent MUST only be expressed as part of the exponent value if n is negative.
      • Numeric values MUST NOT be expressed with mathematical symbols, functions, or operators.
      • Numeric values MUST NOT contain qualifiers or additional characters (e.g., currency symbols, units of measure, etc.).
      • Numeric values MUST NOT contain commas or punctuation marks except for a single decimal point (“.”) if required to express a decimal value.
      • Numeric values MUST NOT include a character to represent a sign for a positive value. A negative sign (-) MUST indicate a negative value.
      • Columns with a Numeric value format MUST present one of the following values as the “Data type” in the column definition.
        • Allowed values:
          Data Type Type Description
          Integer Specifies a numeric value represented by a whole number or by zero. Integer number formats correspond to standard data types defined by ISO/IEC 9899:2018
          Decimal Specifies a numeric value represented by a decimal number. Decimal formats correspond to ISO/IEC/IEEE 60559:2011 and IEEE 754-2008 definitions.
      • Providers SHOULD define precision and scale for Numeric Format columns using one of the following precision values in a data definition document that providers publish.
        • Allowed values:
          Data Type Precision Definition Range / Significant Digits
          Integer Short 16-bit signed short int ISO/IEC 9899:2018 -32,767 to +32,767
          Integer Long 32-bit signed long int ISO/IEC 9899:2018 -2,147,483,647 to +2,147,483,647
          Integer Extended 64-bit signed two’s complement integer or higher -(2^63 – 1) to (2^63 – 1)
          Decimal Single 32-bit binary format IEEE 754-2008 floating-point (decimal32) 9
          Decimal Double 64-bit binary format IEEE 754-2008 floating-point (decimal64) 16
          Decimal Extended 128-bit binary format IEEE 754-2008 floating-point (decimal128) or higher 36+

3.7.4.1. Examples

This format requires that single numeric values be represented using an integer or decimal format without additional characters or qualifiers. The following lists provide examples of values that meet the requirements and those that do not.

      • Values Meeting Numeric Requirements:
        • -100.2
        • -3
        • 4
        • 35.2E-7
        • 1.234
      • Values NOT Meeting Numeric Requirements
        • 1 1/2 – contains fractional notation
        • 35.2E+7 – contains a positive exponent with a sign
        • 35.24 x 10^7 – contains an invalid format for scientific notation
        • [3,5,8] – contains an array
        • [4:5] – contains a range
        • 5i + 4 – contains a complex number
        • sqrt(2) – contains a mathematical symbol or operation
        • 2.3^3 – contains an exponent
        • 32 GiB – contains a unit of measure
        • $32 – contains a currency symbol
        • 3,432,342 – contains a comma
        • +333 – contains a positive sign

3.7.5. Exceptions

None

3.7.6. Introduced (version)

1.0-preview

3.8. String Handling

Columns that capture string values conforming to specified requirements foster data integrity, interoperability, and consistency, improve data analysis and reporting, and support reliable data-driven decision-making.

All columns capturing a string value, defined in the FOCUS specification, MUST follow the requirements listed below. Custom string value capturing columns SHOULD adopt the same requirements over time.

3.8.1. Attribute ID

StringHandling

3.8.2. Attribute Name

String Handling

3.8.3. Description

Requirements for string-capturing columns appearing in a
FOCUS dataset
.

3.8.4. Requirements

      • String values MUST maintain the original casing, spacing, and other relevant consistency factors as specified by providers and end-users.

      • Charges
        to mutable entities (e.g., resource names) MUST be accurately reflected in corresponding charges incurred after the change and MUST NOT alter charges incurred before the change, preserving data integrity and auditability for all charge records.
      • Immutable string values that refer to the same entity (e.g., resource identifiers, region identifiers, etc.) MUST remain consistent and unchanged across all
        billing periods
        .
      • Empty strings and strings consisting solely of spaces SHOULD NOT be used in not-nullable string columns.

3.8.5. Exceptions

      • When a record is provided after a change to a mutable string value and the ChargeClass is “Correction”, the record MAY contain the altered value.

3.8.6. Introduced (version)

1.0

3.9. Unit Format

Billing data frequently captures data measured in units related to data size, count, time, and other
dimensions
. The Unit Format attribute provides a standard for expressing units of measure in columns appearing in a
FOCUS dataset
.

All columns defined in FOCUS specifying Unit Format as a value format MUST follow the requirements listed below.

3.9.1. Attribute ID

UnitFormat

3.9.2. Attribute Name

Unit Format

3.9.3. Description

Indicates standards for expressing measurement units in columns appearing in a FOCUS dataset.

3.9.4. Requirements

      • Units SHOULD be expressed as a single unit of measure adhering to one of the following three formats.
        • <plural-units> – “GB”, “Seconds”
        • <singular-unit>-<plural-time-units> – “GB-Hours”, “MB-Days”
        • <plural-units>/<singular-time-unit> – “GB/Hour”, “PB/Day”
      • Units MAY be expressed with a unit quantity or time interval. If a unit quantity or time interval is used, the unit quantity or time interval MUST be expressed as a whole number. The following formats are valid:
        • <quantity> <plural-units> – “1000 Tokens”, “1000 Characters”
        • <plural-units>/<interval> <plural-time-units> – “Units/3 Months”
      • Unit values and components of columns using the Unit Format MUST use a capitalization scheme that is consistent with the capitalization scheme used in this attribute if that term is listed in this section. For example, a value of “gigabyte-seconds” would not be compliant with this specification as the terms “gigabyte” and “second” are listed in this section with the appropriate capitalization. If the unit is not listed in the table, it is to be used over a functional equivalent with a similar meaning with the same capitalization scheme.
      • Units SHOULD be composed of the list of recommended units listed in this section unless the unit value covers a dimension not listed in the recommended unit set, or if the unit covers a count-based unit distinct from recommended values in the count dimension listed in this section.

3.9.4.1. Data Size Unit Names

Data size unit names MUST be abbreviated using one of the abbreviations in the following table. For example, a unit name of “TB” is a valid unit name, and a unit name of “terabyte” is an invalid unit name. Data size abbreviations can be considered both the singular and plural form of the unit. For example, “GB” is both the singular and plural form of the unit “gigabyte”, and “GBs” would be an invalid unit name. Values that exceed 10^18 MUST use the abbreviation for exabit, exabyte, exbibit, and exbibyte, and values smaller than a byte MUST use the abbreviation for bit or byte. For example, the abbreviation “YB” for “yottabyte” is not a valid data size unit name as it represents a value larger than what is listed in the following table.

The following table lists the valid abbreviations for data size units from a single bit or byte to 10^18 bits or bytes.

Data size in bits Data size in bytes
b (bit) = 10^1 B (byte = 10^1)
Kb (kilobit = 10^3) KB (kilobyte = 10^3)
Mb (megabit = 10^6) MB (megabyte = 10^6)
Gb (gigabit = 10^9) GB (gigabyte = 10^9)
Tb (terabit = 10^12) TB (terabyte = 10^12)
Pb (petabit = 10^15) PB (petabyte = 10^15)
Eb (exabit = 10^18) EB (exabyte = 10^18)
Kib (kibibit = 2^10) KiB (kibibyte = 2^10)
Mib (mebibit = 2^20) MiB (mebibyte = 2^20)
Gib (gibibit = 2^30) GiB (gibibyte = 2^30)
Tib (tebibit = 2^40) TiB (tebibyte = 2^40)
Pib (pebibit = 2^50) PiB (pebibyte = 2^50)
Eib (exbibit = 2^60) EiB (exbibyte = 2^60)

3.9.4.2. Count-based Unit Names

A count-based unit is a noun that represents a discrete number of items, events, or actions. For example, a count-based unit can be used to represent the number of requests, instances, tokens, or connections.

If the following list of recommended values does not cover a count-based unit, a provider MAY introduce a new noun representing a count-based unit. All nouns appearing in units that are not listed in the recommended values table will be considered count-based units. A new count-based unit value MUST be capitalized.

Count
Count
Unit
Request
Token
Connection
Certificate
Domain
Core

3.9.4.3. Time-based Unit Names

A time-based unit is a noun that represents a time interval. Time-based units can be used to measure consumption over a time interval or in combination with another unit to capture a rate of consumption. Time-based units MUST match one of the values listed in the following table.

Time
Year
Month
Day
Hour
Minute
Second

3.9.4.4. Composite Units

If the unit value is a composite value made from combinations of one or more units, each component MUST also align with the set of recommended values.

Instead of “per” or “-” to denote a Composite Unit, slash (“/”) and space(” “) MUST be used as a common convention.  Count-based units like requests, instances, and tokens SHOULD be expressed using a value listed in the count dimension.  For example, if a usage unit is measured as a rate of requests or instances over a period of time, the unit SHOULD be listed as “Requests/Day” to signify the number of requests per day.

3.9.5. Exceptions

None

3.9.6. Introduced (version)

1.0-preview

4. Metadata

The FOCUS specification defines a metadata structure to be supplied by data providers to facilitate practitioners’ use of FOCUS data. This metadata includes general information about the data generator and the schema of the
FOCUS dataset
.

FOCUS Metadata SHOULD be provided in a format that is accessible programmatically, such as a file, website, API, or table. Providers SHOULD provide documentation on their implementation of the FOCUS metadata.

4.1. Data Generator

The FOCUS metadata about the generator of the FOCUS data.

4.1.1. Requirements

The FOCUS Data Generator metadata MUST be provided. This metadata MUST be of type Object and MUST NOT contain null values.

4.1.2. Schema Example

For an example of the FOCUS Data Generator metadata please refer to: Data Generator Example

4.1.3. Data Generator

Human-readable name of the entity that is generating the data.

The DataGenerator MUST be provided in the metadata. DataGenerator MUST be of type String and MUST NOT be null. The DataGenerator SHOULD be easily associated with the provider who generated the
FOCUS dataset
.

4.1.3.1. Metadata ID

DataGenerator

4.1.3.2. Metadata Name

Data Generator

4.1.3.3. Content constraints
Constraint Value
Feature level Mandatory
Allows nulls False
Data type String
Value format <not specified>

4.1.3.4. Introduced (version)

1.0

4.2. Schema

The schema metadata object and its contents provides information about the structure of the data provided.

4.2.1. Requirements

4.2.1.1. Reference to FOCUS Data

FOCUS data artifacts, whether they are data files, data streams, or data tables, MUST provide a clear reference to the schema of the data. This reference MUST be retrievable without inspection of the contents of the FOCUS data within the data artifact. For some delivery mechanisms such as database tables, the provider may rely on the schema functionality of the providing system.

It is recommended that the schema reference be provided as an external reference rather than included in full as metadata accompanying the data artifact. This allows for easier understanding of when changes to the schema of the
FOCUS datasets
occurs.

4.2.1.2. Schema Metadata Creation

Should the provider change the structure of the supplied FOCUS data artifact, a new schema metadata object MUST be supplied. These scenarios include, but are not limited to:

4.2.1.3. Schema Metadata Updates

Should there be an error where the schema metadata object does not match the schema of the FOCUS data artifact, the provider MUST update the schema metadata object to match the schema of the FOCUS data artifact. This is to ensure that the schema metadata object is always accurate.

4.2.2. Schema Example

For an example of the FOCUS schema metadata please refer to: Schema Metadata Example

4.2.3. Schema ID

The Schema ID provides the reference item to associate which Schema was used for the generation of a FOCUS Dataset.

The SchemaId MUST be present in the metadata. The SchemaId MUST be of String. It is RECOMMENDED for SchemaId to be a Globally Unique Identifier (GUID).

4.2.3.1. Metadata ID

SchemaId

4.2.3.2. Metadata Name

Schema ID

4.2.3.3. Content constraints
Constraint Value
Feature level Mandatory
Allows nulls False
Data type STRING
Value format Recommend GUID String

4.2.3.4. Introduced (version)

1.0

4.2.4. Creation Date

Date the schema was created.

The CreationDate MUST be present in the metadata. This MUST be of type Date/Time and MUST NOT contain null values. CreationDate MUST conform to DateTimeFormat.

4.2.4.1. Metadata ID

CreationDate

4.2.4.2. Metadata Name

Creation Date

4.2.4.3. Content constraints
Constraint Value
Feature level Mandatory
Allows nulls False
Data type Date/Time
Value format Date/Time Format

4.2.4.4. Introduced (version)

1.0

4.2.5. FOCUS Version

The version of FOCUS utilized for building the dataset.

The FocusVersion MUST be provided in the metadata. FocusVersion MUST be of type String and MUST NOT contain null values. FocusVersion MUST match one of the published versions of the FOCUS specification. FocusVersion MUST match the version of the FOCUS specification that the
FOCUS dataset
conforms to.

4.2.5.1. Metadata ID

FocusVersion

4.2.5.2. Metadata Name

FOCUS Version

4.2.5.3. Content constraints
Constraint Value
Feature level Mandatory
Allows nulls False
Data type STRING
Value format Must align with a published FocusVersion

4.2.5.4. Introduced (version)

1.0

4.2.6. Provider Version

The ProviderVersion MAY be supplied to declare the version of logic by which the
FOCUS dataset
was generated and is separate from FOCUS Version. ProviderVersion allows for the provider to specify changes that may not result in a structural change in the data. It is suggested that the provider version use a versioning approach such as SemVer version.

ProviderVersion MUST be of type String and MUST NOT contain null values. If FocusVersion is changed a new ProviderVersion MUST be also changed. The provider MUST document what changes are present in the ProviderVersion.

4.2.6.1. Metadata ID

ProviderVersion

4.2.6.2. Metadata Name

Provider Version

4.2.6.3. Content constraints
Constraint Value
Feature level Optional
Allows nulls False
Data type STRING
Value format <not specified>

4.2.6.4. Introduced (version)

1.1

4.2.7. Column Definition

The FOCUS metadata schema column definition provides a list of the columns present in the
FOCUS dataset
along with metadata about the columns.

4.2.7.1. Requirements

This metadata MUST be present in the FOCUS metadata schema. This metadata MUST be of type Object and MUST NOT contain null values.

4.2.7.2. Column Name

The name of the column provided in the
FOCUS dataset
.

The ColumnName MUST be provided in the FOCUS Metadata schema. ColumnName MUST be of type String and MUST NOT contain null values.

4.2.7.2.1. Metadata ID

ColumnName

4.2.7.2.2. Metadata Name

Column Name

4.2.7.2.3. Content constraints
Constraint Value
Feature level Mandatory
Allows nulls False
Data type String
Value format <not specified>

4.2.7.2.4. Introduced (version)

1.0

4.2.7.3. Data Type

The data type of the column provided in the
FOCUS dataset
.

The DataType MUST be provided in the FOCUS Metadata schema. DataType MUST be of type String and MUST NOT contain null values.

4.2.7.3.1. Metadata ID

DataType

4.2.7.3.2. Metadata Name

Data Type

4.2.7.3.3. Content constraints
Constraint Value
Feature level Mandatory
Allows nulls False
Data type String
Value format <not specified>

4.2.7.3.4. Introduced (version)

1.0

4.2.7.4. Numeric Precision

Numeric Precision is the maximum number of digits for the values in the column.

NumericPrecision SHOULD be provided in the FOCUS Metadata schema for Numeric Format columns. NumericPrecision MUST be of type Integer and MUST NOT contain null values.

4.2.7.4.1. Metadata ID

NumericPrecision

4.2.7.4.2. Metadata Name

Numeric Precision

4.2.7.4.3. Content constraints
Constraint Value
Feature level Conditional
Allows nulls False
Data type Integer
Value format Numeric Format

4.2.7.4.4. Introduced (version)

1.0

4.2.7.5. Number Scale

The number scale of the data provides the maximum number of digits after the decimal point in decimal numbers.

NumberScale SHOULD be provided in the FOCUS Metadata schema for Decimal columns. NumberScale MUST be of type Integer and MUST NOT contain null values.

4.2.7.5.1. Metadata ID

NumberScale

4.2.7.5.2. Metadata Name

Number Scale

4.2.7.5.3. Content constraints
Constraint Value
Feature level Conditional
Allows nulls False
Data type Integer
Value format Numeric Format

4.2.7.5.4. Introduced (version)

1.0

4.2.7.6. Provider Tag Prefixes

The Provider Tag Prefixes defines the list of prefixes used in the tag name of provider-defined tags. This metadata is useful for the consumer to identify which tags are provider-defined vs user-defined.

The ProviderTagPrefixes MUST be provided when ColumnName is equal to Tags. The ProviderTagPrefix MUST be of type Array of Strings. The ProviderTagPrefixes SHOULD be easily associated with the provider who generated the
FOCUS dataset
.

4.2.7.6.1. Metadata ID

ProviderTagPrefixes

4.2.7.6.2. Metadata Name

Provider Tag Prefixes

4.2.7.6.3. Content constraints
Constraint Value
Feature level Conditional
Allows nulls False
Data type Array
Value format STRING datatype values in the array

4.2.7.6.4. Introduced (version)

1.0

4.2.7.7. String Encoding

The string encoding scheme of the column provided in the
FOCUS dataset
.

StringEncoding SHOULD be provided in the FOCUS Metadata schema when it is required to know this information in order to successfully read the data. StringEncoding MUST be of type String and MUST NOT contain null values.

4.2.7.7.1. Metadata ID

StringEncoding

4.2.7.7.2. Metadata Name

StringEncoding

4.2.7.7.3. Content constraints
Constraint Value
Feature level Conditional
Allows nulls False
Data type String
Value format <not specified>

4.2.7.7.4. Introduced (version)

1.0

4.2.7.8. String Max Length

The string max length of the data that can be stored in the column.

StringMaxLength SHOULD be provided in the FOCUS Metadata schema for String columns. StringMaxLength MUST be of type Integer and MUST NOT contain null values.

4.2.7.8.1. Metadata ID

StringMaxLength

4.2.7.8.2. Metadata Name

String Max Length

4.2.7.8.3. Content constraints
Constraint Value
Feature level Conditional
Allows nulls False
Data type Integer
Value format Numeric Format

4.2.7.8.4. Introduced (version)

1.0

5. Use Case Library

This specification is based on a set of common FinOps use cases, which are publicly available at [ https://focus.finops.org/use-cases/](https://focus.finops.org/use-cases/). Developed by FinOps practitioners, these use cases are organized by persona and capability, making it easy to find relevant scenarios. Each use case includes sample SQL queries to help you get started with implementation.

6. Glossary


Adjustment

A charge representing a modification to billing data to account for certain events or circumstances not previously captured, or captured incorrectly. Examples include billing errors, service disruptions, or pricing changes.


Amortization

The distribution of upfront costs over time to accurately reflect the consumption or benefit derived from the associated resources or services. Amortization is valuable when the commitment period (time duration of the cost) extends beyond the granularity of the source report.


Availability Zone

A collection of geographically separated locations containing a data center or cluster of data centers. Each availability zone (AZ) should have its own power, cooling, and networking, to provide redundancy and fault tolerance.


Billed Cost

A charge that serves as the basis for invoicing. It includes the total amount of fees and discounts, signifying a monetary obligation. Valuable when reconciling cash outlay with incurred expenses is required, such as cost allocation, budgeting, and invoice reconciliation.


Billing Account

A container for resources and/or services that are billed together in an invoice. A billing account may have sub accounts, all of whose costs are consolidated and invoiced to the billing account.


Billing Currency

An identifier that represents the currency that a charge for resources and/or services was billed in.


Billing Period

The time window that an organization receives an invoice for, inclusive of the start date and exclusive of the end date. It is independent of the time of usage and consumption of resources and services.


Block Pricing

A pricing approach where the cost of a particular resource or service is determined based on predefined quantities or tiers of usage. In these scenarios, the Pricing Unit and the corresponding Pricing Quantity can be different from the Consumed Unit and Consumed Quantity.


Capacity Reservation

A capacity reservation is an agreement that secures a dedicated amount of resources or services for a specified period. This ensures the reserved capacity is always available and accessible, even if it’s not fully utilized. Customers are typically charged for the reserved capacity, regardless of actual consumption.


Charge

A row in a FOCUS-compatible cost and usage dataset.


Charge Period

The time window for which a charge is effective, inclusive of the start date and exclusive of the end date. The charge period for continuous usage should match the time granularity of the dataset (e.g., 1 hour for hourly, 1 day for daily). The charge period for a non-usage charge with time boundaries should match the duration of eligibility.


Cloud Service Provider (CSP)

A company or organization that provides remote access to computing resources, infrastructure, or applications for a fee.


Commitment

A customer’s agreement to consume a specific quantity of a service or resource over a defined period, usually also creating a financial commitment throughout the entirety of the commitment period. Some commitments also hold Providers to certain assurance levels of resource availability.


Commitment Discount

A billing discount model that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Commitment discount purchases, made upfront and/or with recurring monthly payments are amortized evenly across predefined charge periods (i.e. hourly), and unused amounts cannot be carried over to subsequent charge periods. Commitment discounts are publicly available to customers without special contract arrangements.


Commitment Discount Flexibility

A feature of
commitment discounts
that may further transform the predetermined amount of usage purchased or consumed based on additional, provider-specific requirements.


Contracted Unit Price

The agreed-upon unit price for a single Pricing Unit of the associated SKU, inclusive of negotiated discounts, if present, and exclusive of any other discounts. This price is denominated in the Billing Currency.


Dimension

A specification-defined categorical attribute that provides context or categorization to billing data.


Effective Cost

The amortized cost of the charge after applying all reduced rates, discounts, and the applicable portion of relevant, prepaid purchases (one-time or recurring) that covered this charge.


Exclusive Bound

A Date/Time Format value that is not contained within the ending bound of a time period.


Finalized Tag

A tag with one tag value chosen from a set of possible tag values after being processed by a set of provider-defined or user-defined rules.


FinOps Cost and Usage Specification (FOCUS)

An open-source specification that defines requirements for billing data.


FOCUS Dataset

A structured collection of cost and usage data that meets or exceeds the Basic compliance criteria of FOCUS.


Inclusive Bound

A Date/Time Format value that is contained within the beginning bound of a time period.


Interruptible

A category of compute resources that can be paused or terminated by the CSP within certain criteria, often advertised at reduced unit pricing when compared to the equivalent non-interruptible resource.


List Unit Price

The suggested provider-published unit price for a single Pricing Unit of the associated SKU, exclusive of any discounts. This price is denominated in the Billing Currency.


Managed Service Provider (MSP)

A company or organization that provides outsourced management and support of a range of IT services, such as network infrastructure, cybersecurity, cloud computing, and more.


Metric

A FOCUS-defined column that provides numeric values, allowing for aggregation operations such as arithmetic operations (sum, multiplication, averaging etc.) and statistical operations.


Negotiated Discount

A contractual agreement where a customer commits to specific spend or usage goals over a
term
in exchange for discounted rates across varying SKUs. Unlike
commitment discounts
, negotiated discounts are typically more customized to customer’s accounts, can be utilized at varying frequencies, and may overlap with commitment discounts.


On-Demand

A term that describes a service that is available and provided immediately or as needed, without requiring a pre-scheduled appointment or prior arrangement. In cloud computing, virtual machines can be created and terminated as needed, i.e. on demand.


Pascal Case

Pascal Case (PascalCase, also known as UpperCamelCase) is a format for identifiers which contain one or more words meaning the words are concatenated together with no delimiter and the first letter of each word is capitalized.


Potato

A long and often painful conversation had by the FOCUS contributors. Sometimes the name of a thing that we could not yet name. No starchy root vegetables were harmed during the production of this specification. We thank potato for its contribution in the creation of this specification.


Practitioner

An individual who performs FinOps within an organization to maximize the business value of using cloud and cloud-like services.


Price List

A comprehensive list of prices offered by a provider.


Provider

An entity that made internal or 3rd party resources and/or services available for purchase.


Resource

A unique component that incurs a charge.


Row

A row in a FOCUS-compatible cost and usage dataset.


Service

An offering that can be purchased from a provider, and can include many types of usage or other charges; eg., a cloud database service may include compute, storage, and networking charges.


SKU

A construct composed of the common properties of a product offering associated with one or many SKU Prices.


SKU Price

The unit price used to calculate a charge that is associated with one SKU. SKU Prices are usually referenced from the provider’s price list and are unique to various providers.


Sub Account

A sub account is an optional provider-supported construct for organizing resources and/or services connected to a billing account. Sub accounts must be associated with a billing account as they do not receive invoices.


Tag

A metadata label assigned to a resource to provide information about it or to categorize it for organizational and management purposes.


Tag Source

A Resource or Provider-defined construct for grouping resources and/or other Provider-defined construct that a Tag can be assigned to.


Term

A duration of a contractual agreement like with a
commitment discount
or
negotiated discount
.

7. Appendix

This section is non-normative.

7.1. Commitment Discounts

A commitment
discount
is a billing discount model that offers reduced rates
on preselected SKUs in exchange for
an obligated usage or spend amount over a predefined term. Commitment discounts
typically consist of purchase and usage records within cost and usage
datasets.

Usage-based commitment discounts obligate a customer to a
predetermined amount of usage over a preselected term. In some
cases, usage-based commitment discounts also feature commitment discount
flexibility
which may expand the types of resources that a commitment
discount
can cover. It is important to note when mixing
commitment discounts with and without commitment discount
flexibility
, the CommitmentDiscountUnit should reflect
this difference.

Spend-based commitment discounts obligate a customer to a
predetermined amount of spend over a preselected term. In the
usage examples below, each row
measures the monetary amount of the hourly commit consumed by the
commitment discount, so the CommitmentDiscountUnit chosen is
“USD”, or the billing
currency
.

7.1.1. Purchasing

While customers are bound to the term of a commitment
discounts
, providers offer some or all of the following payment
options before and/or during the term:

      • All Upfront – The commitment discounts is paid in
        full before the term begins.
      • No Upfront – The commitment discounts is paid on a
        repeated basis, typically over each billing period of the
        term.
      • Partial Upfront – Some of the commitment discounts
        is paid before the term begins, and the rest is paid repeatedly
        over the term.

For example, if a customer buys a 1-year, spend-based commitment
discount
with a $1.00 hourly commit and pays with the partial
option, the commitment discount’s payment consists of a
one-time purchase in the beginning of the term and
monthly recurring purchases with the following totals:

      1. One-Time – $4,380
        (24 hours * 365 days * &dollar;1.00 * 0.5)
      2. Recurring – $182.50
        (24 hours * 365 days * &dollar;1.00 / 12 months)

7.1.2. Usage

Commitment discounts follow a “use-it-or-lose-it” model where the amortization of a
commitment discount’s purchase applies evenly to eligible
resources over each charge period of the
term.

For example, if a customer buys a spend-based commitment
discount
with a $1.00 hourly commit in January (31 days), only
$1.00 is eligible for consumption for each hourly charge
period
. If a customer has eligible resources running
during this charge period, an amount of up to $1.00 will be
allocated to these resources. Conversely, if a customer does
have eligible resources running that fully take advantage of
this $1.00 during this charge period, then some or all of this
amount will go to waste.

7.1.3. Commitment Discounts
in FOCUS

Within the FOCUS specification, the following examples demonstrate
how a commitment discount appears across various payment and
usage scenarios.

7.1.3.1. Purchase Rows

All commitment discount purchases appear with a positive BilledCost, PricingCategory as “Standard”, and with the
commitment discount’s id populating both the ResourceId and CommitmentDiscountId value. One-time
purchases appear as a single record with ChargeCategory as “Purchase”, ChargeFrequency as “One-Time”, and the total
quantity and units for commitment discount’s term
reflected as CommitmentDiscountQuantity and
CommitmentDiscountUnit, respectively.

Recurring purchases are allocated across all corresponding charge
periods
of the term when ChargeCategory is “Purchase”,
ChargeFrequency is “Recurring”, and CommitmentDiscountQuantity and
CommitmentDiscountUnit are reflected only for that charge
period
.

Using the same commitment discount example as above with a
one-year, spend-based commitment discount with a $1.00 hourly
commit purchased on Jan 1, 2023, various purchase options are
available:

7.1.3.1.1. Scenario #1: All
Upfront

The entire commitment discount is billed once
during the first charge period of the term for $8,670
(derived as 24 hours * 365 days * &dollar;1.00).

[
    {   
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2024-01-01T00:00:00Z",
        "ChargeCategory": "Purchase",
        "ChargeFrequency": "One-Time",
        "PricingCategory": "Standard",
        "ResourceId": "<commitment-discount-id>",
        "BilledCost": 8760.00,
        "EffectiveCost": 0.00,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 8760.00,
        "CommitmentDiscountUnit": "USD"
    }
]

7.1.3.1.2. Scenario #2: No
Upfront

The commitment discount is billed across all 8,760
(24 hours * 365 days) charge periods of the
term with $1.00 allocated to each charge period over
the term.

[
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2023-01-01T01:00:00Z",
        "ChargeCategory": "Purchase",
        "ChargeFrequency": "Recurring",
        "PricingCategory": "Standard",
        "ResourceId": "<commitment-discount-id>",
        "BilledCost": 1.00,
        "EffectiveCost": 0.00,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 1.00,
        "CommitmentDiscountUnit": "USD"
    },

    /* ... 8,759 more recurring purchase records for the *term* ... */
]

7.1.3.1.3. Scenario #3:
Partial Upfront

With a 50/50 split, half of the commitment is billed once
during the first charge period of the term for $4,380
(derived as 24 hours * 182.5 days * &dollar;1.00), and
the other half is billed across each charge period over the
term, derived as (&dollar;1.00 * 8,760 hours * 0.5).
Amortized costs incur half of the amount (i.e. $0.50) from the one-time
purchase and the other half from the recurring purchase.

[
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2024-01-01T00:00:00Z",
        "ChargeCategory": "Purchase",
        "ChargeFrequency": "One-Time",
        "PricingCategory": "Standard",
        "ResourceId": "<commitment-discount-id>",
        "BilledCost": 4380.00,
        "EffectiveCost": 0.00,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 4380.00,
        "CommitmentDiscountUnit": "USD"
    },
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2023-01-01T01:00:00Z",
        "ChargeCategory": "Purchase",
        "ChargeFrequency": "Recurring",
        "PricingCategory": "Standard",
        "ResourceId": "<commitment-discount-id>",
        "BilledCost": 0.50,
        "EffectiveCost": 0.00,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 0.50,
        "CommitmentDiscountUnit": "USD"
    },

    /* ... 8,759 more recurring purchase records for the *term* ... */
]

7.1.3.2. Usage Rows

Amortization of commitment discounts occur
similarly regardless of how commitment discount purchases are
made. The same usage-based or spend-based amount is applied evenly
across all charge periods and potentially allocated to eligible
resources. Continuing with the same commitment
discount
example, a one-year, spend-based commitment
discount
with a $1.00 hourly commit and 1 resource (for
simplicity) yields 4 types of scenarios that can occur during a
charge period:

      • Scenario #1: An eligible resource fully consumes the
        allocated amount (100% utilization)
      • Scenario #2: No eligible resource consumes the allocated
        amount (0% utilization)
      • Scenario #3: An eligible resource partially consumes the
        allocated amount (75% utilization)
      • Scenario #4: An eligible resource fully consumes the $1.00
        hourly commit with an overage (100% utilization + overage)

7.1.3.2.1.
Scenario #1: An eligible resource fully consumes the allocated
amount (100% utilization)

In this scenario, one eligible resource runs for the full
hour and consumes $1.00, so one row allocated to the
resource is produced.

[
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2023-01-01T01:00:00Z",
        "ChargeCategory": "Usage",
        "ChargeFrequency": "Usage-Based",
        "PricingCategory": "Committed",
        "ResourceId": "<resource-id>",
        "ConsumedQuantity": 1,
        "ConsumedUnit": "Hour",
        "BilledCost": 0.00,
        "EffectiveCost": 1.00,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 1.00,
        "CommitmentDiscountStatus": "Used",
        "CommitmentDiscountUnit": "USD"
    }
]

7.1.3.2.2.
Scenario #2: No eligible resource consumes the allocated amount
(0% utilization)

In this situation, the full eligible, $1.00 amount remained
unutilized and results in 1 unused row. In this scenario, it is
important to note that while CommitmentDiscountQuantity is not because
$1 was still drawn down by the commitment discount even though,
no resource was allocated, so ConsumedQuantity and ConsumedUnit are null.

[
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2023-01-01T01:00:00Z",
        "ChargeCategory": "Usage",
        "ChargeFrequency": "Usage-Based",
        "PricingCategory": "Committed",
        "ResourceId": "<commitment-discount-id>",
        "ConsumedQuantity": null,
        "ConsumedUnit": null,
        "BilledCost": 0.00,
        "EffectiveCost": 1.00,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 1.00,
        "CommitmentDiscountStatus": "Unused",
        "CommitmentDiscountUnit": "USD"
    }
]

7.1.3.2.3.
Scenario #3: An eligible resource partially consumes the
allocated amount (75% utilization)

In this scenario, one eligible resource runs for the full
hour and consumes $0.75 of the $1.00 allocation. One row shows
$0.75 to a resource, and the other row shows that
$0.25 was unused.

[
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2023-01-01T01:00:00Z",
        "ChargeCategory": "Usage",
        "ChargeFrequency": "Usage-Based",
        "PricingCategory": "Committed",
        "ResourceId": "<resource-id>",
        "ConsumedQuantity": 1,
        "ConsumedUnit": "Hour",
        "BilledCost": 0.00,
        "EffectiveCost": 0.75,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 0.75,
        "CommitmentDiscountStatus": "Used",
        "CommitmentDiscountUnit": "USD"
    },
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2023-01-01T01:00:00Z",
        "ChargeCategory": "Usage",
        "ChargeFrequency": "Usage-Based",
        "PricingCategory": "Committed",
        "ResourceId": "<commitment-discount-id>",
        "ConsumedQuantity": null,
        "ConsumedUnit": null,
        "BilledCost": 0.00,
        "EffectiveCost": 0.25,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 0.25,
        "CommitmentDiscountStatus": "Unused",
        "CommitmentDiscountUnit": "USD"
    }
]

7.1.3.2.4.
Scenario #4: An eligible resource fully consumes the $1.00
hourly commit with an overage (100% utilization + overage)

In this scenario, one eligible resource runs for the full
hour and is charged $1.50. One row shows that $1.00 was
amortized from the commitment discount, and the other
shows that $0.50 was charged as standard, on-demand spend.

[
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2023-01-01T01:00:00Z",
        "ChargeCategory": "Usage",
        "ChargeFrequency": "Usage-Based",
        "PricingCategory": "Committed",
        "ResourceId": "<resource-id>",
        "ConsumedQuantity": 1,
        "ConsumedUnit": "Hour",
        "BilledCost": 0.00,
        "EffectiveCost": 1.00,
        "CommitmentDiscountId": "<commitment-discount-id>",
        "CommitmentDiscountQuantity": 1.00,
        "CommitmentDiscountStatus": "Used",
        "CommitmentDiscountUnit": "USD"
    },
    {
        "BillingPeriodStartDate": "2023-01-01T00:00:00Z",
        "BillingPeriodEndDate": "2023-02-01T00:00:00Z",
        "ChargePeriodStartDate": "2023-01-01T00:00:00Z",
        "ChargePeriodEndDate": "2023-01-01T01:00:00Z",
        "ChargeCategory": "Usage",
        "ChargeFrequency": "Usage-Based",
        "PricingCategory": "Standard",
        "ResourceId": "<resource-id>",
        "ConsumedQuantity": 1,
        "ConsumedUnit": "Hour",
        "BilledCost": 0.50,
        "EffectiveCost": 0.00
    }
]

7.2. Grouping
constructs for resources or services

Providers natively support various constructs for grouping resources or services. These grouping
constructs are often used to mimic organizational structures, technical
architectures, cost attribution/allocation and access management
boundaries, or other customer-specific structures based on
requirements.

Providers may support multiple levels of resource or service grouping
mechanisms. FOCUS supports two distinct levels of groupings that are
commonly needed for FinOps capabilities like chargeback, invoice
reconciliation and cost allocation.

      • Billing account: A
        mandatory container for resources or services that are
        billed together in an invoice. Billing accounts are commonly
        used for scenarios like grouping based on organizational constructs,
        invoice reconciliation and cost allocation strategies.
      • Sub account: An optional
        provider-supported construct for organizing resources and
        services connected to a billing account. Sub
        accounts
        are commonly used for scenarios like grouping based on
        organizational constructs, access management needs and cost allocation
        strategies. Sub accounts must be associated with a billing
        account
        as they do not receive invoices.

The table below highlights key properties of the two grouping
constructs supported by FOCUS.

Property Billing account Sub account
Requirement level Mandatory Optional
Receives an invoice? Yes No
Invoiced at Self Associated billing account
Examples AWS: Management
Account*
GCP: Billing Account
Azure MCA: Billing
Profile
Snowflake: Organizational Account
AWS: Member Account
GCP:
Project
Azure MCA: Subscription
Snowflake: Account

* For organizations that have multiple AWS Member Accounts
within an AWS Organization, consolidated billing is enabled by default
and invoices are received at Management Account level. A Member Account
can be removed from AWS consolidated billing whereby the removed account
receives independent invoices and is responsible for payments.

7.3. Origination of Cost Data

Cost data presented in the billing datasets originates from various
sources depending on the purchasing mechanism. There are at least 3
different pieces of information that are important for understanding
where cost originated from.

      • Provider: The entity that made the resources or services available for
        purchase.
      • Publisher: The entity that produced the
        resources or services that were purchased.
      • Invoice Issuer: The entity responsible
        for invoicing for the resources or services
        consumed.

The value for each of these may be different depending on the various
purchasing scenarios for resources or services. Use
cases for purchasing direct, via a Managed Service Provider (MSP), via a
cloud marketplace, and from internal service offerings were considered.
The table below presents a few scenarios to show how the value for each
dimension may change based on the purchasing scenario.

# Scenario Provider Publisher Invoice Issuer
1.1 Purchasing cloud services directly from
cloud provider
Cloud service provider Cloud service provider Cloud service provider
1.2 Purchasing cloud services from the cloud
provider where the cloud region is operated by a 3rd party
Cloud service provider Cloud service provider Entity operating the region for the cloud
service provider
2.1 Purchasing cloud services via MSP Managed Service Provider Cloud service provider Managed Service Provider
2.2 Purchasing cloud-agnostic resources or
services built/sold by an MSP
Managed Service Provider Managed Service Provider Managed Service Provider
2.3 Purchasing labor services from managed
service provider
Managed Service Provider Managed Service Provider Managed Service Provider
3.1 Purchasing a cloud marketplace offering
that runs on the cloud provider
Cloud service provider Company building the software or services
(Cloud service provider OR third-party software or services
company)
Cloud service provider
3.2 Purchasing a cloud marketplace offering
that is not running directly on your cloud infrastructure (e.g,. SaaS
product, Professional Services)
Cloud service provider Company producing the SaaS or services
product
Cloud service provider
3.3 Purchasing a SaaS product that is not
directly running on your cloud infrastructure from a 3rd party reseller
managed cloud marketplace
Cloud service provider SaaS provider Reseller
4.1 Purchasing SaaS software directly from
provider
SaaS provider SaaS provider SaaS provider
4.2 Purchasing SaaS software that additionally
runs on your cloud resources (in addition to #4.1)
Cloud service provider Cloud service provider Cloud service provider
5.1 Purchasing internal infrastructure or
services offerings running on-premise
Internal product name Internal product name Internal product name
5.2 Purchasing internal infrastructure or
services offerings running on cloud
Internal product name Internal product name Internal product name
5.3 Associated software license cost for use
on an on-premise infrastructure platform (Where license cost is
presented separately in cost data)
Internal product name Company producing the software Internal product name

7.4. Examples

This section is non-normative.

7.4.1. Metadata Examples

The following sections contain examples of metadata provided by a
hypothetical FOCUS data provider called ACME to supply the required
reference between the FOCUS
dataset
and the schema metadata. Provider implementations will
vary on how the metadata is disseminated; however, the provider’s chosen
metadata delivery approach should be able to support the structure
represented in this example.

In this example, the provider supports delivery of FOCUS data via
file export to a data storage system. It uses JSON as the format for
providing the metadata. The provider delivers data every 12 hours into a
path structure described below:

Type of data Path
Export location /FOCUS
Metadata location /FOCUS/metadata
Cost data location /FOCUS/data

Here are some metadata examples for various scenarios:

7.4.1.1. Data Generator
Metadata

7.4.1.1.1. Scenario

Acme provides metadata about the data generator as a part of their
FOCUS data export. They provide the relevant data via the Data Generator schema object.

7.4.1.1.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/data_generator.json.

The updated data generator related metadata could look like this:

{
    "DataGenerator": "Acme"
}

7.4.1.2. Schema Metadata

7.4.1.2.1. Scenario

ACME has only provided one Schema for their
FOCUS data export. ACME provides a directory of schemas and each schema
is a single file. Acme’s provides a file representing the schema for the
data they provide.

7.4.1.2.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-1234-abcde-12345-abcde-12345.json.

The updated schema related metadata could look like this:

{
  "SchemaId": "1234-abcde-12345-abcde-12345",
  "FocusVersion": "1.0",
  "CreationDate": "2024-01-01T12:01:03.083z",
  "ColumnDefinition": [
    {
      "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["acme", "ac"]
          }
      ]
}

7.4.1.3. Schema
Metadata to FOCUS Data Reference

7.4.1.3.1. Scenario

ACME makes a change to the Schema of their data
exports. For each FOCUS data export, ACME includes a metadata reference
to the schema object. Because multiple files are provided in each
export, Acme has elected to include a metadata file in each export
folder that includes the FOCUS schema reference that applies to the data
export files within that folder. When the schema changes, they include
the new Schema ID in their export metadata file
of the new folder.

7.4.1.3.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/data/export1-metadata.json

The export metadata could look like this:

{
  "SchemaId":"1234-abcde-12345-abcde-12345",
  "data_location":
  [
    {
      "filepath": "/FOCUS/data/export1/export1-part1.csv",
      "total_bytes": 9010387,
      "total_rows": 4450
    },
    {
      "filepath": "/FOCUS/data/export1/export1-part2.csv",
      "total_bytes": 9010387,
      "total_rows": 4450
    },
    {
      "filepath": "/FOCUS/data/export1/export1-part3.csv",
      "total_bytes": 9010387,
      "total_rows": 4450
    },
    {
      "filepath": "/FOCUS/data/export1/export1-part4.csv",
      "total_bytes": 9010387,
      "total_rows": 4450
    }
  ]
}

New metadata can be provided at a location such as
/FOCUS/data/export2-metadata.json.

The new export metadata could look like this:

{
  "SchemaId":"23456-abcde-23456-abcde-23456",
  "data_location":
  [
    {
      "filepath": "/FOCUS/data/export2/export2-part1.csv",
      "total_bytes": 9010387,
      "total_rows": 4450
    },
    {
      "filepath": "/FOCUS/data/export2/export2-part2.csv",
      "total_bytes": 9010387,
      "total_rows": 4450
    },
    {
      "filepath": "/FOCUS/data/export2/export2-part3.csv",
      "total_bytes": 9010387,
      "total_rows": 4450
    },
    {
      "filepath": "/FOCUS/data/export2/export2-part4.csv",
      "total_bytes": 9010387,
      "total_rows": 4450
    }
  ]
}

7.4.1.4. Adding New Columns

7.4.1.4.1. Scenario

ACME has decided add additional columns to their FOCUS data export.
The new columns are x_awesome_column1, x_awesome_column2, and
x_awesome_column3. The provider creates a new Schema object to represent the new schema, this
schema object has a unique SchemaId. The
subsequent data exports that use the new schema include the new schema’s
id as a reference to their corresponding schema object.

7.4.1.4.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-23456-abcde-23456-abcde-23456.json.

The updated schema related metadata could look like this:

 {
  "SchemaId": "23456-abcde-23456-abcde-23456",
  "FocusVersion": "1.0",
  "CreationDate": "2024-02-02T12:01:03.083z",
  "ColumnDefinition": [
          {
                "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["awecorp", "ac"]
          },
          {
                "ColumnName": "x_awesome_column1",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "x_awesome_column2",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "x_awesome_column3",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          }
      ]
}

For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference

7.4.1.5. Removing Columns

7.4.1.5.1. Scenario

ACME has decided to remove columns from their FOCUS data export. The
column removed is x_awesome_column3. The provider creates a new Schema object to represent the new schema, with a
unique SchemaId.

7.4.1.5.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-34567-abcde-34567-abcde-34567.json.

The updated schema related metadata could look like this:

 {
  "SchemaId": "34567-abcde-34567-abcde-34567",
  "FocusVersion": "1.0",
  "CreationDate": "2024-03-02T12:01:03.083z",
  "ColumnDefinition": [
    {
      "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["acme", "ac"]
          },
          {
                "ColumnName": "x_awesome_column1",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "x_awesome_column2",
                "DataType": "DATETIME"
          }
      ]
}

For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference

7.4.1.6. Changing Column
Metadata

7.4.1.6.1. Scenario

ACME has decided to change the datatype of column x_awesome_column1
from a string to a number. ACME creates a new Schema object with the modification to
x_awesome_column2.

7.4.1.6.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-67891-abcde-67891-abcde-67891.json.

The updated schema related metadata could look like this:

 {
  "SchemaId": "67891-abcde-67891-abcde-67891",
  "FocusVersion": "1.0",
  "CreationDate": "2024-06-02T12:01:03.083z",
  "ColumnDefinition": [
    {
      "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["acme", "ac"]
          },
          {
                "ColumnName": "x_awesome_column1",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "x_awesome_column2",
                "DataType": "DATETIME"
          }
      ]
}

For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference

7.4.1.7. Provider
Metadata Error Correction

7.4.1.7.1. Scenario

ACME has discovered that while their export includes the column
x_awesome_column3, the Schema metadata does not
include this column. In this case, the provider fixes the metadata in
the existing schema object and does not need to create a new schema
object. Reference metadata remains the same.

7.4.1.7.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-34567-abcde-34567-abcde-34567.json.

The updated schema related metadata could look like this:

 {
  "SchemaId": "34567-abcde-34567-abcde-34567",
  "FocusVersion": "1.0",
  "CreationDate": "2024-03-02T12:01:03.083z",
  "ColumnDefinition": [
    {
      "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["acme", "ac"]
          },
          {
                "ColumnName": "x_awesome_column1",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "x_awesome_column2",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          }
      ]
}

7.4.1.8. FOCUS Version Changed

7.4.1.8.1. Scenario

ACME’s previous exports used FOCUS version 1.0. They are now going to
adopt FOCUS version 1.1. It is required that they create a new schema
metadata object which specifies the new FOCUS version via the FOCUS Version property – regardless of schema
changes. In this example, the new FOCUS version adoption doesn’t include
columns changes. This is to illustrate that FOCUS version changes are
independent of column changes, however, this scenario is unlikely.

7.4.1.8.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-45678-abcde-45678-abcde-45678.json.

The updated schema related metadata could look like this:

 {
  "SchemaId": "45678-abcde-45678-abcde-45678",
  "FocusVersion": "1.1",
  "CreationDate": "2024-04-02T12:01:03.083z",
  "ColumnDefinition": [
    {
      "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["acme", "ac"]
          },
          {
                "ColumnName": "x_awesome_column1",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "x_awesome_column2",
                "DataType": "DATETIME"
          }
      ]
}

For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference

7.4.1.9.
FOCUS Version Changed by Provider Using Provider Version

7.4.1.9.1. Scenario

ACME specifies the optional metadata property Provider Version in their Schema object. Their provider version 2.2 supported
FOCUS version 1.0. They are now going to adopt FOCUS Version 1.1 which
requires that they update their Provider Version when updating the FOCUS
Version. They create a new schema object designating that both
properties have changed. In this example, the adoption of the new FOCUS
version doesn’t include additional columns. This is to illustrate that
Provider Version can change independent of column changes; however, this
scenario is unlikely.

The provider creates a new schema object to represent the new schema.
The provider includes both the new FOCUS Version and Provider Version in
the schema object.

7.4.1.9.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-45678-abcde-45678-abcde-45678.json.

The updated schema related metadata could look like this:

 {
  "SchemaId": "45678-abcde-45678-abcde-45678",
  "FocusVersion": "1.1",
  "ProviderVersion": "2.3",
  "name": "New Columns",
  "CreationDate": "2024-04-02T12:01:03.083z",
  "ColumnDefinition": [
    {
      "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["acme", "ac"]
          },
          {
                "ColumnName": "x_awesome_column1",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "x_awesome_column2",
                "DataType": "DATETIME"
          }
      ]
}

For reference, the prior schema object looked like this:

 {
  "SchemaId": "34567-abcde-34567-abcde-34567",
  "FocusVersion": "1.0",
  "ProviderVersion": "2.2",
  "CreationDate": "2024-04-02T12:01:03.083z",
  "ColumnDefinition": [
    {
      "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["acme", "ac"]
          },
          {
                "ColumnName": "x_awesome_column1",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "x_awesome_column2",
                "DataType": "DATETIME"
          }
      ]
}

For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference

7.4.1.10.
Data Changed by Provider Using Provider Version

7.4.1.10.1. Scenario

ACME specifies the optional metadata property Provider Version in their Schema object. They made a change to the FOCUS dataset they produce
that does not adopt a new FOCUS Version, nor make a change the included
columns but does impact values in the data. This example illustrates
that Provider Version changes are independent of column changes, however
provider version changes may include column changes.

The provider creates a new schema object to represent the new schema.
The provider includes both the FOCUS Version and Provider Version in the
schema object.

7.4.1.10.2. Supplied Metadata

Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-56789-abcde-56789-abcde-56789.json.

The updated schema related metadata could look like this:

 {
  "SchemaId": "56789-abcde-56789-abcde-56789",
  "FocusVersion": "1.1",
  "ProviderVersion": "2.4",
  "CreationDate": "2024-05-02T12:01:03.083z",
  "ColumnDefinition": [
    {
      "ColumnName": "BillingAccountId",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "BillingAccountName",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
               "ColumnName": "ChargePeriodStart",
               "DataType": "DATETIME"
          },
          {
                "ColumnName": "ChargePeriodEnd",
                "DataType": "DATETIME"
          },
          {
                "ColumnName": "BilledCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "EffectiveCost",
                "DataType": "DECIMAL",
                "NumericPrecision": 20,
                "NumberScale": 10
          },
          {
                "ColumnName": "Tags",
                "DataType": "JSON",
                "ProviderTagPrefixes": ["acme", "ac"]
          },
          {
                "ColumnName": "x_awesome_column1",
                "DataType": "STRING",
                "StringMaxLength": 64,
                "StringEncoding": "UTF-8"
          },
          {
                "ColumnName": "x_awesome_column2",
                "DataType": "DATETIME"
          }
      ]
}

For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference

Get Trained and Certified on FOCUS

Learn how FOCUS can accelerate FinOps at your organization.

Introduction to FOCUS

Explore the goals of FOCUS, view sample use cases, and learn about gathering FOCUS conformed datasets.

Take the Free course

FinOps Certified FOCUS Analyst

An in-depth understanding of the FOCUS Specification, learn how to use FOCUS datasets to answer real-world business questions.

Learn more