

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-timeUse case type
notificationReal-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.
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 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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Ticket ID | conversation.id | |
| Ticket Subject | conversation.subject | |
| Assignee Email | assignee.email | |
| Ticket URL | ||
5 optional fields▸ show
| Assignee First Name | assignee.firstName |
| Customer Name | conversation.createdBy.firstName |
| Mailbox Name | mailbox.name |
| Ticket Status | conversation.status |
| Previous Assignee | previousAssignee |
Step-by-Step Setup
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.
- 1Go to pipedream.com and sign in
- 2Click 'New Workflow' in the left sidebar
- 3Enter the name 'Help Scout → Slack Ticket Assignment'
- 4Click 'Create'
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.
- 1Click 'Add a trigger'
- 2Type 'Help Scout' in the search bar
- 3Select 'Help Scout' from the results
- 4Choose the 'New Conversation Assigned' event
- 5Connect your Help Scout account via Connected Accounts and click 'Save and continue'
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.
- 1Open Help Scout in a new tab
- 2Go to Settings > General > Webhooks
- 3Click 'Add Webhook'
- 4Paste the Pipedream URL into the 'URL' field
- 5Check 'Conversation Assigned' under Events
- 6Click 'Save'
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.
- 1Assign a test ticket to yourself in Help Scout
- 2Switch back to Pipedream
- 3Click the 'Event' tab on the trigger block
- 4Expand the payload to verify fields are present
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.
- 1Click the '+' button below the trigger block
- 2Select 'Filter' from the Helpers section
- 3Set the condition: steps.trigger.event.body.previousAssignee === null
- 4Set the filter to 'Continue if true'
- 5Click 'Test'
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.
- 1Click '+' below the filter step
- 2Select 'Run Node.js code'
- 3Paste the lookup code (see Pro Tip section)
- 4Add your Slack Connected Account token as an environment variable or use $.auth
- 5Click 'Test step'
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.
- 1Click '+' below the Slack lookup step
- 2Select 'Run Node.js code'
- 3Construct the Block Kit payload referencing trigger event fields
- 4Export the payload object from the step
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}'.
- 1Click '+' below the message builder step
- 2Search for 'Slack' and select it
- 3Choose 'Send a Direct Message'
- 4Connect your Slack bot account via Connected Accounts
- 5Set 'User ID' to steps.lookup_slack_user.$return_value
- 6Set 'Blocks' to steps.build_message.$return_value.blocks
- 7Set 'Text' to the plain-text fallback
channel: {{channel}}
ts: {{ts}}
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.
- 1Click '+' below the Send DM step
- 2Select 'Run Node.js code'
- 3Add a conditional check: if (!steps.lookup_slack_user.$return_value)
- 4Use $.send.http or the Slack step to post to your fallback channel
- 5Click 'Test step'
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.
- 1Click the blue 'Deploy' button in the top right
- 2Assign a live Help Scout ticket to a team member
- 3Open the 'Logs' tab and watch the run appear
- 4Confirm all steps show green status
- 5Go to Settings > Notifications and enable error email alerts
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
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.
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.
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 button — Extend 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 leads — Build 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 minutes — Add 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
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