Reading the AWS Bill: A Field Guide to Rates and Credits

How the AWS bill is actually assembled: the CUR, the four rate types, how RI and Savings Plan discounts flow, and why your reports never quite agree.

Erik LoydJune 30, 202613 min read
Reading the AWS Bill: A Field Guide to Rates and Credits

Key takeaways

  • Every AWS cost number is an aggregation of CUR line items; disagreements between tools are almost always rate-type mismatches
  • Unblended, blended, amortized, and net cost answer four different questions, and only one of them is right for any given report
  • RI and Savings Plan discounts float across a consolidated bill by default, landing where usage matched first, not where the commitment was bought
  • Showback that ignores amortization punishes teams in upfront-payment months and flatters them the rest of the year

Every team that takes AWS cost seriously eventually hits the same wall: the invoice says one number, Cost Explorer says another, the finance export says a third, and all three are technically correct. This guide explains the machinery underneath, the Cost and Usage Report, the four rate types, and the way commitment discounts and credits actually land, so that when two reports disagree, you know which one is answering the question you asked.

Nothing here requires third-party tooling. It is the mechanics of the bill itself, as AWS publishes it, laid out in the order the money flows.

Where every number comes from

All AWS cost reporting descends from one artifact: the Cost and Usage Report, a file AWS delivers to an S3 bucket you designate, containing one row per resource per usage type per hour. A moderately busy organization generates millions of rows per month; a large one generates billions. Every row carries the who (account), the what (service, usage type, operation, resource ID), the how much (usage amount), and several different answers to the how much did it cost question, which is where the trouble starts.

Cost Explorer, the invoice PDF, AWS Budgets, and every third-party cost tool are aggregations of this same data at different granularities, with different default rate columns, different handling of credits, and different refresh timing. When two of them disagree, the explanation is almost never a bug. It is a different aggregation choice, and the rest of this guide is a map of those choices.

4
different cost columns for every line item in the CUR
unblended, blended, amortized, and net, each correct for a different question

The four rate types

Unblended cost is what actually hit the bill for that line item that hour: the cash view. If an instance ran on-demand, the unblended cost is the on-demand rate; if a Savings Plan covered it, the unblended cost of the usage line drops toward zero and the commitment's own charge appears as its own line. Unblended is the default in most tooling and the right basis for cash reconciliation against the invoice.
Blended cost exists because of consolidated billing. When multiple accounts in an organization run identical usage and some of it is covered by reservations, AWS computes a blended rate, the average of the covered and uncovered rates across the organization, and applies it evenly. Blended cost answers what did this usage cost the organization on average, which finance sometimes wants for fairness, at the price of no longer matching any real price list. Most teams are better served ignoring the blended columns entirely.
Amortized cost spreads commitment payments across the usage they cover. An all-upfront Reserved Instance is real cash in month one and zero cash for the next thirty-five months; unblended cost reports exactly that, a spike then silence. Amortized cost instead attributes each hour of covered usage its share of the upfront fee, the same treatment finance already gives an annual insurance premium or a prepaid software license. This is the column for unit economics, trend lines, and any per-team or per-customer allocation, because it makes January comparable to February.
Net cost variants (net unblended, net amortized) apply your negotiated discounts, private pricing, and credits into the rate itself. Organizations with an Enterprise Discount Program or heavy credits should treat the net amortized column as the closest thing to economic truth the CUR offers.

The practical rule: reconcile cash with unblended, report trends and showback with amortized, and never mix the two in one table. A surprising share of "our costs jumped 40 percent" alarms are an upfront commitment purchase read through the cash column by a report that should have been amortized.

One instance, four numbers

A worked example makes the columns concrete. Take an m7i.xlarge in us-east-1, on-demand rate $0.2016 per hour, running the full 730-hour month, covered by a one-year all-upfront EC2 Instance Savings Plan bought for $1,020 by a different account in the same organization.

