Cost per Customer for Multi-Tenant SaaS
🏢 Enterprise · ☁️ MSP
- The Challenge
You run multi-tenant infrastructure - shared databases, load balancers, Kubernetes clusters - and need to know what it actually costs to serve each individual customer. Customer identity never appears on a cloud bill, and shared resources can't be split by tags alone without resorting to arbitrary, inaccurate percentages.
- The Solution
Bring in the customer usage data you already collect (e.g. from your billing system, app database, or data warehouse) as a telemetry pipeline in Umbrella. Use that usage as the allocation key in a Business Mapping, so shared cloud cost is split across customers by real, weighted consumption - not a flat percentage.
- Dataset Needed
Each row of your telemetry source should tie a customer to a usage measure at a point in time. Typical fields:
| fiels | Type | Example | Purpose |
|---|---|---|---|
timestamp | Dimension | 2026-05-27T15:04:05Z | Aligns usage with the billing period (daily granularity recommended) |
payer_account_id | Dimension | 123456789012 | Ties usage to the correct cloud account |
linked_account_id | Dimension | 234567890123 | Identifies the linked/member account, if usage spans a multi-account org |
service_name | Dimension | Amazon RDS | Optional - lets you allocate per service instead of a whole account |
customer_id / customer_name | Dimension | Customer ID | The identifier the cost will be broken out by |
usage_measure (e.g. throughput_mbps, api_requests, active_users) | Measure | 4568 | The allocation key - determines each customer's proportional share |
📘 Note on cost
You don't need to bring in cost as part of this dataset — Umbrella already has cost data from your connected billing export. The telemetry pipeline only needs to supply the usage side (customer identifier + usage measure); Umbrella joins it with existing cost data during allocation. At minimum, you need a timestamp, a customer identifier, and one usage measure — the account-level fields above are optional enrichments.
- KPIs to Build
| KPI | Formula | What it represents |
|---|---|---|
| Cost per Active User | Amortized Cost ÷ active_users | What it costs, on average, to serve one active user - useful for tracking margin per seat |
📘 Note
"Cost per Customer" itself is not a KPI — it's the output of the Business Mapping described in section 5. The KPIs above are complementary metrics you can chart alongside it.
Build these in KPI Builder (Unit Economics → KPI Builder → + Add New KPI), selecting your pipeline's measures alongside cost measures, and setting Group By to customer_id so each KPI can be viewed per customer.
- Business Mapping to Create
| Field | Value | Purpose |
|---|---|---|
| Type | Telemetry-Based Group By | - |
| Rule → Condition | Service Is Amazon EC2, Amazon RDS, Amazon S3 | The cost slice to allocate |
| Pipeline | Customer Stats | Where the usage data lives |
| Custom Dimension (Group By) | customer_id | The field the cost will be broken out by |
| Allocation Metric | throughput_mbps (or api_requests) | The measure that determines each customer's share |
| Time Granularity | Daily | Matches the billing period granularity |
| Include Unmatched Costs | On | Costs with no matching usage go to a "Not Allocated" bucket instead of being dropped |
| Mapping Name | Cost per Customer | Becomes the group-by option in Cost & Usage Explorer |
📘 How allocation works: Umbrella distributes cost by weighted average against the allocation metric. A customer responsible for 40% of usage on a given day is allocated 40% of that day's filtered cost. This cannot be manually overridden.
- How to Display It in the UI
Build these as saved views in Cost & Usage Explorer, then pin them to a dashboard:
| View | Group By / Measure | What it shows |
|---|---|---|
| Cost per Customer - Trend | Group By → Business Mapping → Cost per Customer; chart over time | Stacked/line chart of cost per customer over the last 30/90 days |
| Top Customers by Cost | Same mapping, sorted descending, table view | Ranks customers by allocated cost - flags your most expensive customers to serve |
| Cost per Active User (KPI) | Measure picker → Unit Economics KPIs → Cost per Active User | Tracks unit cost trend independent of total customer count - rising cost/user signals inefficiency even if total spend looks flat |
| Not Allocated Cost | Filter the mapping's "Not Allocated" bucket | Data-quality check — flags gaps in telemetry coverage before they distort reporting |
| Customer Drill-Down | Any single customer → Next Drill by Service/Region | Ad hoc investigation — e.g. "why did this customer's cost spike in March?" Note: For Business Mapping, you can define the next drill on the Business Mapping page. |
