- 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! 🚀