> ## Documentation Index
> Fetch the complete documentation index at: https://80x.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Inbound routing by territory and seniority

> Route every inbound demo request to the right rep in seconds, matched on region and seniority. Then set the owner, a first-touch task, and a Slack alert.

Route every inbound demo request to the right rep in seconds, matched on region and seniority. Then set the owner, a first-touch task, and a Slack alert. A lead is a new person who fills out your demo form. When that lead lands on your inbound list, this workflow starts on [Record added to list](/reference/triggers/record-added-to-list).

From there, it screens out noise with a [Filter](/reference/conditions/filter). It then branches on territory with a [Switch](/reference/conditions/switch), and branches again on seniority. Next, it picks a rep with [Round robin](/reference/workspace/round-robin). Finally, it writes the owner with [Update record](/reference/records/update-record), books the first call with [Create task](/reference/tasks/create-task), and direct-messages that rep over Slack. Speed-to-lead drops from hours to seconds, and the right rep owns every demo request.

| | |
| - | - |
| **Difficulty** | Starter |
| **Time to build** | \~10 minutes |
| **Trigger** | [Record added to list](/reference/triggers/record-added-to-list) |
| **Blocks used** | [Filter](/reference/conditions/filter), [Switch](/reference/conditions/switch), [Round robin](/reference/workspace/round-robin), [Update record](/reference/records/update-record), [Create task](/reference/tasks/create-task), [Slack](/reference/integrations) |
| **Credit cost per run** | \~3 credits for a qualified lead |
| **Plan required** | Plus and above |

## Prerequisites

* An Attio plan of Plus or above, running the Workflows engine (June 2026 and later).
* A connected Slack integration with a channel or direct message the workflow can post to.
* A People object whose inbound records carry a `country` (or `region`) attribute and a `job_title` attribute.
* A `territory` single-select attribute on People with the options EMEA, AMER, and APAC.
* An inbound list, for example Demo requests, that new leads land on from your form or webhook.
* Two or more Attio users assigned to each territory-and-tier pool you plan to route to.

## How it works

The trigger fires the moment a record joins your inbound list. That scopes each run to a genuinely new lead, not to every edit on a person. A [Filter](/reference/conditions/filter) then drops records that are not real inbound demo requests. A condition that stops a run is free, so the Filter screens out noise before any write happens.

Next, a [Switch](/reference/conditions/switch) reads the country or region field and sends the run down an EMEA, AMER, or APAC branch. A second Switch on each path separates senior titles from the rest. Senior titles are vice president (VP), director, and head. Splitting on seniority means your strongest reps get the named-account leads.

Finally, [Round robin](/reference/workspace/round-robin) picks one rep from the matched pool. Round robin shares leads evenly across a list of reps, handing each new one to the next rep in turn. Three writes then finish the job.

The blocks run in this order:

1. [Record added to list](/reference/triggers/record-added-to-list): a lead joins the inbound list.
2. [Filter](/reference/conditions/filter): keep only real demo requests.
3. [Switch](/reference/conditions/switch): branch on territory (EMEA, AMER, or APAC).
4. [Switch](/reference/conditions/switch): branch on seniority within the territory.
5. [Round robin](/reference/workspace/round-robin): pick a rep from the matched pool.
6. [Update record](/reference/records/update-record): set the owner and territory.
7. [Create task](/reference/tasks/create-task): schedule the first touch.
8. [Slack](/reference/integrations): alert the assigned rep.

## Build steps

<Steps>
  <Step title="Add the trigger">
    Create a new workflow and add [Record added to list](/reference/triggers/record-added-to-list) as the trigger. Point it at your inbound list. Do not use [Record updated](/reference/triggers/record-updated) for this build. That trigger fires on every edit to a person, so it re-routes leads that already have an owner.

    | Field | Value |
    | - | - |
    | Trigger | Record added to list |
    | List | Demo requests |
    | Object | People |
  </Step>

  <Step title="Filter to real inbound">
    Add a [Filter](/reference/conditions/filter) so the workflow acts only on genuine demo requests. A condition that stops the run is free. Use it to screen out test entries, internal emails, and rows missing a territory before any write happens.

    | Field | Value |
    | - | - |
    | Condition 1 | `lead_source` is `Demo request` |
    | Condition 2 | `email` does not contain `acme.com` (your own domain) |
    | Condition 3 | `country` is not empty |
    | Match | All conditions |
  </Step>

  <Step title="Switch on territory">
    Add a [Switch](/reference/conditions/switch) that reads the country or region field and creates one branch per territory. Map each set of countries to a branch label.

    | Field | Value |
    | - | - |
    | Switch on | `country` |
    | Branch: EMEA | United Kingdom, Germany, France, Spain, United Arab Emirates |
    | Branch: AMER | United States, Canada, Brazil, Mexico |
    | Branch: APAC | Australia, Singapore, Japan, India |
    | Default branch | EMEA, or your fallback pool |
  </Step>

  <Step title="Switch on seniority">
    On each territory branch, add a nested [Switch](/reference/conditions/switch) that reads the job title. Use a [Filter](/reference/conditions/filter) instead if you only need a senior-or-standard split. Both blocks are free.

    | Field | Value |
    | - | - |
    | Switch on | `job_title` |
    | Branch: Senior | title contains `VP`, `Director`, or `Head` |
    | Branch: Standard | everything else |
  </Step>

  <Step title="Round robin within the pool">
    On each seniority branch, add a [Round robin](/reference/workspace/round-robin) and list only the reps who own that territory and tier. Round robin is free and returns one user.

    | Field | Value |
    | - | - |
    | Pool: EMEA Senior | Priya Sharma, Tomás Alvarez |
    | Pool: EMEA Standard | Lena Fischer, Marco Rossi |
    | Output | `assigned_rep`, a user reference |
  </Step>

  <Step title="Update the record">
    Add an [Update record](/reference/records/update-record) that writes the owner and territory back to the lead. This is the first write, so it costs 1 credit.

    | Field | Value |
    | - | - |
    | Record | Trigger record |
    | `owner` | `assigned_rep`, from Round robin |
    | `territory` | `EMEA`, the matched branch label |
  </Step>

  <Step title="Create the first-touch task">
    Add a [Create task](/reference/tasks/create-task) so the rep has a concrete next action. This costs 1 credit.

    | Field | Value |
    | - | - |
    | Title | First touch: Priya Sharma, demo request |
    | Assignee | `assigned_rep` |
    | Linked record | Trigger record |
    | Due | Today |
  </Step>

  <Step title="Slack the owner">
    Add the [Slack](/reference/integrations) block to alert the assigned rep. This costs 1 credit.

    | Field | Value |
    | - | - |
    | Destination | Direct message to `assigned_rep` |
    | Message | New EMEA demo request assigned to you: Priya Sharma (VP Marketing, acme.com). The first-touch task is due today. |
  </Step>
