Allocating Shared and Unknown Spend
Some cloud costs cannot be organized using metadata alone. A shared database serves multiple applications, but the billing data only shows a single line item. Other costs have no tags or account attributes at all, leaving them entirely unallocated. CloudZero handles both cases the same way: Allocation Dimensions split these costs across teams, products, customers, or any other grouping that fits your business.
This guide covers how to identify shared or unallocated costs, choose an allocation method, and combine the result into a single Dimension.
What you need
A Dimension where the costs you want to split are visible. This can be:
- A prebuilt Cloud Provider Dimension (such as Account, Service, or Region)
- A custom Grouping Dimension you built in Dimension Studio or CostFormation
Step 1: Identify what to split
Before creating an Allocation Dimension, identify the costs you want to split. You can allocate:
- Unallocated spend: Costs that do not match any rule in an existing Dimension, appearing under Not In Dimension. For example, if your Team Dimension leaves 30% of spend unallocated, you can split that 30% proportionally across the teams that do have spend.
- Identified elements: Costs already grouped into a named Dimension element. For example, a
Shared Databaseelement in a Grouping Dimension that isolates your shared database costs by service or account, or aPre-Prodelement that you want to redistribute across development, QA, and staging.
If your Dimension has a Default Value, costs that do not match any rule are labeled with that value (such as
OtherorNot Allocated) instead of appearing under Not In Dimension. CloudZero treats these as identified elements. When setting up your allocation in Dimension Studio or CostFormation, target Default Value costs by matching the element name. Target Not In Dimension costs as unallocated spend.
Step 2: Choose an allocation method
CloudZero supports two allocation methods. Both work in Dimension Studio and CostFormation YAML.
| Method | How it works | When to use |
|---|---|---|
| Allocate By Rules | Splits costs evenly or proportionally using spend data already in CloudZero. No additional data required. | You want to spread shared costs evenly across groups, or use known spend patterns from related services to distribute costs that cannot be directly attributed. |
| Allocate By Streams | Splits costs proportionally using usage data you send to CloudZero from observability, security, marketing, or other sources. | You have usage metrics (such as API calls, query counts, storage per customer, or other consumption data) and want allocation based on actual usage. |
Option A: Allocate By Rules
Use Allocate By Rules when you want to use known spend that exists in CloudZero already to allocate the shared or unknown spend. This can be done evenly or proportionally:
- Even splits costs equally across all elements regardless of usage. For example, there's a $10,000 database that's shared across the Mobile, Web, and Platform teams. CloudZero splits the cost evenly at $3,333.33 to each team.
- Proportional splits costs based on each group's share of existing spend. For example, a serverless function that calls the shared $10,000 database is already broken down by metadata: Mobile at $1,200, Web at $600, and Platform at $200. CloudZero uses those spend amounts to calculate proportions automatically (60%, 30%, 10%) and splits the $10,000 database cost based on those calculated proportions: $6,000 to Mobile, $3,000 to Web, and $1,000 to Platform. Proportions recalculate for each time period as new data arrives.
For allocations that need different split logic per element, see ForEachElementOf.
Option B: Allocate By Streams
See Telemetry Streams to learn how to send non-cost data (such as observability metrics, security data, marketing data, or other usage data) into CloudZero.
Once your telemetry data is in CloudZero, the usage patterns in that data determine how costs are split proportionally. As new telemetry data arrives, the allocation updates automatically.
Example: You have $10,000 in shared database compute costs. Your observability platform shows 100,000 database queries total for January 25, where Mobile made 60,000, Web made 30,000, and Platform made 10,000. CloudZero calculates the proportions for that day (60%, 30%, 10%) and splits the $10,000 as $6,000 to Mobile, $3,000 to Web, and $1,000 to Platform.
How telemetry data maps to allocation
Every Allocation Stream has four components:
| Component | What it does |
|---|---|
| Timestamp | When the usage occurred |
| Element name | The entity each row allocates to (such as a team, product, or customer). CloudZero creates these as elements in the Allocation Dimension. |
| Allocation value | The usage number CloudZero uses to calculate proportions |
| Filter columns (optional) | Scope which spend the stream allocates. Without filters, the stream applies proportions to 100% of your organization's spend. Add filters to target specific services, usage types, or other categories. |
Example: A shared RDS database serves three teams. Your observability platform tracks compute and storage usage per team per day:
| Date | Team | Usage | Service | Usage Type |
|---|---|---|---|---|
| 2025-01-25 | Mobile | 60,000 | RDS | Compute |
| 2025-01-25 | Web | 30,000 | RDS | Compute |
| 2025-01-25 | Platform | 10,000 | RDS | Compute |
| 2025-01-25 | Mobile | 500 | RDS | Storage |
| 2025-01-25 | Web | 1,200 | RDS | Storage |
| 2025-01-25 | Platform | 800 | RDS | Storage |
Team is the element name, Usage is the allocation value, and Service and Usage Type are filter columns that scope the allocation to RDS compute and RDS storage independently.
Send your telemetry data as an Allocation Stream via CSV upload or the API.
If your Allocation Dimension uses multiple streams, the first stream listed takes precedence.
Rate-based allocation
Allocate By Streams also supports a fixed rate per unit of usage, where each element's cost is their usage multiplied by a rate you set. This is useful for internal chargeback with agreed-upon transfer prices. The remaining spend goes to a default element so the total always reconciles with the actual bill. For syntax details, see CostFormation Reference.
Step 3: Set it up
There are multiple ways to design your allocation, but this is the approach we recommend:
-
Create an Allocation Dimension that splits the shared or unknown costs you identified in Step 1, using the method you chose in Step 2. Follow the guide for Dimension Studio or CostFormation YAML. Most organizations hide this Dimension (
hidden: truein Dimension Studio or CostFormation) because it serves as an input to the combined view, not something users interact with directly. -
Create a combined Grouping Dimension using a GroupBy rule that references both your Allocation Dimension and your Grouping Dimension. List the Allocation Dimension first, then the Grouping Dimension. The Allocation Dimension splits shared costs and redistributes them. The Grouping Dimension then organizes the remaining spend. Because the allocation already redistributed the shared costs, the shared element disappears from the final result.
Example: Your Team Dimension has Mobile at $8,000, Web at $5,000, Platform at $2,000, and Shared at $10,000. Your Allocation Dimension splits the $10,000 Shared element as $6,000 to Mobile, $3,000 to Web, and $1,000 to Platform. With the Allocation Dimension listed first, the combined result is Mobile at $14,000, Web at $8,000, and Platform at $3,000. Shared is gone because the allocation already redistributed it.
A typical setup uses three Dimensions. Using the Team example:
| Dimension | Type | What it does | Hidden |
|---|---|---|---|
| Team | Grouping | Organizes known spend using metadata rules, and in this example puts unknown spend into a Shared element | No |
| TeamAllocation | Allocation | Splits Team's Shared element using proportional, even, or stream-based allocation | Yes |
| Team (with Shared Allocation) | Grouping | Combines TeamAllocation and Team so that all Shared from Team is accurately distributed | No |
Filtering noise and small elements
If an Allocation Dimension produces many elements where most account for very little spend, you can set a cutoff threshold to filter out the noise. Elements below the threshold are grouped into a single named element, or, when no name is set, their spend is spread across the elements that remain. This is available for proportional and standard telemetry allocations. For configuration details, see CostFormation Reference.
Keep allocations efficient
Most allocation setups process quickly as they are. As you add allocations, especially ones that build on each other, a few habits keep processing quick and your results easy to read.
Each Allocation Dimension turns a shared cost into one row per element. The way your allocations fit together affects how much work each publish takes, and how much CloudZero works through when you explore several Dimensions together.

