How to Test HubSpot Webhooks
Capture HubSpot CRM events — contact creation, deal updates, property changes — and verify HMAC signatures before deploying your integration.
TL;DR: Get a free URL from requex.me, paste it into your HubSpot Private App webhook subscription settings, and trigger a CRM action. HubSpot sends a signed JSON array of events — inspect every field and header in Requex before writing a single line of handler code.
What HubSpot Sends
HubSpot webhooks are configured at the app level (Private Apps or Public Apps). Like SendGrid, HubSpot batches multiple events into a single POST as a JSON array. Each object in the array represents one CRM event. High-traffic portals can send large batches — always iterate over the array rather than assuming a single event.
| Event | Trigger | Use Case |
|---|---|---|
contact.creation | New contact created in CRM | Welcome sequence, CRM sync |
contact.propertyChange | Any contact property updated | Downstream data sync, notifications |
deal.creation | New deal created | Pipeline automation, Slack alerts |
deal.propertyChange | Deal stage or any property changes | Revenue reporting, forecast updates |
company.creation | New company record created | Account enrichment, billing sync |
Step 1 — Generate a Requex Endpoint
Open requex.me. Your unique URL is ready immediately:
https://requex.me/hook/a1b2c3d4-e5f6-7890-abcd-ef1234567890
Copy this URL. You will paste it into HubSpot's webhook target URL field in the next step.
Step 2 — Configure HubSpot Webhook
- In HubSpot, go to Settings → Integrations → Private Apps and open (or create) a Private App.
- Click the Webhooks tab inside your Private App settings.
- Set the Target URL to your Requex URL.
- Click Create Subscription and choose the object type (Contacts, Deals, Companies) and the event type (Creation, Property Change, Deletion, or Association Change).
- For
propertyChangesubscriptions, specify which property to watch or select "Any property". - Click Subscribe. HubSpot does not send an initial verification request — events will start flowing as soon as you trigger CRM actions.
Step 3 — Trigger a Test Event
The quickest test is to create a new contact directly in HubSpot. Go to CRM → Contacts → Create contact, fill in a name and email, and save. Within a few seconds the contact.creation event should appear in your Requex dashboard.
To test property changes, edit an existing contact's phone number or lifecycle stage. HubSpot fires a separate event for each property that changes — you may see multiple objects in a single batch if several properties are updated at once.
Step 4 — Inspect the Payload
Switch back to Requex and click the incoming request. The body is a JSON array:
[
{
"eventId": 1234567890,
"subscriptionId": 987654,
"portalId": 11223344,
"appId": 445566,
"occurredAt": 1712345678901,
"subscriptionType": "contact.creation",
"attemptNumber": 0,
"objectId": 51234,
"changeFlag": "CREATED",
"changeSource": "CRM_UI",
"sourceId": "user_id:1234"
}
]Notice that HubSpot only sends the object ID (objectId), not the full contact or deal record. Your handler needs to call the HubSpot CRM API to fetch the object details. For propertyChange events, the payload also includes propertyName and propertyValue.
Check the Headers tab in Requex for the X-HubSpot-Signature header — you will need this value to test your signature verification.
HubSpot Signature Verification
HubSpot supports two signature versions. The version is indicated by the X-HubSpot-Signature-Version header.
v1 (SHA-256 hash)
Concatenate your app secret and the raw request body, then SHA-256 hash the result:
const crypto = require('crypto');
const hash = crypto
.createHash('sha256')
.update(APP_SECRET + rawBody)
.digest('hex');
// Compare with X-HubSpot-Signature headerv3 (HMAC-SHA256)
Concatenate HTTP method, full request URL, raw body, and timestamp, then HMAC-SHA256:
const message = method + requestUri + rawBody + timestamp;
const hmac = crypto
.createHmac('sha256', APP_SECRET)
.update(message)
.digest('base64');
// Compare with X-HubSpot-Signature-v3 headerUse Requex to capture a real signed request and test both versions locally using the exact body and headers you see in the dashboard.
Common Issues
| Problem | Cause | Fix |
|---|---|---|
| No events arriving | Private App not installed on the portal | Install the Private App and ensure the portal matches the subscription's portalId |
| Signature mismatch | Wrong app client secret used | Use the Client Secret from your Private App's Auth tab — not the Access Token |
| Only objectId in payload | Expected design — HubSpot sends thin events | Call GET /crm/v3/objects/contacts/{objectId} to fetch full details |
Test HubSpot Webhooks Free
Capture real CRM events and inspect every header and payload field. No signup required.
Open Requex →Related guides
Start Testing Webhooks Now
Generate your unique URL and test webhooks instantly. Free, no signup.
Open Webhook Tester →