Skip to content

Round-robin ticket assignment by team/queue

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: Service Hub Professional.

Per-hub plans: also Marketing Hub ProfessionalUpdated for HubSpot seat pricing
OutcomeNew tickets are split into queues by pipeline or category and each queue rotates assignment evenly across its rep pool, so no ticket sits unowned.
Workflow maptickets-sla-001
Ticket created, queue known leads to Ticket queue value?. Ticket queue value? leads to billing: Rotate to Billing pool; technical: Rotate to Technical pool; general: Rotate to General pool; blank / unknown: Notify support ops + add to Needs manual triage list. Rotate to Billing pool leads to Set routed date, notify new owner. Rotate to Technical pool leads to Set routed date, notify new owner. Rotate to General pool leads to Set routed date, notify new owner. billing technical general blank / unknown Ticket created, queue known Ticket queue value? Rotate to Billing pool Rotate to Technical pool Rotate to General pool Notify support ops + add to Needs manual triage list Set routed date, notify new owner
Ticket created, queue known leads to Ticket queue value?. Ticket queue value? leads to billing: Rotate to Billing pool; technical: Rotate to Technical pool; general: Rotate to General pool; blank / unknown: Notify support ops + add to Needs manual triage list. Rotate to Billing pool leads to Set routed date, notify new owner. Rotate to Technical pool leads to Set routed date, notify new owner. Rotate to General pool leads to Set routed date, notify new owner. blank / unknown Ticket created, queue known Ticket queue value? billing Rotate to Billing pool technical Rotate to Technical pool general Rotate to General pool Notify support ops + add to Needs manual triage list Set routed date, notify new owner

When to use it, when not to

Use it

  • Use it when support has 2+ reps per queue (billing, technical, general) and tickets currently get triaged by hand.
  • Use it when tickets come in faster than a manager can eyeball and assign them one by one.

Skip it

  • Do not use it if a queue has a single rep. Use a plain Set property value (ticket owner) action instead, see Variants.
  • Do not use it for VIP or named accounts that need a fixed owner. Exclude those first with a list-based suppression, see tickets-sla-020.

Prerequisites

Needs Service 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: Ticket queue (internal name ticket_queue), object ticket, field type dropdown select, options matching your queues (for example billing, technical, general). Why: this is the field the branch logic reads. Populate it via a support form hidden field, a chatflow routing question, or a workflow that infers it from subject/category (see tickets-sla-007 or tickets-sla-023 for the classification logic upstream of this workflow).
  • A rotation pool per queue: either an active HubSpot Team per queue, or a manually maintained list of reps. Why: Rotate record to owner needs a defined, static set of owners to rotate across.
  • Confirm every rep in a rotation pool has an active seat. A deactivated rep in the list is skipped by the rotate record owner action and shows with a red border in routing rules, so the rotation keeps working on the remaining active seats (https://knowledge.hubspot.com/user-management/remove-hubspot-users).
  • A connected support inbox and at least one ticket pipeline already in use, so tickets exist to test against.
  • Property: Ticket routed date (internal name ticket_routed_date), object ticket, field type date picker. Why: it stamps the moment a ticket was routed, used for SLA timing and rotation reporting.

Enrollment

Trigger typeevent-based.
CriteriaTicket created AND Ticket queue is known (value present).
Re-enrollmentoff. A ticket should not re-roll owner assignment every time an unrelated property changes; unintended reassignment mid-conversation confuses the customer and the rep.
Suppressionstatic list VIP accounts - manual ticket assignment excluded via enrollment filter Associated company not in list.

Steps

  1. If/then branch: Ticket queue is billing
    • Rotate record to owner: pool = Billing team rotation
    • Set property value: Ticket routed date = current date
    • Send internal email notification to: ticket owner, subject "New ticket assigned: {{ticket.subject}}"
  2. If/then branch: Ticket queue is technical
    • Same 3 actions as above, pool = Technical team rotation
  3. If/then branch: Ticket queue is general
    • Same 3 actions as above, pool = General team rotation
  4. Else branch (queue unknown or blank)
    • Send internal email notification to support ops distribution owner: "Ticket with no queue value: {{ticket.hs_object_id}}"
    • Add to static list: "Needs manual triage"

Known pitfalls

  • Rotate record to owner rotates evenly at the moment it fires. Adding or removing a rep from a pool does not rebalance tickets already assigned.
  • If Ticket queue is set by a chatflow routing question, it only fires for chat-originated tickets. Email and form-originated tickets need a separate classification step upstream, or they land in the Else branch.
  • Re-enrollment left on will re-roll an already-assigned, already-worked ticket to a new owner the next time queue is edited. Keep it off unless reassignment is the intent.
  • Rotation pools built as manual lists do not update when someone joins or leaves the team. Review membership monthly, or use an active HubSpot Team as the pool where the tier allows it.
  • Business hours are not applied automatically. A ticket created at 2 a.m. still rotates immediately unless you add a business-hours condition, see tickets-sla-016.

Test plan

  1. Create 3 test tickets, one per queue value, via the support form or by setting the property manually.
  2. Open workflow history (Automation > Workflows > this workflow > History tab) and confirm each ticket enrolled within a minute.
  3. Check each ticket record's timeline for the owner assignment event and confirm it matches the expected pool.
  4. Confirm the internal email notification arrived in the assigned rep's inbox.
  5. Create one ticket with Ticket queue left blank and confirm it lands in the "Needs manual triage" list with the ops notification sent.

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 queue: replace Rotate record to owner with Set property value (ticket owner = fixed rep).
  • Chat-originated tickets only: trigger on Ticket created filtered to Ticket source = Chat, skip the queue property and route directly by chatflow inbox.
  • Weighted by current open-ticket load instead of even split: see the weighted rotation pattern in lead-routing-014.

Build spec

Build specYAML, swipe
trigger:
  type: event-based
  event: ticket_created
  criteria:
    - ticket_queue: is_known
  reenrollment: false
  suppression_list: "VIP accounts - manual ticket assignment"
branches:
  - condition: ticket_queue == "billing"
    actions:
      - type: rotate_record_to_owner
        pool: "Billing team rotation"
      - type: set_property_value
        property: ticket_routed_date
        value: current_date
      - type: send_internal_email_notification
        to: ticket_owner
        subject: "New ticket assigned: {{ticket.subject}}"
  - condition: ticket_queue == "technical"
    actions: [same_as_above, pool: "Technical team rotation"]
  - condition: ticket_queue == "general"
    actions: [same_as_above, pool: "General team rotation"]
  - condition: else
    actions:
      - type: send_internal_email_notification
        to: support_ops_owner
        subject: "Ticket with no queue value: {{ticket.hs_object_id}}"
      - type: add_to_static_list
        list: "Needs manual triage"

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.

tickets-sla-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.