Register your interest: Tag @Cody, get an agent
BlogEngineering

How to automate task assignment: round-robin is not fair

Even distribution of tickets produces uneven workload. Balancing by effort rather than count, routing for skill without trapping people, and the assignments that should never be automatic.

Aymeric ZhuoAymeric Zhuo11 min read

Summarize with AI

How to automate task assignment: round-robin is not fair
On this page

Round-robin assignment is the default because it is obviously fair: everybody gets the same number of items. It is also the reason one person on the team is drowning while another has capacity, because tasks are not interchangeable and counting them as though they were produces exactly the imbalance the automation was meant to prevent.

Assignment is a scheduling problem with several competing objectives — speed, quality, learning, and not exhausting your best people — and the automation worth building is the one that makes those trade-offs explicit rather than pretending a queue is a queue.

What we'll cover

Why even distribution is not balance

Tasks differ by an order of magnitude in effort, so equal counts produce unequal weeks.

Difficulty concentrates. The hard items tend to reach the same few people because somebody once decided they were the right person.

Interruptions are invisible to a counter. A person handling three escalations and two tickets is fully occupied.

Work in progress matters more than assignment count, since five open items is a different state from five completed ones.

Context switching is a real cost and an assignment policy that spreads a person across four areas is expensive in a way nothing measures.

Fairness is not the objective anyway. Throughput, quality and sustainability are, and they sometimes require an uneven distribution.

Measuring load properly

Count open items, not assigned ones, which is the single easiest improvement over round-robin.

Weight by estimated effort where estimates exist, and by historical time-to-close for that category where they do not.

Include the unticketed work: on-call, reviews, meetings, and the person who is currently mentoring somebody.

Respect a work-in-progress limit per person rather than assigning into an overflowing queue.

Age matters. Somebody holding an old blocked item is carrying a cost that a count does not show.

Show the load view to the team. People self-correct when they can see the distribution, and that is less effortful than any routing rule.

Skill routing and the trap in it

Routing by expertise is efficient and concentrating. The expert gets faster, everybody else stays where they are, and the bus factor worsens every week.

Reserve a proportion for learning, deliberately — a share of items routed to somebody who does not yet know the area, with the expert available.

Pair rather than reassign for the hard ones, which spreads knowledge without slowing the resolution much.

Track coverage per area as a metric, since single-person coverage is a risk that only becomes visible when that person is away.

Let people signal interest, because somebody wanting to learn an area is the cheapest coverage improvement there is.

Route the routine work widely and the genuinely specialist work narrowly, rather than applying one policy to everything.

Building it with CodeWords

CodeWords connects to more than 3,000 integrations, so the tracker, the calendar, the rota and your chat can meet in one automation.

  1. Open CodeWords and start a new automation.
  2. Describe what should happen in plain language to Cody, the automation builder: how load is measured, how skill and learning are balanced, and what escalates.
  3. Authorize the connections — the tracker or helpdesk, the calendar, and Slack.
  4. Describe the exceptions: leave, on-call, a work-in-progress limit reached, a task needing a specific person.
  5. Run it in suggestion mode for two weeks and compare against what the team actually did.

You describe the outcome; Cody builds it, connects it, and deploys it. The free plan covers light use, with Pro at $39 per month and Business at $100 per month as usage grows; details are on the pricing page.

Availability, which breaks everything

Leave and holidays, from the actual system, since assigning to someone who is away is the most common cause of a stalled item.

On-call. Somebody on call has less capacity for planned work, not the same amount.

Working hours and time zones, particularly for anything with a response expectation.

Part-time schedules, which round-robin ignores entirely and which produce a visibly unfair result when it does.

Meeting load, where the calendar is honest about it, since a day that is mostly meetings is not a working day.

Handle the unavailable assignee already holding items, by surfacing them for reassignment before they go quiet rather than after somebody notices.

Reassignment and the stalled task

Detect no movement rather than no update, since a comment is not progress.

Ask the holder first, privately, before doing anything, because most stalls have a reason that is easily resolved.

Escalate to reassignment on a defined clock, with the original holder told rather than silently bypassed.

Distinguish blocked from stalled. A blocked item needs the blocker escalated; reassigning it just moves the blockage.

Track reassignment rate per category, since a category that reassigns frequently is usually mis-routed at the start.

Never reassign silently. It reads as a judgement about the person and it destroys trust in the automation faster than any other behaviour.

What should never be automatic

Anything customer-visible with a relationship attached, where the person who owns the relationship should decide.

Escalations, which need a judgement about who is right for this particular situation.

Work that is part of somebody's development plan, agreed deliberately with their manager.

Incident roles, which follow the incident process rather than a queue.

Anything where the assignment is itself a message — a sensitive investigation, a piece of work with political weight.

Assignment during an incident, when the ordinary rules should be suspended rather than competing with the response.

