[object Object]

A new lead source goes live Monday and 400 inbound leads land in the queue. The round-robin rule cheerfully assigns 80 to a rep on a two-week vacation, 60 to a rep over capacity, and routes nothing in the right time zone for the European contacts. The routing engine did exactly what you told it. The configuration did not encode any of the things that matter.

What the Engine Actually Does

The Sales assignment rule engine takes a queue, a list of users, and a strategy. The default strategies are round-robin, load balanced, and random. The engine does not consult capacity, calendars, time zones, language, or skills unless you explicitly model those as conditions.

The engine evaluates rules in order. The first matching rule wins. After a match, no further rules are evaluated for that lead. This means rule order is your most important configuration choice.

A Working Rule Order

Order rules from most specific to most generic.

1. Strategic accounts -> named rep on the account team
2. Named industries -> industry specialist team
3. Region match -> regional team
4. Language match -> language-capable team
5. Catch-all -> general SDR queue

Without the catch-all at the bottom, leads that match no rule sit unassigned forever. With the strategic accounts at the top, the named-account model survives the round robin.

Capacity-Aware Round Robin

Add a capacity column to the systemuser table called sales_currentcapacity, and a max column called sales_maxleads. Update them on lead create and close through a flow. The routing condition then filters to users with current below max.

<fetch>
  <entity name="systemuser">
    <attribute name="systemuserid" />
    <filter>
      <condition attribute="isdisabled" operator="eq" value="false" />
      <condition attribute="sales_currentcapacity" operator="lt" attribute2="sales_maxleads" valueof="sales_maxleads" />
    </filter>
  </entity>
</fetch>

The engine picks from this filtered set in round-robin order, and the capacity columns recharge as leads close. Vacation is just a temporary capacity of zero.

Time Zone and Working Hours

The systemuser record has a timezonecode and a configurable schedule. The routing engine does not consult these by default. Add a calculated field on systemuser called sales_oncall that returns true when the current UTC time falls within the user’s working hours, and add it to the routing condition.

sales_oncall = within(now, schedule_start, schedule_end)

A lead that arrives at 2am local time for the rep can either wait in the queue until working hours, or route to a follow-the-sun pool. Build both options and let the lead source decide which applies.

Skill-Based Routing

For complex products, route by skill. Tag users with a many-to-many relationship to a skill table and add a skill-match condition on the rule. A lead from a manufacturing prospect routes to reps tagged with the Manufacturing skill, then by capacity within that pool.

This pattern needs maintenance. Skills drift as reps train. Build a quarterly review that confirms each rep’s skill tags reflect their current desk.

Reassignment on Inactivity

A lead assigned to a rep who does not touch it within four working hours should reassign automatically. Build a flow that runs hourly, finds owned leads with no activity logged in the SLA window, removes the owner, and routes them back through the rule. Without this, leads die quietly in inboxes.

async function reassignStale(leadId) {
  await fetch(`/api/data/v9.2/leads(${leadId})`, {
    method: "PATCH",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ "ownerid@odata.bind": `/teams(${routingTeamId})` })
  });
}

Measuring Routing Health

Track three metrics weekly: time to assignment, time to first touch, and percentage of leads reassigned for inactivity. A healthy routing pipeline keeps time to first touch under 30 minutes for inbound and reassignment rate under 5 percent. If reassignment climbs, your capacity model is wrong.

What to do this week

Audit your assignment rules for catch-all at the bottom and capacity in the conditions. Build the inactivity reassignment flow and the three-metric dashboard. Run one Monday-morning load test by replaying yesterday’s leads through the new rules in a sandbox.

[object Object]
Share