Intermediate~20 min setupCommunication & SupportVerified April 2026
Slack logo
Help Scout logo

How to Send Help Scout Ticket Assignments to Slack with n8n

When a Help Scout conversation is assigned to a team member, n8n sends a Slack DM or channel message to that person with the ticket subject, customer name, and a direct link.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Support teams of 5–30 agents who live in Slack and miss Help Scout assignment emails or in-app notifications.

Not ideal for

Teams using Help Scout's built-in notification emails and already responding within SLA — adding Slack noise on top creates duplicate alerts.

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 12-person SaaS support team routes tickets by product area — billing, onboarding, and technical — and each agent covers a different queue. Before this workflow, agents found out they'd been assigned a ticket by refreshing Help Scout or waiting for an email that arrived 5–10 minutes late. With the n8n webhook firing in under 30 seconds, agents get a Slack DM the moment a ticket lands in their queue, including the customer's name, subject line, and a one-click link to open the conversation.

What Will This Cost?

Drag the slider to your expected monthly volume.

/mo
505005K50K

Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.

Prices shown for annual billing. Based on published pricing as of April 2026.

Estimated ROI

1000

min saved/mo

$583

labor value/mo

Free

no platform cost

Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.

Implementation

Skip the setup

Import this workflow directly into n8n

Copy the pre-built n8n blueprint and paste it straight into n8n. All modules, filters, and field mappings are already configured — you just need to connect your accounts.

Before You Start

Make sure you have everything ready.

Help Scout admin access to create webhooks under Manage > Integrations
A Slack app with scopes: chat:write, im:write, and users:read.email — installed to your workspace
Your Slack bot token (starts with xoxb-) saved as a credential in n8n
n8n instance running and accessible via a public URL (self-hosted on a server with HTTPS, or n8n Cloud) — localhost won't receive Help Scout webhooks
All Help Scout agents using the same email address in both Help Scout and Slack

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Assignee Emailbody.assignedTo.email
Conversation IDbody.conversation.id
Ticket Subjectbody.conversation.subject
7 optional fields▸ show
Assignee First Namebody.assignedTo.firstName
Assignee Last Namebody.assignedTo.lastName
Customer Namebody.conversation.customer.fullName
Customer Emailbody.conversation.customer.email
Mailbox IDbody.conversation.mailboxId
Conversation Statusbody.conversation.status
Created Atbody.conversation.createdAt

Step-by-Step Setup

1

n8n Canvas > + New Workflow

Create a new workflow in n8n

Open your n8n instance and click the '+ New Workflow' button in the top right of the canvas. Give the workflow a name like 'Help Scout → Slack Assignment Alerts' so it's easy to find later. You'll start with an empty canvas — the first node you add will be the trigger. n8n saves automatically, but the workflow won't run until you activate it in the final step.

  1. 1Click '+ New Workflow' in the top-right corner
  2. 2Click the workflow title at the top and rename it to 'Help Scout → Slack Assignment Alerts'
  3. 3Click the '+' node button in the center of the empty canvas to add your first node
What you should see: You should see a blank canvas with the workflow name updated at the top and the node picker open.
2

Canvas > Add Node > Webhook

Add the Webhook trigger node

In the node picker, search for 'Webhook' and select it. n8n will generate a unique webhook URL — copy this, you'll need it in Help Scout. Set the HTTP Method to POST and leave Authentication set to None for now. n8n provides two URLs: a 'Test URL' that only works when you're actively listening in the editor, and a 'Production URL' that fires when the workflow is active. Use the Test URL during setup.

  1. 1Type 'Webhook' in the node search box and click the Webhook node
  2. 2Set HTTP Method to 'POST'
  3. 3Copy the 'Test URL' shown in the node panel — you'll paste it into Help Scout next
What you should see: The Webhook node appears on the canvas with a generated URL visible in the node panel. The node shows 'Waiting for test event' when you click 'Listen for Test Event'.
Common mistake — Do not use the Production URL during testing. Help Scout will fire real events at it, but n8n won't capture test data unless you're actively listening on the Test URL.
n8n
+
click +
search apps
Slack
SL
Slack
Add the Webhook trigger node
Slack
SL
module added
3

