Harloop
Back to blog

How to Track Video-Driven Demos in HubSpot Without a New Pixel

May 27, 2026 · chinmay


This post walks through wiring Harloop's video-engagement webhook into HubSpot as a custom behavioral event, attaching that event to contact timelines, and surfacing it in deal source reporting. No new tracking pixel, no GTM container changes required. Approximately 25 minutes. You'll need: HubSpot Marketing Hub Professional or Enterprise (custom behavioral events require at least Professional tier), a Harloop account with webhook access enabled, a HubSpot Private App token with the analytics.behavioral_events.send scope, and admin access to both platforms. If you have not confirmed your HubSpot plan tier, do that first since the attribution reporting step is gated to Enterprise.

Step 1: Define the Custom Event in HubSpot

HubSpot requires a schema to exist before you can send event occurrences. The legacy custom events tool was retired on August 1, 2025; the v3 Custom Behavioral Events API is now the standard path.

In HubSpot, go to Settings → Data Management → Custom Behavioral Events (as of May 2026) and click Create event. Name it harloop_video_view. Add three custom properties: video_id (string), watch_pct (number), and page_url (string).

Alternatively, create the definition via the API:

curl -X POST https://api.hubapi.com/events/v3/event-definitions \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "label": "Harloop Video View",
    "name": "harloop_video_view",
    "description": "Fired when a contact watches a Harloop video past the configured threshold",
    "propertyDefinitions": [
      { "name": "video_id",  "type": "string", "label": "Video ID" },
      { "name": "watch_pct", "type": "number", "label": "Watch Percentage" },
      { "name": "page_url",  "type": "string", "label": "Page URL" }
    ]
  }'

Expected result: HubSpot returns a fullyQualifiedName such as pe123456_harloop_video_view. Copy this value; you will paste it into Harloop's webhook config in the next step.

What to check: Confirm the event appears under Settings → Data Management → Custom Behavioral Events before continuing.

Step 2: Configure the Harloop Webhook

In your Harloop dashboard, open Settings → Integrations → Webhooks and add a new outbound webhook. Set the trigger to Video viewed and configure a minimum watch threshold. 25 percent works as a floor for an MQL signal; 50 percent signals higher intent. Set the endpoint details:

  • Endpoint URL: https://api.hubapi.com/events/v3/send
  • HTTP method: POST
  • Headers: Authorization: Bearer YOUR_ACCESS_TOKEN and Content-Type: application/json

Map the payload using Harloop's variable interpolation:

{
  "eventName": "pe123456_harloop_video_view",
  "email": "{{visitor.email}}",
  "properties": {
    "video_id":  "{{video.id}}",
    "watch_pct": {{video.watch_percentage}},
    "page_url":  "{{page.url}}"
  }
}

Replace pe123456_harloop_video_view with the fullyQualifiedName you copied in Step 1.

A note on anonymous visitors: if the visitor has not been identified (no email captured), Harloop skips the webhook. Configure Harloop's form capture or visitor identification to fire before the video plays to maximize your match rate.

Expected result: When a test visitor watches past the threshold, Harloop POSTs to HubSpot's events endpoint and receives a 200 OK.

What to check: Open Settings → Integrations → Webhooks → Delivery Log in Harloop. Confirm the most recent delivery returned 200. A 400 means the eventName does not match the fully qualified name exactly.

Step 3: Verify the Event on Contact Timelines

HubSpot matches incoming event payloads to contacts by the email field. No additional configuration is needed. If a matching contact does not exist, HubSpot creates a new record.

To confirm it is working: open any contact record in HubSpot CRM, click the Activity tab, then click Filter activity and enable Custom event. You should see a Harloop Video View card with video_id, watch_pct, and page_url populated.

Expected result: The event card appears within a few seconds of the webhook firing.

What to check: If the card is absent, the email in the payload likely did not match any known contact. Verify that visitor identification is firing before the video threshold is reached.

Step 4: Wire the Event into Deal Source Reporting

With the event on the timeline, you can surface it in two ways.

Workflow trigger: In HubSpot, create a contact-based workflow. Set the enrollment trigger to Custom behavioral event occurred, choose harloop_video_view, and add a filter: watch_pct is greater than or equal to 50. Set an action to change lifecycle stage to MQL or enroll the contact in a demo-request sequence. This creates an attribution-visible signal equivalent to a form fill.

Attribution report: Go to Reports → Attribution and create a new deal attribution report. Under Interaction types, check Custom behavioral events and filter by harloop_video_view. This surfaces deals where a video engagement appeared somewhere in the buyer path, under whichever attribution model you select (first-touch, last-touch, or multi-touch). HubSpot's full configuration walkthrough is at create attribution reports.

If you are running variant-level personalization on your demo page and want to connect video engagement to specific variant performance, the approach described in personalization without attribution is just vibes covers the data model that makes this tractable.

Expected result: The attribution report shows deal records where a Harloop Video View event appears in the interaction path.

Step 5: End-to-End Verification

Run a controlled test before pointing production traffic at this setup:

  1. Open a Harloop-hosted page in an incognito window. Identify yourself with a test email tied to a known HubSpot contact. Watch the video past the threshold configured in Step 2.
  2. Open the Harloop Webhook Delivery Log and confirm the delivery returned 200.
  3. Open the HubSpot contact record for that email. Filter the Activity tab to Custom event and confirm the Harloop Video View entry appears with the correct video_id, watch_pct, and page_url values.
  4. Open Reports → Custom Events in HubSpot and confirm the event count incremented by one.

All four checks passing confirms the pipeline is live and attribution-ready.

What Can Go Wrong

  • 400 from HubSpot on every webhook delivery: The eventName in the payload does not exactly match the fullyQualifiedName HubSpot assigned. The v3 API does not create event schemas on the fly. Re-copy the fullyQualifiedName from Settings → Data Management → Custom Behavioral Events and update the Harloop webhook template to match it character for character.

  • Event fires but no contact appears on the timeline: The email passed in the payload did not match any HubSpot contact. Confirm Harloop's visitor identification fires before the video threshold is reached. Anonymous visitors produce no timeline entry.

  • Event appears on the timeline but not in attribution reports: Deal attribution reports with Custom behavioral events as an interaction type require Marketing Hub Enterprise. On Professional, the event remains usable in workflows and visible on contact timelines, but the Revenue Attribution filtering view is gated. Check your subscription under Settings → Account → Billing.

  • 401 on webhook delivery: The HubSpot Private App token expired or was created without the analytics.behavioral_events.send scope. Regenerate the token or add the required scope under Settings → Integrations → Private Apps → Token scopes.

Summary

Once the event definition is live and the webhook is verified, every Harloop video view attaches to the matching HubSpot contact timeline with no additional pixel on your pages. If you prefer Harloop to handle this configuration automatically, see the demo.

More posts