Skip to content

Round-robin lead assignment by territory

One of 565 written HubSpot workflow specs, by a collective of independent HubSpot consultants.

Free
Professional

Seat pricing: Professional edition. To build it, a GTM Seat or an Ops Seat (an Ops Seat cannot create marketing emails or sequences). Per-hub plans: Sales Hub Professional.

Per-hub plans: also Marketing Hub ProfessionalUpdated for HubSpot seat pricing
OutcomeNew leads are split into territory groups and each group is assigned to the right owner pool in round-robin order, with no manual triage.
Workflow maplead-routing-001
Contact created / Territory set leads to Territory value?. Territory value? leads to north-america: Rotate to NA pool; emea: Rotate to EMEA pool; apac: Rotate to APAC pool; blank / unknown: Notify sales ops + add to Needs manual routing list. Rotate to NA pool leads to Set routed date, notify owner, create call task. Rotate to EMEA pool leads to Set routed date, notify owner, create call task. Rotate to APAC pool leads to Set routed date, notify owner, create call task. north-america emea apac blank / unknown Contact created / Territory set Territory value? Rotate to NA pool Rotate to EMEA pool Rotate to APAC pool Notify sales ops + add to Needs manual routing list Set routed date, notify owner, create call task
Contact created / Territory set leads to Territory value?. Territory value? leads to north-america: Rotate to NA pool; emea: Rotate to EMEA pool; apac: Rotate to APAC pool; blank / unknown: Notify sales ops + add to Needs manual routing list. Rotate to NA pool leads to Set routed date, notify owner, create call task. Rotate to EMEA pool leads to Set routed date, notify owner, create call task. Rotate to APAC pool leads to Set routed date, notify owner, create call task. blank / unknown Contact created / Territory set Territory value? north-america Rotate to NA pool emea Rotate to EMEA pool apac Rotate to APAC pool Notify sales ops + add to Needs manual routing list Set routed date, notify owner, create call task

When to use it, when not to

Use it

  • Use it when the sales team is split by geography (country, state, or region) and each territory has its own pool of 2+ reps.
  • Use it when leads currently sit unassigned for hours because a manager triages them by hand.

Skip it

  • Do not use it if only one rep exists per territory. Use a simple Set property value (owner) action instead, see Variants.
  • Do not use it for named/strategic accounts that need a fixed owner. Exclude those with a list-based suppression, see lead-routing-011.

Prerequisites

Needs Sales Hub Professional and Marketing Hub Professional.

On per-hub plans, one of its steps belongs to another subscription: add to static list needs Marketing Hub Professional. Both are required to build it as written. On seat pricing the edition covers both.

  • Property: Territory (internal name territory), object contact, field type dropdown select, options matching your sales regions (for example north-america, emea, apac). Why: this is the field the branch logic reads. Populate it via form hidden field, lifecycle enrichment, or a country-to-territory lookup (see lead-routing-033 for the postal/zip variant).
  • Active HubSpot Teams or manually built owner rotation lists per territory, one per branch. Why: Rotate record to owner needs an explicit, static list of owners to rotate across.
  • Confirm every rep listed in a rotation pool has a seat and is set to active. Deactivated reps break the rotation, see lead-routing-012.
  • A test contact per territory value, for the test plan.
  • Property: Lead routed date (internal name lead_routed_date), object contact, field type date picker. Why: it stamps the moment a lead was routed, used for SLA timing and rotation reporting.

Enrollment

Trigger typeevent-based.
CriteriaContact was created OR Territory has been set with a value present (is known). Add a filter Lifecycle stage is not customer to keep existing customers out of new-lead routing.
Re-enrollmentoff. A contact should not re-roll the dice every time a property changes; reassigning an active lead mid-cycle causes handoff confusion.
Suppressionstatic list Do not auto-route - named accounts excluded via enrollment trigger Not in list.

