Finance does not need the 40-line service breakdown — they need four numbers a month: total spend in amortized terms, spend per team or product, the month-over-month delta with a one-line explanation, and a unit metric (cost per customer, per environment, per thousand requests). Everything in this guide exists to produce those four numbers reliably. The raw material is Cost Explorer set to amortized cost, grouped by a cost-allocation tag or by account, plus one CUR query if you want the unit metric automated.
What’s happening
The gap between the AWS invoice and a readable analysis is structural. The invoice reports unblended cost by service — accurate for accounts payable, useless for accountability, because “EC2: $X” answers neither whose spend it is nor why it moved. Three translations bridge the gap.
First, amortized instead of unblended. Unblended cost books an upfront Savings Plan or RI purchase entirely on the purchase date, so the month someone buys a commitment looks catastrophic and the following eleven look artificially cheap. Amortized cost spreads the commitment over its term — that is the number finance should trend.
Second, attribution by tag or account. Spend becomes ownable when it is grouped by a cost-allocation tag (team, product, cost-center) or by member account in an Organization. Whichever attribution scheme you use, its coverage is the ceiling on your analysis quality — 40% untagged means 40% of the report is a shrug.
Third, a unit denominator. Total spend rising is not inherently bad; spend per customer rising is a real signal. The denominator comes from your own systems (active customers, orders, tenants), not from AWS.
What to check first
- Is Cost Explorer set to amortized cost? The toggle hides under Cost Explorer > Report parameters > Advanced options > Cost aggregation. Most surprise “spikes” reported to finance are unblended artifacts.
- Are cost allocation tags activated? Tags do not appear in billing data until activated in Billing and Cost Management > Cost allocation tags — activation applies to usage going forward, and up to 24 hours pass before data flows.
- What fraction of spend is untagged? Group by your tag and look at the “No tag key” bucket.
- Do credits and refunds distort the trend? Filter charge type to see the operational number separately from one-time adjustments.
How to verify
# Spend by team tag, last full month, amortized
aws ce get-cost-and-usage \
--time-period Start=2026-06-01,End=2026-07-01 \
--granularity MONTHLY \
--metrics AmortizedCost \
--group-by Type=TAG,Key=team
# Spend by member account, if you run Organizations
aws ce get-cost-and-usage \
--time-period Start=2026-06-01,End=2026-07-01 \
--granularity MONTHLY \
--metrics AmortizedCost \
--group-by Type=DIMENSION,Key=LINKED_ACCOUNT
# Which cost allocation tags are actually active?
aws ce list-cost-allocation-tags --status Active
An empty Type=TAG grouping result means the tag was never activated for billing — the tag can exist on every resource and still be invisible here.
The runbook
- Pick the attribution scheme and commit to it. Account-per-team gives perfect attribution with zero tagging discipline; tags give finer grain but demand enforcement. Most organizations land on accounts for the coarse split and tags for product-level detail. A tagging standard that survives real teams is its own topic — see the cost-allocation tagging strategy.
- Build the monthly one-pager from four numbers. Total amortized spend; spend per team/product; month-over-month delta with its top two drivers named in plain language (“staging environment left running”, “June marketing campaign traffic”); unit cost. One page. Every additional page halves the readership.
- Save the Cost Explorer reports. Configure amortized cost, monthly granularity, group-by tag or account, then Save to report library — so the numbers are reproducible by anyone, not conjured by whoever remembers the filter set.
- Automate the pull when the manual version stabilizes. The two CLI queries above in a scheduled job, output to a spreadsheet or dashboard. Only automate a report format after three manual months prove people read it.
- Reconcile against the invoice once a quarter. Amortized analysis and the payable invoice legitimately differ (commitment timing, credits, tax). Document the reconciliation once so finance stops re-deriving it; the mechanics are in the AWS Cost Management docs.
- Name the driver, not the service, in the commentary. “RDS up 18%” is data; “the analytics replica added for the Q3 report is now permanent — decision needed” is analysis. The commentary line is the entire value of a human doing this.
When this is the wrong move
If the bill is small and one founder reads it, a saved Cost Explorer report is the whole system — do not build a reporting pipeline for an audience of one. And if spend attribution is currently near zero, fix tagging or account structure first; a beautifully formatted report over untagged spend is fiction with a chart.
Common mistakes
- Reporting unblended cost to finance. Every commitment purchase becomes a fire drill, and post-purchase months are read as savings that do not exist.
- Letting the untagged bucket grow silently. Report untagged spend as its own line every month; what gets a line gets fixed.
- Charging shared costs arbitrarily. NAT Gateways, Organizations-level support fees, and shared tooling need an allocation rule everyone accepts — proportional split is fine, silence is not.
- Shipping the report without commentary. Numbers without the “because” line train readers to ignore the report.
Prevention
- Activate cost allocation tags the day a tag standard exists — history before activation is not recoverable for grouping.
- Alert on untagged-spend percentage, not just total spend.
- Keep the report definition in version control or the report library, not in someone’s browser session.
- Recheck the amortized-vs-invoice reconciliation whenever a new commitment is purchased.
- Revisit the unit metric yearly; a denominator that stops matching the business quietly invalidates the trend.
A billing analysis is working when finance stops forwarding the invoice with a question mark and starts asking about the one driver you named — that shift is the whole point. If nobody on your team truly owns the AWS environment end to end, that is the root of most of these problems — Stack Harbor runs AWS accounts daily under AWS Operations, and you can book an AWS review.