TL;DR: Tags answer "what does this resource belong to?"; Cost Categories answer "what does my org want to see?" It's a free rules engine — think SQL CASE WHEN for billing — that maps raw spend into a custom dimension (like BusinessUnit) by matching on tags, services, accounts, or regions, and re-bundles messy tag values into clean stakeholder buckets. You change no tags and move no resources; the new dimension just shows up in Cost Explorer, Budgets, CUR, and QuickSight. Its killer feature: proportionally splitting shared costs across consumers, which is what makes real chargeback possible.
The numbers
- Free — no per-category charge.
- Four rule sources: tag key/value (most common), service, linked account, and region/usage-type/charge-type — combined with AND/OR; first matching rule wins, unmatched falls to your default (
Unallocated). - Three split methods: proportional (by consumers' relative cost of another dimension), fixed (e.g. 50/30/20), or even. Pick the defensible one, not the most precise.
- Worked example — $13,500/mo of shared infra (central RDS $8k + NAT $3k + monitoring $2.5k) split proportionally by each team's compute spend gives every team a true cost-of-ownership number and finally puts data behind "should we right-size the shared RDS?"
- Field examples: 14 messy
Teamvalues collapsed into a 3-row CFO report in 45 minutes, untouched 18 months; a media company's $25k/mo analytics platform allocated by per-team S3 reads made 2 of 6 teams optimize hard once cost was visible.
Do this
- Start with one category answering one stakeholder question — usually
BusinessUnitorTeam; prove it out a quarter before adding a second. - Write 3–8 rules covering your top ~80% of spend, and always define an
Unallocated/Shareddefault so you never end up with null. - Use Inherited Value rules (
BusinessUnit = tag:Project) instead of one rule per value — new projects flow in automatically, a big maintenance win. - Add split-charge rules for shared infrastructure — the one thing nothing else does cleanly; proportional-by-usage is the usual choice.
- Publish the rules to anyone whose cost they appear in, wait ~24 hours for backfill, and wire the dimension into a Cost Explorer report + a budget to prove it end-to-end.
Gotchas
- It's reporting, not enforcement — categories don't block anything (use SCPs for that) and operate on cost line items, not per-resource.
- ~24-hour update cadence — no real-time recalculation; same billing-pipeline lag as everything else.
- A large
Unallocatedbucket breeds fairness complaints — tighten rules until the top spend is covered. - Tag-based rules need activated cost allocation tags, and newly-defined categories have no baseline for ~14 days (matters for anomaly monitors on them).
- Don't build 5 interlocking categories on day one — start with one; add a second (
EnvironmentorWorkloadType) only when it answers a distinct question.
Skip this if
- Each team just needs to see their own real-rate spend and you can group by a single existing tag — plain Cost Allocation Tags + Cost Explorer may be enough (tags are the prerequisite either way).
- You need audit-grade financial allocation joined with your own data — Cost and Usage Reports + Athena/Snowflake is the heavier tool. Downstream, categories feed AWS Budgets and AWS Cost Explorer so every report inherits the dimension.