$80,000 All Upfront plan, the daily rate becomes approximately $219.18.
3. Isolate Commitment Costs:
* Add a filter: Purchase Option equals Savings Plans.
* This removes On-Demand and Spot charges, focusing the view solely on commitment performance.
4. Analyze Utilization Distribution:
* Group by Linked Account to see which accounts are consuming coverage.
* Group by Service to verify coverage across EC2, Lambda, and Fargate.
* Interpretation: In the Amortized view, used commitment appears as negative offsets against usage. Unused commitment appears as a positive cost with no offset. This positive cost is your waste signal.
Architecture Decision: CUR vs. Cost Explorer
While Cost Explorer provides visual insights, production environments require programmatic analysis. The CUR is the source of truth. When querying CUR data, you must select the correct cost methodology to avoid double-counting.
Rationale: The CUR contains both lineItem/UnblendedCost and savingsPlan/SavingsPlanEffectiveCost. Summing both in the same aggregation double-counts the expense. For Amortized analysis, you must rely on SavingsPlanEffectiveCost and specific Savings Plan line item types.
New Code Example: Daily Commitment Health Query
The following Athena query calculates daily utilization, waste, and allocation across linked accounts. This template uses distinct naming conventions and a structure optimized for detecting waste trends.
-- FinOps Daily Savings Plan Efficiency Report
-- Calculates utilization rate and identifies daily waste per account
WITH sp_daily_metrics AS (
SELECT
DATE_TRUNC('day', line_item_usage_start_date) AS usage_date,
line_item_usage_account_id AS linked_account_id,
savings_plan_savings_plan_arn AS sp_arn,
-- Total daily amortized commitment value
SUM(CASE
WHEN line_item_line_item_type IN ('SavingsPlanRecurringFee', 'SavingsPlanUpfrontFee')
THEN savings_plan_amortized_upfront_fee_for_usage + savings_plan_amortized_recurring_fee
ELSE 0
END) AS daily_commitment_total,
-- Value of commitment actually applied to usage
SUM(CASE
WHEN line_item_line_item_type = 'SavingsPlanCoveredUsage'
THEN savings_plan_savings_plan_effective_cost
ELSE 0
END) AS daily_commitment_used,
-- Value of commitment wasted (unused)
-- Negation line items represent the portion of the fee not offset by usage
SUM(CASE
WHEN line_item_line_item_type = 'SavingsPlanNegation'
THEN savings_plan_amortized_upfront_fee_for_usage + savings_plan_amortized_recurring_fee
ELSE 0
END) AS daily_commitment_wasted
FROM cloud_finops_cur_data
WHERE line_item_line_item_type IN (
'SavingsPlanRecurringFee',
'SavingsPlanUpfrontFee',
'SavingsPlanCoveredUsage',
'SavingsPlanNegation'
)
AND savings_plan_savings_plan_arn IS NOT NULL
GROUP BY 1, 2, 3
)
SELECT
usage_date,
linked_account_id,
sp_arn,
daily_commitment_total,
daily_commitment_used,
daily_commitment_wasted,
ROUND(
(daily_commitment_used / NULLIF(daily_commitment_total, 0)) * 100,
2
) AS utilization_pct,
CASE
WHEN daily_commitment_wasted > 0 THEN 'ALERT: Waste Detected'
ELSE 'Healthy'
END AS status_flag
FROM sp_daily_metrics
ORDER BY usage_date DESC, daily_commitment_wasted DESC;
Key Implementation Details:
NULLIF Safety: The utilization calculation uses NULLIF to prevent division-by-zero errors on days with no commitment fees.
- Negation Logic: The query explicitly sums
SavingsPlanNegation line items to quantify waste. This is the technical representation of unused commitment in the CUR.
- Grouping: Grouping by
linked_account_id ensures that waste is attributed to the correct account, which is critical for chargeback accuracy in consolidated billing.
Pitfall Guide
-
The Double-Counting Trap
- Explanation: Aggregating
lineItem/UnblendedCost alongside savingsPlan/SavingsPlanEffectiveCost in the same query sums the cost twice.
- Fix: Choose a single methodology. For Amortized analysis, exclude
UnblendedCost and rely exclusively on Savings Plan effective cost fields and line item types.
-
Latency Blindness
- Explanation: Cost Explorer and CUR data have a refresh latency of 24 to 72 hours. A utilization drop may not appear in dashboards for up to three days.
- Fix: Design alerts based on trend analysis rather than hourly spikes. Accept that real-time monitoring is impossible with native AWS tools; focus on daily batch checks.
-
Management Account Chargeback Error
- Explanation: Using Unblended costs for chargebacks assigns the entire Savings Plan cost to the management account, regardless of which linked accounts consumed the resources.
- Fix: Always use Amortized costs for internal allocation. The Amortized view distributes the cost to linked accounts based on actual usage coverage.
-
Ignoring Purchase Option Filters
- Explanation: Analyzing costs without filtering by
Purchase Option mixes On-Demand, Reserved Instances, and Savings Plans, distorting utilization metrics.
- Fix: Apply a strict filter
Purchase Option = Savings Plans when evaluating commitment efficiency.
-
Static Analysis Fallacy
- Explanation: Amortized cost is a historical view. It shows what happened but cannot predict future utilization or recommend sizing adjustments.
- Fix: Combine Amortized analysis with AWS Cost Explorer recommendations or forecasting tools to proactively adjust commitments before waste accumulates.
-
Formula Misinterpretation
- Explanation: Teams sometimes believe Amortized cost changes the actual AWS bill.
- Fix: Understand that Amortized cost is an analytical view only. It does not alter billing, invoicing, or payment terms. It is strictly for operational analysis.
-
Linked Account Application Order
- Explanation: AWS applies Savings Plans to linked accounts in a specific order (roughly by account ID, then service). Teams may assume coverage is distributed evenly or by request.
- Fix: Review the application order in the CUR. If a specific account is not receiving coverage, verify its position in the application sequence and consider purchasing account-specific plans if necessary.
Production Bundle
Action Checklist
Decision Matrix
| Scenario | Recommended Approach | Why | Cost Impact |
|---|
| Monthly Finance Reconciliation | Unblended View | Matches the actual invoice for cash-flow tracking. | Ensures accurate treasury reporting. |
| Team Chargeback / Showback | Amortized View | Distributes costs to consuming accounts fairly. | Prevents overcharging management account; accurate unit economics. |
| Utilization Audit | Amortized View | Reveals daily waste signals and unused commitment. | Identifies potential savings (e.g., $150k waste on $500k plan). |
| Commitment Sizing | Amortized + Forecasting | Amortized shows historical efficiency; forecasting predicts future needs. | Optimizes purchase size to reduce future waste. |
Configuration Template
Use this Athena view definition to create a reusable dataset for Savings Plan analysis. This encapsulates the logic for daily amortized metrics.
CREATE OR REPLACE VIEW finops.v_savings_plan_daily_efficiency AS
SELECT
DATE_TRUNC('day', line_item_usage_start_date) AS analysis_date,
line_item_usage_account_id AS account_id,
savings_plan_savings_plan_arn AS plan_arn,
savings_plan_offering_type AS plan_type,
savings_plan_commitment_discount AS discount_rate,
-- Amortized Fee Components
SUM(savings_plan_amortized_upfront_fee_for_usage) AS amortized_upfront,
SUM(savings_plan_amortized_recurring_fee) AS amortized_recurring,
(amortized_upfront + amortized_recurring) AS total_daily_amortized,
-- Utilization Components
SUM(CASE WHEN line_item_line_item_type = 'SavingsPlanCoveredUsage'
THEN savings_plan_savings_plan_effective_cost ELSE 0 END) AS covered_usage_cost,
SUM(CASE WHEN line_item_line_item_type = 'SavingsPlanNegation'
THEN savings_plan_amortized_upfront_fee_for_usage + savings_plan_amortized_recurring_fee
ELSE 0 END) AS unused_commitment_cost,
-- Derived Metrics
ROUND((covered_usage_cost / NULLIF(total_daily_amortized, 0)) * 100, 2) AS utilization_percentage,
CASE
WHEN unused_commitment_cost > 0 THEN TRUE
ELSE FALSE
END AS is_wasting
FROM cloud_finops_cur_data
WHERE line_item_line_item_type IN (
'SavingsPlanRecurringFee',
'SavingsPlanUpfrontFee',
'SavingsPlanCoveredUsage',
'SavingsPlanNegation'
)
GROUP BY 1, 2, 3, 4, 5;
Quick Start Guide
- Open Cost Explorer: Navigate to the AWS Billing Console and launch Cost Explorer.
- Toggle Amortized: In the right panel, select Advanced Options and switch Cost Type to
Amortized.
- Filter Savings Plans: Add a filter for
Purchase Option equals Savings Plans.
- Inspect Waste: Group by
Linked Account. Look for positive cost values on Savings Plan line items; these indicate unused commitment.
- Validate with CUR: Run the provided Athena query to quantify daily waste and identify which accounts are underutilizing coverage.