

How to Send Help Scout Ticket Updates to Slack with n8n
Sends a Slack message to a designated channel whenever a Help Scout ticket is closed, reopened, or reassigned — in real time via webhook.
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–50 people who need real-time ticket visibility in Slack without checking Help Scout constantly.
Not ideal for
Teams that want two-way sync — this workflow only pushes from Help Scout to Slack, not the other way.
Sync type
real-timeUse case type
notificationReal-World Example
A 12-person SaaS support team routes all tickets through Help Scout but coordinates in Slack. Before this workflow, agents had to check Help Scout manually to know when a colleague closed or reassigned a ticket — delays stretched up to 90 minutes. After setup, the #support-ops channel gets a Slack message within 10 seconds of any status change, including who made the change and a direct link to the ticket.
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 | ||
| Ticket Number | item.number | |
| Ticket Subject | item.subject | |
| Ticket Status | item.status | |
| Event Type | eventType | |
6 optional fields▸ show
| Assignee First Name | item.assignee.first |
| Assignee Last Name | item.assignee.last |
| Mailbox Name | item.mailbox.name |
| Customer Email | item.customer.email |
| Updated At Timestamp | item.userModifiedAt |
| Conversation ID | item.id |
Step-by-Step Setup
n8n Dashboard > Workflows > + New Workflow
Create a new n8n workflow
Open your n8n instance and click the '+ New Workflow' button in the top-right corner of the Workflows dashboard. Give it a name like 'Help Scout → Slack: Ticket Status Updates' so it's easy to find later. You'll land on a blank canvas with a single 'Add first step' prompt in the center. This is where you'll add the webhook trigger node.
- 1Click '+ New Workflow' in the top-right corner
- 2Click the pencil icon next to 'My workflow' and rename it to 'Help Scout → Slack: Ticket Status Updates'
- 3Click the '+ Add first step' node in the canvas center
Canvas > Add Node > Webhook
Add and configure the Webhook trigger node
Search for 'Webhook' in the node panel and select it. Set the HTTP Method to POST and the Path to something memorable like 'helpscout-status'. n8n will generate a full webhook URL — copy it now, you'll paste it into Help Scout in the next step. Leave Authentication set to 'None' for now; you can add a secret header later. Click 'Listen for Test Event' to keep n8n waiting for the first payload.
- 1Type 'Webhook' in the node search panel and click the Webhook node
- 2Set HTTP Method to 'POST'
- 3Set Path to 'helpscout-status'
- 4Copy the displayed Test URL (starts with your n8n domain + /webhook-test/)
- 5Click 'Listen for Test Event'
Help Scout > Your Profile > Your Apps > Webhooks > New Webhook
Register the webhook in Help Scout
Log into Help Scout, go to Your Profile > Your Apps > Webhooks, and click 'New Webhook'. Paste the n8n Test URL into the Endpoint URL field. Under Events, check 'conversation.status.changed', 'conversation.assigned', and 'conversation.unassigned' — these cover closed, reopened, and reassignment scenarios. Set a Secret Key (any random string works; store it somewhere — you'll validate it later if needed). Save the webhook.
- 1In Help Scout, click your avatar in the top-right corner
- 2Go to 'Your Apps' then select 'Webhooks'
- 3Click 'New Webhook'
- 4Paste the n8n Test URL into 'Endpoint URL'
- 5Check 'conversation.status.changed', 'conversation.assigned', and 'conversation.unassigned'
- 6Enter a Secret Key, save it, and click 'Save'
Help Scout > Any Conversation > Change Status
Trigger a test event from Help Scout
Go to any Help Scout conversation and change its status — close it, reopen it, or assign it to someone. Within a few seconds, n8n should receive the webhook payload. Switch back to n8n and look for the green 'Webhook called' message on the Webhook node. Click the node to inspect the incoming data — you should see fields like item.status, item.subject, item.assignee, and item.number in the JSON output.
- 1Open any Help Scout conversation
- 2Click 'Close' or change the assignee
- 3Switch back to n8n and watch the Webhook node
- 4Click the Webhook node to open the Output panel and inspect the JSON payload
Canvas > + Add Node > IF
Add an IF node to filter by status event type
Not every webhook event needs the same Slack message. Add an IF node after the Webhook node to branch logic based on item.status. Connect the Webhook node's output to the IF node. Set Condition 1 to: Value 1 = {{ $json.item.status }}, Operation = 'is not empty'. This ensures only meaningful status events proceed. You can extend this later with additional branches for 'closed', 'active', or 'pending' using a Switch node.
- 1Click the '+' connector on the right side of the Webhook node
- 2Search for 'IF' and select the IF node
- 3Set Value 1 to '{{ $json.item.status }}' using the expression editor
- 4Set Operation to 'Is Not Empty'
- 5Click 'Save'
Canvas > + Add Node > Code
Add a Function node to build the Slack message
Add a Code node (JavaScript) after the IF node's 'true' branch. This is where you format the Help Scout data into a clean Slack message. You'll extract the ticket number, subject, new status, assignee name, and a direct link. The Code node runs once per webhook event, so no batching is needed. Paste the code from the pro tip section below into the Code node's editor.
- 1Click '+' on the IF node's 'true' output
- 2Search for 'Code' and select the Code node
- 3Set Language to 'JavaScript'
- 4Paste the pro tip code into the editor
- 5Click 'Test Step' to preview the output
channel: {{channel}}
ts: {{ts}}
Canvas > + Add Node > Slack > Credentials > + Create New
Connect your Slack account
Add a Slack node after the Code node. In the node panel, click 'Credential for Slack API' and then '+ Create New Credential'. You'll be prompted to connect via OAuth2. Click 'Connect my account', sign into Slack, and grant n8n the chat:write and channels:read scopes. Select the workspace you want to post to. The credential will appear as your Slack workspace name once connected.
- 1Click '+' after the Code node and search for 'Slack'
- 2Select the Slack node and choose 'Send a Message' as the operation
- 3Click 'Credential for Slack API' dropdown and select '+ Create New Credential'
- 4Click 'Connect my account' and complete the OAuth flow in the popup
- 5Confirm the green 'Account connected' badge appears
Slack Node > Parameters > Message
Configure the Slack message fields
Inside the Slack node, set the Resource to 'Message' and Operation to 'Send'. Set Channel to the Slack channel ID or name (e.g. #support-ops). Set the Message Text field to {{ $json.slackText }} — this pulls the formatted message from the Code node. Enable 'Include Link Preview' if you want the ticket URL to unfurl. Leave 'As User' unchecked unless you've set up a custom bot name.
- 1Set Resource to 'Message' and Operation to 'Send'
- 2In the Channel field, type your channel name (e.g. #support-ops) or paste the channel ID
- 3Click the expression toggle on the Text field and enter '{{ $json.slackText }}'
- 4Optionally toggle 'Include Link Preview' to on
- 5Click 'Test Step' to send a test message
n8n Canvas > Execute Workflow (test mode)
Test the full workflow end to end
With n8n still in test mode, trigger another status change in Help Scout. Watch each node light up green as the event flows through: Webhook → IF → Code → Slack. Click each node to verify the data at that stage looks correct. Pay particular attention to the Code node output — confirm slackText is populated and contains the ticket number and status. If anything is empty, check the expression syntax in the Code node.
- 1In Help Scout, reopen or close a conversation
- 2Watch the n8n canvas — each node should highlight green as it executes
- 3Click the Slack node output to confirm the message payload
- 4Check your Slack channel to confirm the message arrived
n8n Webhook Node > Production URL | Help Scout > Webhooks > Edit
Swap to the Production webhook URL
Now that the test works, you need to update Help Scout to use the Production webhook URL — not the test one. In n8n, click the Webhook node and copy the Production URL (it uses /webhook/ instead of /webhook-test/). Go back to Help Scout's webhook settings, edit the webhook you created, and replace the URL. Save it in Help Scout.
- 1In n8n, click the Webhook node to open its settings
- 2Copy the Production URL shown below the Test URL
- 3In Help Scout, navigate to Your Apps > Webhooks and click Edit on your webhook
- 4Replace the Test URL with the Production URL
- 5Save the webhook in Help Scout
n8n Workflow Editor > Active Toggle (top right)
Activate the workflow
In n8n, click the toggle in the top-right of the workflow editor to set it from Inactive to Active. The toggle turns blue when active. Trigger one final status change in Help Scout to confirm the Production URL is receiving events correctly. Check your n8n Executions log (left sidebar > Executions) to see the run logged with a green Success status.
- 1Click the grey 'Inactive' toggle in the top-right of the workflow editor
- 2Confirm it turns blue and reads 'Active'
- 3Change a Help Scout ticket status
- 4Go to the Executions log in the left sidebar and confirm a new entry appears with a green checkmark
This Code node runs after the Webhook node and before the Slack node. It normalizes the Help Scout payload into a clean Slack message string, picks the right emoji per status, builds the ticket URL from the number (not the UUID), and handles missing assignee data gracefully. Paste it into the Code node's JavaScript editor and click 'Test Step' with a real webhook payload loaded.
JavaScript — Code Node// n8n Code node: Help Scout → Slack message formatter▸ Show code
// n8n Code node: Help Scout → Slack message formatter // Runs once per webhook event. Input: Help Scout webhook payload. // Output: formatted fields ready for the Slack node.
... expand to see full code
// n8n Code node: Help Scout → Slack message formatter
// Runs once per webhook event. Input: Help Scout webhook payload.
// Output: formatted fields ready for the Slack node.
const item = $input.first().json;
// Extract core fields with safe fallbacks
const eventType = item.eventType || '';
const ticketNumber = item.item?.number || 'N/A';
const subject = item.item?.subject || '(No subject)';
const status = item.item?.status || 'unknown';
const mailboxName = item.item?.mailbox?.name || 'Support';
const customerEmail = item.item?.customer?.email || '';
// Build assignee display name
const firstName = item.item?.assignee?.first || '';
const lastName = item.item?.assignee?.last || '';
const assigneeName = (firstName || lastName)
? `${firstName} ${lastName}`.trim()
: 'Unassigned';
// Map status to emoji and human label
const statusMap = {
closed: { emoji: '✅', label: 'closed' },
active: { emoji: '🔄', label: 'reopened' },
pending: { emoji: '⏳', label: 'set to pending' },
spam: { emoji: '🚫', label: 'marked as spam' },
};
const statusInfo = statusMap[status] || { emoji: '📋', label: status };
// Pick action verb based on event type
let actionLine;
if (eventType === 'conversation.assigned') {
actionLine = `👤 Ticket #${ticketNumber} assigned to ${assigneeName}`;
} else if (eventType === 'conversation.unassigned') {
actionLine = `👤 Ticket #${ticketNumber} unassigned (was: ${assigneeName})`;
} else {
actionLine = `${statusInfo.emoji} Ticket #${ticketNumber} ${statusInfo.label} by ${assigneeName}`;
}
// Build direct URL using ticket number (not UUID)
const ticketUrl = `https://secure.helpscout.net/conversation/${ticketNumber}`;
// Compose final Slack message
const slackText = [
actionLine,
`*${subject}*`,
customerEmail ? `Customer: ${customerEmail}` : null,
`Mailbox: ${mailboxName}`,
`🔗 ${ticketUrl}`,
].filter(Boolean).join('\n');
return [{
json: {
slackText,
ticketUrl,
ticketNumber,
ticketSubject: subject,
statusLabel: statusInfo.label,
assigneeName,
eventType,
mailboxName,
}
}];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 self-host your infrastructure, have a developer on the team who can maintain JavaScript code nodes, or you're already running n8n for other workflows. The code node gives you precise control over message formatting — you can build Slack Block Kit payloads, handle edge cases in the payload, and add custom logic in 30 lines of JavaScript that would require five separate nodes in other tools. The one scenario where you'd skip n8n: if nobody on your team can read JavaScript and you don't want to maintain code. In that case, Zapier's Help Scout + Slack integration requires zero code and sets up in under 8 minutes.
n8n Cloud's pricing starts at $20/month for 2,500 executions. This workflow uses 1 execution per ticket status change. A support team closing, assigning, and reopening tickets at 200 events/day hits 6,000 executions/month — that puts you on the $50/month Growth plan. Self-hosted n8n is free indefinitely with no execution cap; you only pay for the server (a $6/month DigitalOcean droplet runs n8n fine for this volume). Zapier charges $49/month for 2,000 tasks on a paid plan, so self-hosted n8n beats it on cost for any team doing more than a few hundred ticket events per month.
Zapier's Help Scout trigger is simpler to configure — no webhook URL management, no activation toggle. It just works in 3 clicks. The downside: Zapier polls every 5–15 minutes on most plans, so you'll wait up to 15 minutes for a Slack notification after a ticket closes. Make has a Help Scout webhook module that matches n8n's real-time speed, and its visual router handles multi-branch logic more cleanly than n8n's IF/Switch nodes for non-coders. Power Automate has no native Help Scout connector, so you'd need a custom HTTP trigger — more work than n8n with less flexibility. Pipedream has an excellent Help Scout webhook source with TypeScript support and built-in logging, and it's free up to 10,000 invocations/month, which makes it cheaper than n8n Cloud for most support teams. If cost is your primary concern and you're comfortable with TypeScript, Pipedream is the honest pick over n8n Cloud.
Three things you'll hit after go-live. First: Help Scout retries failed webhook deliveries up to 3 times, but it stops after that. If your n8n instance goes down for maintenance during a burst of ticket activity, you'll miss those events permanently — there's no catch-up mechanism. Build a nightly reconciliation workflow using the Help Scout API to catch gaps. Second: the item.assignee object is null in the webhook payload when a ticket is unassigned rather than assigned to someone new. The Code node handles this with fallback to 'Unassigned', but if you skip that guard, you'll get 'undefined undefined' in your Slack messages. Third: Help Scout's webhook payload uses ISO 8601 timestamps in UTC with no timezone offset notation. If your team is in a non-UTC timezone and you display timestamps in Slack messages, use JavaScript's Intl.DateTimeFormat in the Code node to convert to your local timezone — don't display raw UTC times to a team in Sydney or New York.
Ideas for what to build next
- →Route to different Slack channels by mailbox — Add a Switch node after the Code node that checks
mailboxNameand sends to #support-ops, #billing-team, or #product-feedback based on which Help Scout mailbox the ticket belongs to. Takes 10 minutes to configure. - →Add a daily digest of closed tickets — Build a second n8n workflow with a Schedule trigger that queries the Help Scout API at 5pm each day, counts tickets closed that day, and posts a summary to Slack. Pairs well with this real-time workflow to give both instant and daily visibility.
- →Log ticket status changes to a Google Sheet — Add a Google Sheets node in parallel with the Slack node to append each status change — ticket number, status, assignee, timestamp — to a running log. Gives you a searchable audit trail and raw data for support performance reporting.
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