← All articles

GTM Operations

Lead Routing Is a Latency Problem, Not a Fairness Problem

Your round-robin is balanced to the record and slow to the buyer, and the buyer is the one who leaves. 65% of buyers expect a response inside an hour. Here is the latency stack that fixes it, in build order.

· 13 min read

For years the routing SLA lived in a footnote. Get the split right, weight by ramp, cap the new reps, respect PTO, and speed-to-lead was a nice-to-have you would tighten once the fairness math settled. I built exactly that machine. Three weeks tuning a round-robin, weighting by ramp, capping the ramping reps, splitting by segment so nobody felt cheated on account size. The distribution came out beautiful. Then I measured the one thing I had not been measuring, and the median time from lead creation to first human touch was 47 minutes. The p90 was over four hours. I had built a perfectly fair machine for handing out leads slowly.

Break the footnote. Every minute of routing latency is conversion you already paid for and then threw away at the door. Ops teams argue about fairness because fairness is visible and easy to fight over. Reps notice when the split is uneven. Nobody stands in your office complaining that the median latency crept from nine minutes to thirty. But latency is the variable the buyer feels, and 65% of B2B buyers now expect a response inside an hour (ZoomInfo, 2025 speed-to-lead benchmarks). The buyer decides whether this ever becomes a deal, and the buyer is timing you.

21x
More likely to qualify when contacted under 5 minutes (MIT/InsideSales lead-response study)
65%
Of B2B buyers expect a response inside one hour (ZoomInfo 2025)
~29 hrs
Average response among the B2B sites that replied at all (RevenueHero 2025 audit of 1,000 sites)

The reason this matters is the shape of the decay, and the shape is a cliff, not a slope. Scroll the curve below. The value of a lead does not fade gently over the afternoon; it falls off in the first few minutes while the buyer still has the tab open and the intent still runs hot. Everything in the build order later in this piece exists to keep leads on the left side of that cliff.

The shape you are selling againstQualification odds fall off a cliff, not a slope
02855831101 min5 min10 min30 min1 hr24 hrTime from lead creation to first human touch
1001 minPeak intent, tab still open
Relative odds of qualifying a web lead by time to first human touch. The drop between 5 and 30 minutes is the whole game. Directional, from the MIT/InsideSales lead-response curve; treat the multiple as a heuristic, not a law of physics.

The number that should scare you

The MIT and HBR heuristic still gets quoted because nothing has replaced it: contact a web lead within five minutes and you are roughly 21x more likely to qualify it than if you wait thirty (MIT/InsideSales lead-response study). Read the curve above and the reason is obvious. At one minute you are at peak intent. By ten minutes you have lost more than half the odds. By an hour you are down to about an eighth of where you started, and an hour is exactly the window where 65% of buyers said they expected to hear from you (ZoomInfo, 2025). Miss that window and you are not late, you are competing from behind against whoever answered first.

Most teams are nowhere near the top of that cliff. RevenueHero ran a 2025 audit of 1,000 B2B websites: 63.5% never responded at all, and the average response time among the rest was around 29 hours (RevenueHero, 2025 inbound response audit). Twenty-nine hours. By then the buyer has filled out three competitor forms, taken a call from whoever answered first, and forgotten your name. The fairness of your round-robin is irrelevant when the lead is dead before anyone picks it up.

Measure the median, then go hunt the tail

Stop reporting distribution balance as your routing health metric. Report median latency from lead creation to first touch, and report it every week. The median tells you what a typical buyer experiences, which is the thing you are selling against.

Then go find the p90 tail, because that is where the leak lives. My median of 47 minutes was bad. The p90 of four-plus hours was where the deals were quietly dying, and the median hid it. When I sliced the tail it was almost all the same pattern: leads that came in outside a rep’s working hours, or that fell to a rep on PTO the round-robin did not know was out, or that bounced between an enrichment step and an assignment step while a queue backed up. The average looked survivable. The tail was a graveyard.

