Showback (cost attribution)
Attribute spend to teams and to cloud tags (including Smart Tag values) with trend charts and resource-level drilldown.
Showback answers “whose cost is this?”; by team, by tag, or both. Every report on this page reads from a single attribution table that’s refreshed nightly from cost records and re-refreshed whenever billing sync runs. So team totals and tag totals reconcile against the Reports trend chart down to the dollar.
Two attribution dimensions
You can attribute the same cost record by both team and tag simultaneously. They’re independent.
| Dimension | What it does | Splitting |
|---|---|---|
| Team | Cost flows to the team(s) that own the resource | Cost is split equally across owning teams when a resource has more than one. Unattributed resources are tracked separately. |
| Tag | Cost flows to each tag key-value pair on the resource | Each tag key-value pair gets the full resource cost: no splitting. A resource tagged env=prod and team=alpha contributes its full cost to both. |
The difference matters: if you sum tag totals across all keys, you’ll get more than your total spend (a single resource is counted under multiple tags). Sum team totals and you’ll match the cost trend.
Team attribution
The Teams tab on the Reports page lists every team with its cost for the selected period, sorted by spend.
Click a team to drill in:
- By provider: AWS / GCP / Azure split
- By resource type: top resource types in the team’s spend
- Trend chart: cost over time for the team, with the same granularity controls as the org-wide trend
- Resources: paginated list of resources attributed to this team, with shared-team indicators
How teams get attributed to resources
Team ownership is resolved per resource via the org’s team / resource bindings. Resources owned by more than one team have their daily cost split equally across the owning teams (shareCount driving the divisor in cost_allocation_daily). Resources with no owning team are tracked separately and surface under Unattributed teams on the Sankey overlay and in the team list.
Tag attribution
The Tags tab is the same shape as Teams but keyed on tag key-value pairs. Each row is a flattened key:value; env:prod, team:alpha, cost-center:engineering.
What gets included

Showback → Teams; spend attributed across owning teams with full-coverage tracking and per-team trends.
Three sources of tags feed the attribution:
| Source | Where it comes from |
|---|---|
| AWS tags | Native EC2/RDS/S3/etc. tags |
| GCP labels | Native Compute Engine / GKE labels |
| Azure tags | Native VM / Storage / SQL tags |
| Smart Tags | ZopNight’s policy-derived virtual tags you’ve explicitly accepted. Pending (not-yet-accepted) values are not included. Smart Tags live inside ZopNight and are never written back to your cloud. |
The dimension_source field on each row tracks whether the tag came from cloud or auto (a Smart Tag). You can filter the Tags trend chart by source if you want to see one or the other. See Smart Tags.
Drilling in
Click any tag row to expand:
- All values for that tag key (e.g. expand
env:to seeenv:prod,env:staging,env:dev) - Provider split for that key-value
- Resource-type split for that key-value
- Trend chart for the key-value with provider / type filter dropdowns
Tag trend (batched)
If you want to compare multiple tag values on the same chart; e.g. env:prod vs env:staging vs env:dev; the trend endpoint accepts multiple tagKey / tagValue pairs in a single call. The chart renders one line per pair.
Tag coverage widget
The Dashboard has a Tag Coverage widget; a donut chart showing tagged vs untagged resources as a percentage of cost. A high untagged percentage means your attribution is missing context. Two ways to improve it:
- Tag the resources at the cloud level (Terraform, AWS Resource Tagger, etc.)
- Define a Smart Tag policy in Settings → Policy → Tagging to derive a consistent virtual tag for untagged resources, then accept the derived values so they count toward attribution; see Smart Tags
Unit economics
For costs in business terms (cost per active user, cost per order, cost per 1000 API requests) define a unit metric and push (or let ZopNight pull) the denominator values.
Define the unit metric
Reports → Unit economics → New metric. Name (e.g. “Monthly active users”), label, display scale (1 / 100 / 1000), and the source;
push,csv, orpull.Pick the ingest path
- Push API:
POST /orgs/{orgID}/unit-metric-values/{id}; your pipeline POSTs[{date, value}]daily - CSV upload: drag a CSV onto the metric (capped at 1 MB / 5,000 rows)
- Pull: register an HTTPS endpoint + auth + interval. ZopNight fetches it daily at 04:15 UTC, with SSRF guards (no private IPs, no localhost, no link-local, 30s timeout)
- Push API:
View cost per unit on the Reports trend
The trend chart gains a secondary axis showing infra spend per unit (cost ÷ denominator) for each bucket. Zero-denominator buckets are skipped. A server-side average-of-last-N forecast appears when there are enough data points.
Curated catalogue
Five common metric types are pre-defined: MAU, DAU, API requests, transactions, signups. Add any of these in one click and configure the ingest path after.
Test fetch (for pull metrics)
The “Test fetch” button runs the full pull code path synchronously before the cron schedule starts. Use this to verify your endpoint, auth header, and JSON shape before scheduling the cron; saves a 24-hour feedback loop.
Dimensioned unit economics
If the cost numerator is dimensioned (team or tag), the denominator falls back to the org-wide metric series when no dimensioned values exist. So you can ask “cost per MAU for team alpha” without having to push per-team MAU values; though pushing them gets you a more accurate denominator.
Endpoint paths
The showback endpoints moved from /showback/* to /reports/* in an earlier release. If you have integrations or saved URLs from before that change, update them:
/reports/teams,/reports/teams/:teamId,/reports/teams/:teamId/resources,/reports/teams/trends/reports/tags,/reports/tags/:tagKey,/reports/tags/:tagKey/values/:tagValue/resources,/reports/tags/trends