</Steps>

## Variable mapping

| Variable | Source block | Field | Example value |
| - | - | - | - |
| `lead_email` | Record added to list | `email` | `jane@acme.com` |
| `lead_country` | Record added to list | `country` | `Germany` |
| `lead_title` | Record added to list | `job_title` | `VP Marketing` |
| `territory` | Switch (territory) | branch label | `EMEA` |
| `seniority` | Switch (seniority) | branch label | `Senior` |
| `assigned_rep` | Round robin | selected user | `Priya Sharma` |

## Credit cost worked example

The trigger, both [Switch](/reference/conditions/switch) blocks, the [Filter](/reference/conditions/filter), and [Round robin](/reference/workspace/round-robin) are free logic blocks, so they never consume credits. Only the three writes cost. That is [Update record](/reference/records/update-record) (1) plus [Create task](/reference/tasks/create-task) (1) plus [Slack](/reference/integrations) (1), which equals **3 credits per qualified lead**.

At 400 inbound demo requests a month, that is 400 × 3 = **1,200 credits per month**. A lead that the Filter in step 2 stops costs 0 credits, so your real spend tracks qualified inbound rather than raw form fills. Check that monthly figure against your plan allowance on [Credits & pricing explained](/reference/credits-and-pricing).

## Test plan

1. In your form or test tool, submit a demo request for `jane@acme.com`, country `Germany`, title `VP Marketing`, source `Demo request`. The lead lands on the Demo requests list and fires the trigger.
2. Open the run in run history and confirm the **Filter** passed, with all three conditions matched.
3. Confirm the territory **Switch** took the EMEA branch and the seniority **Switch** took the Senior branch.
4. Confirm **Round robin** returned one EMEA Senior rep, for example Priya Sharma. Confirm that the same name appears in the **Update record**, **Create task**, and **Slack** steps.
5. Verify the lead's `owner` and `territory` are set, a task is due today, and a Slack direct message arrived.
6. Submit a deliberately failing input: a lead with `country` empty and source `Newsletter`. The step 2 Filter stops the run, and run history shows it halted at the Filter with zero writes and zero credits.

## Failure modes

| Symptom | Cause | Fix |
| - | - | - |
| Leads re-route after every edit | The trigger is Record updated, which fires on any change | Switch the trigger to Record added to list, or scope it to a change on a specific attribute |
| The run lands on the Default branch | The country value is not in any territory mapping | Add the country to the right branch, or normalize the field before the Switch |
| Round robin returns no rep | The matched pool is empty, or every user in it is out of seat | Populate each territory-and-tier pool with at least one active user |
| The Slack step fails | The Slack integration is disconnected, or the channel was removed | Reconnect Slack and reselect the destination |
| An existing lead's owner gets overwritten | The Filter does not exclude records that already have an owner | Add `owner is empty` to the step 2 Filter |

## Variations

### Routing by ICP score instead of seniority

Replace the seniority [Switch](/reference/conditions/switch) with one that reads an `icp_score` attribute. ICP stands for ideal customer profile, a score of how well a lead matches the kind of customer you want. Branch high scores to your senior pool and the rest to the standard pool. Everything downstream stays the same.

### Emailing the owner instead of Slack

Swap the [Slack](/reference/integrations) block for a [Send HTTP request](/reference/utilities/send-http-request) to your email provider, or enroll the rep in a notification via [Enroll in sequence](/reference/sequences/enroll-in-sequence). Both are 1-credit writes, so the per-lead cost is unchanged.

## See also

* [Round-robin lead routing](/guides/route-and-sequence/round-robin-routing)
* [Conditions & filters](/explanation/conditions-and-filters)
* [Switch](/reference/conditions/switch)
* [Round robin](/reference/workspace/round-robin)
* [Attio: Workflows](https://attio.com/help/apps/other-apps/workflows)

***

*Source: [Attio Help Center: Workflows](https://attio.com/help/apps/other-apps/workflows) and [Attio Help Center: Assign records and tasks](https://attio.com/help/workflows). Last reviewed against the Attio Help Center, June 2026.*


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.