Help Scout > Manage > Integrations > Webhooks > Create Webhook

Register the webhook in Help Scout

In Help Scout, go to Your Profile > My Apps > Webhooks (or if you're an admin, Manage > Integrations > Webhooks). Click 'Create Webhook', paste the n8n Test URL into the URL field, and set a Secret Key — save this value, you can use it later to validate payloads. Under Events, check 'Conversation Assigned'. Leave all other events unchecked to avoid flooding n8n with irrelevant payloads. Click Save.

  1. 1Go to Manage > Integrations > Webhooks in Help Scout
  2. 2Click 'Create Webhook'
  3. 3Paste the n8n Test URL into the Payload URL field
  4. 4Enter a Secret Key value and save it somewhere safe
  5. 5Check only the 'Conversation Assigned' event
  6. 6Click 'Save'
What you should see: The webhook appears in your Help Scout webhook list with a green active status. Help Scout will show a test ping option — you can use this to send a sample payload to n8n.
Common mistake — Help Scout sends webhooks for ALL mailboxes by default. If you only want notifications for one mailbox, you'll need to filter by mailbox ID in a later n8n node — Help Scout doesn't let you scope webhooks per mailbox at creation time.
4

n8n Canvas > Webhook Node > Listen for Test Event

Capture a test payload from Help Scout

Back in n8n, click the Webhook node and press 'Listen for Test Event'. In Help Scout, open any conversation and manually assign it to a team member — this fires a real webhook event to your test URL. n8n will capture the payload and show you the raw JSON structure. Look for the fields under 'body': you'll see conversation details including assignee info nested under the 'assignedTo' object.

  1. 1Click the Webhook node and press 'Listen for Test Event' in the right panel
  2. 2Switch to Help Scout and open any existing conversation
  3. 3Assign the conversation to any team member using the Assignee dropdown
  4. 4Switch back to n8n — you should see the payload appear within a few seconds
What you should see: n8n shows the full JSON payload from Help Scout in the node output panel. You can expand the 'body' object and see fields like 'conversation.subject', 'assignedTo.email', and 'conversation.id'.
n8n
▶ Run once
executed
Slack
Help Scout
Help Scout
🔔 notification
received
5

Canvas > + > Code Node

Add a Code node to extract and format fields

Click the '+' button after the Webhook node and add a 'Code' node. This is where you pull out the fields you actually need: the assignee's email, the ticket subject, the customer name, and the Help Scout conversation link. The conversation URL follows a predictable format — Help Scout doesn't return it directly in the webhook payload, so you build it from the conversation ID. Set the Code node to run in 'Run Once for All Items' mode.

  1. 1Click '+' after the Webhook node
  2. 2Search for 'Code' and select the Code node
  3. 3Set Mode to 'Run Once for All Items'
  4. 4Paste the transformation code from the Pro Tip section below
What you should see: After clicking 'Test Step', the Code node output shows a clean object with fields: assigneeEmail, assigneeName, ticketSubject, customerName, ticketUrl, and mailboxId.
Common mistake — Help Scout's 'assignedTo' object contains 'email' and 'firstName'/'lastName' as separate fields. If you try to use 'name' directly, it will be undefined — you must concatenate first and last name in the code node.

Paste this into the Code node (Step 5) set to 'Run Once for All Items' mode. It handles null assignees (team assignments), constructs the Help Scout URL, and outputs a clean object that every downstream node can reference with $json.fieldName.

JavaScript — Code Node// Code node — runs once per webhook event
▸ Show code
// Code node — runs once per webhook event
// Safely extracts Help Scout assignment data and builds the Slack message payload
const body = $input.first().json.body;

... expand to see full code

// Code node — runs once per webhook event
// Safely extracts Help Scout assignment data and builds the Slack message payload

const body = $input.first().json.body;

// Guard: Help Scout fires this event for team assignments too.
// If assignedTo is null or not an individual agent, exit gracefully.
if (!body.assignedTo || body.assignedTo.type === 'team' || !body.assignedTo.email) {
  return [{
    json: {
      skip: true,
      reason: 'Assigned to a team, not an individual agent',
      conversationId: body.conversation?.id ?? 'unknown'
    }
  }];
}

const conversation = body.conversation;
const assignee = body.assignedTo;
const customer = conversation.customer ?? {};

// Build the full assignee name safely
const assigneeName = [assignee.firstName, assignee.lastName]
  .filter(Boolean)
  .join(' ') || assignee.email;

// Build the customer display name
const customerName = customer.fullName || customer.email || 'Unknown customer';

// Help Scout conversation URL — works for both secure.helpscout.net and app.helpscout.com
const ticketUrl = `https://secure.helpscout.net/conversation/${conversation.id}`;

// Build the Slack message text using mrkdwn formatting
const slackMessage = [
  '🎫 *You have been assigned a new ticket*',
  `*Subject:* ${conversation.subject || '(No subject)'}`,
  `*Customer:* ${customerName}`,
  `*Status:* ${conversation.status ?? 'active'}`,
  `*Mailbox ID:* ${conversation.mailboxId ?? 'N/A'}`,
  `*View ticket:* ${ticketUrl}`
].join('\n');

return [{
  json: {
    skip: false,
    assigneeEmail: assignee.email,
    assigneeName,
    customerName,
    ticketSubject: conversation.subject || '(No subject)',
    ticketUrl,
    mailboxId: conversation.mailboxId ?? null,
    slackMessage,
    conversationId: conversation.id
  }
}];
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
6

Canvas > + > HTTP Request Node

Look up the Slack user by email

Add an HTTP Request node after the Code node. You'll call Slack's 'users.lookupByEmail' API endpoint to convert the Help Scout assignee email into a Slack user ID — you need the user ID to send a DM. Set the method to GET, URL to 'https://slack.com/api/users.lookupByEmail', and add the email as a query parameter. Add a Header for Authorization with value 'Bearer YOUR_SLACK_BOT_TOKEN'. The response will contain the Slack user ID under 'user.id'.

  1. 1Click '+' after the Code node and add an 'HTTP Request' node
  2. 2Set Method to GET
  3. 3Set URL to 'https://slack.com/api/users.lookupByEmail'
  4. 4Under Query Parameters, add key 'email' with value '{{ $json.assigneeEmail }}'
  5. 5Under Headers, add 'Authorization' with value 'Bearer YOUR_SLACK_BOT_TOKEN'
  6. 6Click 'Test Step' and confirm the response contains a 'user.id' field
What you should see: The HTTP Request node returns a JSON object where 'ok' is true and 'user.id' contains the Slack member ID — a string starting with 'U', like 'U04KXYZ123'.
Common mistake — If the assignee's Help Scout email doesn't match their Slack workspace email, this call returns 'ok: false' and 'error: users_not_found'. You'll need a fallback — covered in troubleshooting below.
7

Canvas > + > If Node

Add an IF node to handle lookup failures

Add an 'If' node after the HTTP Request node. Set the condition to check if the Slack API response field 'ok' equals true (boolean). This routes the workflow into two branches: the 'true' branch continues to send the DM, and the 'false' branch can post to a fallback channel or stop gracefully. Without this guard, the Slack message node will fail silently or throw an error if the user ID is missing.

  1. 1Click '+' after the HTTP Request node and add an 'If' node
  2. 2Set Condition: Value 1 to '{{ $json.ok }}'
  3. 3Set Operation to 'Equal'
  4. 4Set Value 2 to 'true' (toggle to Boolean type)
  5. 5Connect the 'true' output to the next Slack node
What you should see: The If node shows two output handles: 'true' on the left and 'false' on the right. Test data flows through the 'true' branch if the Slack lookup succeeded.
8

Canvas > + > Slack Node > Message > Post

Add the Slack node to send the DM

Connect a Slack node to the 'true' output of the If node. Set Resource to 'Message' and Operation to 'Post'. For Channel, use the Slack user ID pulled from the previous HTTP Request node: '{{ $node["HTTP Request"].json.user.id }}'. This sends a direct message rather than a channel post. Build the message text using the fields from the Code node — subject, customer name, and the ticket URL. Authenticate using your Slack bot token via n8n's credential store.

  1. 1Click '+' on the 'true' output of the If node and add a 'Slack' node
  2. 2Set Resource to 'Message', Operation to 'Post'
  3. 3Set Channel to '{{ $node["HTTP Request"].json.user.id }}'
  4. 4Set Text to your message template using Code node fields (see Pro Tip for full template)
  5. 5Select your Slack credential or click 'Create New Credential' to add your bot token
What you should see: After clicking 'Test Step', you should receive a Slack DM from your bot containing the ticket subject, customer name, and a clickable Help Scout URL.
Common mistake — Sending a DM to a user ID requires your Slack bot to have the 'im:write' and 'chat:write' scopes. If you only added 'chat:write', the DM will fail with a 'channel_not_found' error — you must reinstall the app after adding the missing scope.
9

Canvas > If Node (false branch) > + > Slack Node

Add an optional fallback channel message

Connect another Slack node to the 'false' output of the If node. Point this message to a fallback channel like '#support-ops' and include a message like 'Could not find Slack user for Help Scout assignee [email]. Ticket: [URL]'. This way no assignment notification is silently dropped — an admin can manually follow up. Use the assigneeEmail from the Code node so the message is actionable.

  1. 1Click '+' on the 'false' output of the If node
  2. 2Add another Slack node with Resource 'Message' and Operation 'Post'
  3. 3Set Channel to '#support-ops' (or your chosen fallback channel name)
  4. 4Set Text to 'Could not find Slack user for {{ $node["Code"].json.assigneeEmail }}. Ticket: {{ $node["Code"].json.ticketUrl }}'
  5. 5Use the same Slack credential as Step 8
What you should see: The workflow canvas shows two Slack nodes — one on the true branch for DMs, one on the false branch for the fallback channel. Both are connected and the workflow graph has no dangling outputs.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
10

n8n Canvas > Webhook Node > Production URL

Switch from Test URL to Production URL

Go back to the Webhook node and copy the 'Production URL' — it's a different URL from the Test URL. Return to Help Scout under Manage > Integrations > Webhooks, edit the webhook you created in Step 3, and replace the Test URL with the Production URL. The Production URL only fires when your n8n workflow is active. Do this before activating the workflow in the next step.

  1. 1Click the Webhook node and copy the Production URL from the node panel
  2. 2Go to Help Scout > Manage > Integrations > Webhooks
  3. 3Click Edit on the webhook you created
  4. 4Replace the Payload URL with the n8n Production URL
  5. 5Click Save
What you should see: Help Scout shows the updated Production URL in the webhook settings. The Test URL is no longer in the field.
Common mistake — If you forget to update Help Scout with the Production URL, the workflow will appear active in n8n but receive zero events — assignments will happen in Help Scout with no Slack notification fired.
11

n8n Canvas > Workflow Active Toggle (top right)

Activate the workflow

In n8n, toggle the workflow from inactive to active using the switch in the top-right corner of the canvas. The toggle turns blue and the workflow status changes to 'Active'. From this point, every 'Conversation Assigned' event from Help Scout hits the Production webhook URL and runs the full workflow. Assign a real ticket in Help Scout and confirm the DM arrives in Slack within 30 seconds.

  1. 1Click the toggle switch in the top-right corner of the canvas
  2. 2Confirm the status changes to 'Active' and the toggle turns blue
  3. 3Go to Help Scout and assign a real conversation to a team member
  4. 4Check the assignee's Slack DMs within 30 seconds to confirm the notification arrived
What you should see: The assignee receives a Slack DM with the ticket subject, customer name, and a Help Scout link. The n8n execution log shows a successful run with all nodes in green.

Going live

Production Checklist

Before you turn this on for real, confirm each item.

Troubleshooting

Common errors and how to fix them.

Frequently Asked Questions

Common questions about this workflow.

Analysis

VerdictWhy n8n for this workflow

Use n8n for this if you're self-hosting your infrastructure and want zero recurring per-task cost, or if you need custom logic that Zapier and Make can't handle without convoluted workarounds. The email-to-Slack-ID lookup step is a perfect example — it requires an HTTP Request to the Slack API, a conditional branch, and a fallback path. In n8n, that's three nodes and five minutes. In Zapier, you'd need a multi-step Zap with a Zapier Paths step, which is locked behind the Teams plan ($69/month). If your team is entirely non-technical and wants a no-code setup they can manage without touching node configuration, pick Make instead — its interface is more forgiving for people who haven't built workflows before.

Cost

On cost: this workflow uses 3–4 n8n executions per ticket assignment (Webhook, Code, HTTP Request, Slack). At 200 ticket assignments per month, that's 600–800 executions. n8n Cloud's Starter plan costs $20/month and includes 2,500 executions — you'd need to nearly triple your current volume before upgrading. Self-hosted n8n is free indefinitely with no execution limits. Zapier charges per task: the same 800 tasks per month costs $19.99/month on the Starter plan, and the Paths feature you'd need for the fallback branch bumps you to $69/month. Make's Core plan at $9/month includes 10,000 operations and handles this workflow easily.

Tradeoffs

Zapier handles Help Scout triggers with a polished native integration — the 'New Conversation Assigned' trigger is a one-click setup with no webhook registration required. That's genuinely easier for step 3. Make has a visual branching interface that makes the true/false Slack routing in steps 7–9 much easier to understand at a glance — non-developers can read it without opening the nodes. Power Automate has a Help Scout connector, but it's a premium connector that costs extra per user per month and the trigger is polling-based (5-minute delay minimum), not instant. Pipedream has excellent Slack and Help Scout component support with pre-built actions and handles the users.lookupByEmail call natively without a raw HTTP request. n8n still wins here if you're self-hosting and need the code node's flexibility for the name concatenation and null-safety logic — no other platform lets you write that in plain JavaScript as the primary path rather than a workaround.

Three things you'll hit after setup. First, Help Scout disables your webhook automatically after 10 consecutive non-2xx responses — if n8n restarts during a deploy or upgrade, you can return to a silently broken workflow. Build an n8n error workflow that pings Slack when any execution fails. Second, Help Scout's webhook payload structure changed between API v1 and v2 — the field paths are different. If you copied field references from old documentation, 'body.conversation.id' might not exist and you'll get undefined errors in the Code node. Always capture a fresh test payload and verify the structure yourself. Third, Slack rate limits the users.lookupByEmail endpoint to 20 calls per minute per workspace. At normal ticket volumes this is fine, but if you have a burst of 30 assignments in a minute (common after a large email blast hits your support queue), some lookups will return 429 errors. Add a Wait node with a 1-second pause before the HTTP Request node to stay inside the rate limit.

Ideas for what to build next

  • Add per-mailbox Slack channel routingInstead of sending every assignment as a DM, route notifications to different Slack channels based on the mailbox ID — billing tickets go to #support-billing, technical tickets to #support-technical. Add a Switch node after the Code node that checks the mailboxId field.
  • Send a daily digest instead of per-ticket DMsReplace the webhook trigger with an n8n Schedule trigger that runs every morning, queries the Help Scout API for all open conversations assigned to each agent, and posts a single summary message to Slack. Reduces notification fatigue for high-volume teams.
  • Post a thread update when the ticket is resolvedAdd a second workflow triggered by Help Scout's 'Conversation Resolved' webhook event that finds the original Slack DM (by storing the message timestamp in n8n's static data) and posts a reply confirming the ticket was closed.

Related guides

Was this guide helpful?
Slack + Help Scout overviewn8n profile →