Executive summary
A customer profitability analysis measures what each customer contributes to profit after everything that customer causes: discounts and rebates, product cost, freight, support, special handling, returns, and the cost of carrying their receivable. It is different from the margin report most companies run, which stops at gross margin by product and treats every customer buying that product as equally profitable.
Cost to serve can vary more between customers than product cost does. Two customers can buy the same products at the same list price. One orders full pallets, pays on time, and never calls. The other orders small lots, expedites, asks for custom paperwork, and pays late. On a gross margin report they look identical. On a customer profitability report one of them may be losing money.
This guide builds the analysis step by step: net revenue, gross margin, cost-to-serve with activity drivers, the cumulative profit curve known as the whale curve, and the decisions that follow. Those decisions, such as repricing, changing service terms, or exiting, are only as good as the cost data underneath, so the guide spends time on which costs are actually avoidable. It pairs with Price Waterfall Analysis, which covers leakage between list and pocket price, and with B2B Customer Segmentation for Pricing and Sales, which uses the result to set treatment by segment.
When to use this
Run the analysis when:
- Revenue is growing and operating profit is not.
- Sales, customer service, or logistics complain about a handful of demanding customers.
- A price increase is planned and you need to decide where it should be heaviest. See Price Increase Playbook.
- You are deciding which accounts get a dedicated account manager or a better payment term.
It is a poor fit if you cannot link invoices and costs to a customer identifier. Fix the data first, because everything below depends on it.
Diagnostic questions
Answer from the ERP, CRM, support system, and logistics records.
- Can every invoice and credit memo be tied to a single customer or a defined parent group, and is the hierarchy clean?
- What discounts, rebates, and allowances are given at the customer level, and are they recorded by customer?
- Is product cost current, and does it differ by plant, supplier, or channel in a way that affects customer margin?
- How are freight, packaging, and handling costs charged: actual by shipment, or averaged across customers?
- How much support, customer service, and account management time is spent by customer, and is any of it tracked?
- Which customers drive rush orders, custom documentation, special packaging, or small-lot orders?
- How much goes to returns, warranty claims, and credits by customer?
- What are the payment terms and actual days-to-pay by customer, and what is the cost of carrying that receivable?
- Which overhead costs are fixed and would stay if the customer left, and which would go?
- How concentrated is revenue and profit: what share comes from the top 10 customers?
- Do contracts with key customers contain commitments (service levels, rebates, most-favored terms) that affect cost to serve, and has counsel reviewed them?
Questions 4, 5, and 9 decide how good the analysis is. If freight and support are averaged, the analysis cannot find the customers it is meant to find.
Framework: five layers from list price to customer profit
Build the view in layers, so each step answers one question and each layer can be checked against the ledger.
| Layer |
Calculation |
Question answered |
| 1. List revenue |
Quantity × list price |
What would we have earned at list? |
| 2. Net revenue |
List revenue − on-invoice discounts − rebates, allowances, and credits |
What did the customer actually pay for the product? |
| 3. Gross profit |
Net revenue − product cost |
What did the product earn? |
| 4. Cost to serve |
Freight, handling, support, account management, returns, special requests, financing cost of receivables |
What did serving this customer cost? |
| 5. Customer operating profit |
Gross profit − cost to serve |
What did the customer contribute? |
Layers 1 to 3 are the revenue-side waterfall described in Price Waterfall Analysis. Layers 4 and 5 are what this analysis adds. Corporate overhead (finance, HR, IT, executive) is not allocated to customers in the base view. Allocating it by revenue only makes large customers look worse and tells you nothing. Show it as a single unallocated line below the customer view, so the total reconciles to the P&L.
Allocate cost with drivers, not percent of revenue
The allocation rule decides the answer. Use a driver for each cost pool that reflects what actually causes the cost:
| Cost pool |
Better driver |
Poor driver |
| Freight and delivery |
Actual shipment cost, or weight and distance by shipment |
Percent of revenue |
| Order handling and warehouse |
Order lines picked, orders processed |
Percent of revenue |
| Customer service and support |
Tickets or contact hours by customer |
Percent of revenue |
| Account management |
Hours or named-account assignment |
Even split across customers |
| Returns and credits |
Actual credits by customer |
Average rate |
| Special requests (rush, custom packaging, documentation) |
Count of occurrences times cost per occurrence |
Ignored |
| Receivable carrying cost |
Average balance × your cost of capital × days outstanding |
Ignored |
Where you have no tracking, estimate with a driver rate: total cost of the pool divided by total driver volume, then multiply by each customer's driver volume. For example, if the support team costs $1.2M and handled 24,000 tickets, the rate is $50 per ticket, and a customer who raised 400 tickets carries $20,000. State the rate and its source in the analysis so it can be challenged.
Avoidable versus fixed cost
Before acting on the result, classify each cost pool by how it behaves if a customer is repriced, reduced, or lost:
- Avoidable: freight, handling, returns, and credits move with the customer. They disappear or fall.
- Semi-fixed: support and account management only fall if you change headcount or scope, which takes time and a decision.
- Fixed: facilities, systems, and management. These stay.
An account that shows a loss after allocating semi-fixed costs may still contribute positively to covering fixed costs. The worked example shows the effect.
Step-by-step process
Weeks 1 to 2: Scope and data
- Define the customer unit. Parent groups versus ship-to locations, and rules for merging. Owner: Sales Ops with Finance. Output: customer hierarchy file.
- Pull 12 months of invoices, credit memos, and rebates by customer and product. Owner: Finance. Output: net revenue by customer.
- Attach product cost at current standard or actual. Owner: FP&A. Output: gross profit by customer. Note where the cost is out of date, as described in the cost-side half of the price waterfall.
- Inventory cost-to-serve pools with total cost, driver, and driver volume. Owner: FP&A with Operations, Customer Service, and Logistics. Output: cost pool table.
Weeks 3 to 4: Build
- Allocate each pool to customers by its driver. Owner: FP&A. Output: customer-level cost to serve.
- Compute customer operating profit and margin. Owner: FP&A. Output: customer P&L table.
- Reconcile to the P&L. Sum of customer net revenue, gross profit, and cost to serve plus the unallocated line must equal the ledger. Owner: Controller. Output: reconciliation sign-off.
- Draw the whale curve: rank customers by operating profit, plot cumulative profit as a share of total. Owner: FP&A. Output: chart and table.
Weeks 5 to 6: Interpret
- Review with Sales, Operations, and Customer Service. Where numbers surprise them, check the driver and data before accepting the result. Owner: CFO. Output: validated analysis with disputed items resolved.
- Classify each unprofitable or marginal account by cause: low price, high discounts and rebates, high cost to serve, or low volume. Owner: Commercial lead. Output: cause per account.
- Classify costs as avoidable or fixed for each action under consideration. Owner: FP&A. Output: avoidable-cost estimate per action.
Weeks 7 to 12: Act
- Choose the action per account: reprice, change terms (minimum order, freight, payment), change service level, move to a lower-cost channel, or exit. Owner: Commercial lead and account owner. Output: account plan with an expected profit effect.
- Check contracts before acting. Price protection, service commitments, and termination rights govern what you can do. Involve counsel. Owner: Legal. Output: confirmed options per account.
- Execute through the price increase and discount governance processes. See Discount Approval Matrix and Governance. Owner: Account owners. Output: changes in effect.
- Refresh quarterly and feed results into segmentation, account planning, and the cadence in Key Account Management Cadence. Owner: FP&A. Output: quarterly customer profit report.
Templates
Customer profit table (copy into a spreadsheet)
| Customer |
List revenue |
Discounts and rebates |
Net revenue |
Product cost |
Gross profit |
GP % |
Freight |
Support |
Other cost to serve |
Operating profit |
Op % |
Rank by op profit |
Cost-to-serve pool table
| Pool |
Annual cost |
Driver |
Total driver volume |
Rate per driver unit |
Source |
Avoidable, semi-fixed, or fixed |
Account action plan
| Account |
Operating profit |
Main cause of low profit |
Action |
Contract constraint |
Expected profit change |
Avoidable cost assumed |
Owner |
Date |
Metrics and KPIs
| Metric |
Formula |
Data source |
| Net revenue per customer |
List revenue − discounts − rebates − credits |
Invoices and credit memos |
| Gross margin % |
(Net revenue − product cost) ÷ net revenue |
ERP |
| Cost-to-serve % |
Cost to serve ÷ net revenue |
Cost pool table |
| Customer operating margin % |
(Gross profit − cost to serve) ÷ net revenue |
Customer profit table |
| Number of accounts below zero |
Count with operating profit under zero |
Customer profit table |
| Peak of whale curve |
Maximum cumulative profit ÷ total profit |
Whale curve |
| Reconciliation difference |
Sum of customer view + unallocated − ledger |
Controller |
Targets by method. Set the operating margin target for a segment from your own best-performing accounts in that segment. Set a floor at zero operating profit after avoidable cost to serve, and give any account below it an action plan within a quarter.
Common mistakes
- Stopping at gross margin. It ranks customers by product mix, not by what they cost to serve.
- Allocating cost to serve as a percent of revenue. This moves cost to your largest customers and hides the small, demanding ones.
- Allocating all overhead to customers. Fixed corporate costs do not change when a customer leaves. Keep them unallocated.
- Acting on semi-fixed costs as if they were avoidable. Exiting an account saves only the costs that actually go away. See the worked example.
- Using a wrong customer unit. Treating each ship-to as a customer splits a profitable parent into pieces that look unprofitable.
- Using out-of-date product cost. A stale standard cost makes some customers look better than they are, as covered in Price Waterfall Analysis.
- Skipping reconciliation. If the customer view does not tie to the P&L, the numbers will not be trusted.
- Firing customers before trying price and terms. Many unprofitable accounts can be fixed with a price, minimum order, or freight change.
- One-time analysis. Costs and behavior change. Refresh quarterly.
Worked example
Illustrative. All numbers are made up to demonstrate the method. They are not benchmarks. Figures are in $ thousands for the trailing 12 months.
| Customer |
List revenue |
Discounts and rebates |
Net revenue |
Product cost |
Gross profit |
GP % |
Freight |
Support |
Other |
Cost to serve |
Operating profit |
Op % |
| C01 |
6,000 |
400 |
5,600 |
3,900 |
1,700 |
30.4% |
150 |
120 |
80 |
350 |
1,350 |
24.1% |
| C02 |
5,200 |
1,040 |
4,160 |
3,400 |
760 |
18.3% |
100 |
150 |
160 |
410 |
350 |
8.4% |
| C03 |
4,100 |
160 |
3,940 |
2,600 |
1,340 |
34.0% |
90 |
60 |
40 |
190 |
1,150 |
29.2% |
| C04 |
3,500 |
525 |
2,975 |
2,300 |
675 |
22.7% |
210 |
300 |
260 |
770 |
-95 |
-3.2% |
| C05 |
2,900 |
60 |
2,840 |
1,800 |
1,040 |
36.6% |
50 |
40 |
30 |
120 |
920 |
32.4% |
| C06 |
2,300 |
115 |
2,185 |
1,500 |
685 |
31.4% |
40 |
50 |
30 |
120 |
565 |
25.9% |
| C07 |
1,800 |
360 |
1,440 |
1,150 |
290 |
20.1% |
120 |
210 |
190 |
520 |
-230 |
-16.0% |
| C08 |
1,500 |
0 |
1,500 |
900 |
600 |
40.0% |
30 |
30 |
20 |
80 |
520 |
34.7% |
| C09 |
1,200 |
60 |
1,140 |
780 |
360 |
31.6% |
60 |
120 |
100 |
280 |
80 |
7.0% |
| C10 |
900 |
45 |
855 |
580 |
275 |
32.2% |
50 |
140 |
110 |
300 |
-25 |
-2.9% |
| Total |
29,400 |
2,765 |
26,635 |
18,910 |
7,725 |
29.0% |
|
|
|
3,140 |
4,585 |
17.2% |
Reconciliation: net revenue $26,635 minus product cost $18,910 equals gross profit $7,725, and $7,725 minus cost to serve $3,140 equals operating profit $4,585. Corporate overhead stays below this line, unallocated.
What the gross margin view says. Ranking by GP % puts C02 (18.3%), C07 (20.1%), and C04 (22.7%) at the bottom. C09 (31.6%) and C10 (32.2%) look healthy.
What the customer operating view says.
- C02 is the weakest on gross margin but is still profitable after cost to serve, at 8.4%. Its problem is discounts and rebates ($1,040 on $5,200 of list, 20%), so the fix is price and rebate structure.
- C09 and C10 look fine on gross margin and nearly vanish after cost to serve: C10 is at -$25 because support and other costs are 29% of its net revenue ($250 of $855).
- C04 costs 25.9% of net revenue to serve ($770 of $2,975). It is the fourth largest customer by list revenue and loses $95.
- C07 loses $230, or 16.0% of net revenue, because of a 20% discount-and-rebate load and cost to serve at 36.1% of net revenue.
The whale curve. Rank by operating profit and accumulate: C01 $1,350 (29.4% of total profit), C03 $2,500 (54.5%), C05 $3,420 (74.6%), C06 $3,985 (86.9%), C08 $4,505 (98.3%), C02 $4,855 (105.9%), C09 $4,935 (107.6%), C10 $4,910 (107.1%), C04 $4,815 (105.0%), C07 $4,585 (100.0%). The curve peaks at 107.6% of total profit, so the three loss-making accounts together subtract $350, which is 7.6% of total profit.
Break-even price moves, volume held. C10 needs +$25 on $855 of net revenue, 2.9%. C04 needs +$95 on $2,975, 3.2%. C07 needs +$230 on $1,440, 16.0%, which is a very different conversation. For C04 and C10, a price or minimum-order change is plausible. For C07, price alone may not be realistic, and cost-to-serve changes (shipping rules, support scope) should be explored first.
Why avoidable cost matters. Suppose you exit C07. You lose its gross profit of $290. But only some cost to serve disappears. If 70% of C07's $520 of cost to serve is avoidable (freight, handling, returns, and some support), you save $364. The effect on total profit is -$290 + $364 = +$74, not the +$230 the table suggests, because $156 of cost to serve stays and now has no customer to cover it. Exit is the weakest option here. The 3.2% and 2.9% price moves for C04 and C10 recover $95 + $25 = $120 with no loss of accounts, if volume holds.
AI prompt assistance
Provide your own data, and verify output against the ledger before acting on any account.
1. Build the customer profit table.
I will paste a CSV of 12 months of invoice lines with customer, parent customer, list price, invoice price, quantity, rebates and credits, and product cost. Compute net revenue, gross profit, and GP % by parent customer. List any invoice lines where the invoice price is above list or cost is missing.
Check: tie total net revenue to the P&L and recompute one customer by hand.
2. Allocate cost-to-serve pools.
Here are 6 cost pools with annual cost, a driver for each, and driver volume by customer. Compute the rate per driver unit and the allocation by customer. Show every step and give the total by pool, which must equal the pool cost.
Check: confirm pool totals equal ledger cost, and that drivers come from system records, not estimates by the model.
3. Identify drivers of low profit.
For each customer with operating margin below 10%, state the main contributor from the list: discount and rebate load, low gross margin on mix, freight, support, or other cost to serve, measured as percentage points of net revenue compared with the average for all customers.
Check: spot-check three accounts and review with the account owner before concluding anything.
Implementation guide
| Phase |
Weeks |
Owner |
Exit criteria |
| Scope and data |
1-2 |
Sales Ops and Finance |
Customer hierarchy, net revenue by customer, product cost, cost pool table |
| Build |
3-4 |
FP&A and Controller |
Allocation by driver, customer P&L, reconciliation to ledger, whale curve |
| Interpret |
5-6 |
CFO and Commercial lead |
Validated with Sales and Operations; causes and avoidable costs classified |
| Act |
7-12 |
Commercial lead and account owners |
Action plans with contract review; changes executed; quarterly refresh scheduled |
Governance: the CFO owns the method and the reconciliation, FP&A owns the model, the Commercial lead owns actions, Operations and Customer Service own driver data, and Legal reviews anything that touches contracts. Report accounts below zero, whale curve peak, and cost-to-serve percent quarterly.
What to expect: the first build is rough, and the first value comes from the surprises that prompt better driver data. The second quarter is more reliable. Profit effects of price and terms changes show up as contracts renew and orders flow, so measure over two to three quarters.
Downloadable assets
The customer profit table, cost-to-serve pool table, account action plan, and review agenda above are designed to be copied into a spreadsheet. The EBITDA improvement calculator can translate profit changes from repricing or terms into EBITDA. The price waterfall builder computes list-to-pocket leakage from your own figures.
Related resources
Frequently asked questions
What is a customer profitability analysis?
A customer profitability analysis calculates profit by customer after net revenue, product cost, and the cost of serving each account: freight, handling, support, returns, special requests, and receivable carrying cost. It differs from a product margin report because customers who buy the same products can cost very different amounts to serve.
How do you calculate cost to serve?
Divide each cost pool by its driver volume to get a rate, then multiply by each customer's driver volume. If a support team costs $1.2M and handled 24,000 tickets, the rate is $50 per ticket, and a customer with 400 tickets carries $20,000. Use drivers such as shipments, order lines, and tickets, not a percent of revenue.
What is a whale curve?
A whale curve ranks customers from most to least profitable and plots cumulative profit as a share of total profit. It can rise above 100% and then fall back, because loss-making customers subtract from the profit earned by the best accounts. The height of the peak shows how much profit the unprofitable accounts erase.
Should I drop unprofitable customers?
Not before testing price, terms, and service-level changes, and not before checking which costs would actually go away. Fixed and semi-fixed costs stay when a customer leaves, so exiting often improves profit less than the report suggests. Contracts also govern what you can do, so involve counsel before changing terms or ending an account.
How often should I update customer profitability?
Update it quarterly once the first version is built and reconciled to the ledger. Costs, discounts, and customer behavior change, and the actions you take (price, terms, service) need a follow-up measurement. Review driver rates and the customer hierarchy at least annually, and whenever product cost or logistics costs move.
How this works in a System of Performance
Customer profit depends on records that live in different places: invoices and rebates in the ERP, tickets in the support system, shipments in logistics, and account notes in the CRM. A Performis routine can take on a recurring job like this, with the scope and fit agreed with you: it works from the records your team supplies, prepares the work for your named reviewer, and keeps each approval on record. If you want to see which of your accounts erase profit after cost to serve, bring it to us as a launch partner.