Budget
MCM-managed budget configuration, evaluation, alerting, and stored budget fields.
Budget
Budgets are MCM-managed spend controls. MCM does not create or depend on provider-native AWS Budgets or Azure Budgets. Instead, budget definitions are stored in MCM, evaluated against normalized FinOps cost and forecast data, and exposed through the FinOps API for dashboards, account views, and alert workflows.
For canonical provider, account, resource type, and category terminology, see the Provider and Resource Reference.
Design Goals
| Goal | Design Detail |
|---|---|
| Centralized spend governance | Store budget definitions in MCM so the same model works across AWS and Azure. |
| Provider-independent evaluation | Evaluate budgets from normalized cost and forecast records instead of provider-native budget resources. |
| Flexible filtering | Support budget scopes from global spend down to provider, account, and tag-level spend. |
| Repeatable alerting | Calculate threshold state from actual and forecast spend after cost and forecast data refresh. |
| Auditable posture | Persist evaluation results so budget state can be inspected without recalculating every request. |
Data Sources
Budget evaluation uses data already collected by the Cost and Forecast pipelines.
| Source | Used For | Reference |
|---|---|---|
| Normalized cost records | Actual spend for the current budget period. | Cost |
| Forecast records | Projected spend for the budget period or next available forecast window. | Forecast |
| Provider account metadata | Account names, provider names, and account identifiers. | Provider and Resource Reference |
| Resource metadata and tags | Custom tag filters used for tagged budget scopes. | Provider and Resource Reference |
Budget Configuration
A budget definition describes what spend should be tracked, where the budget applies, the period being evaluated, the allowed amount, and the alert thresholds.
| Configuration Area | Detail |
|---|---|
| Identity | Name, description, and stable budget ID. |
| Period | Daily, weekly, monthly, quarterly, annual, or custom date range. |
| Recurrence | Recurring budgets reset every period; one-time budgets apply only to the configured start and end dates. |
| Scope | Defines the subset of cost and forecast data included in evaluation. |
| Amount | Budget cap in the configured currency. |
| Thresholds | One or more percentage thresholds evaluated against actual and forecast spend. |
| Status | Current budget posture derived from the latest evaluation result. |
Supported Budget Scopes
| Scope | Required Selector | Evaluation Filter |
|---|---|---|
| Global | None | All supported FinOps cost records. |
| Provider | Provider | Cost records for one provider, such as AWS or Azure. |
| Account | Provider and account ID | Cost records for one cloud account or Azure subscription. |
| Custom Tag | Tag key and optional tag value | Cost records whose provider tag set matches the configured selector. |
Scopes are resolved into cost-query filters before evaluation. Provider and account names must use the canonical values from the Provider and Resource Reference.
Period Resolution
| Period Type | Window Calculation |
|---|---|
| Daily | Start and end of the current day. |
| Weekly | Start and end of the current week. |
| Monthly | First day through last day of the current month. |
| Quarterly | First day through last day of the current quarter. |
| Annual | First day through last day of the current year. |
| Custom Range | Configured start date through configured end date. |
For recurring budgets, MCM derives the active window from the current date and the configured period type. For one-time budgets, MCM uses the stored start and end dates and stops evaluation after the end date.
Evaluation Schedule
| Trigger | Purpose |
|---|---|
| After daily cost collection | Refresh actual spend and threshold posture after new cost records are ingested. |
| After monthly reconciliation | Recalculate budgets when finalized billing data replaces provisional cost data. |
| After forecast refresh | Update forecast posture and Might Exceed status from the latest forecast rows. |
| Manual evaluation | Recalculate a budget or budget group after configuration changes or operational troubleshooting. |
Budget evaluation should be idempotent for the same budget, period window, and source data version. A rerun overwrites the latest evaluation result for that active period instead of creating duplicate current-state rows.
Evaluation Flow
- Load active budget definitions.
- Resolve each budget period into a concrete start and end date.
- Resolve each budget scope into provider, account, or tag filters.
- Query normalized cost records that match the period and scope.
- Sum actual spend in the reporting currency.
- Query matching forecast rows when forecast data is available for the same scope.
- Calculate utilization percentage from actual spend and budget amount.
- Calculate forecast utilization percentage from forecast spend and budget amount.
- Evaluate thresholds and derive budget status.
- Store the latest evaluation result, threshold state, and calculated timestamps.
Threshold And Alert Logic
Thresholds are stored as percentages of the budget amount. They are early-warning levels, not separate budgets. MCM evaluates both actual spend and forecast spend so the budget can show a simple status before the spend actually crosses the configured amount.
| Status | Condition |
|---|---|
| Under Budget | Actual spend and forecast spend are below the configured warning threshold. |
| Might Exceed | Actual spend or forecast spend has crossed the configured warning threshold, but actual spend is still within the budget amount. |
| Over Budget | Actual spend is greater than the configured budget amount. |
For example, if a monthly budget is 1000 USD and the threshold is 80%, MCM calculates the threshold amount as 800 USD.
| Actual Spend | Forecast Spend | Status | Reason |
|---|---|---|---|
650 USD | 740 USD | Under Budget | Both actual and forecast spend are below 800 USD. |
720 USD | 900 USD | Might Exceed | Forecast spend is above the 800 USD threshold. |
850 USD | 920 USD | Might Exceed | Actual spend is above the 800 USD threshold but still below the 1000 USD budget. |
1025 USD | 1100 USD | Over Budget | Actual spend is already greater than the budget amount. |
If multiple thresholds are configured, MCM uses the highest threshold crossed by actual or forecast spend. Over Budget always takes precedence because it is based on actual spend exceeding the budget amount.
Stored Budget Definition Fields
| Field | Type | Description | Required Behavior |
|---|---|---|---|
| Budget ID | string | Stable budget identifier. | Stored for every budget. |
| Name | string | Budget display name. | Stored for every budget. |
| Description | string | Optional business context. | Stored when provided. |
| Period | enum | Daily, weekly, monthly, quarterly, annual, or custom. | Stored for every budget. |
| Start Date | date | Configured start date or first active period date. | Stored for every budget. |
| End Date | date | Configured end date for one-time or custom budgets. | Stored when applicable. |
| Recurrence | enum | Recurring or one-time. | Stored for every budget. |
| Scope Type | enum | Global, provider, account, or custom tag. | Stored for every budget. |
| Provider | string | Provider selector for scoped budgets. | Required for provider-specific scopes. |
| Account ID | string | Account selector for account-scoped budgets. | Required for account scope. |
| Account Name | string | Display name for the selected account. | Stored when available. |
| Tag Key | string | Custom tag key selector. | Required for custom tag scope. |
| Tag Value | string | Custom tag value selector. | Optional for custom tag scope. |
| Amount | number | Budget cap. | Stored for every budget. |
| Currency | string | Budget currency such as USD. | Stored for every budget. |
| Thresholds | list | Configured warning percentages such as 80% or 90%. | Stored for every budget. |
| Is Active | boolean | Whether the budget should be evaluated. | Stored for every budget. |
| Created At | datetime | Timestamp when the budget was created. | Stored for every budget. |
| Updated At | datetime | Timestamp when the budget definition last changed. | Updated on modification. |
Stored Budget Evaluation Fields
| Field | Type | Description | Required Behavior |
|---|---|---|---|
| Evaluation ID | string | Stable identifier for the stored evaluation result. | Stored for every evaluation. |
| Budget ID | string | Reference to the budget definition. | Stored for every evaluation. |
| Period Start | date | Start date used for this evaluation. | Stored for every evaluation. |
| Period End | date | End date used for this evaluation. | Stored for every evaluation. |
| Actual Cost | number | Actual spend from normalized cost records. | Stored for every evaluation. |
| Forecast Cost | number | Forecasted spend for the budget scope. | Stored when forecast data is available. |
| Currency | string | Reporting currency for actual and forecast values. | Stored for every evaluation. |
| Budget Amount | number | Budget cap copied from the definition at evaluation time. | Stored for every evaluation. |
| Remaining Amount | number | Budget amount minus actual cost. | Stored for every evaluation. |
| Utilization Percent | number | Actual cost divided by budget amount. | Stored for every evaluation. |
| Forecast Utilization Percent | number | Forecast cost divided by budget amount. | Stored when forecast data is available. |
| Current Threshold | string | Highest threshold crossed by actual or forecast spend. | Stored when a threshold is crossed. |
| Alert Status | enum | Under Budget, Might Exceed, or Over Budget. | Stored for every evaluation. |
| Alert Triggered | boolean | Whether this evaluation should create or update an alert. | Stored for every evaluation. |
| Evaluated At | datetime | Timestamp when the evaluation completed. | Stored for every evaluation. |
| Source Cost Window | string | Cost data window used for the calculation. | Stored for auditability. |
| Source Forecast Window | string | Forecast data window used for the calculation. | Stored when forecast data is available. |
Failure Scenarios
| Scenario | Action |
|---|---|
| Budget definition is incomplete | Mark evaluation failed and store validation error details. |
| Scope selector does not match any records | Store actual cost as zero and keep the budget evaluable. |
| Cost data is not available | Store evaluation as failed or pending, depending on whether collection is still in progress. |
| Forecast data is not available | Evaluate actual spend and leave forecast fields empty. |
| Currency conversion is unavailable | Evaluate records already in the budget currency; otherwise store an error for unsupported conversion. |
| Threshold configuration is invalid | Skip alert evaluation for that budget and store validation error details. |
API Output
Budget API responses should be assembled from the stored budget definition and latest evaluation result.
| Output Area | Source |
|---|---|
| Budget identity | Budget definition fields. |
| Scope and period | Budget definition plus resolved active period. |
| Actual spend | Latest budget evaluation result. |
| Forecast spend | Latest budget evaluation result. |
| Utilization and remaining amount | Latest budget evaluation result. |
| Alert status and threshold state | Latest budget evaluation result. |
| Spending history | Aggregated normalized cost records for the active period. |