- Updated: March 22, 2026
- 8 min read
Step‑by‑step guide: Integrating OpenClaw sales‑assistant with Zoho CRM and Microsoft Dynamics 365 using UBOS
You can integrate the OpenClaw sales‑assistant with both Zoho CRM and Microsoft Dynamics 365 in under an hour by using the UBOS low‑code platform, deploying ready‑made Node‑RED flows, and following the step‑by‑step guide below.
1. Introduction
OpenClaw is a conversational sales‑assistant that can qualify leads, schedule demos, and push data into any CRM. UBOS (Unified Business Operating System) provides a drag‑and‑drop UBOS platform overview where you can host OpenClaw agents, create API connectors, and orchestrate workflows without writing extensive code.
This guide walks sales managers, CRM administrators, and technical leads through the entire lifecycle:
- Preparing prerequisites.
- Deploying the OpenClaw agent on UBOS.
- Connecting to Zoho CRM.
- Connecting to Microsoft Dynamics 365.
- Publishing, monitoring, and optimizing the integration.
2. Prerequisites
Before you start, gather the following items. All of them are required for a smooth, secure integration.
- UBOS account – a valid subscription with access to the console and Node‑RED studio.
- OpenClaw agent access – API key and the agent’s webhook URL (provided by OpenClaw).
- Zoho CRM credentials – client ID, client secret, and a refresh token generated from the Zoho Developer Console.
- Microsoft Dynamics 365 credentials – Azure AD tenant ID, application (client) ID, client secret, and the Dynamics 365 instance URL.
3. Setting up the OpenClaw agent on UBOS
3.1 Deploying via UBOS console
UBOS offers a one‑click deployment wizard for third‑party agents. Follow these steps:
- Log in to the UBOS homepage and navigate to Workflow automation studio.
- Click New Integration → Marketplace → search for “OpenClaw”.
- Select the OpenClaw Sales‑Assistant template and click Deploy.
- In the configuration modal, paste your OpenClaw API key and set the webhook endpoint (e.g.,
https://your‑ubos‑instance.com/webhook/openclaw). - Save and enable the integration. UBOS automatically creates a Node‑RED flow that routes incoming chat messages to OpenClaw and returns responses.
💡 Tip: Use the Web app editor on UBOS to customize the chat UI if you need a branded front‑end for your sales team.
4. Connecting to Zoho CRM
4.1 API authentication
Zoho CRM uses OAuth 2.0 with a refresh token flow. Create a .env file in your UBOS project and store the credentials securely:
ZOHO_CLIENT_ID=your_client_id
ZOHO_CLIENT_SECRET=your_client_secret
ZOHO_REFRESH_TOKEN=your_refresh_token
ZOHO_API_BASE=https://www.zohoapis.com/crm/v2
4.2 Sample Node‑RED flow (Zoho CRM)
Import the following JSON into the Node‑RED editor. It fetches a lead record, updates it with OpenClaw conversation data, and logs the result.
{
"id": "zoho-lead-sync",
"type": "tab",
"label": "Zoho CRM Sync",
"nodes": [
{
"id": "1a2b3c",
"type": "http request",
"z": "zoho-lead-sync",
"name": "Get Access Token",
"method": "POST",
"ret": "obj",
"url": "https://accounts.zoho.com/oauth/v2/token",
"tls": "",
"x": 180,
"y": 80,
"wires": [["4d5e6f"]]
},
{
"id": "4d5e6f",
"type": "function",
"z": "zoho-lead-sync",
"name": "Build Token Payload",
"func": "msg.payload = {\n client_id: process.env.ZOHO_CLIENT_ID,\n client_secret: process.env.ZOHO_CLIENT_SECRET,\n refresh_token: process.env.ZOHO_REFRESH_TOKEN,\n grant_type: \"refresh_token\"\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 380,
"y": 80,
"wires": [["7g8h9i"]]
},
{
"id": "7g8h9i",
"type": "http request",
"z": "zoho-lead-sync",
"name": "Refresh Access Token",
"method": "POST",
"ret": "obj",
"url": "https://accounts.zoho.com/oauth/v2/token",
"tls": "",
"x": 580,
"y": 80,
"wires": [["a1b2c3"]]
},
{
"id": "a1b2c3",
"type": "function",
"z": "zoho-lead-sync",
"name": "Store Token",
"func": "flow.set('zoho_access_token', msg.payload.access_token);\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 800,
"y": 80,
"wires": [["d4e5f6"]]
},
{
"id": "d4e5f6",
"type": "http request",
"z": "zoho-lead-sync",
"name": "Create / Update Lead",
"method": "POST",
"ret": "obj",
"url": "https://www.zohoapis.com/crm/v2/Leads",
"tls": "",
"x": 200,
"y": 200,
"wires": [["g7h8i9"]]
},
{
"id": "g7h8i9",
"type": "debug",
"z": "zoho-lead-sync",
"name": "Zoho Response",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"x": 420,
"y": 200,
"wires": []
}
]
}
4.3 Testing the connection
Deploy the flow and trigger it with a test payload (e.g., a JSON object containing a lead’s email). Verify that:
- The access token is refreshed without errors.
- A new lead appears in Zoho CRM with the expected fields.
- The debug node shows a
200 OKresponse.
🔧 If you encounter 401 Unauthorized, double‑check the refresh token scope and ensure the client secret matches the one in the Zoho Developer Console.
5. Connecting to Microsoft Dynamics 365
5.1 OAuth setup in Azure AD
Dynamics 365 also relies on OAuth 2.0. Follow these steps in the Azure portal:
- Create a new App registration named “UBOS‑OpenClaw”.
- Copy the Application (client) ID and Directory (tenant) ID**.
- Generate a Client secret (keep it safe).
- Under API permissions, add
user_impersonationforDynamics CRMand grant admin consent.
Store these values in a .env file inside your UBOS project:
DYNAMICS_TENANT_ID=your_tenant_id
DYNAMICS_CLIENT_ID=your_client_id
DYNAMICS_CLIENT_SECRET=your_client_secret
DYNAMICS_RESOURCE=https://yourorg.crm.dynamics.com
5.2 Sample Node‑RED flow (Dynamics 365)
The flow below obtains an access token from Azure AD, then creates a contact record in Dynamics 365 using the OpenClaw conversation data.
{
"id": "dynamics-sync",
"type": "tab",
"label": "Dynamics 365 Sync",
"nodes": [
{
"id": "token-request",
"type": "http request",
"z": "dynamics-sync",
"name": "Get Azure Token",
"method": "POST",
"ret": "obj",
"url": "https://login.microsoftonline.com/{{process.env.DYNAMICS_TENANT_ID}}/oauth2/v2.0/token",
"tls": "",
"x": 180,
"y": 80,
"wires": [["store-token"]]
},
{
"id": "store-token",
"type": "function",
"z": "dynamics-sync",
"name": "Build Token Payload",
"func": "msg.payload = {\n client_id: process.env.DYNAMICS_CLIENT_ID,\n client_secret: process.env.DYNAMICS_CLIENT_SECRET,\n scope: \"https://graph.microsoft.com/.default\",\n grant_type: \"client_credentials\"\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 380,
"y": 80,
"wires": [["token-request"]]
},
{
"id": "save-token",
"type": "function",
"z": "dynamics-sync",
"name": "Store Access Token",
"func": "flow.set('dynamics_token', msg.payload.access_token);\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 600,
"y": 80,
"wires": [["create-contact"]]
},
{
"id": "create-contact",
"type": "http request",
"z": "dynamics-sync",
"name": "Create Contact",
"method": "POST",
"ret": "obj",
"url": "{{process.env.DYNAMICS_RESOURCE}}/api/data/v9.2/contacts",
"tls": "",
"x": 200,
"y": 200,
"wires": [["debug-response"]]
},
{
"id": "debug-response",
"type": "debug",
"z": "dynamics-sync",
"name": "Dynamics Response",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"x": 420,
"y": 200,
"wires": []
}
]
}
5.3 Testing the connection
Inject a sample payload containing a prospect’s name and email. After deployment, confirm that:
- The Azure token is retrieved (check the
save-tokennode). - A new contact appears in the Dynamics 365 UI.
- No CORS or SSL errors appear in the Node‑RED console.
⚠️ Remember to grant the app Read/Write permissions on the Dynamics entity you target; otherwise the API will return 403 Forbidden.
6. Deployment instructions
6.1 Publishing the flows
Once both CRM flows are validated, follow these steps to make them production‑ready:
- In the UBOS console, click Deploy → Production to push the Node‑RED project to the live environment.
- Enable Auto‑restart so that any crash of the OpenClaw webhook restarts automatically.
- Set environment variables in the UBOS Settings → Secrets page – never store secrets in plain text.
6.2 Monitoring and logging
UBOS provides built‑in log aggregation. To keep an eye on the integration:
- Navigate to Logs → Real‑time and filter by
openclaworzohotags. - Configure alerts for HTTP 5xx responses using the Workflow automation studio → Alert rules.
- Export logs weekly to a secure S3 bucket for audit compliance.
7. Best‑practice tips
- Security first: Rotate API keys and client secrets every 90 days. Use UBOS secret vaults instead of hard‑coding.
- Granular error handling: In each Node‑RED flow, add a
catchnode that writes errors to a dedicatederror_logtable. - Idempotent writes: Before creating a lead/contact, query the CRM for an existing record using email as a unique key to avoid duplicates.
- Rate‑limit awareness: Both Zoho and Dynamics enforce API throttling. Implement a
delaynode (e.g., 200 ms) between successive calls. - Performance optimization: Bundle multiple field updates into a single PATCH request instead of many individual calls.
- Audit trail: Append a custom field “OpenClaw_Source” with the conversation ID so you can trace back any CRM record to the originating chat.
- Testing strategy: Use UBOS’s sandbox environment for integration tests, then promote to production only after a full regression suite passes.
8. Conclusion and next steps
By leveraging UBOS’s low‑code environment, you can connect OpenClaw to Zoho CRM and Microsoft Dynamics 365 in a matter of minutes, while maintaining enterprise‑grade security and observability. The integration empowers sales teams to capture leads instantly, enrich CRM records with conversational context, and close deals faster.
Ready to expand?
- Explore additional ChatGPT and Telegram integration to push OpenClaw notifications directly to sales Slack channels.
- Build analytics dashboards using the Chroma DB integration for advanced lead scoring.
- Scale to multi‑tenant SaaS mode with the Enterprise AI platform by UBOS.
For a deeper dive into the underlying architecture, refer to the original announcement from OpenClaw.