← All integration guides

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

Estimated time

25 minutes

Steps

Part A — the webhook

  1. In n8n, click + Add workflow and name it RecordJoy → Zoho.
  2. Add a Webhook node: HTTP Method POST, Path recordjoy-zoho.
  3. Click Save, then switch the Active toggle on.
  4. Open the Webhook node and copy the Production URL.

🖥️ What you should see: a URL like https://your-instance.app.n8n.cloud/webhook/recordjoy-zoho.

<!-- SCREENSHOT: n8n-workflow-active-production-url.png -->
  1. In recordjoy.ai → dashboard sidebar → CRM Integration: paste the URL, tick your events, click Save, then Send test event.
  2. In n8n's Executions tab, confirm an execution arrived with "event": "recording.test" under body.

Part B — upsert the contact

  1. Add an HTTP Request node connected to the Webhook node; name it Upsert Contact.
  2. Configure:
    • Method: POST
    • URL: https://www.zohoapis.com/crm/v5/Contacts/upsert (use zohoapis.eu / zohoapis.in if your Zoho account lives in that data center)
    • Authentication: Predefined Credential TypeZoho OAuth2 API (create the credential and complete the sign-in)
    • Body Content Type: JSON, Specify Body: Using JSON
  3. 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 sentTo with a createdBy fallback. For inbound recording.received events use sentBy instead.

  1. Execute the step and confirm the output contains data[0].details.id.

🖥️ What you should see: a response with code: SUCCESS and a long numeric id under data[0].details.id.

<!-- SCREENSHOT: n8n-zoho-upsert-output.png -->

Part C — attach the note

  1. Add another HTTP Request node connected to Upsert Contact; name it Attach Note. Same Zoho OAuth2 credential.
  2. Configure: Method POST, URL https://www.zohoapis.com/crm/v5/Notes, Body JSON:
={{ { "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" } ] } }}
  1. Click Save and confirm the workflow is Active.

Verification

  1. In RecordJoy → CRM Integration, click Send test event.
  2. In n8n Executions, confirm a green run through all three nodes.
  3. In Zoho CRM → Contacts, open the contact matching your account email and scroll to Notes.

🖥️ What you should see: a note titled RecordJoy recording.test with a recordjoy.ai/view/... link.

<!-- SCREENSHOT: zoho-note-on-contact.png -->

Troubleshooting

ProblemFix
INVALID_URL_PATTERN or 404Wrong data center. Match the API host to your account: zohoapis.com, zohoapis.eu, or zohoapis.in — in BOTH nodes.
OAUTH_SCOPE_MISMATCHThe Zoho client lacks CRM scope. Recreate the n8n Zoho credential and approve the requested ZohoCRM.modules.ALL scope.
Note fails with an invalid idParent_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.