Automation · Customer success
How to build support intake from every channel
A customer emails, then opens a chat, then posts in your shared Slack channel, and three agents start on the same problem. The model behind intake that turns every channel into one ticket, the prompts that build it, and what it takes to run it.
Built with Tray Headless
- System Email, chat, Slack
- Step Match the account
- Step Join or open
- Step Tag the channel
- System Zendesk
Every channel lands in the help desk as a ticket matched to the account, and a second message about the same problem joins the open ticket instead of opening a new one.
The short answer
What is support channel intake?
Support intake from every channel has four parts: every channel your customers use, including shared Slack channels and phone, lands in the help desk as a ticket; the sender is matched to a contact and an account rather than left as an email address; a second message about the same problem joins the open ticket instead of starting a new one; and the reply goes back on the channel the customer used. The part teams skip is matching. A ticket from an unknown address carries no contract, no tier and no history, so everything downstream of it routes blind.
Stage 2 of 6: Intake from every channel. Part of Customer support automation, end to end : every stage, the systems it runs on and the guide that builds it.
What matters here
- Every channel a customer can reach you on is a support channel, whether or not the help desk knows about it. Shared Slack channels are the usual gap.
- Match the sender to an account before anything else. An unmatched ticket routes blind.
- A second message about the same problem should join the open ticket. Three tickets for one problem means three agents and three different answers.
- Reply on the channel the customer used. Moving them to email to suit the tool is the first bad experience.
- Count the tickets that arrive unmatched. It tells you how good your contact data is.
Who this is for
You run support operations. Email and the help desk widget create tickets, but chat, phone and the shared Slack channels with your biggest customers are handled by whoever sees them first.
How it works in practice
What has to happen between a customer reaching out on any channel and a ticket being ready to route.
- 1
The message arrives on whatever channel the customer chose
Email, the help desk widget, live chat, a web form, a phone call or a shared Slack or Teams channel.
- 2
The sender is matched to a contact and an account
By email address first, then by email domain, then by the Slack workspace or phone number on the account.
- 3
It joins an open ticket or opens a new one
Same requester, same account, an open ticket on the same subject in the last few days: it joins. Otherwise it is new.
- 4
The ticket records where it came from
The channel, the original message and a link back to it, so the agent can reply where the customer is.
- 5
Unmatched senders are flagged, not dropped
A ticket from an unknown address still gets answered, and a person links it to the right account.
- 6
Replies go back on the original channel
An agent's reply in the help desk posts to the Slack thread, the chat or the email the customer used.
What channel intake is made of
Four parts, and the second is the one everything after it depends on.
One intake for every channel
Email, chat, phone, forms and shared Slack or Teams channels all create help desk tickets, so nothing lives only in somebody's inbox.
Account matching
Each sender tied to a contact and an account in the CRM, with the contract tier attached, before the ticket is routed.
Join, don't duplicate
A follow-up from the same person about the same problem is added to the open ticket, with any doubt left as two tickets and a suggested merge.
Two-way replies
The agent works in the help desk and the reply reaches the customer where they asked, with the thread kept in step both ways.
The Tray Headless prompts
Paste these into Claude Code or Codex with the Tray Headless plugin installed. Each stage runs on its own. The systems named in them are the worked example rather than a requirement, and every prompt says so.
Once per project, run
/tray-workflows:set-workspace
to pick the workspace these build in. Point it at a sandbox first.
- 1
First, list every channel and how it arrives today
The channels nobody counted are where tickets go missing.
Headless skills
build-workflowUse build-workflow. The systems in play are Zendesk, Intercom, Slack, Aircall and Salesforce, or whatever we run in those seats. Before you plan anything, tell me which of them are already authenticated in the workspace. List every way a customer can reach support today: support email addresses, the help desk widget, live chat, web forms, the phone line, and every shared Slack or Teams channel with a customer. For each, tell me whether it creates a ticket now, and if not, who sees it. From Zendesk I need the Ticket and User models, including the channel field and external ids. From Salesforce I need Contact and Account with email domains, support tier and the Slack workspace or channel id if we store one.
- 2
Match every sender to an account
A ticket with no account carries no tier, no history and no owner.
Headless skills
build-workflowUse build-workflow. On every inbound message, match the sender in this order: 1. Exact email address on a Contact 2. Email domain on an Account, skipping free mail domains 3. Slack workspace or channel id stored on the Account 4. Phone number on a Contact or Account Write the matched Contact and Account to the ticket, with the support tier and the account owner. Record which rule matched, because a domain match is weaker than an exact address. If nothing matches, still create the ticket, tag it unmatched and post it to the support ops channel so a person can link it. Never drop or hold a message because the sender is unknown.
- 3
Join follow-ups to the open ticket
Three tickets for one problem means three agents and three answers.
Headless skills
tray-patternsUse tray-patterns. Before creating a ticket, look for an open one from the same requester on the same account, created in the last five days. If the new message replies to that ticket's thread, or clearly refers to the same problem, add it as a comment on the open ticket and tell the assignee. If it is a different problem, open a new ticket. Where it is unclear, open a new ticket and suggest the merge to the agent rather than merging it yourself. Two tickets that should be one cost a merge; one ticket that should be two hides a problem. Messages can arrive twice from the same channel when a webhook retries. Check the message id before creating anything, so a retry never opens a second ticket.
- 4
Reply where the customer asked
Moving a customer to email to suit the tool is the first bad experience.
When an agent replies on a ticket that started in Slack, post the reply to the original thread. Do the same for chat. Replies from the customer in that thread come back as comments on the ticket. Internal notes never leave the help desk. Check the comment is public before posting anything to a channel the customer can see. Report weekly: tickets by channel, tickets that arrived unmatched and how long they took to link, and follow-ups joined versus suggested merges.
The public-comment check is the one to test hardest. An internal note posted to a customer's Slack channel is the incident this workflow can cause.
- 5
Validate, then hand the channel list to support ops
Because shared channels open every time a big deal closes.
Run the per-step schema checks and the whole-workflow audit before this touches production. Then open the same workflow in Tray Build so support operations can add a new shared channel, a new support address or a new matching rule in the visual canvas without asking engineering.
What it connects to
The channels bring the message, the CRM says who sent it, and the help desk holds the ticket.
Zendesk
Create and update tickets, find open tickets for the requester, and post agent replies back out.
Reads and writes
Intercom
Hand chat conversations to a ticket with the transcript, and return agent replies to the chat.
Reads and writes
Slack
Read messages from shared customer channels, and post agent replies back to the same thread.
Reads and writes
Salesforce
Match the sender to a contact and account, and read the support tier and account owner.
Reads
Same build, other stacks
The design does not change if you run something else in one of these seats. The same prompts build it against Microsoft Dynamics 365, Microsoft Teams, Jira, Microsoft Outlook, HubSpot or Google Chat.
Connections in this build
Field mapping, templates and common problems for each pairing: Intercom + Zendesk, Slack + Zendesk, Intercom + Slack and Aircall + Zendesk.
Named systems are the ones most teams run, not the only ones that work. Each is an authentication in your Tray workspace, referenced by name, so the workflow never holds a credential. Where we have a connector page, the name links to it.
Running it in production
This is the front door. If it drops a message, nobody finds out until the customer chases.
It runs on the platform, not on a laptop
Every channel is watched on the same engine, including the spike when something breaks and every channel lights up at once.
Every message is accounted for
Each inbound message is logged with the ticket it became or joined, so a missing one can be traced in minutes.
Credentials are managed, never written into the build
The Slack and help desk credentials read customer conversations. They live in your workspace, scoped to the channels support uses.
Support ops owns the channel list
New shared channels, support addresses and matching rules open in Tray Build, maintained by the team that runs the queue.
Nothing is merged on a guess
Unclear follow-ups become a suggested merge for the agent. A wrong merge hides a second problem inside the first.
Questions people ask
Should shared Slack channels create tickets?
Yes, for anything that needs an answer. Customers in a shared channel expect the same response times as email, and a question answered only in Slack never reaches the reports, the SLA clock or the next agent.
How do you match a sender to an account?
Exact email address first, then the email domain on the account, skipping free mail domains, then the Slack workspace or phone number stored on the account. Record which rule matched, because a domain match is weaker than an exact address.
What happens when the sender is unknown?
The ticket is still created and answered. It is tagged unmatched and sent to support ops to link to the right account, and the count of unmatched tickets tells you how good your contact data is.
How do you stop duplicate tickets?
Look for an open ticket from the same requester on the same account before creating one. Join clear follow-ups, and suggest a merge to the agent when it is unclear rather than merging automatically.
Can support ops add a new channel without engineering?
Yes. The channel list and matching rules open in Tray Build, so a new shared channel or support address is a change support ops makes itself.
Further reading
Background on the same subject, for the case rather than the build.
Related guides
Customer success
How to build support ticket routing
Route on the skill needed and the account, not on who is free. Derive priority from contract and impact, and time the clock from the customer. The prompts.
AI operations
How to build AI support deflection
Answer only what the knowledge base actually covers, escalate early with the context, and measure resolution rather than deflection. The prompts that build it.
Customer success
How to build SLA breach alerts
Warn the right person before a support SLA is missed, with the clock read from the customer's contract, paused only when it should be, and every near miss recorded. The prompts.
Data operations
How to build a customer 360 and master data sync
Pick a survivorship order per attribute, resolve identity on more than email, and publish a golden record every system can point at. The prompts.
Last reviewed October 2026.