- Updated: March 21, 2026
- 5 min read
Integrating OpenClaw Support Agent with Intercom: A Step‑by‑Step Guide
Integrating OpenClaw Support Agent with Intercom: A Step‑by‑Step Guide
In this article we walk you through the complete workflow for connecting OpenClaw – UBOS’s powerful support‑ticketing engine – with Intercom, the popular customer‑messaging platform. By the end you’ll have a live integration that creates tickets in OpenClaw from Intercom conversations, syncs status updates, and keeps your support team in sync across tools.
Why Combine OpenClaw and Intercom?
- Unified Customer View: Intercom handles real‑time chat while OpenClaw provides robust ticket management and reporting.
- Automation: Automatically turn chat conversations into tickets, assign them, and close them when the issue is resolved.
- Scalability: Leverage OpenClaw’s multi‑tenant architecture for larger support teams.
Prerequisites
- An active UBOS instance with OpenClaw installed.
- Intercom workspace with admin access.
- API credentials for both platforms (OpenClaw API token, Intercom Access Token).
- Node‑RED instance (the integration is built as a Node‑RED flow – the same environment that powers UBOS tooling).
Integration Workflow Overview

The flow consists of three main steps:
- Capture Intercom Events: Use Intercom’s Webhooks to listen for new conversations or replies.
- Create/Update OpenClaw Ticket: Call OpenClaw’s REST API to create a ticket or update its status based on the Intercom event.
- Sync Status Back to Intercom: Post a message to the Intercom conversation when the ticket is closed or escalated.
Step‑by‑Step Implementation
1. Set Up Intercom Webhook
In Intercom go to Settings → Webhooks → New Webhook and configure the following:
- URL:
https://your‑node‑red‑instance.com/intercom/webhook - Events:
conversation.user.createdandconversation.user.replied - Authentication: Bearer token (use the same token you will configure in Node‑RED).
2. Build the Node‑RED Flow
Import the JSON below into your Node‑RED editor (Menu → Import → Clipboard). The flow contains:
http innode to receive Intercom webhooks.functionnode to map Intercom payload to OpenClaw ticket fields.http requestnode to call OpenClaw’s/api/v1/ticketsendpoint.http responsenode to acknowledge the webhook.functionnode to post status updates back to Intercom.
{
"id":"openclaw‑intercom‑integration",
"type":"tab",
"label":"OpenClaw ↔ Intercom",
"nodes":[
{"id":"1","type":"http in","z":"openclaw‑intercom‑integration","name":"Intercom Webhook","url":"/intercom/webhook","method":"post","swaggerDoc":""},
{"id":"2","type":"function","z":"openclaw‑intercom‑integration","name":"Map to Ticket","func":"// Extract data from Intercom payload\nvar payload = msg.payload;\nvar ticket = {\n subject: 'Intercom: ' + payload.data.item.title,\n description: payload.data.item.conversation_message.body,\n requester_email: payload.data.item.user.email,\n source: 'Intercom'\n};\nmsg.payload = ticket;\nreturn msg;","outputs":1,"noerr":0},
{"id":"3","type":"http request","z":"openclaw‑intercom‑integration","name":"Create Ticket","method":"POST","ret":"txt","paytoqs":"ignore","url":"https://your‑ubos‑instance.com/api/v1/tickets","tls":"","persist":false,"proxy":"","authType":"bearer","senderr":false,"headers":[{"key":"Authorization","value":"Bearer $OPENCLAW_API_TOKEN","enabled":true}],"x":380,"y":120},
{"id":"4","type":"http response","z":"openclaw‑intercom‑integration","name":"Ack","statusCode":"200","headers":{},"x":580,"y":120},
{"id":"5","type":"function","z":"openclaw‑intercom‑integration","name":"Notify Intercom","func":"// When ticket status changes, post back to Intercom\nvar ticketId = msg.payload.id;\nvar status = msg.payload.status;\nmsg.url = 'https://api.intercom.io/messages';\nmsg.method = 'POST';\nmsg.headers = {\n 'Authorization': 'Bearer $INTERCOM_ACCESS_TOKEN',\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n};\nmsg.payload = {\n message_type: 'note',\n body: 'Ticket #' + ticketId + ' is now ' + status,\n // replace with actual conversation ID from earlier payload\n conversation_id: $CONVERSATION_ID\n};\nreturn msg;","outputs":1,"noerr":0},
{"id":"6","type":"http request","z":"openclaw‑intercom‑integration","name":"Send to Intercom","method":"POST","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"headers":[],"x":580,"y":200}
]
}
Replace the placeholder variables ($OPENCLAW_API_TOKEN, $INTERCOM_ACCESS_TOKEN, $CONVERSATION_ID) with your actual secrets (store them in Node‑RED’s credential store).
3. Test the Integration
- Start a new conversation in Intercom as a test user.
- Verify that a ticket appears in OpenClaw (navigate to Tickets → All).
- Close the ticket in OpenClaw and check that a note is posted back to the Intercom conversation.
If anything fails, check the Node‑RED debug sidebar – the flow logs the full payloads.
Best‑Practice Tips
- Secure Secrets: Use environment variables or Node‑RED’s encrypted credential store for API tokens.
- Idempotency: Store the Intercom conversation ID in the OpenClaw ticket metadata to avoid duplicate tickets.
- Rate Limits: Both Intercom and OpenClaw enforce API limits – implement exponential back‑off in the flow if you see 429 responses.
- Logging: Add a
debugnode after each HTTP request to capture responses for troubleshooting. - Data Hygiene: Trim long messages and sanitize HTML before sending it to OpenClaw to prevent markup issues.
Reference Guides
This guide is part of a series covering OpenClaw integrations. For related tutorials see:
By following the steps above you now have a seamless bridge between Intercom and OpenClaw, giving your support team the best of both worlds.
Happy integrating! 🚀
Andrii Bidochko
CTO UBOS
Andrii Bidochko is an AI entrepreneur and researcher focused on AI agents, reinforcement learning, and autonomous systems. He writes about the technologies shaping the future of machine intelligence, from frontier models and agent architectures to real-world AI applications.