microsoft / microsoft/finops-toolkit

Feature: FOCUS 1.3 Ingestion and Hub Support (ContractCommitment + ContractApplied)

Open
#2,104 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Tool: FinOps hubs Tool: FOCUS
Dominant language
PowerShell
Stars
603
Forks
248
Avg merge
7d 11h
Merged PRs (30d)
11

Description

Feature Request: FOCUS 1.3 Ingestion and Hub Support (ContractCommitment + ContractApplied)

Summary

Add FOCUS 1.3 ingestion (IngestionSetup_v1_3.kql) and hub (HubSetup_v1_3.kql) KQL scripts to support the new columns and datasets introduced in the FOCUS 1.3 specification (ratified December 2025).

The highest-priority additions are the Contract Commitment dataset and the ContractApplied column on Cost and Usage, which enable provider-confirmed MACC decrement tracking instead of heuristic-based eligibility classification.

Motivation

Organizations with Microsoft Azure Consumption Commitments (MACCs) currently rely on heuristic confidence layers to estimate which charges decrement the commitment:

  • Layer 1: First-party Azure usage (95%+ confidence via ProviderName + ChargeCategory)
  • Layer 2: RI/SP purchases (90%+ via CommitmentDiscountId)
  • Layer 3: Marketplace (70-75%, "benefit eligible" tags can be stale)
  • Layer 4: Edge cases (30-40%, requires Finance confirmation)

This gets to ~85-90% accuracy. The remaining 10-15% gap requires reconciliation against the Billing API (/Microsoft.Consumption/lots and /events endpoints).

FOCUS 1.3 eliminates this gap by having the data generator (Azure) tell you per-row which charges applied to which contract commitment and the exact applied amount. This is ground truth, not a heuristic.

What FOCUS 1.3 Adds

New supplemental dataset: ContractCommitment (13 columns)

Column Description
ContractCommitmentId Unique commitment identifier
ContractCommitmentCategory Type classification
ContractCommitmentType Spend vs usage commitment
ContractCommitmentDescription Human-readable label
ContractCommitmentCost Commitment amount in billing currency
ContractCommitmentQuantity Commitment in units (if applicable)
ContractCommitmentUnit Unit of measure
ContractCommitmentPeriodStart Commitment term start
ContractCommitmentPeriodEnd Commitment term end
ContractId Parent contract identifier
ContractPeriodStart Contract start
ContractPeriodEnd Contract end
BillingCurrency Currency

New column on Cost and Usage: ContractApplied (JSON)

Each cost row carries a JSON array:

{
  "Elements": [
    {
      "ContractCommitmentID": "...",
      "ContractCommitmentAppliedCost": 123.45
    }
  ]
}

Column deprecations (available in 1.3, removed in 1.4)

  • ProviderName replaced by ServiceProviderName
  • PublisherName replaced by HostProviderName
Proposed Work
  1. IngestionSetup_v1_3.kql: Raw table definitions and transform functions for FOCUS 1.3 exports, including:

    • ContractApplied JSON column on Costs_raw
    • ServiceProviderName / HostProviderName columns (with ProviderName / PublisherName backward compat)
    • ContractCommitment dataset raw table and transform
    • Data completeness / recency metadata fields
  2. HubSetup_v1_3.kql: Hub functions (Costs_v1_3, Prices_v1_3, etc.) that:

    • Project ContractApplied alongside existing cost columns
    • Add ServiceProviderName / HostProviderName with fallback to ProviderName / PublisherName
    • Include ContractCommitment() function wrapping the new dataset
    • Update latest-version aliases: Costs() -> Costs_v1_3(), etc.
  3. Backward compatibility: v1_2 data should union cleanly into v1_3 functions with column_ifexists() for new fields, matching the existing v1_0-to-v1_2 pattern.

Blocking Dependency

Azure Cost Management needs to actually populate the FOCUS 1.3 columns in FOCUS exports. If Azure is not yet exporting ContractApplied or the ContractCommitment dataset, the ingestion scripts would define empty columns. Confirming export availability would help sequence this work.

References
Labels

Tool: FinOps hubs, Tool: FOCUS, Type: Feature

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reading the existing v1_0-to-v1_2 ingestion and hub patterns, then confirm whether Azure Cost Management exports ContractApplied and the ContractCommitment dataset. Implement the specified changes in IngestionSetup_v1_3.kql and HubSetup_v1_3.kql; done means FOCUS 1.3 fields and functions are supported while v1_2 data still unions cleanly.

Written by the indexing model from the issue text.

Assessment

Tech stack
azure
Domain
cloud, data-engineering, tooling
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.