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

How to Send Help Scout Ticket Assignments to Slack with Pipedream

When a Help Scout ticket is assigned to a team member, Pipedream fires a webhook, resolves the assignee's name, and posts a direct Slack notification to that person.

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 need instant, per-agent Slack pings the moment a ticket lands in their queue.

Not ideal for

Teams that want a single shared #support-assignments channel digest rather than per-agent direct messages — use Make's scheduling module for that instead.

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 12-person customer success team at a B2B SaaS company uses this to DM each agent in Slack the moment Help Scout assigns them a ticket. Before this, agents refreshed their Help Scout queue manually every 20–30 minutes and tickets sat unacknowledged for up to an hour during busy periods. After setup, average first-response time dropped from 47 minutes to 11 minutes within the first week.

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 Pipedream

Copy the pre-built Pipedream blueprint and paste it straight into Pipedream. 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 admin access to create and manage webhooks under Settings > General > Webhooks
A Slack bot app with chat:write and users:read.email OAuth scopes installed to your workspace
Pipedream account with Help Scout and Slack Connected Accounts configured (free tier is sufficient)
Consistent email addresses across Help Scout and Slack — every agent's Help Scout email must match their Slack account email
Help Scout plan that supports webhook integrations (Standard plan or above)

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Ticket IDconversation.id
Ticket Subjectconversation.subject
Assignee Emailassignee.email
Ticket URL
5 optional fields▸ show
Assignee First Nameassignee.firstName
Customer Nameconversation.createdBy.firstName
Mailbox Namemailbox.name
Ticket Statusconversation.status
Previous AssigneepreviousAssignee

Step-by-Step Setup

1

pipedream.com > Workflows > New Workflow

Create a new Pipedream workflow

Log in at pipedream.com and click the blue 'New Workflow' button in the top-left sidebar. Give it a clear name like 'Help Scout → Slack Ticket Assignment'. You'll land on the workflow canvas with a single empty trigger block at the top. Everything you build flows from this trigger block downward.

  1. 1Go to pipedream.com and sign in
  2. 2Click 'New Workflow' in the left sidebar
  3. 3Enter the name 'Help Scout → Slack Ticket Assignment'
  4. 4Click 'Create'
What you should see: You should see a blank workflow canvas with a gray 'Add a trigger' block at the top.
2

Workflow Canvas > Add a trigger > Help Scout > New Conversation Assigned

Add the Help Scout webhook trigger

Click the 'Add a trigger' block and search for 'Help Scout' in the app list. Select the 'New Conversation Assigned' event — this fires every time a ticket's assignee changes. Pipedream will generate a unique webhook URL for your Help Scout app. Copy that URL; you'll paste it into Help Scout in the next step.

  1. 1Click 'Add a trigger'
  2. 2Type 'Help Scout' in the search bar
  3. 3Select 'Help Scout' from the results
  4. 4Choose the 'New Conversation Assigned' event
  5. 5Connect your Help Scout account via Connected Accounts and click 'Save and continue'
What you should see: You should see a unique webhook URL displayed under the trigger config, and a 'Listening for events' status indicator.
Common mistake — Help Scout fires the 'conversation.assigned' webhook event for both new assignments and reassignments. If you only want first-time assignments, you'll need a filter step later — the trigger alone cannot distinguish between the two.
Pipedream
+
click +
search apps
Slack
SL
Slack
Add the Help Scout webhook t…
Slack
SL
module added
3

Help Scout > Settings > General > Webhooks > Add Webhook

Register the webhook in Help Scout

In a separate tab, go to your Help Scout account and navigate to Settings > General > Webhooks. Paste the Pipedream webhook URL into the URL field. Under 'Events', check only 'Conversation Assigned'. Give it a label like 'Pipedream Assignment Notifier'. Save the webhook.

  1. 1Open Help Scout in a new tab
  2. 2Go to Settings > General > Webhooks
  3. 3Click 'Add Webhook'
  4. 4Paste the Pipedream URL into the 'URL' field
  5. 5Check 'Conversation Assigned' under Events
  6. 6Click 'Save'