Here is the argument in one line, and it is the line I put at the top of every routing review now.

Fairness is measured against the rep. Latency is measured against the buyer. Only one of them signs the contract.

Fairness rules are latency in a suit

Here is the uncomfortable mechanic. Every rule you add to make routing fairer adds a step, and every step adds time. Weight by ramp, you add a lookup. Cap the ramping reps, you add a condition and a fallback. Round-robin within segment within region, you add a nested branch that has to resolve before anyone gets the lead. Each rule is defensible on its own. Stacked, they turn assignment from an instant into a pipeline, and the buyer waits through all of it.

The diagram below is the anatomy of that pipeline. Every box is a place a lead can sit and wait, and the fair-but-slow instinct keeps adding boxes.

The routing pipeline Every fairness rule is a box the lead waits inside
Lead inEnrich+ scoreSegment+ regionAssignrepAccept / reject5-min SLAreject reason feeds routing
Assignment is a chain of steps, and each one is latency. The closed loop at the end is the step most teams never build.

I am not saying throw out fairness. I am saying price it. When someone asks for another balancing rule, I ask what it does to median and p90 latency, and we decide with that number in view. Most of the time the fair-but-slower option loses, because a lead that reaches a slightly overloaded rep in ninety seconds beats a lead that reaches the perfectly optimal rep in fifty minutes. Balanced and late is still late.

Fairness-first routing Latency-first routing
Health metric Distribution balance across reps Median and p90 time to first touch
What a new rule buys A more even split Measured against the latency it adds
After-hours lead Waits for the assigned rep Falls through to on-shift coverage
Who notices a problem The rep, in a Slack complaint The dashboard, on Monday
The deal Reaches the optimal rep, cold Reaches a good-enough rep, warm
Same reps, same leads, two different optimization targets. Only one of them is measured against the buyer.

The step nobody sets up: closed-loop accept and reject

The gap that quietly kills routing is the assignment that never gets acknowledged. The system assigns a lead, marks its job done, and moves on. Whether a human ever touched it is somebody else’s problem, which means it is nobody’s problem.

Fix it with an accept-or-reject SLA. When a lead is assigned, the rep has a fixed window, five minutes for hot inbound, to accept and act or reject with a reason. No action inside the window and it auto-reassigns to the next rep, with the miss logged against the first one. The reject reasons feed back into the routing logic: wrong segment, bad data, duplicate, out of territory. That loop turns routing from a one-way conveyor into a system that knows whether it worked.

Here is the SLA config I run. It is the real artifact, not a diagram of one. Drop the thresholds into whatever routing engine you have and the business_hours guard is what keeps after-hours leads from rotting until morning.

routing_sla:
  hot_inbound:              # demo request, pricing, contact-sales
    accept_window_minutes: 5
    on_no_accept: reassign_next_on_shift
    escalate_after_reassigns: 2
    escalate_to: routing_manager
  standard_inbound:         # content download, webinar
    accept_window_minutes: 30
    on_no_accept: reassign_next_on_shift
  after_hours:
    business_hours: "Mon-Fri 08:00-18:00 local"
    on_lead_outside_hours: route_to_on_shift_pool   # never hold for an absent rep
  reject_reasons:           # every reason feeds back into routing
    - wrong_segment
    - bad_data
    - duplicate
    - out_of_territory
  logging:
    capture: [lead_created_at, assigned_at, first_activity_at, accepted_at]
    report: [median_latency, p90_latency]   # weekly, sliced by source + segment

Build that loop and your latency reporting suddenly has teeth, because now you can see not only when a lead was assigned but when it was worked, and the difference between those two timestamps is the number that has been bleeding you the whole time.

Here is how I build it: instrument, route, enforce