Assignment as a signal about the work itself

The assignment data this system produces is more informative than the assignments. Reading it back tells you things no other report will.

Which categories reassign most, which points at a routing rule that is wrong or a category that is not really one category.

Where the queue ages, by area rather than by person, which separates a capacity problem from a skill problem.

Who is the only person who ever receives a given category, which is a coverage risk stated plainly.

How much work arrives outside working hours, which is either a genuine round-the-clock need or a process producing unnecessary urgency.

The ratio of planned to interrupt work per person, which is the number that explains why somebody with a light queue is not getting anything finished.

Share this with the team, not about them. These are facts about how work arrives, and presenting them as facts about individuals converts a useful report into a performance conversation nobody asked for.

Making it survive

Fail to unassigned, not to a random person, since an unassigned item in a visible queue is better than a wrongly assigned one.

Make it idempotent so retries do not produce assignment churn.

Respect manual overrides for a period, because a person who reassigned deliberately should not be undone by the next run.

Handle team membership changes, since a departed colleague still in the rotation is a queue that silently swallows items.

Report the outcome: assignments made, load distribution, reassignments, and items that could not be assigned.

Letting people pull instead of pushing

Every rule above assumes the system assigns. A pull model inverts that, and for some teams it works considerably better.

People take the next item from a prioritised queue when they finish something, which naturally respects their real capacity.

The automation's job becomes ordering the queue, not choosing a person, which is a much easier problem to get right.

Work-in-progress limits do the balancing on their own, since somebody at their limit cannot take another item.

It fails on the unattractive work, which is the honest objection — the tedious item sits while pleasant ones are taken.

Ageing fixes most of that. An item that rises in priority as it waits eventually reaches the top and gets taken.

Use both. Pull for the routine queue, push for anything with a deadline or a named owner, which is how most teams that make this work actually operate.

Limits worth knowing about

Effort estimates are poor, so load weighting is approximate and should be treated as such.

Skill data goes stale quickly and self-reported skill is unreliable in both directions.

Calendar data is incomplete unless everybody maintains it, which they do not.

Optimising assignment cannot fix understaffing — it redistributes the same shortfall and makes it look like a routing problem.

People notice being routed away from interesting work long before any metric shows it, and that is a retention issue rather than a scheduling one.

What to build first

The load view: open items per person, weighted by category, including on-call and review commitments, visible to the whole team. It assigns nothing. In most teams it immediately shows that the distribution people assumed was even is not, which is the finding that makes any routing change worth making.

Two habits make the difference. Count open work rather than assignments, since that single change captures most of the benefit of a sophisticated routing system. And reserve a deliberate proportion of work for learning, because pure efficiency routing concentrates knowledge in the people who already have it, and you find out how much it concentrated when one of them leaves.

Frequently asked questions

Why is round-robin assignment a problem?

Because tasks differ by an order of magnitude in effort, so equal counts produce unequal workloads. The hard items also concentrate on the same few people, which a counter cannot see.

What is the best measure of workload?

Open items rather than assigned ones, weighted by category or historical time-to-close, and including unticketed work like on-call, reviews and mentoring.

What is wrong with routing purely by skill?

It is efficient and concentrating. The expert gets faster while everybody else stays put, and the coverage risk grows invisibly until that person is away.

How do I spread knowledge without slowing everything down?

Reserve a proportion of items for someone learning the area, with the expert available, and pair on the hard ones rather than reassigning them. Track coverage per area as a metric.

What should happen when a task stalls?

Detect no movement rather than no update, ask the holder privately first, then reassign on a defined clock with the original holder told. Never reassign silently.

What should never be assigned automatically?

Customer-visible work with a relationship attached, escalations, development-plan work, incident roles, and anything where the assignment itself carries a message.

What happens if assignment cannot be made?

Leave it unassigned in a visible queue. An unassigned item somebody can see is better than one assigned to the wrong person, where it sits quietly.

Can better routing fix an overloaded team?

No. It redistributes the same shortfall and makes understaffing look like a routing problem, which delays the actual conversation.

What can I learn from assignment data?

Which categories reassign most, where the queue ages by area rather than by person, who is the only person receiving a category, and each person's ratio of planned to interrupt work — which usually explains why somebody with a light queue finishes nothing.

Should assignment metrics be per person?

Share them with the team, not about them. These are facts about how work arrives; framing them as facts about individuals turns a useful report into a performance conversation.

Should people pull work instead of being assigned it?

For routine queues it often works better: the automation orders the queue rather than choosing a person, and work-in-progress limits do the balancing. Push assignment still fits anything with a deadline or a named owner.

What goes wrong with a pull model?

Unattractive work sits while pleasant items are taken. Ageing — where an item rises in priority as it waits — fixes most of it.

Get started today

Your first workflow is free to build.

Describe what you need. Cody handles the build, the connections, and the deployment.