What you should see: The webhook should appear in your list with a green active status dot. Help Scout will send a test ping immediately — return to Pipedream and you should see a sample event appear in the trigger's 'Event' tab.
Common mistake — Help Scout sends a secret key with each webhook request. If you want to verify request authenticity, grab the secret from the webhook detail page in Help Scout and validate it in a Pipedream code step using HMAC-SHA1. Skipping this is fine for internal tools, but don't skip it if this workflow is exposed to the internet without other auth.
4

Workflow Canvas > Trigger > Event tab

Test the trigger with a real assignment

Back in Pipedream, click 'Send Test Event' or manually assign a ticket in Help Scout to yourself. Within 2–3 seconds, Pipedream will capture the payload. Click on the event in the trigger panel to expand it. You should see fields like conversation.id, assignee.id, assignee.email, subject, and mailbox.name. These are the fields you'll map in the next steps.

  1. 1Assign a test ticket to yourself in Help Scout
  2. 2Switch back to Pipedream
  3. 3Click the 'Event' tab on the trigger block
  4. 4Expand the payload to verify fields are present
What you should see: You should see a JSON payload containing conversation.id, assignee.email, assignee.firstName, assignee.lastName, subject, and status fields.
Pipedream
▶ Deploy & test
executed
Slack
Help Scout
Help Scout
🔔 notification
received
5

Workflow Canvas > + > Helpers > Filter

Add a filter step to skip reassignments (optional but recommended)

Click the '+' button below the trigger to add a new step. Choose 'Filter' (under Helpers) or use a Node.js Code step. This step checks whether the ticket was previously assigned to someone else — if it was, you may not want to send a duplicate ping. Use the previousAssignee field from the Help Scout payload to make this call. If previousAssignee is null, it's a fresh assignment.

  1. 1Click the '+' button below the trigger block
  2. 2Select 'Filter' from the Helpers section
  3. 3Set the condition: steps.trigger.event.body.previousAssignee === null
  4. 4Set the filter to 'Continue if true'
  5. 5Click 'Test'
What you should see: For a first-time assignment, the filter passes and the workflow continues. For a reassignment, the workflow halts here and no Slack message is sent.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Help Scout
HE
notified
6

Workflow Canvas > + > Add a step > Run Node.js code

Look up the assignee's Slack user ID

Help Scout gives you the assignee's email address. Slack needs a user ID (like U04XYZABC) to send a direct message. Add a Node.js Code step that calls the Slack API's users.lookupByEmail method using the assignee's email from the Help Scout payload. This resolves the email to a Slack user ID you can use in the next step.

  1. 1Click '+' below the filter step
  2. 2Select 'Run Node.js code'
  3. 3Paste the lookup code (see Pro Tip section)
  4. 4Add your Slack Connected Account token as an environment variable or use $.auth
  5. 5Click 'Test step'
What you should see: The step returns a Slack user ID string like 'U04XYZABC' in the step's export. You'll reference this as steps.lookup_slack_user.$return_value in the next step.
Common mistake — If the agent's Help Scout email doesn't match their Slack account email, this lookup returns null and your DM will fail silently. Standardize emails across both tools before going live, or add an error branch for null results.
7

Workflow Canvas > + > Run Node.js code

Build the Slack message with Block Kit

