Send RecordJoy Video Events to Zoho CRM with n8n
When you finish this guide, every RecordJoy event will upsert a Zoho CRM contact by email and attach a note with the video link and watch count.
flowchart LR A[RecordJoy] -->|"event JSON"| B["n8n Webhook node"] B --> C["Zoho: upsert contact"] C --> D["Zoho: attach note"] D --> E[(Zoho CRM)]
Shortcut: RecordJoy ships an importable version —
docs/recipes/n8n-zoho.json. The steps below build the same thing by hand.
Prerequisites
- An n8n instance reachable over HTTPS
- A Zoho CRM account; n8n's Zoho OAuth2 API credential will walk you
through creating a client in the Zoho API console
(
api-console.zoho.com→ Server-based Applications) - RecordJoy account (any plan)
Estimated time
25 minutes
Steps
Part A — the webhook
- In n8n, click + Add workflow and name it
RecordJoy → Zoho. - Add a Webhook node: HTTP Method
POST, Pathrecordjoy-zoho. - Click Save, then switch the Active toggle on.
- Open the Webhook node and copy the Production URL.
<!-- SCREENSHOT: n8n-workflow-active-production-url.png -->🖥️ What you should see: a URL like
https://your-instance.app.n8n.cloud/webhook/recordjoy-zoho.
- In
recordjoy.ai→ dashboard sidebar → CRM Integration: paste the URL, tick your events, click Save, then Send test event. - In n8n's Executions tab, confirm an execution arrived with
"event": "recording.test"underbody.
Part B — upsert the contact
- Add an HTTP Request node connected to the Webhook node; name it
Upsert Contact. - Configure:
- Method:
POST - URL:
https://www.zohoapis.com/crm/v5/Contacts/upsert(usezohoapis.eu/zohoapis.inif your Zoho account lives in that data center) - Authentication:
Predefined Credential Type→ Zoho OAuth2 API (create the credential and complete the sign-in) - Body Content Type:
JSON, Specify Body:Using JSON
- Method:
- Paste this as the JSON body:
={{ { "data": [ { "Last_Name": $json.body.recording.sentTo || $json.body.recording.createdBy, "Email": $json.body.recording.sentTo || $json.body.recording.createdBy } ], "duplicate_check_fields": [ "Email" ] } }}
Contact rule: this maps
sentTowith acreatedByfallback. For inboundrecording.receivedevents usesentByinstead.
- Execute the step and confirm the output contains
data[0].details.id.
<!-- SCREENSHOT: n8n-zoho-upsert-output.png -->🖥️ What you should see: a response with
code: SUCCESSand a long numeric id underdata[0].details.id.
Part C — attach the note
- Add another HTTP Request node connected to
Upsert Contact; name itAttach Note. Same Zoho OAuth2 credential. - Configure: Method
POST, URLhttps://www.zohoapis.com/crm/v5/Notes, BodyJSON:
={{ { "data": [ { "Note_Title": "RecordJoy " + $('Webhook').item.json.body.event, "Note_Content": ($('Webhook').item.json.body.recording.description || "") + " — watch: " + $('Webhook').item.json.body.recording.viewUrl + " (watched " + ($('Webhook').item.json.body.recording.watchedTimes || 0) + "x)", "Parent_Id": $json.data[0].details.id, "se_module": "Contacts" } ] } }}
- Click Save and confirm the workflow is Active.
Verification
- In RecordJoy → CRM Integration, click Send test event.
- In n8n Executions, confirm a green run through all three nodes.
- In Zoho CRM → Contacts, open the contact matching your account email and scroll to Notes.
<!-- SCREENSHOT: zoho-note-on-contact.png -->🖥️ What you should see: a note titled
RecordJoy recording.testwith arecordjoy.ai/view/...link.
Troubleshooting
| Problem | Fix |
|---|---|
INVALID_URL_PATTERN or 404 | Wrong data center. Match the API host to your account: zohoapis.com, zohoapis.eu, or zohoapis.in — in BOTH nodes. |
OAUTH_SCOPE_MISMATCH | The Zoho client lacks CRM scope. Recreate the n8n Zoho credential and approve the requested ZohoCRM.modules.ALL scope. |
| Note fails with an invalid id | Parent_Id must read from the upsert node's output ($json.data[0].details.id), not from the webhook. |
Ready to connect?
Your webhook settings live in Dashboard → CRM Integration.