← All integration guides

Send RecordJoy Video Events to HubSpot with n8n

When you finish this guide, every RecordJoy event will upsert a HubSpot contact and log a note on their timeline, via an n8n workflow you own.

flowchart LR A[RecordJoy] -->|"event JSON"| B["n8n Webhook node"] B --> C["HubSpot: upsert contact"] C --> D["HubSpot: create note"] D --> E[(HubSpot)]

Shortcut: RecordJoy ships an importable version of this workflow — docs/recipes/n8n-hubspot.json in the repository. 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 → HubSpot.
  2. Add a Webhook node: HTTP Method POST, Path recordjoy-hubspot.
  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-hubspot.

<!-- 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://api.hubapi.com/crm/v3/objects/contacts/batch/upsert
    • Authentication: Generic Credential TypeHeader Auth — create a credential with Name Authorization and Value Bearer pat-XXXX (your Private App token)
    • Body Content Type: JSON, Specify Body: Using JSON
  3. Paste this as the JSON body:
={{ { "inputs": [ { "idProperty": "email", "id": $json.body.recording.sentTo || $json.body.recording.createdBy, "properties": { "email": $json.body.recording.sentTo || $json.body.recording.createdBy } } ] } }}

Contact rule: this maps sentTo with a createdBy fallback. For inbound recording.received events use sentBy instead — simplest is a separate workflow per rule.

  1. Click Execute step (with a pinned test execution) and confirm the output contains results[0].id.

🖥️ What you should see: a JSON response with status: COMPLETE and a numeric contact id under results[0].id.

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

Part C — create the note

  1. Add another HTTP Request node connected to Upsert Contact; name it Create Note. Use the same Header Auth credential.
  2. Configure: Method POST, URL https://api.hubapi.com/crm/v3/objects/notes, Body JSON:
={{ { "properties": { "hs_note_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)", "hs_timestamp": Date.now() }, "associations": [ { "to": { "id": $json.results[0].id }, "types": [ { "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 202 } ] } ] } }}
  1. Click Save and confirm the workflow is still Active.

Verification

  1. In RecordJoy → CRM Integration, click Send test event.
  2. In n8n Executions, confirm a green (successful) run through all three nodes.
  3. In HubSpot, open the contact matching your account email.

🖥️ What you should see: a Note on the timeline containing recording.test and a recordjoy.ai/view/... link.

<!-- SCREENSHOT: hubspot-note-on-timeline.png -->

Troubleshooting

ProblemFix
401 from HubSpotThe Header Auth value must be Bearer pat-XXX (with the word Bearer and a space). Check the Private App token and scopes.
results[0].id is undefined in the note stepThe upsert failed or the expression references the wrong node. The note's association id must read from the Upsert Contact node's output.
Execution succeeds but no note in HubSpotWrong association type. Confirm associationTypeId: 202 (note→contact) and that the contact id is numeric.

Ready to connect?

Your webhook settings live in Dashboard → CRM Integration.