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

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

Use case type

notification

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

/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 Apps & Integrations
Slack workspace with permission to install apps and a bot token with chat:write and channels:join scopes
n8n instance (self-hosted or n8n Cloud) accessible via a public URL — Help Scout must be able to reach your webhook endpoint over HTTPS
The target Slack channel already created, with your n8n Slack bot invited to it

Optional

Help Scout API credentials (OAuth app or API key) if you plan to do additional API calls — not required for webhook-only setup

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Conversation IDid
Subjectsubject
Customer Email_embedded.customers[0].email
Mailbox Name_embedded.mailbox.name
Ticket URL
5 optional fields▸ show
Customer Name_embedded.customers[0].firstName
Ticket Statusstatus
Created AtcreatedAt
Assigned To_embedded.assignee.email
Tagstags

Step-by-Step Setup

1

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.

  1. 1Click '+ New Workflow' in the top right
  2. 2Click the workflow title 'My Workflow' and rename it to 'Help Scout → Slack New Ticket'
  3. 3Click 'Add first step' in the canvas center
What you should see: You should see a blank canvas with a node search panel open on the right side.
2

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

  1. 1Type 'Webhook' in the node search box
  2. 2Click 'Webhook' under the Trigger section (not the HTTP Request node)
  3. 3Set HTTP Method to POST
  4. 4Set Respond to 'Immediately'
  5. 5Click 'Copy Webhook URL' and save it — you need it in Step 3
What you should see: You should see a Webhook node on the canvas with a green 'Waiting for webhook call' status after you activate it.
Common mistake — n8n gives you two URLs: a 'Test URL' (only active when the canvas is open) and a 'Production URL' (active when the workflow is published). Register the Production URL in Help Scout, not the Test URL, or your webhook will stop firing the moment you close the browser tab.
n8n
+
click +
search apps
Slack
SL
Slack
Add a Webhook trigger node
Slack
SL
module added
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.

  1. 1Go to Your Account > Apps & Integrations > Webhooks
  2. 2Click 'Add New Webhook'
  3. 3Paste the n8n Production Webhook URL into 'Payload URL'
  4. 4Enter a Secret Key (e.g. a 32-character random string)
  5. 5Check only the 'conversation.created' event box
  6. 6Click 'Save'
What you should see: Help Scout should show the new webhook in the list with a green dot and a 'conversation.created' event tag.
Common mistake — Help Scout sends a test ping immediately after you save. If your n8n workflow isn't active yet, Help Scout will show a delivery failure. This is cosmetic — it doesn't break anything. Activate the n8n workflow before creating a real test ticket.
4

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.

  1. 1Click 'Test Workflow' in the n8n top bar to begin listening
  2. 2In a new browser tab, open Help Scout and create a new conversation
  3. 3Return to n8n and wait for the green execution dot on the Webhook node
  4. 4Click the Webhook node to open the output panel and inspect the JSON
What you should see: You should see a JSON object in the Webhook node output with keys like 'conversation.id', 'conversation.subject', 'conversation.status', and '_embedded.customer.email'.
Common mistake — Help Scout's webhook payload nests customer data under '_embedded.customers[0]' — not at the top level. If you reference 'customer.email' directly, you'll get undefined. Use '{{ $json._embedded.customers[0].email }}' in your expressions.
n8n
▶ Run once
executed
Slack
Help Scout
Help Scout
🔔 notification
received
5

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.

  1. 1Click '+' to the right of the Webhook node
  2. 2Search 'Edit Fields' and select 'Edit Fields (Set)'
  3. 3Click '+ Add Field' and set Name to 'ticket_id', Value to '{{ $json.id }}'
  4. 4Add field: Name 'subject', Value '{{ $json.subject }}'
  5. 5Add field: Name 'customer_email', Value '{{ $json._embedded.customers[0].email }}'
  6. 6Add field: Name 'mailbox_name', Value '{{ $json._embedded.mailbox.name }}'
  7. 7Add field: Name 'ticket_url', Value '{{ "https://secure.helpscout.net/conversation/" + $json.id }}'
What you should see: The Edit Fields node output should show a clean object with 'ticket_id', 'subject', 'customer_email', 'mailbox_name', and 'ticket_url' — no nested '_embedded' keys.
Common mistake — The 'status' field in the payload is a string like 'active' or 'pending' — not 'open'. If you're filtering by status downstream, check the exact string value from your test payload first.
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 > + 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.

  1. 1Click '+' after the Edit Fields node
  2. 2Search 'Slack' and select the Slack node
  3. 3Set Operation to 'Send a Message'
  4. 4Click 'Credential for Slack API' > 'Create New Credential' and complete the OAuth flow
  5. 5Set Channel to '#support-live' (or your target channel name)
  6. 6Paste the message text (see message format in field mapping section)
What you should see: After connecting OAuth, you should see your Slack workspace name appear in the credential dropdown with a green checkmark.
Common mistake — n8n's Slack node requires the bot to be manually invited to private channels. If you target a private channel and the message fails with 'channel_not_found', type '/invite @YourBotName' in that Slack channel first.
7

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.

  1. 1In the Slack node, change 'Message Type' to 'Blocks'
  2. 2Click 'Add Block' and choose 'Section'
  3. 3Set the section text to '*New ticket:* {{ $json.subject }}'
  4. 4Add a second Section block: 'From: {{ $json.customer_email }} | Inbox: {{ $json.mailbox_name }}'
  5. 5Add an Actions block with a Button labeled 'Open in Help Scout' linking to '{{ $json.ticket_url }}'
What you should see: The Slack node preview should show a formatted message block with bold subject text, customer email, mailbox name, and a button linking to the conversation.
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.
8

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.

  1. 1Click 'Test Workflow' in the n8n top bar
  2. 2In Help Scout, create a new conversation: subject 'Broken checkout page', from '[email protected]'
  3. 3Watch n8n — all three nodes should show green execution indicators
  4. 4Open Slack and confirm the message in '#support-live'
What you should see: You should see the message in Slack within 3-5 seconds of creating the Help Scout conversation, with the correct subject, email, mailbox name, and a working 'Open in Help Scout' button.
Common mistake — If the Slack message shows '{{ $json.subject }}' as literal text instead of the ticket subject, you have an expression error. Check that 'Expression' mode is toggled on in each field — the toggle is a small '{' icon to the right of each value input in n8n.
9

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.

  1. 1Click '+' after the Edit Fields node and add an IF node
  2. 2Set Condition: Value 1 = '{{ $json.mailbox_name }}', Operation = 'Equals', Value 2 = 'Billing'
  3. 3Connect the True output to a Slack node targeting '#billing-support'
  4. 4Connect the False output to the existing Slack node targeting '#support-live'
What you should see: The canvas should show a split path — tickets from the Billing mailbox go to one Slack node, all others go to a second Slack node.
Common mistake — IF node string comparison in n8n is case-sensitive by default. 'Billing' and 'billing' won't match. Check the exact casing of your Help Scout mailbox name in the test payload before setting this condition.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
10

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.

  1. 1Click the 'Inactive' toggle in the top right to switch it to 'Active'
  2. 2Confirm the status bar shows 'Active' in green
  3. 3Create one final real test ticket in Help Scout
  4. 4Go to n8n > Executions to confirm the workflow ran successfully
What you should see: The Executions list should show a successful run with green status. The workflow will now fire automatically 24/7 without any browser session required.

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

VerdictWhy n8n for this workflow

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

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.

Tradeoffs

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 tagAdd 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 ticketsAdd 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 notesUse 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

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