Split each shared cost once
An Allocation Dimension can split the output of another Allocation Dimension. The second multiplies the rows the first produced, and processing time grows with the longest chain of Dimensions that build on one another. When you can, point each allocation at the original shared spend, such as a hidden Grouping Dimension that isolates it. For a ready-made example, see Split several shared costs from one source. When a later step needs an earlier allocation's result, keep the chain short.
A Grouping Dimension that combines an allocation with your other costs, as in Step 3, keeps one row per line and adds no extra rows.
To spot it: an allocation's SpendToAllocate source or conditions name another Allocation Dimension, directly or through a Grouping Dimension that reads one.
Give each shared cost one allocation
When two Allocation Dimensions split the same costs, CloudZero works through every combination of their elements. Isolate the shared spend in one hidden Grouping Dimension, with one element per kind of shared cost, and give each allocation its own element. If you keep two allocations of the same spend on purpose, such as one for showback and one for chargeback, that's a reasonable choice.
To spot it: two allocations whose SpendToAllocate conditions match the same service, account, or tag value.
Keep test copies out of processing
A copy of an allocation saved in another namespace is processed like the original, so the two split the same costs twice. When you finish testing, set Disable: true on the copy or delete it. Hide: true only removes a Dimension from view, and CloudZero still processes it.
Filter small elements
An allocation with a long tail of small elements adds rows that carry little spend. A cutoff keeps the elements that carry most of the spend and combines or spreads the rest, so choose a threshold that still shows the detail you report on. See Filtering noise and small elements.
Publish related changes together
Each publish reprocesses the Dimensions you changed, and any Dimensions that build on them, across your full cost history. Save related edits and publish them together.
Have questions or feedback? Reach out to your account manager.
Updated 1 day ago