Unblended, the usage line for the instance shows close to $0.00, because a commitment covered it, and the commitment's charge sits elsewhere: the $1,020 appeared as a fee line in the purchasing account back in the month of purchase. If you read only this account's unblended cost, the instance looks nearly free. If you read the purchasing account's, it looks like a $1,020 spike followed by nothing.
Blended, the organization's identical usage is averaged, so this instance shows a rate somewhere between the discounted and on-demand price depending on what the rest of the organization ran that hour. The number is smooth and matches no price list.
Amortized, the instance shows roughly $85 for the month, the $1,020 upfront spread across the plan's covered hours. This is the number that belongs in a trend line or a per-team report, because it neither hides the instance's real cost nor spikes the purchase month.
Net amortized, if the organization carries an EDP discount or credits, lands a few percent below amortized. This is the closest column to what the organization economically paid.

Four numbers, one instance, every one of them correct. The report is only wrong when the column and the question do not match.

Working with the CUR directly

Cost Explorer answers most day-to-day questions, but the CUR is where disputes get settled, and querying it directly is less work than its size suggests. AWS delivers it in Parquet, and the standard pattern is Athena over the delivery bucket; AWS provides the table definition, and from there it is SQL.

A handful of columns do most of the work:

  • line_item_line_item_type classifies every row and is the first filter in almost every query: Usage (on-demand), DiscountedUsage (RI-covered), SavingsPlanCoveredUsage, Fee and RIFee (commitment charges), SavingsPlanNegation (the offsetting entries that keep covered usage from double-counting), Credit, Refund, and Tax. Summing costs without understanding these types is the single most common way to build a wrong number from correct data.
  • line_item_usage_type names what was consumed (BoxUsage:m7i.xlarge, NatGateway-Bytes, TimedStorage-ByteHrs) and carries a region prefix outside us-east-1 (USW2-BoxUsage:...). It is the key for any analysis finer than service level.
  • line_item_unblended_cost plus the reservation_ and savings_plan_ column families supply the rate types: amortized cost is assembled from effective-cost columns rather than read from a single field, which is exactly why tools differ in the decimals.
  • resource_tags_ columns carry activated cost allocation tags, one column per tag key.
Two habits keep CUR work honest. First, always bound queries by bill_billing_period_start_date rather than usage dates alone; late-arriving rows are assigned to billing periods in ways that surprise date filters. Second, treat any month as provisional until several days after close, because AWS restates the file as late charges and support fees settle.

None of this requires standing infrastructure beyond the delivery bucket and an Athena workgroup. For a finance-facing team, one saved query per reporting convention, each with the rate type, credit handling, and filters written down in the query itself, is a serviceable single source of truth.

How commitment discounts actually land

Reserved Instances and Savings Plans are bought by one account but, by default, discount matching usage anywhere in the organization. AWS applies them in a fixed order, every hour: RI discounts first, matched to usage with the same attributes, then Savings Plans, applied to whatever eligible usage remains, sorted by discount percentage so the commitment dollars go to the highest-discount usage first.

Two consequences follow, and both surprise teams the first time.

First, the discount lands where the usage matched, not where the commitment was bought. A production account's Savings Plan can spend its hours discounting a development account's instances if development's usage happened to match at a higher discount rate. The purchasing account's bill looks worse than expected; another account's looks better; the organization total is right.

Second, coverage is hourly, not monthly. A commitment sized to average monthly usage over-covers quiet hours and under-covers peaks. This is why serious commitment sizing works from the hourly usage floor, the level usage never drops below, rather than monthly averages; the mechanics of that sizing are their own subject, covered in our commitments research.

Sharing is also a control surface. Discount sharing can be turned off per account, which pins an account's commitments to its own usage. Organizations doing internal chargeback or reselling to external customers need a deliberate position on sharing, because the default silently redistributes real money between cost centers every hour.

Credits, and the order of subtraction

Credits, promotional, migration, or negotiated, apply at the consolidated bill level, and AWS decides which line items they offset unless you use the payer-level allocation controls. For reporting, the question is whether you want them in the rate (net columns) or as a separate line. Both are defensible; mixing them is not. A team that reports gross cost while finance reconciles net cost will disagree by exactly the credit amount and spend an afternoon rediscovering why.

