Round-robin route HubSpot leads and notify reps in Slack using Make

medium complexityCost: $10-29/mo

Prerequisites

Prerequisites
  • Make account (Core plan or higher recommended)
  • HubSpot connection configured in Make via OAuth
  • Slack connection configured in Make
  • A Make Data Store for round-robin state
  • A mapping of HubSpot owner IDs to Slack user IDs

Why Make?

Make is a good visual option for round-robin routing at a lower price point than Zapier ($10.59/mo vs $29.99/mo). The built-in Data Store handles counter persistence without external services, and the scenario builder makes the routing logic transparent. The main trade-off is more modules to configure than n8n — the Data Store read/write adds extra steps.

For teams processing under 200 leads/month, Make's free plan (1,000 credits) covers it.

How it works

  • Watch Contacts fires when a new contact appears in HubSpot
  • Filter skips contacts that already have an assigned owner
  • Data Store reads and increments the round-robin counter
  • Switch/Set Variable maps the counter to the next rep's IDs
  • Update Contact sets the hubspot_owner_id in HubSpot
  • Slack Create a Message DMs the assigned rep

Step 1: Create a Data Store for the counter

Before building the scenario, create a Data Store to persist the round-robin index:

  1. Go to Data Stores in the left sidebar
  2. Click Add data store
  3. Name it round_robin_state
  4. Add a record structure with one field: counter (Number)
  5. Add an initial record with counter = 0
Why a Data Store?

Make scenarios are stateless. The Data Store persists a value across scenario runs -- exactly what's needed for tracking which rep is next in the rotation.

Step 2: Add a Watch Contacts trigger

Create a new scenario. Add a HubSpot CRM -> Watch Contacts module:

  • Connection: Your HubSpot OAuth connection
  • Watch: New contacts
  • Limit: 10
  • Properties: Select firstname, lastname, email, company, jobtitle, hubspot_owner_id

Step 3: Filter out already-assigned contacts

Add a Filter between the trigger and the next module:

  • Condition: hubspot_owner_id -> Does not exist (is empty)

Step 4: Read and update the round-robin counter

Add a Data Store -> Get a Record module:

  • Data Store: round_robin_state
  • Key: Your record ID

Then add a Tools -> Set Variable module to calculate the assigned rep:

  • Variable name: repIndex
  • Value: {{1.counter % 4}} (replace 4 with the number of reps)

Add a Data Store -> Update a Record module to increment:

  • counter: {{1.counter + 1}}

Step 5: Map rep index to owner and Slack IDs

Add a Tools -> Switch module (or a Code module) to map the index to rep details:

IndexRepHubSpot Owner IDSlack User ID
0Alice12345678U01AAAA
1Bob23456789U02BBBB
2Carol34567890U03CCCC
3Dave45678901U04DDDD

For each case, set variables: repName, hubspotOwnerId, slackUserId.

Switch vs. Code module

Make's Switch module works for a small team (under 8 reps). For larger teams, use a JavaScript Code module with an array lookup -- it's easier to maintain than a long switch with many cases.

Step 6: Update the contact owner in HubSpot

Add a HubSpot CRM -> Update a Contact module:

  • Contact ID: {{1.id}} (from the Watch Contacts trigger)
  • Contact Owner: {{hubspotOwnerId}}

Step 7: Send a Slack DM

Add a Slack -> Create a Message module:

  • Connection: Your Slack connection
  • Channel ID: {{slackUserId}} (DM by user ID)
  • Text:
🆕 *New Lead Assigned to You*
*{{1.firstname}} {{1.lastname}}* — {{1.jobtitle}} at {{1.company}}
Email: {{1.email}}
<https://app.hubspot.com/contacts/YOUR_PORTAL_ID/contact/{{1.id}}|View in HubSpot>

Step 8: Schedule and activate

  • Set the scenario schedule to Immediately (processes as soon as HubSpot emits the event)
  • Toggle the scenario to Active

Troubleshooting

Common questions

Can I use a Google Sheet instead of a Data Store for the counter?

Yes, but it's slower — each Google Sheet read/write uses additional credits and adds latency. The Data Store is purpose-built for this kind of small persistent state. Use a Google Sheet only if you want a human-readable audit trail of counter changes.

What happens if a rep is removed from the team?

Update the Switch module to remove their case and adjust the modulo divisor. The counter will skip the removed index and continue cycling through the remaining reps. No leads are lost — the worst case is one round of slightly uneven distribution while the counter catches up.

How does Make handle multiple leads arriving at the same time?

Make processes items sequentially within an execution cycle. If 3 leads arrive in the same poll, they're processed one at a time — each gets a different rep. The Data Store read/write is sequential within a scenario run, so there's no race condition within a single execution.

Cost

  • Free plan: 1,000 credits/month. Each new lead uses ~5 credits (trigger + data store read/write + HubSpot update + Slack). Handles ~200 leads/month on free.
  • Core plan: $10.59/mo for 10,000 credits. Handles ~2,000 leads/month.

Looking to scale your AI operations?

We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.