Hey @Soniak Paul here from weekend support engineering to help you out 🤝
You’re, right! Ticket-based workflows in Intercom can’t send user-facing messages like in-app or email notifications. They’re focused on internal routing and updates.
To notify the user automatically, the best option is to send a message via your backend after creating the ticket using the Intercom API to start a new conversation or send a post-style message.
This keeps internal ticket details private while giving users a clear update, like “We’re reviewing your info and will follow up within 24 hours.”
Thank you for your reply, @Paul Byrne !
If we were to create a new conversation via API, is there a way to connect it to the back-office ticket that was created in conjunction to essentially keep records tied to each other? I figure it’ll get tedious and difficult to go searching through records and would like to keep everything organized.
Hey @Soniak
You could try this work around,
Both objects expose a linked_objects
section, and you can programmatically link a conversation to a ticket so they remain associated and easy to navigate between in Inbox and via the API.
To do this, you’ll first create the conversation, then create the back-office ticket, and finally update the ticket to link it to the conversation. Both the Ticket and Conversation schemas include a linked_objects
collection, which lists metadata for linked conversations and tickets (up to 1000). The supported way to programmatically create the association is by updating the ticket and setting the conversation_to_link_id
field to the conversation ID.
Here’s the recommended flow:
-
Create the conversation
curl -X POST https://api.intercom.io/conversations \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-H "Intercom-Version: 2.14" \
-d '{
"from": { "type": "user", "id": "CONTACT_ID" },
"body": "Hi there — following up on your case."
}'
-
Create the back-office ticket
curl -X POST https://api.intercom.io/tickets \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-H "Intercom-Version: 2.14" \
-d '{
"ticket_type_id": 88,
"contacts": [{ "id": "CONTACT_ID" }],
"ticket_attributes": {
"_default_title_": "Back-office review",
"_default_description_": "Details of the internal issue..."
}
}'
-
Link them by updating the ticket with the conversation ID
curl -X PUT https://api.intercom.io/tickets/{TICKET_ID} \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-H "Intercom-Version: Unstable" \
-d '{
"conversation_to_link_id": "CONVERSATION_ID"
}'
You may need to use the Intercom-Version: Unstable
header if your workspace requires the latest API surface for this field. Once linked, you can confirm the association from either side. To verify, retrieve the conversation and inspect its linked_objects
array, or retrieve the ticket and confirm that the linked conversation appears there.
curl -X GET https://api.intercom.io/conversations/{CONVERSATION_ID} \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Intercom-Version: 2.14"
curl -X GET https://api.intercom.io/tickets/{TICKET_ID} \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Intercom-Version: 2.14"
Would you like me to streamline this further into a single end-to-end script (instead of separate cURL calls) that you can run in your preferred language?