This is the order I build routing in now, and it is deliberately backwards from how most teams do it. Instrument first so you can see latency, route second so the tail has somewhere to fall, enforce fairness last, because fairness is the layer that adds latency and it should never go in before you can price what it costs. Locate your own team on these five rungs. Most teams live on rung one and have never measured a median.

Instrument, route, enforce
  1. 1

    1. Instrument the two timestamps

    Before you touch a rule, capture lead-created time and first-activity time on every lead. If you cannot compute median and p90 latency today, nothing else on this list can be measured, so this is where you start. This is the instrument phase.

  2. 2

    2. Report median and p90 weekly

    Put both numbers on a standing weekly report, sliced by source and segment. The median is the typical buyer experience, the p90 is the graveyard. Watch the gap between them widen or close.

  3. 3

    3. Close the loop with an accept SLA

    Assign, then require accept-or-reject inside a fixed window, five minutes for hot inbound. No action auto-reassigns and logs the miss. Now you have a worked timestamp, not only an assigned one. This is where routing starts to enforce itself.

  4. 4

    4. Build coverage for the tail

    The p90 tail is almost always after-hours, PTO, or a queue backing up behind enrichment. Add on-shift fallback pools and a PTO-aware skip so no lead waits for an absent human. This is the route phase doing its job on the graveyard.

  5. 5

    5. Add fairness last, and price every rule

    Only now add balancing rules, and for each one measure what it does to median and p90 before you keep it. A rule that adds three minutes of latency to save half a point of balance does not ship. This is the enforce phase, with a budget.

A worked example the curve pays off

Take a week of 100 hot inbound leads and put them on the decay curve. Under the fair-but-slow round-robin I started with, the latency distribution looked like the table below. Map each band to its relative qualification odds from the curve above, and the fairness machine turns into a leak you can size in dollars.

Latency bandLeadsRelative qualify odds (from curve)Qualified-lead equivalents
Under 5 min1878%14.0
5 to 30 min34~35%11.9
30 min to 1 hr2012%2.4
1 hr to 4 hr166%1.0
Over 4 hr (the p90 tail)123%0.4
Total10029.7

That fair machine converts like 29.7 fully-qualified leads out of 100. Now rebuild it latency-first with the config above: the after-hours pool and the 5-minute accept SLA pull the bottom two bands forward, so the 28 leads sitting past an hour move into the under-30-minute bands. Re-score them at roughly 35% and the total climbs to about 43 qualified-lead equivalents from the same 100 leads.

ModelLeads over 1 hrQualified-lead equivalentsLift
Fairness-first round-robin2829.7baseline
Latency-first with accept SLA4~43+45%

A 45% lift in qualified leads, no new headcount, no new lead source, purely from moving leads left on the curve. That is the whole argument. The 21x multiple on the top stat tile is the same physics as this table: the difference between a five-minute touch and a thirty-minute one is not a rounding error, it is most of your qualified pipeline.

What to do Monday

Pull median and p90 time from lead creation to first activity for the last thirty days. If you cannot pull it, that is your first finding, because it means no one is watching the number the buyer feels. Then read the p90 tail lead by lead and name the pattern. It will be after-hours, PTO, or a queue backing up behind an enrichment step. Instrument, then route the tail somewhere, then enforce fairness with a latency budget. Fair can wait. The buyer will not.

Routing latency is one leak in a longer chain, and the chain runs straight into the post-sale side of the business where the same blindness compounds. For where the CRM stops instrumenting the deal entirely, see you have 40 pipeline reports and one renewal-date field. And for where routing lag shows up as a scaling wall you hit on schedule, see the systems that got you to $10M sabotage you at $30M, where routing lag is one of the four breakpoints that arrive on time.

lead-routing speed-to-lead

Keep reading

One email. Every week.

One email a week: an operating problem I solved or botched, with the model, the numbers, and what I would change. No roundups, no theory, unsubscribe whenever it stops being useful.

The newsletter opens soon.

Connect a provider in src/config.ts