Webhook Test Works But Real Contact Creation Events Not Triggering

Hello,

I’m trying to set up webhooks from HubSpot to n8n, but I’m experiencing a strange issue where test webhooks work perfectly, but real contact creation events are not being sent.

My Setup:

What Works:
:white_check_mark:OAuth connection successful
:white_check_mark:“Test URL” button in webhook subscription sends data successfully
:white_check_mark:n8n receives the test payload correctly
:white_check_mark:Webhook subscription appears active in HubSpot

What Doesn’t Work:
:cross_mark:When I create a real contact in HubSpot (via UI), no webhook is triggered
:cross_mark:In “Data from last 30 days” section: Total: 0, Errors: 0
:cross_mark:No executions appear in n8n when real contacts are created

What I’ve Tried:

  • Recreating the webhook subscription multiple times
  • Deactivating and reactivating the n8n workflow (which recreates the subscription)
  • Waiting 5+ minutes after creating contacts
  • Verifying all scopes are set as “Required” not “Optional”
  • Checking that the subscription is for “contact.creation” event

Why would the test webhook work perfectly, but real contact creation events never trigger the webhook? Is there a delay, additional configuration, or permission I’m missing?

Any help would be greatly appreciated!

Hey @Grove_, thanks for posting on the HubSpot Community!
Hi @HubDoPete, @CBN and @SteveHTM, do you have any insights on why only test events are triggering the webhook, to help @Grove_, please?
Thanks so much in advance for your valuable contributions! :orange_heart:
Bérangère

Thanks for the question @Grove_

We also have issues with events coming to our backend, but they are generated.

Did you set the key correctly for the header? For webhook events in a workflow the options are primitive and insecure.

When we use NGROK to pass the event to our webhook it works when the endpoint in on my local machine.
When the endpoint is our production app, then we get 403.
I can see from your endpoint that your have Cloudflare in front of your application. You may need run the worker before for endpoints.

Our settings in wrandler.toml

run_worker_first = [ ... "/webhooks", "/webhooks/*",...]

Moderator note: While this solution may not address the original poster’s specific situation, it could be helpful for other community members facing similar challenges.

Hi @Grove_ , I’ve seen this exact “Test works, real events don’t” pattern a few times, and it’s almost always one of two things: either the app is not actually installed in the same HubSpot account where you’re creating the contacts, or you’re not creating a truly new contact.

A couple checks that usually unblock it. First, confirm you’re creating contacts in the exact portal that completed the OAuth install for the app. Webhooks are configured on the app, but they only fire for accounts that installed the app via OAuth, not just because the subscription exists in your developer portal (the docs call this out: webhooks trigger for “any account that install your app” via OAuth). (https://developers.hubspot.com/docs/api-reference/webhooks-webhooks-v3/guide)

Second, double-check the “creation” you’re doing is genuinely a create. If you enter an email that already exists, HubSpot will update the existing record instead of creating a new one, and you’d expect no contact.creation event.

For a quick sanity test, create a contact with a never-before-used email address.

If those two are fine, then I’d look at the Cloudflare tunnel URL stability and any edge rules: HubSpot will POST to your target URL and expects a fast 2xx.

If Cloudflare blocks or challenges the request, HubSpot would normally show errors in the webhook stats, but if the URL changed after you tested, you can end up with “nothing happens” until it’s corrected (also, webhook settings can be cached for up to ~5 minutes). (https://developers.hubspot.com/docs/api-reference/webhooks-webhooks-v3/guide)

I managed to resolve this issue.

Steps to fix:
HubSpot website:
Legacy-Apps > Create Legacy Private App > Edit App > Webhooks elements > Target URL > Cloudflared Tunnel URL > Save

After changing your Cloudflared Tunnel URL, you must change the address to the new one again.

Under Webhooks elements there is a Create Subscription button, but the subscription is created automatically when you deactivate the workflow and reactivate it.
n8n HubSpot Developer API node:

Client ID: private-app

Client Secret *: from Legacy-Apps Authentication

Developer API Key *: from Legacy-Apps Authentication

APP ID *: I entered it from the public app because it wasn’t available in the private app. Any number will probably work.