The activation trap: tagging the resource isn't enough
On AWS, a user-defined cost allocation tag has to be separately activated in the Billing and Cost Management console. Only then does it appear in Cost Explorer or a Cost and Usage Report. Tagging the resource itself doesn't do it. Activation used to be strictly forward-looking with no way back. AWS now lets an account request a backfill of up to twelve months, but only for the stretch where the resource was already, physically, tagged. A tag activated today still can't retroactively create history for a resource that was untagged last year.
That makes activating every tag key you plan to ever use a same-week task, not a someday task. Waiting does more than delay you. It leaves a hole in the historical record. A backfill request can't fill that hole unless the tag was already there. Other providers carry their own version of the same trap. Google Cloud's labels have no built-in mechanism for a project's labels to propagate down to the resources inside it. Azure tags don't inherit from a resource group either, unless you deliberately attach the built-in "Inherit a tag from the resource group" policy. In both cases, a tag scoped one level up does nothing for the resource underneath it until something explicit copies it down.
Coverage → showback → chargeback: what each stage needs
The four bands above aren't arbitrary cutoffs; they map to what a number is safe to do. Below 50, the bill can't support any team-level statement at all. Between 50 and 80, it's solid enough to point a team at its rough number and prioritize from there. It's not solid enough to put in front of anyone as final. Between 80 and 95, showback holds up, and the number is close enough to trust for visibility and behavior change.
Chargeback needs the top band, and that's not caution for its own sake. Any team billed off a number built on a meaningful share of unattributed or misattributed spend has a legitimate argument that the bill is wrong. A chargeback program that loses that argument once loses the trust it needs to run at all. Reaching for chargeback before the coverage supports it turns a FinOps process into a dispute process.
Showback vs. chargeback, defined →
Enforcement that doesn't slow engineering down
The fix that holds is layered, not a single gate. It combines two controls. Tag defaults in infrastructure-as-code make a resource start tagged, not get tagged later. A narrow IAM condition blocks creation when a required tag is missing. A recurring drift sweep against the normalized cost view catches whatever still slips through both of those.
What deliberately isn't on that list is blocking every deploy on a tag-lint failure. A hard gate on every commit turns tagging into an engineering-velocity argument instead of a FinOps one. It's also the kind of control that gets quietly bypassed the first time it blocks an incident fix. A weekly sweep that flags drift and files a ticket keeps the same discipline without ever being the reason a deploy didn't ship.
Track this as a checklist item →
Where CostMon fits, and where it can't help
CostMon reads the tags that already exist across every connected provider into one normalized daily view. A dollar tagged checkout on AWS and a dollar tagged checkout on another provider sit in the same view. You can sum them together. The Showback and Allocation pages show unallocated spend as its own number, so it does not hide in an "Other" bucket.
CostMon adds no tags to your resources. It reads the provider's billing export as tagged, or not, at the source. The schema, the Terraform defaults, and the IAM condition below are still yours to apply. CostMon allocation rules can assign spend to a team. A rule matches on source, service, connector, or tag. AI API spend has no resource to tag, so a rule on its connector or service does the job a tag would do. Spend that matches no rule stays visible as unallocated.
See how CostMon normalizes every connector →