← Benjamin J. Sunter
Queueing theory for operating model design

Half a Day of Nothing

When a support function should sit central, and when it should split into dedicated pods. Companies flip between the two every few years and the debate almost never has a number in it. So I worked one out.

Benjamin J. Sunter · 6 minute read

The question

I keep watching companies flip between these two setups every couple of years, and I don't think either side is being unreasonable. The debate just runs on instinct, so it ends up wherever the most senior person in the room already was.

On the setup below, the math comes to about sixteen people, which was more than I expected.

Picture ten clients, each with support written into the contract. Give every client a named person who learns their quirks. Or build one shared team that covers everything and shares what they learn.

TEN PODSone named person per clientONE SHARED TEAMeverything, shared context?The question is how big this box needs to be.Squares are clients. Circles are people.
Each client gets their own person, or every client shares everyone.

Both are defensible, and which one is right for you changes as you grow.

The obvious objection is fair: when a client has a real emergency, nobody wants to be handed to whoever's free and start explaining from the beginning. A dedicated pod gives them somebody who already knows, and that matters. The math below doesn't price it, so there's a section near the end that tries to.

I'd still do the math first, because it's the only way to find out what that's costing you.

Or skip ahead to the calculator →

The two numbers that decide it

You probably know both of them roughly already. The first is how much work each client generates, counted in people rather than tickets. The second is how much slower a shared person is on anything that needs client-specific knowledge. That second one is the whole case for pods, so it's the one to pin down. I call it the context penalty.

The chart shows how big that penalty has to be before pods come out cheaper.

0%25%50%75%100%125%150%What most teams guess: about 30%150%73%60%29%20%13%12481632How many people’s worth of work each client generatesPenalty needed for pods to winPOOLING WINS IN HEREPODS WIN UP HERE
If your penalty sits below the curve, pooling is cheaper. Above it, pods are. The dashed line is what people guess when you ask them cold. Everything here assumes 80% of requests answered within two minutes. Change that target and every number moves.

At two people's worth of work per client, a shared person would have to take 73% longer on every request, all day, including the routine ones.

Each client sends enough work to keep two people busy, but two people can't cover it. Requests arrive in clumps, so somebody has to be free when three land at once. A pod needs four: two working and two in reserve. Ten of those is twenty working and twenty in reserve. Forty people.

Pool all ten clients and the reserve gets shared, because one client's quiet hour covers another client's bad one. The same twenty people's worth of work now needs four in reserve instead of twenty. Twenty-four people.

So pooling starts sixteen people ahead, all of it reserve you're no longer buying ten times over. The shared team only loses that lead if it gets slow enough to need forty people anyway, and that's 73% slower.

The gap comes almost entirely from ten small teams each buying their own reserve, against one team that buys it once.

Most estimates of that penalty land around twenty or thirty percent. Even at thirty, you're nine people better off pooling.

Context penalty
knows the clientdoesn't+73%

How much longer the same request takes when you don't know the client. The 73% above.

Occupancy
one working dayhandlingwaiting

How full the day is, handling rather than waiting. The 50% and 83% below.

They move independently. A team can be busy all day and still slow on a client it doesn't know.

Why the gap is so big

Pooled people don't work faster. Dedicated people just spend more of the day waiting.

Those sixteen people were reserve, sitting in ten separate places waiting for a clump that mostly didn't come.

0306090120301333%77%1 per client402450%83%2 per client704557%89%4 per client1108673%93%8 per clientTotal people needed, ten clientsTen pods added togetherOne pooled team of that sizeThe % inside each bar is how much of the day those people spend handling something.
Both structures do the same work at the same service level. The percentage inside each bar is how much of the day those people spend handling something.

The pod runs at 50% occupancy, the pooled team at 83%. The chart below shows both over a working day.

