Every Service Cloud project I have run eventually hits the same wall on day one of go-live. The cases are flowing in from email and phone, the agents are logged in, and nobody knows which case belongs to whom. A supervisor is standing over someone's shoulder manually reassigning records in a list view because the "routing" everyone agreed to in the design workshop turned out to be three half-finished assignment rule entries. By mid-morning the queue is a thousand cases deep, the same customer has been answered twice, and a VIP outage has been sitting untouched behind a stack of password resets.
Routing is not a nice-to-have configuration detail. It is the part of the implementation that decides whether fifty agents work as a team or as fifty individuals fighting over a shared inbox. Get it right and the system quietly puts the right case in front of the right person; get it wrong and your average handle time, first-contact resolution, and SLA compliance all degrade at once, and no dashboard will tell you why.
This piece walks through how I actually configure the two halves of that problem on client projects: assignment rules that decide where a case goes the moment it is created, and escalation rules that decide what happens when a case sits too long. I will use a composite of two real engagements to keep it concrete, a telco running roughly 5,000 cases a day across fifty agents, and a bank with hard dispute SLAs measured in hours.
Assignment rules: one rule, many ordered entries
The first thing to internalize is that Salesforce allows exactly one active assignment rule per object. Everyone wants to create "the VIP rule" and "the billing rule" as separate things, and you cannot. You get one rule, and inside it you build an ordered list of entries that the platform evaluates top to bottom until one matches.
That ordering is the whole design. On the telco project I built twelve entries, and the sequence mattered more than any single criterion. The first entry caught critical outages and routed them straight to a crisis-response queue, because a regional network failure cannot wait behind anything. The next several entries handled Gold-tier customers, splitting them by product into dedicated tier-one queues so the best customers never touched the general pool. English-language cases got their own entry because the org only had a handful of English-speaking agents and concentrating those cases kept them productive. Everything else fell through to product-based queues, and the very last entry had blank criteria as a deliberate catch-all into a general-inquiry queue.
That catch-all is not optional in my book. If a case matches no entry, the owner defaults to whoever created it, which on an email-to-case channel is your automated integration user. I have inherited orgs where thousands of cases were silently owned by an API user nobody monitored, simply because the assignment rule had no safety net at the bottom. One blank-criteria entry prevents the whole class of problem.
The practical pattern is consistent across clients: priority and severity entries at the top so critical work jumps the line, segmentation entries in the middle for tier and language and product, and a catch-all at the very bottom. Assign to queues rather than individual users wherever you can, because a named user goes on holiday and a queue does not.
Where assignment rules stop and Omni-Channel begins
The honest limitation of assignment rules is that they have no idea how busy anyone is. They evaluate criteria and drop the case into a user or a queue, full stop. They will happily assign the next forty cases to the same person while their colleague sits idle, because that concept simply does not exist at this layer.
For a small support team this is fine, and I will often deliver exactly that: assignment rules drop cases into queues, agents pull work manually, and a team of fifteen handles it comfortably. The trouble starts when people ask for even load distribution. Salesforce has no built-in round-robin for assignment rules, so you end up either writing a Flow that tracks a "last assigned" counter in a custom setting and walks through agents by index, or installing one of the round-robin packages from AppExchange. Both work, both are maintenance you now own forever.
Once a client genuinely needs balanced, skill-aware routing across a larger team, I stop bolting workarounds onto assignment rules and move them to Omni-Channel. That is the layer that understands agent presence, capacity, and skills. You define skills such as product knowledge, language, and support tier, assign them to agents with proficiency levels, and use a Flow to stamp the required skills onto each case. Omni-Channel then pushes each case to an available agent who has all the required skills and still has capacity, which gives you round-robin-like balancing for free because work naturally flows to whoever is least loaded.
Capacity is the piece people forget to model. Each agent has a total capacity, and each channel consumes units of it, so an agent might hold five cases or three chats or some mix up to their limit. On the telco I set tier-one agents to a high capacity because their cases were simple and parallelizable, and tier-three specialists to a low capacity because their cases were complex and demanded focus. The gotcha is that when an agent hits capacity, Omni stops pushing, and if you have not staffed for the peak, cases just sit. I always pair this with a utilization alert so a supervisor sees the queue backing up at eighty percent and can pull in more agents before it becomes a fire.
Escalation rules and the Business Hours trap
Escalation rules answer a different question: not where a case goes, but what happens when it has been sitting too long. Like assignment rules, you get one active escalation rule per object, structured as ordered entries, but the action fires on a time trigger rather than at creation.
On the bank project the requirement was crisp. An ATM dispute marked high priority had to get a response within four hours and a resolution within twenty-four, with each breach escalating to a more senior owner. I built that as an entry per dispute type, each with two time triggers: at four hours without modification the case reassigned to a supervisor and emailed the care manager, and at twenty-four hours without resolution it reassigned to a branch manager and emailed operations leadership.
The single most important setting in all of this is Business Hours, and it is the one people skip. If you do not attach Business Hours to a case, the escalation engine counts time around the clock. A dispute opened Friday at four in the afternoon will dutifully escalate to a supervisor at eight that evening and a branch manager overnight, all while the branch is closed and nobody can act. I have watched a manager get paged on a Saturday for exactly this reason, and it destroys trust in the system instantly.
With Business Hours configured to the bank's actual operating schedule plus a holiday calendar, the math behaves the way humans expect. That four-hour timer on a Friday-afternoon case consumes the last bit of Friday, then resumes Monday morning and trips a few hours into the working day, not at midnight on a weekend. Holidays matter just as much, and the regional wrinkle worth flagging is that lunar-calendar holidays do not recur on fixed dates, so the holiday calendar needs a manual refresh every year. I leave the admin team a standing reminder to update next year's holidays before year-end, because a missed Tet holiday turns a week of closure into a week of false escalations.
Multi-step escalation without flooding inboxes
A flat "escalate to supervisor after four hours" is rarely what a mature support org actually wants. What works better is a graduated ladder where each step targets a different audience with a different urgency.
The pattern I reach for has four levels. A gentle reminder goes to the agent themselves after the first hour with no reassignment, just a nudge. A supervisor notification and reassignment follows at the response-SLA breach. A manager alert with a wider distribution and a Slack or Teams ping comes at the resolution-SLA breach. And for the worst cases, an executive notification that also bumps the priority to critical. Each level writes an "escalation level" field so reporting can show exactly how far a case climbed, and each level uses its own email template written for its audience, because the language you use to nudge an agent is not the language you use to alert a VP.
Two gotchas consistently bite teams here, and both are worth designing against from the start. The first is choosing the wrong time basis. If you escalate on Created Date, you punish an agent who has been actively working a case but has not edited a tracked field, so I escalate on Last Modified and add a Flow that touches the case whenever the agent logs a comment, which keeps "they are working it" and "the clock should keep running" aligned. The second is email overload: a case that climbs four levels can generate a dozen or more notifications to overlapping recipients, and when every alert CCs everyone, people stop reading all of them and miss the one that mattered. I scope each notification to the people newly involved at that step rather than re-blasting the whole chain.
One thing escalation rules cannot do on their own is pause the clock. When a case is genuinely stuck waiting on the customer, counting that time against the agent is unfair and pollutes your SLA numbers. The native escalation engine has no pause; for that you need an Entitlement Process with a milestone and a stop-the-clock field, driven by a Flow that pauses the timer when status flips to "waiting on customer" and resumes it when work continues. It is more moving parts, but for any client with contractual SLAs it is the difference between honest reporting and numbers nobody believes.
The principle underneath all of this is simple enough to state and hard to hold onto under deadline pressure: routing and escalation are not features you switch on, they are operational policy expressed in configuration. Decide who handles what, how busy they are allowed to get, how long is too long, and what time even counts, and then make the system enforce those decisions consistently so your supervisors can manage exceptions instead of manually shoveling cases all day.
Implementing or optimizing Service Cloud? Our Salesforce team runs discovery, designs the case process, and configures Service Cloud, Omni-Channel, and Knowledge on production engagements. Get in touch ->
See our full platform services for the stack we cover.