Steps

  1. If/then branch: Territory is north-america
    • Rotate record to owner: pool = NA rep list (round-robin, evenly distributed)
    • Set property value: Lead routed date = current date
    • Send internal email notification to: record owner, subject "New lead assigned: {{contact.firstname}} {{contact.lastname}}"
    • Create task: type "Call", title "First contact - {{contact.firstname}}", due in 1 business day, assigned to record owner
  2. If/then branch: Territory is emea
    • Same 4 actions as above, pool = EMEA rep list
  3. If/then branch: Territory is apac
    • Same 4 actions as above, pool = APAC rep list
  4. Else branch (territory unknown or blank)
    • Send internal email notification to sales ops distribution owner: "Lead with no territory value: {{contact.hs_object_id}}"
    • Add to static list: "Needs manual routing"

Known pitfalls

  • Rotate record to owner rotates evenly across the list at the moment the action runs. Adding or removing a rep from the list does not retroactively rebalance past assignments.
  • If a rep is deactivated but stays in the rotation list, the action simply skips them: deactivated users are skipped by the rotate record owner action and are removed as options when setting the owner of a record (https://knowledge.hubspot.com/user-management/remove-hubspot-users).
  • Hidden form fields that set Territory only fire on form submission. Leads created via import or API will not get a territory unless you also branch on country/company properties.
  • Re-enrollment left on will re-roll an already-assigned, already-contacted lead to a new owner the next time territory is edited. Keep it off unless you explicitly want reassignment behavior (see lead-routing-005).
  • Round-robin pools defined as static lists do not auto-update when someone joins the team. Review pool membership quarterly.

Test plan

  1. Create 3 test contacts, one per territory value, using the actual form or by manually setting the property.
  2. Open workflow history (Automation > Workflows > this workflow > History tab) and confirm each contact enrolled within a minute.
  3. Check each contact's record timeline for the "Owner changed" event and confirm it matches the expected pool.
  4. Confirm the internal email notification arrived in the assigned owner's inbox.
  5. Confirm the call task appears in the owner's task queue with the correct due date.

The UAT script of this spec holds 5 cases: a negative case, one case per branch, the expected result of each and a sign-off sheet. It comes as Markdown and as a CSV for your spreadsheet.

Variants

  • Single rep per territory: replace Rotate record to owner with Set property value (owner = fixed rep) per branch.
  • Company-level routing instead of contact-level: same structure, object = company, trigger on Company was created.
  • Weighted rotation by rep capacity instead of even split: see lead-routing-014.

Build spec

Build specYAML, swipe
trigger:
  type: event-based
  event: contact_created_or_property_changed
  property: territory
  criteria:
    - territory: is_known
    - lifecycle_stage: not_equal customer
  reenrollment: false
  suppression_list: "Do not auto-route - named accounts"
branches:
  - condition: territory == "north-america"
    actions:
      - type: rotate_record_to_owner
        pool: "NA rep rotation list"
      - type: set_property_value
        property: lead_routed_date
        value: current_date
      - type: send_internal_email_notification
        to: record_owner
        subject: "New lead assigned: {{contact.firstname}} {{contact.lastname}}"
      - type: create_task
        task_type: call
        title: "First contact - {{contact.firstname}}"
        due: +1_business_day
        assigned_to: record_owner
  - condition: territory == "emea"
    actions: [same_as_above, pool: "EMEA rep rotation list"]
  - condition: territory == "apac"
    actions: [same_as_above, pool: "APAC rep rotation list"]
  - condition: else
    actions:
      - type: send_internal_email_notification
        to: sales_ops_owner
        subject: "Lead with no territory value: {{contact.hs_object_id}}"
      - type: add_to_static_list
        list: "Needs manual routing"

Files and install

FileWhat it holds
PDF and MarkdownThe spec as you read it here, with the YAML build spec at the end.
Properties JSONCreates the fields in one API call.
Workflow JSONDocuments the build: the workflow in Automation API v4 format, switched off.
UAT scriptThe test cases, the expected results and a sign-off sheet, as Markdown and CSV.

Take the PDF and build it by hand. One-click install comes with a category pack or the full library.

Get the 12 free specs as a pack

Nothing deleted, enabled or enrolled.

lead-routing-001Spec version 2026-09

Read 12 complete specs before you pay.

One per category, same format as the paid ones. Email only, no card.

We email the link, then a short note when specs change. Nothing else.

All 12 free specs by email, no card.