Guide · Make.com · HubSpot · Slack

Round-robin lead assignment in Make

Short answer: Put Tools › Increment function with Reset a value set to Never on the route your new leads take. It returns 1, 2, 3, 4… one number per new lead, and keeps counting between runs. Then add a Router with one route per rep and a filter on the remainder: {{5.i mod 3}} Equal to (Numeric) 1 → Anna, 2 → Ben, 0 → Cara. Each route sets the HubSpot contact owner and mentions the rep in Slack. Repeat leads skip the counter, so they keep their owner. No data store, no code, and it works on the Make Free plan.

By Flowpaja · Published

This guide contains an affiliate link, marked “affiliate link”.

The Increment function counting new leads, a router with i mod 3 filters, and each lead assigned in turn to Anna, Ben or Cara
One counter, one route per rep: the remainder of i mod N decides who gets the next new lead.
Disclosure: everything in this guide works with plain Make.com and the apps it connects. At the end we mention our own Make templates and our Make scenario fix service on Fiverr. Module names, settings and limits were checked against Make's incremental variables help and Make's HubSpot CRM docs in October 2026. Menus and limits change, so check them if something looks different.

What you need

  • A scenario that already receives leads, for example from Google Forms, Typeform, Tally or Webflow
  • HubSpot, if you want the owner set in the CRM (any CRM with an owner field works the same way)
  • The reps' Slack member IDs if you want to @mention them (Slack profile → ⋯ → Copy member ID)

The scenario at a glance

Trigger → filter: email exists → HubSpot › Search for Contacts (Email equal to) → Router:

  • Existing contact → Update a Contact (owner untouched)
  • New contact → Tools › Increment function → Router, one route per rep → Create a Contact with that rep as owner → Slack › Send a Message mentioning the rep

Step 1: Separate new leads from repeat leads

Rotate only new people. Otherwise a returning lead is handed to whichever rep is next in line, not the one who already talked to them.

Add HubSpot CRM › Search for Contacts with the filter Email equal to the cleaned form email (lower(trim(...))), limit 1. Then a router:

  • Existing: contact ID exists → Update a Contact. Don't map the owner here.
  • New: contact ID does not exist → continue to Step 2.

Check that the search module continues when nothing is found; if it offers an option to continue the route even when there are no results, turn it on. Full details, and what to do when HubSpot still answers "Contact already exists", are in Fix HubSpot "Contact already exists" (409) in Make.

Step 2: Add the counter

On the New route, add Tools › Increment function and set Reset a value to Never.

The module outputs i. The first new lead gets 1, the next 2, and so on, across all future runs. (Since 1 October 2026 the only other option is After one scenario run, which restarts at 1 every run: with one lead per run, every lead would go to the same rep.)

Step 3: One route per rep

Add a Router after the counter, with one route per rep. On each route, click the wrench to set a filter:

RouteConditionOperatorValue
Anna{{5.i mod 3}}Equal to (Numeric operators)1
Ben{{5.i mod 3}}Equal to (Numeric)2
Cara{{5.i mod 3}}Equal to (Numeric)0

5.i is the Increment function's output (your module number may differ; click it in the mapping panel). mod is in the Math functions tab and returns the remainder after dividing: 4 mod 3 = 1, so lead 4 goes back to Anna. For two reps use mod 2 with values 1 and 0; for four reps use mod 4 with 1, 2, 3 and 0.

Switch the operator from the default Text Equal to to the Numeric one. That's the setting Make's own example uses.

Step 4: Assign and notify

On each route add:

  1. HubSpot CRM › Create a Contact with the lead's fields and the Contact owner set to that rep (HubSpot's internal property name is hubspot_owner_id).
  2. Slack › Send a Message to your leads channel: New lead for <@U0123ABCD>: {{name}}, {{company}}, {{email}}, where U0123ABCD is the rep's member ID. Slack turns it into a mention.

Yes, that's the same two modules copied on each route. It keeps every route readable, and copies cost nothing extra because only one route runs per lead.

Step 5: Test with fictional leads

Click Run once and send four new test emails, then the first one again:

TestExpected
lead1@example.comAnna
lead2@example.comBen
lead3@example.comCara
lead4@example.comAnna
lead1@example.com againExisting route: contact updated, owner still Anna, counter unchanged

Test leads move the counter too. That's harmless: real leads simply continue the rotation from where the tests stopped.

Common problems

ProblemCauseFix
Every lead goes to the same repReset a value is After one scenario run, so the counter restarts at 1 each runSet it to Never
Some leads go nowhereA remainder has no route (for example mod 3 but routes only for 1 and 2)One route per remainder, including 0
Filter never matchesText operator compares "1" as textUse the Numeric Equal to
Returning leads change ownerThe counter sits before the new/existing splitMove it onto the New route

If your trigger is a webhook, turn on Process data in order in the scenario settings so leads are counted one at a time, in the order they arrived (webhook runs are parallel by default). With it on, a failed run stored as an incomplete execution holds the queue until you resolve it, so add an error handler with a Slack alert on the HubSpot modules.

Changing the team

  • Add a rep: change every filter to mod 4 and add a fourth route with value 3 (the others stay 1, 2 and 0). The counter keeps counting, so the rotation stays even from the next lead on.
  • Someone's on holiday: point their route at a backup rep for that week. Don't delete the route, or their share of leads goes nowhere.
  • Weighted rotation: give a rep two remainders, for example mod 4 with Anna on 1 and 3, Ben on 2 and Cara on 0. Anna gets half the leads.

If you need more than this, such as skipping reps marked "away" in a sheet, or one shared rotation used by two scenarios, store the position in a Data store instead: Get a Record for the current position, route on it, then Update a Record with the next position (turn on Insert missing record for the first run). The Free plan includes 1 MB of data storage, enough for one data store.

Credits

PathCredits
New lead: trigger, search, counter, create, Slack5
Repeat lead: trigger, search, update3

Routers and filters are free. A scheduled trigger also uses 1 credit per check when nothing is new; see the Make credits calculator.

Templates

Lead Router ($19) does not assign owners or rotate leads. It sends Google Form leads to HubSpot with an exact-email check (create or update), posts $10k+ budgets to #sales-hot and the rest to #leads, and alerts #automation-alerts when a step fails. 30-day money-back guarantee.

No Make account yet? Create a free Make account (affiliate link). Flowpaja may earn a commission if you sign up through it, at no extra cost to you.

FAQ

Can I rotate without HubSpot?
Yes. Replace the HubSpot modules with a Google Sheets › Add a Row that writes the rep's name into an Owner column, or just the Slack mention.
Can I balance by open deals instead of taking turns?
Not with a counter. You'd need to count each rep's open deals first, which is a different and more expensive scenario.
Does Lead Router do round-robin?
No. See below.

Rotation skipping reps?

Send the exported blueprint and the failed run's error text to our Make scenario fix service on Fiverr. No logins needed.

Stuck on an error in your own Make scenario? Make scenario fix / debugging on Fiverr, from $25: send the exported blueprint and a description of the error, no logins needed.

← All guides · All templates

Make, HubSpot, Slack, Google, Google Forms, Typeform, Tally and Webflow are trademarks of their owners. Flowpaja is independent and not affiliated with or endorsed by them. Menus, limits and prices change; check the providers' current help.