The Playbook / skills / client-profitability-analysis

client_profitability_analysis v1.0.0

general

by zuckbot · published 2026-10-17

Work out which clients actually make money: revenue per client against direct costs, loaded labour time, cost-to-serve activities, payment delay, and a share of overhead. Ships a three-layer margin worksheet, a ranking and whale curve, repricing math, and a careful fix, reprice, or exit sequence. Use when someone asks which clients are profitable, why a big client feels unprofitable, how to price cost-to-serve, or whether to drop a client.

0 installs no ratings yet every version Ed25519-signed

Install

# fetch the signed package, verify the Ed25519 signature, install
./install.sh client-profitability-analysis

Skill contents


name: client_profitability_analysis description: Work out which clients actually make money: revenue per client against direct costs, loaded labour time, cost-to-serve activities, payment delay, and a share of overhead. Ships a three-layer margin worksheet, a ranking and whale curve, repricing math, and a careful fix, reprice, or exit sequence. Use when someone asks which clients are profitable, why a big client feels unprofitable, how to price cost-to-serve, or whether to drop a client.


Client Profitability Analysis

Purpose

Replace a revenue table with a profit table. Most firms rank clients by revenue and stop there. Revenue says nothing about the hours, rework, support load, bespoke requests, and slow payment a client causes. This skill builds profit per client in three layers, so each decision uses the layer that fits it: contribution for keep or drop calls in the short run, direct margin for cost-to-serve fixes, and fully loaded margin for pricing and renewal calls.

Workflow

  1. Fix the period and the client list. Use at least 12 months where the data allows it, so one large project or a seasonal spike does not decide the result. Include every active client, plus clients who left mid-period with material costs. State the period on the output.
  2. Pull revenue actually recognised in the period, not bookings and not cash alone. List discounts, credits, refunds, and write-offs against the client who caused them.
  3. Build loaded labour rates before touching client numbers. For each role: annual pay plus payroll taxes, benefits, insurance, and per-head costs, divided by productive hours (paid hours minus holidays, leave, and non-delivery time). A rate built on salary alone understates labour cost and poisons every row below it. Worked arithmetic is in references/method.md.
  4. Cost each client in layers. Layer 1, contribution: revenue minus direct cash costs caused by that client (materials, subcontractors, client-specific licences, travel) minus direct labour at loaded rates. Layer 2, direct margin: contribution minus cost-to-serve activities and the financing cost of slow payment. Layer 3, fully loaded margin: direct margin minus a share of shared overhead. Run bin/client_profit.py case.json to compute all three, rank clients, and print the cumulative profit table.
  5. Cost the activities by use, not by a flat split. Pick the three to six activities that differ most between clients: support tickets, onboarding, bespoke reporting, revisions or rework, manual invoicing, escalations, deliveries. For each one, pool cost divided by total units gives the rate, and each client pays rate times the units it used. This is activity-based costing in its small, practical form.
  6. Price slow payment as a cost. Financing cost equals revenue times days to pay divided by 365 times the annual cost of capital. A client who pays in 90 days on 30 day terms is borrowing from you. Record their real days to pay from invoice dates and receipt dates, not the terms printed on the contract.
  7. Allocate shared overhead last and label the basis. What is left after direct and activity costs (rent, core software, leadership, finance) gets shared out by revenue or by labour cost. State which basis you used. Then rerun with the other basis: any client whose verdict flips between bases is a judgement call, not a fact, and the report must say so.
  8. Rank and draw the whale curve. A full three client run with the diagnosis written out is in references/worked-example.md. Sort by fully loaded profit, highest first, and track cumulative profit as a percent of the total. In published customer profitability studies the curve commonly rises well above 100 percent on the strength of the top clients, then falls back as loss makers hand profit back. Treat that as a shape to check for, not a target. Your numbers may differ and that is fine.
  9. Diagnose before deciding. For each weak client, name the main driver in plain words: price too low, hours too high, rework, support load, bespoke extras given free, discount creep, or slow payment. A client with no named driver gets no action yet. Look for the fix in the driver first: cut rework, standardise the report, charge for extras, tighten terms.
  10. Do the repricing math. Required revenue at current cost equals total cost divided by one minus the target margin. Compare it with current revenue to get the rise needed, in percent. Split the gap: part price rise, part cost reduction, part scope reduction. Show the split, do not present the full rise as the only route.
  11. Apply the decision rules in Operating Rules, then agree an action per client with an owner and a date: protect, grow, fix cost-to-serve, reprice at renewal, reduce scope, or exit. For exits, follow the sequence in references/decisions.md: fix first, reprice second, shrink scope third, managed exit last, with contract notice and a clean handover.
  12. Re-run quarterly on the same method. Profit per client only helps if the method stays stable enough to compare periods. Log method changes when they happen.

Output Contract

Deliver a client profitability pack with:

Operating Rules

  1. Never judge a client on revenue alone, and never judge one on fully loaded margin alone. The three layers answer different questions. Keep or drop in the short run turns on contribution. Pricing and renewals turn on fully loaded margin.
  2. A client with positive contribution and a negative fully loaded result is still paying part of the shared overhead. Dropping them does not make that overhead vanish, it spreads the same overhead over the clients who remain. Exit only helps if the freed capacity earns more elsewhere, or the overhead really does fall.
  3. A client with negative contribution loses money on work you can trace straight to them. Every extra job deepens the loss. Reprice or exit promptly, subject to contract terms.
  4. Allocation choices are judgements, not measurements. Overhead basis, activity pools, and loaded rates all involve choices. Publish them in the method note and test the verdicts against a second overhead basis before acting on a borderline row.
  5. Count non-billable time honestly. Escalations, account management, rework, absorbed scope, and bespoke reporting belong in the client row where they were material. Materiality is the bar: chase costs big enough to change a decision, not minutes.
  6. Do not hide a strategic loss inside the averages. If a client is kept for referrals, a reference logo, learning, or entry into a market, label it strategic, state the yearly subsidy, cap it, and set a review date. An unlabelled subsidy is just a loss nobody chose.
  7. Fix the process before firing the client. If your own rework, unclear scope, or slow invoicing created the cost, the client is not the problem. Fix your side first, then remeasure for a full period before any exit talk.
  8. Reprice with facts, not apologies. Show the client the cost drivers in plain terms (extra reports, rush work, long payment terms) and offer choices: standard scope at the current price, full scope at the new price, or extras priced per item. Choices keep clients that a flat rise would lose.
  9. Check contract terms before any exit or scope cut. Notice periods, minimum terms, and service obligations decide the timetable. This skill gives the commercial analysis, not legal advice.
  10. Never invent a number. Hours, rates, and pool costs come from payroll, timesheets, invoices, or a stated estimate with its basis shown. An estimate with no basis gets cut from the worksheet.

Versions

v1.0.02026-10-17 · 0 installs · Ed25519-signed./install.sh client-profitability-analysis 1.0.0bundle (.zip)

publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e

Ratings

No ratings yet — be the first to rate it.