

How to Send Help Scout Tickets to Slack with n8n
When a new conversation is created in Help Scout, n8n fires a webhook and posts a formatted message to your chosen Slack channel within seconds.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Support teams who want instant Slack alerts on new Help Scout conversations without paying per-task SaaS fees
Not ideal for
Teams without a server or cloud instance to host n8n — use Zapier instead if you need zero infrastructure
Sync type
real-timeUse case type
notificationReal-World Example
A 12-person e-commerce support team gets 80-120 new Help Scout conversations per day across three inboxes. Before this workflow, agents refreshed Help Scout manually and urgent shipping issues sat unread for 20-30 minutes. Now every new ticket posts to #support-live in Slack with the subject, customer email, mailbox name, and a direct link — response time dropped from 28 minutes to under 6.
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.
Optional
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Conversation ID | id | |
| Subject | subject | |
| Customer Email | _embedded.customers[0].email | |
| Mailbox Name | _embedded.mailbox.name | |
| Ticket URL | ||
5 optional fields▸ show
| Customer Name | _embedded.customers[0].firstName |
| Ticket Status | status |
| Created At | createdAt |
| Assigned To | _embedded.assignee.email |
| Tags | tags |
Step-by-Step Setup
n8n Dashboard > Workflows > + New Workflow
Create a new workflow in n8n
Open your n8n instance and click the '+ New Workflow' button in the top right of the Workflows list screen. Give it a clear name like 'Help Scout → Slack New Ticket'. You'll land on a blank canvas with an 'Add first step' prompt in the center. This is where you'll place the webhook trigger node.
- 1Click '+ New Workflow' in the top right
- 2Click the workflow title 'My Workflow' and rename it to 'Help Scout → Slack New Ticket'
- 3Click 'Add first step' in the canvas center
Canvas > Add Node > Search 'Webhook' > Trigger: Webhook
Add a Webhook trigger node
In the node search panel, type 'Webhook' and select it from the Trigger section. n8n will place the Webhook node on the canvas and open its configuration panel on the right. Set the HTTP Method to POST. Leave the path as the auto-generated UUID — you'll copy this URL in the next step. Set 'Respond' to 'Immediately'.
- 1Type 'Webhook' in the node search box
- 2Click 'Webhook' under the Trigger section (not the HTTP Request node)
- 3Set HTTP Method to POST
- 4Set Respond to 'Immediately'
- 5Click 'Copy Webhook URL' and save it — you need it in Step 3
Help Scout > Your Account > Apps & Integrations > Webhooks > Add New Webhook
Register the webhook in Help Scout
Log into Help Scout and navigate to Your Account > Apps & Integrations > Webhooks. Click 'Add New Webhook'. Paste the n8n Production Webhook URL into the Payload URL field. Set the Secret Key to any random string and note it down — you'll use it in n8n to verify payloads later. Under Events, check only 'conversation.created'. Leave the rest unchecked to avoid extra traffic.
- 1Go to Your Account > Apps & Integrations > Webhooks
- 2Click 'Add New Webhook'
- 3Paste the n8n Production Webhook URL into 'Payload URL'
- 4Enter a Secret Key (e.g. a 32-character random string)
- 5Check only the 'conversation.created' event box
- 6Click 'Save'
n8n Canvas > Webhook Node > Test Workflow button (top right)
Activate the workflow and capture a test payload
Back in n8n, click 'Test Workflow' (or toggle the workflow to Active and use the Test URL temporarily). In Help Scout, create a new test conversation manually — assign it to any mailbox, write a short subject like 'Test ticket from n8n setup', and submit it. n8n should receive the webhook within 2-3 seconds. Click the Webhook node to inspect the incoming JSON payload.
- 1Click 'Test Workflow' in the n8n top bar to begin listening
- 2In a new browser tab, open Help Scout and create a new conversation
- 3Return to n8n and wait for the green execution dot on the Webhook node
- 4Click the Webhook node to open the output panel and inspect the JSON
Canvas > + after Webhook > Search 'Edit Fields' > Add
Add an Edit Fields node to extract key data
Click the '+' button after the Webhook node to add a new node. Search for 'Edit Fields (Set)' and add it. You'll map the raw Help Scout payload fields to clean, readable variable names. This makes the downstream Slack node much easier to configure and keeps your expressions short. Add one field per piece of data you want in the Slack message.
- 1Click '+' to the right of the Webhook node
- 2Search 'Edit Fields' and select 'Edit Fields (Set)'
- 3Click '+ Add Field' and set Name to 'ticket_id', Value to '{{ $json.id }}'
- 4Add field: Name 'subject', Value '{{ $json.subject }}'
- 5Add field: Name 'customer_email', Value '{{ $json._embedded.customers[0].email }}'
- 6Add field: Name 'mailbox_name', Value '{{ $json._embedded.mailbox.name }}'
- 7Add field: Name 'ticket_url', Value '{{ "https://secure.helpscout.net/conversation/" + $json.id }}'
Canvas > + after Edit Fields > Search 'Slack' > Send a Message
Add a Slack node to send the notification
Click '+' after the Edit Fields node and search for 'Slack'. Select the Slack node and choose 'Send a Message' as the operation. You'll need to connect your Slack workspace via OAuth — click 'Create New Credential' and follow the OAuth flow. Once connected, set the channel (e.g. '#support-live') and compose the message text using the clean fields from the previous node.
- 1Click '+' after the Edit Fields node
- 2Search 'Slack' and select the Slack node
- 3Set Operation to 'Send a Message'
- 4Click 'Credential for Slack API' > 'Create New Credential' and complete the OAuth flow
- 5Set Channel to '#support-live' (or your target channel name)
- 6Paste the message text (see message format in field mapping section)
Slack Node > Message Type > Blocks
Write the Slack message with Block Kit formatting
In the Slack node, switch 'Message Type' to 'Blocks' for a structured, readable notification. This lets you show the ticket subject in bold, the customer email, mailbox, and a clickable link. Using plain text works but the message looks flat in Slack — blocks take 2 extra minutes but are worth it for a channel your team reads all day.
- 1In the Slack node, change 'Message Type' to 'Blocks'
- 2Click 'Add Block' and choose 'Section'
- 3Set the section text to '*New ticket:* {{ $json.subject }}'
- 4Add a second Section block: 'From: {{ $json.customer_email }} | Inbox: {{ $json.mailbox_name }}'
- 5Add an Actions block with a Button labeled 'Open in Help Scout' linking to '{{ $json.ticket_url }}'
n8n Canvas > Test Workflow > Help Scout (create test ticket) > Slack channel
Test the full workflow end to end
Click 'Test Workflow' again in n8n. Create another new conversation in Help Scout with a realistic subject and a real-looking customer email. Watch the execution flow through each node — green checks mean success, red means an error. Open Slack and confirm the message arrived in your target channel with all fields populated correctly.
- 1Click 'Test Workflow' in the n8n top bar
- 2In Help Scout, create a new conversation: subject 'Broken checkout page', from '[email protected]'
- 3Watch n8n — all three nodes should show green execution indicators
- 4Open Slack and confirm the message in '#support-live'
Canvas > + after Edit Fields > Search 'IF' > Add between Edit Fields and Slack
Add optional channel routing by mailbox
If your team uses multiple Help Scout mailboxes (e.g. Sales, Support, Billing), you can route notifications to different Slack channels based on the mailbox name. Add an IF node between the Edit Fields node and the Slack node. Set the condition to check '{{ $json.mailbox_name }}' equals 'Billing', then connect the true branch to #billing-support and the false branch to #support-live.
- 1Click '+' after the Edit Fields node and add an IF node
- 2Set Condition: Value 1 = '{{ $json.mailbox_name }}', Operation = 'Equals', Value 2 = 'Billing'
- 3Connect the True output to a Slack node targeting '#billing-support'
- 4Connect the False output to the existing Slack node targeting '#support-live'
channel: {{channel}}
ts: {{ts}}
n8n Canvas > Active toggle (top right)
Activate the workflow for production
Once the test passes, toggle the workflow to 'Active' using the switch in the top right of the canvas. The Production Webhook URL is now live. From this point, every new Help Scout conversation triggers the workflow automatically — no browser tab needs to be open. Check the Executions log after your first real ticket to confirm end-to-end delivery.
- 1Click the 'Inactive' toggle in the top right to switch it to 'Active'
- 2Confirm the status bar shows 'Active' in green
- 3Create one final real test ticket in Help Scout
- 4Go to n8n > Executions to confirm the workflow ran successfully
This Code node replaces the Edit Fields node entirely — it extracts all fields, formats the timestamp to human-readable time, handles null assignee and missing customer data gracefully, and assembles the full Slack Block Kit JSON payload. Paste this as a Code node between the Webhook trigger and the Slack node, then in the Slack node set the Blocks field to '{{ $json.blocks }}'.
JavaScript — Code Node// n8n Code Node: Help Scout → Slack Block Kit payload builder▸ Show code
// n8n Code Node: Help Scout → Slack Block Kit payload builder
// Place between Webhook trigger and Slack node
// In Slack node: set Blocks = {{ JSON.stringify($json.blocks) }}... expand to see full code
// n8n Code Node: Help Scout → Slack Block Kit payload builder
// Place between Webhook trigger and Slack node
// In Slack node: set Blocks = {{ JSON.stringify($json.blocks) }}
const item = $input.first().json;
// Safely extract nested fields
const customers = item?._embedded?.customers ?? [];
const customer = customers[0] ?? {};
const mailbox = item?._embedded?.mailbox ?? {};
const assignee = item?._embedded?.assignee ?? null;
const customerEmail = customer.email ?? 'No email';
const customerName = [customer.firstName, customer.lastName].filter(Boolean).join(' ') || 'Unknown customer';
const mailboxName = mailbox.name ?? 'Unknown inbox';
const subject = item.subject ?? '(No subject)';
const ticketId = item.id;
const ticketUrl = `https://secure.helpscout.net/conversation/${ticketId}`;
// Format ISO timestamp to readable string
const createdAt = item.createdAt ? new Date(item.createdAt) : new Date();
const formattedTime = createdAt.toLocaleString('en-US', {
month: 'short', day: 'numeric',
hour: '2-digit', minute: '2-digit', timeZoneName: 'short'
});
// Assignee line — only show if ticket was assigned at creation
const assigneeLine = assignee?.email
? `*Assigned to:* ${assignee.firstName ?? ''} ${assignee.lastName ?? ''} (${assignee.email})`.trim()
: '*Assigned to:* Unassigned';
// Tags line — only show if tags exist
const tags = Array.isArray(item.tags) && item.tags.length > 0
? `*Tags:* ${item.tags.join(', ')}`
: null;
// Build Slack Block Kit JSON
const blocks = [
{
type: 'header',
text: { type: 'plain_text', text: '🎫 New Help Scout Ticket', emoji: true }
},
{
type: 'section',
text: {
type: 'mrkdwn',
text: `*${subject}*`
}
},
{
type: 'section',
fields: [
{ type: 'mrkdwn', text: `*Customer:*\n${customerName}` },
{ type: 'mrkdwn', text: `*Email:*\n${customerEmail}` },
{ type: 'mrkdwn', text: `*Inbox:*\n${mailboxName}` },
{ type: 'mrkdwn', text: `*Received:*\n${formattedTime}` }
]
}
];
// Add assignee/tags section only if relevant
const contextElements = [assigneeLine, tags].filter(Boolean);
if (contextElements.length > 0) {
blocks.push({
type: 'context',
elements: contextElements.map(text => ({ type: 'mrkdwn', text }))
});
}
// Add action button
blocks.push({
type: 'actions',
elements: [
{
type: 'button',
text: { type: 'plain_text', text: 'Open in Help Scout', emoji: true },
url: ticketUrl,
style: 'primary'
}
]
});
// Output clean object for Slack node
return [
{
json: {
ticketId,
subject,
customerEmail,
customerName,
mailboxName,
ticketUrl,
formattedTime,
blocks
}
}
];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, if you process more than 500 tickets per month and don't want per-task pricing, or if you need custom code logic — like formatting timestamps, handling null assignees, or routing to different channels based on tags. The webhook approach means zero polling overhead and sub-5-second delivery. The one scenario where you'd skip n8n: your team has no one comfortable managing a server or cloud instance. In that case, Zapier gets this done in 8 minutes with no infrastructure decision.
Cost math is straightforward. Each ticket creates exactly one n8n execution consuming one webhook trigger and one Slack send. On n8n Cloud's Starter plan ($20/month), you get 2,500 executions per month — that covers ~2,500 tickets. If your team handles 100 tickets/day (3,000/month), you'll need the Pro plan at $50/month. Self-hosted n8n is free at any volume, paying only server costs (a $6/month DigitalOcean droplet handles this load easily). Compare that to Zapier: at 3,000 tasks/month you're on the Professional plan at $49/month — and that's for this single Zap, with every task counting individually. n8n self-hosted wins on cost at any volume above roughly 750 tickets per month.
Make handles this same workflow for free up to 1,000 operations per month and its webhook module has a cleaner visual debugger than n8n's — easier to inspect nested JSON like Help Scout's '_embedded' structure. Zapier's Help Scout integration has a polished 'New Conversation' trigger that pre-maps customer fields without manual expression work, saving 20 minutes of setup. Power Automate has a Help Scout connector in the marketplace but it's a premium connector requiring a $15/user/month plan add-on — hard to justify for Slack notifications alone. Pipedream's Help Scout source component handles webhook registration automatically, skipping Step 3 entirely. n8n is still the right call if you're already running it for other workflows, need code-level control, or want to avoid per-task fees at scale.
Three things you'll hit after setup. First, Help Scout auto-disables webhooks after repeated delivery failures — if your n8n instance has any downtime, go check the webhook status in Help Scout before assuming the workflow is still live. Second, the '_embedded' nesting in Help Scout's payload surprises everyone: customer email is not at 'customer.email', it's at '_embedded.customers[0].email'. Map this wrong and every Slack message shows blank customer info. Third, the Slack Block Kit 'button' action element requires a URL that starts with 'https' — if you construct the ticket URL incorrectly (missing the protocol, wrong subdomain), Slack will silently drop the button from the message without throwing an error in n8n.
Ideas for what to build next
- →Route tickets to Slack by priority or tag — Add an IF or Switch node after field extraction to send 'urgent'-tagged Help Scout tickets to a dedicated '#support-urgent' channel while routine tickets go to '#support-live'. Takes about 10 minutes to configure the routing logic.
- →Post a daily digest of unresolved tickets — Add a second workflow with a Schedule trigger that runs at 9am, queries the Help Scout API for all active conversations older than 4 hours, and posts a numbered summary list to Slack. Requires the Help Scout List Conversations API endpoint.
- →Sync Slack replies back to Help Scout as notes — Use Slack's Event API to listen for messages in your #support-live channel and post them as internal notes on the corresponding Help Scout conversation via the Help Scout Notes API — closing the loop so context stays in one place.
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