Send RecordJoy Video Events to GoHighLevel with n8n
When you finish this guide, every RecordJoy event will upsert a GoHighLevel
contact, add a note with the video link, and apply an event tag (like
video-completed) that can trigger your GoHighLevel Workflows.
flowchart LR A[RecordJoy] -->|"event JSON"| B["n8n Webhook node"] B --> C["GHL: upsert contact"] C --> D["GHL: add note"] D --> E["GHL: add tag"] E --> F[(GoHighLevel)] F -->|"tag trigger"| G["GHL Workflow"]
Shortcut: RecordJoy ships an importable version —
docs/recipes/n8n-gohighlevel.json. The steps below build it by hand.
Prerequisites
- An n8n instance reachable over HTTPS
- A GoHighLevel account and your Location ID (sub-account id — visible in the GHL URL or under Settings → Business Profile)
- n8n's HighLevel OAuth2 credential (n8n walks you through connecting)
- RecordJoy account (any plan)
Estimated time
25 minutes
Steps
Part A — the webhook
- In n8n, click + Add workflow and name it
RecordJoy → GHL. - Add a Webhook node: HTTP Method
POST, Pathrecordjoy-ghl. - 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-ghl.
- 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://services.leadconnectorhq.com/contacts/upsert - Authentication:
Predefined Credential Type→ HighLevel OAuth2 - Send Headers: on — add header Version =
2021-07-28 - Body Content Type:
JSON, Specify Body:Using JSON
- Method:
- Paste this as the JSON body (replace
YOUR_LOCATION_ID):
={{ { "locationId": "YOUR_LOCATION_ID", "email": $json.body.recording.sentTo || $json.body.recording.createdBy, "name": $json.body.recording.sentTo || $json.body.recording.createdBy } }}
Contact rule: this maps
sentTowith acreatedByfallback. For inboundrecording.receivedevents (portal submissions), usesentBy.
- Execute the step and confirm the output contains
contact.id.
<!-- SCREENSHOT: n8n-ghl-upsert-output.png -->🖥️ What you should see: a response with a
contactobject containing anidstring.
Part C — add the note
- Add another HTTP Request node connected to
Upsert Contact; name itAdd Note. Same credential; same Version header. - Configure: Method
POST, URL:
=https://services.leadconnectorhq.com/contacts/{{ $json.contact.id }}/notes
- Body
JSON:
={{ { "body": "RecordJoy " + $('Webhook').item.json.body.event + " — " + ($('Webhook').item.json.body.recording.description || "") + " — watch: " + $('Webhook').item.json.body.recording.viewUrl + " (watched " + ($('Webhook').item.json.body.recording.watchedTimes || 0) + "x)" } }}
Part D — add the tag
- Add a third HTTP Request node connected to
Add Note; name itAdd Tag. Same credential; same Version header. - Configure: Method
POST, URL:
=https://services.leadconnectorhq.com/contacts/{{ $('Upsert Contact').item.json.contact.id }}/tags
- Body
JSON(derives the tag from the event, e.g.video-completed):
={{ { "tags": [ "video-" + $('Webhook').item.json.body.event.split(".")[1] ] } }}
- Click Save and confirm the workflow is Active.
- Optional: in GoHighLevel, create a Workflow with a Contact Tag
trigger on
video-completedto alert your rep or start a campaign.
Verification
- In RecordJoy → CRM Integration, click Send test event.
- In n8n Executions, confirm a green run through all four nodes.
- In GoHighLevel → Contacts, open the contact matching your account email.
<!-- SCREENSHOT: ghl-contact-tag-note.png -->🖥️ What you should see: the contact has a
video-testtag and a note containingrecording.testwith arecordjoy.ai/view/...link.
Troubleshooting
| Problem | Fix |
|---|---|
| 401/403 from LeadConnector | The Version: 2021-07-28 header is missing, or the OAuth credential lacks contact scopes. Add the header to every HTTP node and reconnect the credential. |
| "locationId is required" | Replace YOUR_LOCATION_ID in the upsert body with your actual sub-account id. |
| Tag added but the GHL Workflow doesn't fire | The trigger tag must match exactly (e.g., video-completed) and the Workflow must be Published. |
Ready to connect?
Your webhook settings live in Dashboard → CRM Integration.