One more subtraction trap: refunds and adjustment line items land in the CUR with negative amounts, dated to the billing period in which they were issued, not the period they compensate. A month with a large refund in it will look artificially cheap in trend lines unless refunds are filtered or reallocated.

Cost allocation: tags decide what can be attributed

Everything above concerns how much; attribution, whose spend is this, runs entirely on cost allocation tags and account structure. Two facts govern what is achievable.

Tags only enter the CUR after they are activated as cost allocation tags in the payer account, and activation is not retroactive: history before activation has no tag values. The earlier tags are activated, the longer the attributable history. AWS does offer a backfill for previously existing tags, but there is a window on how far back it reaches, so activation remains an act-now decision.

Untaggable and untagged spend is structural, not a discipline failure to be driven to zero. Data transfer, some request charges, and shared platform services resist per-team tagging. Mature allocation models attribute what tags can carry, allocate the shared remainder by an agreed formula, and publish the split, rather than pretending a 100 percent tagged bill is achievable.

Account boundaries remain the strongest allocation primitive. Spend in an account belongs to that account with no tagging effort at all, which is why organizations that shape their account structure around ownership get attribution nearly for free, and organizations with one big shared account fight the tagging war forever.

The line items that break naive reports

Beyond usage and commitments, a handful of line item families exist only at certain scopes or follow their own rules, and each one has broken somebody's dashboard.

Support charges are computed from the organization's consolidated spend and land at the payer account. An account-level report will never see them; an organization-level report that forgets them will never match the invoice. Business support at 3 to 10 percent of the bill is large enough to be the entire gap in a reconciliation.
Tax appears as its own line item type, applied at invoice time. Most engineering-facing reports exclude it, most finance-facing ones include it, and the two teams routinely compare those numbers without realizing they differ by design.
Marketplace charges flow through the AWS bill but are purchases from third-party vendors, with their own line item namespace. Include them in cloud spend or track them as software procurement; either is fine, but the choice changes the total by whatever your marketplace footprint is.
Savings Plan and RI fees on unused commitment are the quiet ones. If usage drops below the committed level, the unused portion still bills, attached to no resource. Per-resource allocation schemes that only sum resource-attached costs silently drop this money, understating total spend by exactly the amount of commitment going to waste, which is the number you most want to see.
Spot instances bill at the fluctuating spot market rate, carry no commitment interaction (Savings Plans do not discount spot), and record their prices in the same columns as everything else. Trend analysis that mixes a growing spot share with on-demand rates will read architectural change as price change.

None of these require special handling beyond awareness: a filter set that names them explicitly, in or out, keeps every downstream number defensible.

Why your tools disagree: a reconciliation checklist

When two numbers for the same month diverge, walk this list in order; the culprit is almost always in the first three.

  1. Rate type. Unblended versus amortized explains most gaps, especially in months containing commitment purchases. Check what each tool defaults to.
  2. Credits and refunds. Gross versus net, and whether a refund issued this month belongs to this month's story.
  3. Scope. Payer-level views include every linked account; account-level views do not. Support charges and some fees exist only at the payer.
  4. Timing. The CUR is revised continuously for up to several days after month close, and Cost Explorer refreshes on its own cadence. Numbers pulled on the 1st and the 5th legitimately differ.
  5. Filters. Tax, support, marketplace charges, and reservation fees are included or excluded differently across tools. Two "compute spend" figures rarely define compute identically.

A team that documents its answers to these five, one rate type, one credit treatment, one scope, one snapshot day, one filter set, and applies them everywhere, eliminates nearly all recurring reconciliation work. The disagreements that remain are real, and real disagreements are worth investigating.

The foundation pays for itself

None of this reduces the bill by a dollar on its own. What it does is make every downstream decision trustworthy: a rightsizing win measured in amortized cost survives finance review; a commitment sized against hourly usage holds up in month eighteen; a showback report built on documented conventions ends arguments instead of starting them. The optimizations are covered elsewhere in our research; this is the layer that makes their numbers mean something.

For the working definitions behind the terms used here, our glossary covers the vocabulary piece by piece, and the rest of our billing fundamentals research goes deeper on the CUR itself.

Put the numbers in front of your team.