A single eight hour day, one hour per blockIn a pod of four50% busy4h working, 4h waitingIn a pooled team83% busy6h 40m workingTen pods buy that empty half ten times over.The clients, service level and work are the same. The difference is paid time with nothing to do.
Nobody enjoys this kind of slack. It's spread across the week as short gaps between tickets, which makes it hard to use.
If you run pods

Pods only cost you when the gaps are empty. Give a pod a roadmap and hold them to it, and that 50% becomes the other half of their job. A BI pod with its own build queue isn't idle between tickets, and most of the case for pooling it goes away. Focus on cutting shrink rather than headcount.

Where pooling stops helping

Pooling works by covering one client's bad week with another client's quiet one. That only holds if the bad weeks fall in different places.

EVERY CLIENT PEAKS AT QUARTER ENDstaff to herePooling saves 31%PEAKS FALL IN DIFFERENT WEEKSstaff to herePooling saves 56%Gray lines are the ten clients. The teal line is what the pooled team sees.
The gray lines are the ten clients. The teal line is what the pooled team sees.
Check the calendar

Check the timing before you bank the saving. Good clients know their own seasonality and will tell you if you ask. If everyone spikes at quarter end you staff the peak either way, and about half the pooling advantage is gone before you hire anyone.

Watch occupancy

I wouldn't pool past about 85% occupancy. The math will take you to 93% and the service level still looks fine on paper, but you pay for it in attrition, which is slower to spot and costlier to fix.

The second force: reuse

In some functions, reuse matters more than everything above.

In a reporting team, somebody structures the query once and builds the report once, then filters it per client, so the second client costs almost nothing and neither does the tenth. Split that into pods and ten people end up building the same thing.

ONE CENTRAL TEAMbuilds each report once375 hoursTEN PODSeach build the same fifteen reports3,075 hours8.2xOne square is one report, built once by one person.
Fifteen reusable reports, twenty hours to build each, half an hour to run per client. Every pod you add rebuilds all fifteen.

Eight times the hours, for the same fifteen reports. And it turns up anywhere there's a build step: reporting, templates, playbooks, onboarding material, QA rubrics, tooling, the deck somebody rebuilds every quarter.

Where central teams go wrong

Centralize the build. Don't centralize the queue. Central teams turn into backlogs where everything is urgent, and account teams drift back to their own spreadsheets. Push the reusable layer out as self-serve, so people can help themselves. And agree in writing who can jump the queue and who decides, with every function signed up. Without that, centralizing just moves the arguing onto one team who then have to referee it. I'll write about that separately.

Putting the two together

Combine them and you get one number you can work out in your head. Reusable work doesn't carry a context penalty, because a query doesn't care whose data it's filtering. The slowdown only applies to the one-off part.

WORKING OUT YOUR REAL CONTEXT PENALTYan example team, 70% of whose work is reusableBuilt once, reused · 70%One-off · 30%only this part is slower30%of the work×40%slower on it=12%your real penalty
Only the one-off slice is slower, so that's the only slice the penalty applies to.

Say 30% of the work is one-off, and a shared person is 40% slower on that part. Then your real penalty is 40% of 30%. That's 12%.

The crossover for a client this size was 73%. Twelve is nowhere near it, so you pool. That's the whole calculation, and it's what the sliders below do.

Try it with your numbers

Which side of the line are you on?

Everything runs in your browser. Nothing is sent anywhere.

Pool it
Ten pods
40
Pooled
26
Your real penalty
12%
Crossover
73%

What the math can't price

Everything above is about cost, and cost is the easy part to measure. Three things sit outside it, and any one of them can outweigh the headcount you'd save.

Somebody to call. When a deal is on the line, nobody wants to start from the beginning with a stranger. A pod buys a named person, for the client and for your own account team. That has real value, even if it doesn't show up on a spreadsheet.

Switching cost. The model assumes a request takes the same time whatever came before it. A pooled operator jumping from a regulatory edge case to an onboarding setup to a broken pipeline before lunch is paying a recovery penalty. It doesn't show up in handling time. It shows up as errors and rework, and the model has no line for either.

