

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-timeUse case type
notificationReal-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.
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
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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Assignee Email | body.assignedTo.email | |
| Conversation ID | body.conversation.id | |
| Ticket Subject | body.conversation.subject | |
7 optional fields▸ show
| Assignee First Name | body.assignedTo.firstName |
| Assignee Last Name | body.assignedTo.lastName |
| Customer Name | body.conversation.customer.fullName |
| Customer Email | body.conversation.customer.email |
| Mailbox ID | body.conversation.mailboxId |
| Conversation Status | body.conversation.status |
| Created At | body.conversation.createdAt |
Step-by-Step Setup
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.
- 1Click '+ New Workflow' in the top-right corner
- 2Click the workflow title at the top and rename it to 'Help Scout → Slack Assignment Alerts'
- 3Click the '+' node button in the center of the empty canvas to add your first node
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.
- 1Type 'Webhook' in the node search box and click the Webhook node
- 2Set HTTP Method to 'POST'
- 3Copy the 'Test URL' shown in the node panel — you'll paste it into Help Scout next
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.
- 1Go to Manage > Integrations > Webhooks in Help Scout
- 2Click 'Create Webhook'
- 3Paste the n8n Test URL into the Payload URL field
- 4Enter a Secret Key value and save it somewhere safe
- 5Check only the 'Conversation Assigned' event
- 6Click 'Save'
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.
- 1Click the Webhook node and press 'Listen for Test Event' in the right panel
- 2Switch to Help Scout and open any existing conversation
- 3Assign the conversation to any team member using the Assignee dropdown
- 4Switch back to n8n — you should see the payload appear within a few seconds
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.
- 1Click '+' after the Webhook node
- 2Search for 'Code' and select the Code node
- 3Set Mode to 'Run Once for All Items'
- 4Paste the transformation code from the Pro Tip section below
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
}
}];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'.
- 1Click '+' after the Code node and add an 'HTTP Request' node
- 2Set Method to GET
- 3Set URL to 'https://slack.com/api/users.lookupByEmail'
- 4Under Query Parameters, add key 'email' with value '{{ $json.assigneeEmail }}'
- 5Under Headers, add 'Authorization' with value 'Bearer YOUR_SLACK_BOT_TOKEN'
- 6Click 'Test Step' and confirm the response contains a 'user.id' field
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.
- 1Click '+' after the HTTP Request node and add an 'If' node
- 2Set Condition: Value 1 to '{{ $json.ok }}'
- 3Set Operation to 'Equal'
- 4Set Value 2 to 'true' (toggle to Boolean type)
- 5Connect the 'true' output to the next Slack node
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.
- 1Click '+' on the 'true' output of the If node and add a 'Slack' node
- 2Set Resource to 'Message', Operation to 'Post'
- 3Set Channel to '{{ $node["HTTP Request"].json.user.id }}'
- 4Set Text to your message template using Code node fields (see Pro Tip for full template)
- 5Select your Slack credential or click 'Create New Credential' to add your bot token
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.
- 1Click '+' on the 'false' output of the If node
- 2Add another Slack node with Resource 'Message' and Operation 'Post'
- 3Set Channel to '#support-ops' (or your chosen fallback channel name)
- 4Set Text to 'Could not find Slack user for {{ $node["Code"].json.assigneeEmail }}. Ticket: {{ $node["Code"].json.ticketUrl }}'
- 5Use the same Slack credential as Step 8
channel: {{channel}}
ts: {{ts}}
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.
- 1Click the Webhook node and copy the Production URL from the node panel
- 2Go to Help Scout > Manage > Integrations > Webhooks
- 3Click Edit on the webhook you created
- 4Replace the Payload URL with the n8n Production URL
- 5Click Save
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.
- 1Click the toggle switch in the top-right corner of the canvas
- 2Confirm the status changes to 'Active' and the toggle turns blue
- 3Go to Help Scout and assign a real conversation to a team member
- 4Check the assignee's Slack DMs within 30 seconds to confirm the notification arrived
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
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.
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.
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 routing — Instead 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 DMs — Replace 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 resolved — Add 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
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup