River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

Lead Routing Rules Template

Your platform reports the owner field. This pack replays your rule table against real leads and reports which entry actually claimed each one.

Free download  ·  No account needed

A routing rule table gets written once and then never tested, because there is nothing obvious to test it against. The rules live in an admin screen and the leads live in an export, and no screen in any platform joins them. So the table gets judged on whether it reads sensibly, which every rule table does. This pack performs the join: it takes your entries in their real sort order and walks them against your real lead history, one lead at a time.

Each lead then lands in exactly one of three buckets, and the three counts sum to your lead count or the replay is thrown away rather than reported. Exactly one entry matched, so the table worked. Two or more matched, so first-match-wins let sort order pick the owner and nobody chose that sort order against that collision. Or nothing matched, and the lead went to whatever fallback the platform holds. In the worked example those buckets are 71.5%, 22.3% and 6.2%.

The second and third buckets have no report anywhere in any platform, and the reason is the same in both cases. The fallback owner is a real named user, so a lead nothing routed carries an owner name and an assignment timestamp, and is indistinguishable from a correctly routed one anywhere. Response speed is the largest controllable factor, and most companies are not responding nearly fast enough. Blank fields are the commonest reason an entry misses, so run CRM hygiene and dedup alongside this.

One rule table, replayed against 9,420 real leads

Routing Matrix, the Unrouted Lead Log with a cause per row, and Time to Owner.

Routing Matrix

Illustrative, for a fictional network hardware company called Alderbrook. Every entry in sort order with what it actually claimed, plus the number no platform has: what it would have claimed had it been first.

#EntryDestinationSole matchWon a collisionLost to entry aboveIf it were first
1Partner or resellerPer the agreement16800168
2Named accountsStrategic owner244960340
4Source is webinarWebinar queue1,04280601,848
5200 to 999 seatsMid-market pool7031182141,035
620 to 199 seatsCommercial pool1,288749082,270
12Under 20 seatsSelf-serve pool81206221,434
14Catch-allWatched queue000-

The webinar entry at position 4 took 1,670 leads from the six entries below it. Every one of them reports as correctly assigned. The catch-all claimed nothing across 9,420 leads, because the platform fallback owner caught the gaps instead.

Unrouted Lead Log

583 leads matched no entry. That is not one finding: three unrelated things produce it, and they take three unrelated fixes owned by three different people.

CauseLeadsMedian hours to a named ownerFixOwner
Fell through every entry40214.6An entryRevOps
Rotation pool was empty9671.0An overflow pathSales manager
Rules were never invoked852.4Upstream of routingMarketing ops, Platform

The 96 clustered on 11 days, 34 of them in kickoff week: every rep marked away, and the documented behaviour is that the owner property is then set to no owner. Nothing logs it. The 85 arrived through a scanner import, an integration writing straight to the object, and a manual create form whose assignment box defaults to off. No entry will ever catch any of them.

Time to Owner

The sole-match bucket is the control: same business, same period, same lead sources. Each bucket's gap is its lead count times the difference from that rate.

BucketLeadsMedian hrsConversionGapCommitments lost
Sole match6,7330.418.6%control-
Collision, sort order chose1,6700.614.1%4.5pp75.2
Collision, declared precedence4340.514.1%4.5pp19.5
Fell through40214.69.2%9.4pp37.8
Pool empty9671.06.3%12.3pp11.8
Rules never invoked852.44.7%13.9pp11.8
Total2,687---156.1

156 commitments over two quarters, 78 a quarter. Three changes recover 121 of them, and one of the three is dragging a single entry down the list: worth 75.2 on its own, and it takes about a minute.

What is in the pack

01

Routing Matrix

One row per entry in sort order, with four claim counts including what it would have claimed had it been first

02

Unrouted Lead Log

One row per lead no entry matched, each carrying its cause, its fix type and the person who owns that fix

03

Time to Owner

Median hours and conversion per bucket against the sole-match control, ending in commitments lost

04

Territory Register

The lookup your entries copy from, with the lead count and the disagreements between register and entry

05

Routing Policy

Precedence order, pool distribution models, the response commitment, and what this policy deliberately excludes

06

Exception Handling

The cases handled by somebody remembering, written down, with the open questions left open on purpose

07

Coverage Note

What the rules never reached, split by cause, priced, and attributed to the person who can fix it

08

How the Replay Works

The method written down so the output can be checked and rerun in six months for a comparable answer

How it works

  1. 1

    Send both halves

    Your routing entries in their real sort order, and a lead export covering a couple of quarters. Wide rather than tidy: an entry testing a column the export lacks will look dead when it is not.

  2. 2

    Replay every entry

    Each lead is walked against all entries rather than stopping at the first match, so collisions are recorded with the winner and everything it beat, which is the part the platform discards.

  3. 3

    Give every gap a cause

    The no-match bucket splits into criteria gaps, empty rotation pools and leads created by paths that never call the rules. Three fixes, three owners, three separate queues.

  4. 4

    Price it and reorder

    Each bucket gets a median time to owner and a conversion rate against the sole-match control, so the finding arrives as commitments lost rather than as a percentage.

Frequently asked questions

What do I need before this is useful?

Your routing entries with their real sort order and criteria, plus a lead export with every field those entries test, the created timestamp, the current owner and the first-touch timestamp. Pool memberships and a territory map help. A screenshot of the admin screen is fine for the entries.

My reports already show every lead has an owner

That is the finding, not a reason to skip this. The platform fallback owner is a real named user, so a lead that matched no rule carries an owner name and an assignment timestamp and looks identical to a routed one. Owned and routed are different states, and only one of them is reported.

Can this run without lead history?

Partly. Entries can be checked against each other for overlap and against the territory register for disagreement, and both find real defects. But overlap found on paper is only a possible collision. The replay is what turns it into a lead count, which is what makes a reorder worth doing.

Why does a collision matter if the lead still gets one owner?

Because sort order picked that owner and nobody chose the sort order against that collision. A broad entry placed high silently swallows every lead the specific entries below it were written to catch. In the example one entry took 1,670 leads from six others, and all of them reported as correct.

Is round robin not already even?

It is even with respect to itself. HubSpot counts assignments made by that specific rotation action rather than the records each user owns, and the counts reset if you add or remove owners. So an even rotation says nothing about anybody's real book, which is why the matrix names a model per row.

What happens when everyone in a pool is away?

On HubSpot, with availability filtering on, the record is left unassigned. Nothing logs it and it clusters on Fridays, holidays and kickoff week. The fix is an overflow path to a named manager, not another entry, because the criteria matched perfectly well.

Does this set our lead SLA or scoring model?

No, and that boundary is deliberate. This pack decides which owner each lead belongs to and proves the rules deliver it. What the score itself should weigh belongs to the lead scoring model, and the contact-time commitment to the sales and marketing SLA. What the owner does next belongs to pipeline hygiene, and a speed-to-lead audit reads what happens after a lead clears these rules.

Find out how many of your leads were actually routed

Send the entries and a lead export. The first thing back is three bucket counts that sum to your lead count.

Replay my rule table