Whose emergency wins. In a pod, priority is local and obvious. You have one client, so you work on their most urgent thing. In a pool, two critical requests arriving together is a judgment call somebody makes in public, every time.

If you want the pod

Buy the pod as a premium, with a number on it. None of this makes pods cheaper, but it means cost isn't the only thing that counts. Work out what pooling saves you in people, then what one churned account is worth. If the saving is sixteen people and one account is worth more than sixteen, buy the pod. Call it insurance and budget for it that way. If you argue for it on efficiency, you'll lose.

The second queue

Whoever picks it up should be able to decide it. The model counts handling time and nothing else. It can't see a pooled person going off to find whoever owns the client before they can answer. That's a second queue behind the first, and it hurts most on the calls you want made fastest. If the person holding the ticket can't decide, your real penalty is well above what a stopwatch shows.

The whole argument, on one chart

Two questions place any function on this chart: how much work one client generates, and how much of the work gets built once and reused. The line between the two regions comes from the crossover math earlier.

0%25%50%75%100%12481632POOL ITone team, shared contextDEDICATEa named pod per clientReporting & dashboardsTier-1 questionsBilling operationsOnboardingIncident responseRegulatory filingsEnterprise escalationCustom integrationHow many people’s worth of work ONE client generatesShare of the work that is built once and reusedTWO THINGS THAT OVERRIDE THE CHARTDoes the pod have a roadmap?If the gaps are filled with real work, the pooling saving shrinks and you can sit further right.Can you afford to lose the account?If not, buy the pod anyway. Call it insurance and put a number on it.
The boundary is calculated. The dots are just examples, so plot your own functions. Most of the field says pool. Dedicating only pays when one client is big enough to keep a team busy and almost nothing you do for them is reusable, which is a smaller corner than most people assume.

How to run this

This is roughly an afternoon if your ticket data isn't a mess, and most people can stop at step three.

  1. Pull 90 days of requests by client. Your ticket system already has this. Resolved items, grouped by account.
  2. Turn volume into people. Count times average handle time, divided by the hours one person works in that window. That is the bottom axis of the chart above.
  3. Tag fifty tickets reusable or not. You don't need ninety days of them. Fifty is enough to tell 20% from 70%. If reuse comes back high, stop here, centralize the build, and the rest of this barely matters.
  4. Estimate the penalty on the bespoke part. Compare handle time when somebody who knew the account picked it up against somebody who didn't. If assignment has always been dedicated you'll have to guess, which is fine. Move the slider above and see whether your guess changes the answer. Usually it doesn't.
  5. Put each client on the chart. Load along the bottom, reuse up the side. Most will land well inside pool, and the ones that don't will be obvious.
  6. Price the premium on the ones that don't. Headcount difference times loaded cost, against the revenue on the accounts you'd be moving into a queue. That is the number you take into the room.

The harder question under all of this is whether the work is really bespoke, or whether nobody has ever built anything twice. You can answer that from your own ticket history, and it's where I'd start.

How the numbers were produced

Standard Erlang C, which is the queueing model contact centers are staffed with. Fifteen minute average handle time, a target of 80% of requests answered within two minutes, ten clients unless the slider says otherwise. Load is expressed in Erlangs, so "two per client" means each client generates two people's worth of pure handling time.

  • The crossover is found by raising the pooled handle time until pooled headcount matches ten pods at the same service level.
  • Staffing is integer, which makes the curve slightly lumpy at small loads. At 0.75 per client the crossover reads lower than at 1.0, purely because a pod can't hire two thirds of a person. The chart plots the doubling scale to avoid implying a smoothness that isn't there.
  • Erlang C assumes phone-shaped work: arrivals at random, no abandonment, service the moment somebody is free. Ticket and email work is deferrable, and deferrable work pools better still, so these figures understate the case for pooling in most support functions.
  • Shrinkage is excluded. It raises both structures by roughly the same proportion and doesn't move the crossover.