Webhook Test Works But Real Contact Creation Events Not Triggering

Grove_
Member

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:
OAuth connection successful
"Test URL" button in webhook subscription sends data successfully
n8n receives the test payload correctly
Webhook subscription appears active in HubSpot

What Doesn't Work:
When I create a real contact in HubSpot (via UI), no webhook is triggered
In "Data from last 30 days" section: Total: 0, Errors: 0
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!

2 Accepted solutions
CBN
Solution
Top Contributor

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.

View solution in original post

Grove_
Solution
Member

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.

View solution in original post

0 Upvotes
4 Replies 4
Grove_
Solution
Member

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.
0 Upvotes
RubenBurdin
Guide

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)

Did my answer help? Please mark it as a solution to help others find it too.

Ruben Burdin Ruben Burdin
HubSpot Advisor
Founder @ Stacksync
Real-Time Data Sync between any CRM and Database
Stacksync Banner
0 Upvotes
CBN
Solution
Top Contributor

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.

BérangèreL
Community Manager
Community Manager

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! 🧡
Bérangère





loop


Loop Marketing is a new four-stage approach that combines AI efficiency and human authenticity to drive growth.

Learn More