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

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-time

Use case type

notification

Real-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.

/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 account with admin access to create webhooks under Your Apps > Webhooks
Slack workspace where you have permission to add OAuth apps and post to the target channel
n8n instance (self-hosted or n8n Cloud) with a publicly accessible URL so Help Scout can reach the webhook endpoint
Help Scout API webhook events enabled: conversation.status.changed, conversation.assigned, conversation.unassigned
Slack OAuth scopes: chat:write and channels:read (or channels:join if the bot needs to join private channels)

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Ticket Numberitem.number
Ticket Subjectitem.subject
Ticket Statusitem.status
Event TypeeventType
6 optional fields▸ show
Assignee First Nameitem.assignee.first
Assignee Last Nameitem.assignee.last
Mailbox Nameitem.mailbox.name
Customer Emailitem.customer.email
Updated At Timestampitem.userModifiedAt
Conversation IDitem.id

Step-by-Step Setup

1

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.

  1. 1Click '+ New Workflow' in the top-right corner
  2. 2Click the pencil icon next to 'My workflow' and rename it to 'Help Scout → Slack: Ticket Status Updates'
  3. 3Click the '+ Add first step' node in the canvas center
What you should see: You should see the node selection panel open on the right side of the canvas.
2

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.

  1. 1Type 'Webhook' in the node search panel and click the Webhook node
  2. 2Set HTTP Method to 'POST'
  3. 3Set Path to 'helpscout-status'
  4. 4Copy the displayed Test URL (starts with your n8n domain + /webhook-test/)
  5. 5Click 'Listen for Test Event'
What you should see: The Webhook node should show a green 'Waiting for test event...' banner at the top of the node panel.
Common mistake — n8n gives you two URLs: a Test URL and a Production URL. They are different. Use the Test URL during setup, then swap to the Production URL when you activate the workflow. Confusing them is the #1 reason webhooks stop working after you go live.
n8n
+
click +
search apps
Slack
SL
Slack
Add and configure the Webhoo…
Slack
SL
module added
3

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.

  1. 1In Help Scout, click your avatar in the top-right corner
  2. 2Go to 'Your Apps' then select 'Webhooks'
  3. 3Click 'New Webhook'
  4. 4Paste the n8n Test URL into 'Endpoint URL'
  5. 5Check 'conversation.status.changed', 'conversation.assigned', and 'conversation.unassigned'
  6. 6Enter a Secret Key, save it, and click 'Save'
What you should see: The webhook should appear in your Help Scout webhook list with a green Active badge.
Common mistake — Help Scout only fires webhooks for conversations in Mailboxes you have access to. If you manage multiple mailboxes, verify the webhook applies to all of them — Help Scout webhooks are account-level, but mailbox permissions can silently block events.
4

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.

  1. 1Open any Help Scout conversation
  2. 2Click 'Close' or change the assignee
  3. 3Switch back to n8n and watch the Webhook node
  4. 4Click the Webhook node to open the Output panel and inspect the JSON payload
What you should see: The Webhook node output panel should show a JSON object with a top-level 'item' key containing conversation details including subject, status, number, and assignee.
n8n
▶ Run once
executed
Slack
Help Scout
Help Scout
🔔 notification
received
5

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.

  1. 1Click the '+' connector on the right side of the Webhook node
  2. 2Search for 'IF' and select the IF node
  3. 3Set Value 1 to '{{ $json.item.status }}' using the expression editor
  4. 4Set Operation to 'Is Not Empty'
  5. 5Click 'Save'
What you should see: The IF node should show two output branches: 'true' (status present) and 'false' (no status). All real Help Scout events will route through the 'true' branch.
Common mistake — Help Scout sends 'conversation.assigned' events even when `item.status` doesn't change. If you only want status-change messages (not assignment messages), add a second condition checking `{{ $json.eventType }}` equals 'conversation.status.changed'.
Slack
SL
trigger
filter
Status
matches criteria?
yes — passes through
no — skipped
Help Scout
HE
notified
6

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.

  1. 1Click '+' on the IF node's 'true' output
  2. 2Search for 'Code' and select the Code node
  3. 3Set Language to 'JavaScript'
  4. 4Paste the pro tip code into the editor
  5. 5Click 'Test Step' to preview the output
What you should see: The Code node output should show a single item with fields: slackText, ticketUrl, statusLabel, assigneeName, and ticketSubject — all populated from the test webhook payload.
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
7

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.

  1. 1Click '+' after the Code node and search for 'Slack'
  2. 2Select the Slack node and choose 'Send a Message' as the operation
  3. 3Click 'Credential for Slack API' dropdown and select '+ Create New Credential'
  4. 4Click 'Connect my account' and complete the OAuth flow in the popup
  5. 5Confirm the green 'Account connected' badge appears
What you should see: The Slack credential dropdown should show your workspace name with a green dot, and the Slack node should no longer show a credential error.
Common mistake — If you're connecting to a Slack workspace where you're not an admin, you may need workspace admin approval before the OAuth app is authorized. This can take minutes or days depending on your org's IT policy — request approval before your go-live date.
n8n settings
Connection
Choose a connection…Add
click Add
Slack
Log in to authorize
Authorize n8n
popup window
Connected
green checkmark
8

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.

  1. 1Set Resource to 'Message' and Operation to 'Send'
  2. 2In the Channel field, type your channel name (e.g. #support-ops) or paste the channel ID
  3. 3Click the expression toggle on the Text field and enter '{{ $json.slackText }}'
  4. 4Optionally toggle 'Include Link Preview' to on
  5. 5Click 'Test Step' to send a test message
What you should see: A message should appear in your #support-ops Slack channel within 5 seconds showing the ticket number, subject, new status, and assignee name.
Common mistake — Slack channel names with uppercase letters or spaces will fail. Always use the lowercase channel name or the channel ID (starts with 'C0...'). Find the ID by right-clicking the channel name in Slack and selecting 'Copy Link' — the ID is the last segment of that URL.
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
9

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.

  1. 1In Help Scout, reopen or close a conversation
  2. 2Watch the n8n canvas — each node should highlight green as it executes
  3. 3Click the Slack node output to confirm the message payload
  4. 4Check your Slack channel to confirm the message arrived
What you should see: All four nodes should show green execution badges and your Slack channel should contain a readable message like: '🎟️ Ticket #482 [Password reset loop] was closed by Sarah Chen. View ticket: https://secure.helpscout.net/conversation/482'
10

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.

  1. 1In n8n, click the Webhook node to open its settings
  2. 2Copy the Production URL shown below the Test URL
  3. 3In Help Scout, navigate to Your Apps > Webhooks and click Edit on your webhook
  4. 4Replace the Test URL with the Production URL
  5. 5Save the webhook in Help Scout
What you should see: The webhook in Help Scout should now point to the Production URL. Future events will route correctly once the workflow is activated.
Common mistake — The Production URL only works after you activate the workflow. If you paste the Production URL but forget to activate, Help Scout will get 404 errors on every event and silently stop retrying after a few attempts.
11

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.

  1. 1Click the grey 'Inactive' toggle in the top-right of the workflow editor
  2. 2Confirm it turns blue and reads 'Active'
  3. 3Change a Help Scout ticket status
  4. 4Go to the Executions log in the left sidebar and confirm a new entry appears with a green checkmark
What you should see: The Executions log should show a new entry with status 'Success' and execution time under 2 seconds. Your Slack channel should show the live notification.

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

VerdictWhy n8n for this workflow

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.

Cost

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.

Tradeoffs

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 mailboxAdd a Switch node after the Code node that checks mailboxName and 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 ticketsBuild 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 SheetAdd 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

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