Add another Node.js Code step. This step constructs the Slack Block Kit message payload. Include the ticket subject, the direct link to the Help Scout conversation (formatted as https://secure.helpscout.net/conversation/{id}), the customer's name, and the mailbox name. Using Block Kit instead of plain text lets you add a clickable 'View Ticket' button directly in the message.

  1. 1Click '+' below the Slack lookup step
  2. 2Select 'Run Node.js code'
  3. 3Construct the Block Kit payload referencing trigger event fields
  4. 4Export the payload object from the step
What you should see: The step exports a complete Slack Block Kit JSON object with a header block, a section block with ticket details, and a button block linking to Help Scout.
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

Workflow Canvas > + > Slack > Send a Direct Message

Send the Slack direct message

Add a Slack step and choose the 'Send a Direct Message' action. Connect your Slack bot's Connected Account. Set the 'User ID' field to the output from your lookup step (steps.lookup_slack_user.$return_value). Set the 'Blocks' field to the Block Kit payload from the previous step. Leave 'Text' as a plain-text fallback like 'New ticket assigned: {subject}'.

  1. 1Click '+' below the message builder step
  2. 2Search for 'Slack' and select it
  3. 3Choose 'Send a Direct Message'
  4. 4Connect your Slack bot account via Connected Accounts
  5. 5Set 'User ID' to steps.lookup_slack_user.$return_value
  6. 6Set 'Blocks' to steps.build_message.$return_value.blocks
  7. 7Set 'Text' to the plain-text fallback
What you should see: A test run sends a real DM to the assigned agent in Slack containing the ticket subject, customer name, mailbox, and a 'View Ticket' button.
Common mistake — Your Slack app must have the chat:write and users:read.email OAuth scopes. If either is missing, the DM step returns a missing_scope error. Re-authorize the Slack Connected Account after adding those scopes in your Slack app's OAuth & Permissions settings.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
9

Workflow Canvas > + > Run Node.js code

Add error handling for failed lookups

Add a final Node.js Code step with a try/catch that checks whether the Slack user ID lookup returned a value. If the lookup failed — email mismatch, deactivated account — post a fallback message to a designated #support-ops Slack channel so the assignment doesn't go completely unnoticed. This step only runs when the Slack user ID is null.

  1. 1Click '+' below the Send DM step
  2. 2Select 'Run Node.js code'
  3. 3Add a conditional check: if (!steps.lookup_slack_user.$return_value)
  4. 4Use $.send.http or the Slack step to post to your fallback channel
  5. 5Click 'Test step'
What you should see: When a Slack user ID lookup fails, a message like 'Could not DM assignee for ticket #12345 — check email match' appears in your #support-ops channel.
10

Workflow Canvas > Deploy > Logs tab

Deploy and monitor the workflow

Click 'Deploy' in the top-right corner of the workflow canvas. Pipedream switches the workflow from test mode to live. Assign a real ticket in Help Scout and verify the DM arrives in Slack within 5 seconds. Open the workflow's 'Logs' tab and confirm each step shows a green checkmark. Set up an email alert under Settings > Notifications for workflow errors.

  1. 1Click the blue 'Deploy' button in the top right
  2. 2Assign a live Help Scout ticket to a team member
  3. 3Open the 'Logs' tab and watch the run appear
  4. 4Confirm all steps show green status
  5. 5Go to Settings > Notifications and enable error email alerts
What you should see: The assigned agent receives a Slack DM within 5 seconds. The Logs tab shows a completed run with green status on all steps and a sub-200ms total execution time.

This code handles the Slack user ID lookup AND builds a Block Kit message payload in a single step. Paste it into a Node.js Code step placed between the filter step and the Slack 'Send a Direct Message' step. It includes error handling for missing email matches and exports both the Slack user ID and the message blocks as separate values.

JavaScript — Code Stepimport axios from 'axios';
▸ Show code
import axios from 'axios';
export default defineComponent({
  props: {

... expand to see full code

import axios from 'axios';

export default defineComponent({
  props: {
    slack: {
      type: 'app',
      app: 'slack',
    },
  },
  async run({ steps, $ }) {
    const event = steps.trigger.event.body;
    const assigneeEmail = event?.assignee?.email;
    const assigneeFirstName = event?.assignee?.firstName ?? 'there';
    const conversationId = event?.conversation?.id;
    const subject = event?.conversation?.subject ?? '(No subject)';
    const customerFirst = event?.conversation?.createdBy?.firstName ?? 'Unknown customer';
    const mailboxName = event?.mailbox?.name ?? 'Unknown mailbox';
    const ticketUrl = `https://secure.helpscout.net/conversation/${conversationId}`;

    if (!assigneeEmail) {
      throw new Error('No assignee email found in Help Scout payload. Check webhook field path.');
    }

    // Resolve Slack user ID from email
    let slackUserId = null;
    try {
      const lookupRes = await axios.get('https://slack.com/api/users.lookupByEmail', {
        headers: { Authorization: `Bearer ${this.slack.$auth.oauth_access_token}` },
        params: { email: assigneeEmail },
      });

      if (lookupRes.data.ok) {
        slackUserId = lookupRes.data.user.id;
      } else {
        console.log(`Slack lookup failed for ${assigneeEmail}: ${lookupRes.data.error}`);
      }
    } catch (err) {
      console.error('Slack API call failed:', err.message);
    }

    // Build Block Kit message
    const blocks = [
      {
        type: 'header',
        text: { type: 'plain_text', text: '📬 New ticket assigned to you', emoji: true },
      },
      {
        type: 'section',
        fields: [
          { type: 'mrkdwn', text: `*Subject:*\n${subject}` },
          { type: 'mrkdwn', text: `*From:*\n${customerFirst}` },
          { type: 'mrkdwn', text: `*Mailbox:*\n${mailboxName}` },
        ],
      },
      {
        type: 'actions',
        elements: [
          {
            type: 'button',
            text: { type: 'plain_text', text: 'View Ticket', emoji: true },
            url: ticketUrl,
            style: 'primary',
          },
        ],
      },
    ];

    return {
      slackUserId,
      blocks,
      fallbackText: `Hey ${assigneeFirstName}, you have a new Help Scout ticket: "${subject}" from ${customerFirst}. View it here: ${ticketUrl}`,
    };
  },
});

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 Pipedream for this if your team has at least one person comfortable reading Node.js. The webhook processing is genuinely instant — under 1 second from Help Scout firing to Pipedream receiving — and the ability to do the Slack email-to-user-ID lookup in the same workflow without a separate API connector tool saves real setup time. The other reason to pick Pipedream: the Slack Block Kit message construction is just code, so you can add conditional logic like 'if the ticket is from an enterprise customer, bold the subject line' without fighting a visual mapper. If nobody on your team touches code, use Make instead — the same workflow takes about 15 minutes to configure without writing a line.

Cost

Pipedream's free tier gives you 10,000 credits/month. This workflow costs roughly 3 credits per run (trigger + code step + Slack step). At 100 ticket assignments/day — which is high for most teams under 30 agents — you'd use about 9,000 credits/month and stay on the free tier. At 200 assignments/day you'd exceed it and need the Basic plan at $19/month. Zapier charges $29.99/month for 2,000 tasks, and this workflow uses 2 tasks per run — meaning Zapier hits its limit at 1,000 assignments/month. Pipedream is cheaper for anything above ~700 assignments/month.

Tradeoffs

Zapier's Help Scout integration has a pre-built 'New Conversation Assigned' trigger that works without any webhook configuration — if your team has zero tolerance for setup complexity, that 5-minute Zapier path is faster. Make's scenario builder lets you visually map the Slack Block Kit JSON without code, which is better for teams that want to maintain the workflow without developer help. n8n gives you the same Node.js flexibility as Pipedream and is cheaper at scale if you self-host, but the Help Scout webhook setup is more manual. Power Automate doesn't have a native Help Scout connector, so you'd need a custom HTTP trigger — viable, but more work than it's worth when Pipedream has a first-class Help Scout integration. Pipedream wins here for small developer-friendly teams who want the customization ceiling of code without standing up their own server.

Three things that bite people after deployment. First, Help Scout occasionally sends duplicate webhook payloads for the same assignment event — usually within 3 seconds of each other. Without the Data Store deduplication step, agents get two identical Slack DMs. Add it from the start, not after your first support complaint. Second, the Help Scout webhook payload structure is not identical across all plan tiers — some fields like assignee.photoUrl exist on Pro plans but not Standard, and your code will throw if you reference them without optional chaining. Third, Slack's users.lookupByEmail endpoint requires the users:read.email scope specifically — users:read alone is not enough and the error message from Slack ('missing_scope') doesn't tell you which specific scope is missing, so people waste 20 minutes re-checking the wrong scope.

Ideas for what to build next

  • Add a Slack acknowledgement buttonExtend the Block Kit message with an 'Acknowledge' button that, when clicked, posts a Slack interactivity payload back to a second Pipedream workflow. That workflow updates the Help Scout ticket tag to 'acknowledged' so managers can see which pings were acted on.
  • Send a daily assignment digest to team leadsBuild a second Pipedream workflow on a scheduled trigger that queries the Help Scout API for all tickets assigned in the last 24 hours, groups them by agent, and posts a summary table to a #support-leads Slack channel each morning at 9am.
  • Escalate unacknowledged tickets after 30 minutesAdd a Pipedream Delay step after the Slack DM. If the ticket status hasn't changed from 'active' after 30 minutes — checked via the Help Scout API — automatically post an escalation alert to the team lead's Slack DM with the ticket link.

Related guides

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