Cost per Customer for Multi-Tenant SaaS

🏢 Enterprise · ☁️ MSP

  1. 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.


  1. 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.


  1. Dataset Needed

Each row of your telemetry source should tie a customer to a usage measure at a point in time. Typical fields:

fielsTypeExamplePurpose
timestampDimension2026-05-27T15:04:05ZAligns usage with the billing period (daily granularity recommended)
payer_account_idDimension123456789012Ties usage to the correct cloud account
linked_account_idDimension234567890123Identifies the linked/member account, if usage spans a multi-account org
service_nameDimensionAmazon RDSOptional - lets you allocate per service instead of a whole account
customer_id / customer_nameDimensionCustomer IDThe identifier the cost will be broken out by
usage_measure (e.g. throughput_mbps, api_requests, active_users)Measure4568The 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.


  1. KPIs to Build
KPIFormulaWhat it represents
Cost per Active UserAmortized Cost ÷ active_usersWhat 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.


  1. Business Mapping to Create
FieldValuePurpose
TypeTelemetry-Based Group By-
Rule → ConditionService Is Amazon EC2, Amazon RDS, Amazon S3The cost slice to allocate
PipelineCustomer StatsWhere the usage data lives
Custom Dimension (Group By)customer_idThe field the cost will be broken out by
Allocation Metricthroughput_mbps (or api_requests)The measure that determines each customer's share
Time GranularityDailyMatches the billing period granularity
Include Unmatched CostsOnCosts with no matching usage go to a "Not Allocated" bucket instead of being dropped
Mapping NameCost per CustomerBecomes 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.


  1. How to Display It in the UI

Build these as saved views in Cost & Usage Explorer, then pin them to a dashboard:

ViewGroup By / MeasureWhat it shows
Cost per Customer - TrendGroup By → Business Mapping → Cost per Customer; chart over timeStacked/line chart of cost per customer over the last 30/90 days
Top Customers by CostSame mapping, sorted descending, table viewRanks customers by allocated cost - flags your most expensive customers to serve
Cost per Active User (KPI)Measure picker → Unit Economics KPIs → Cost per Active UserTracks unit cost trend independent of total customer count - rising cost/user signals inefficiency even if total spend looks flat
Not Allocated CostFilter the mapping's "Not Allocated" bucketData-quality check — flags gaps in telemetry coverage before they distort reporting
Customer Drill-DownAny single customer → Next Drill by Service/RegionAd 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.