HubSpot webhook API: duplicates, order, and retries

Duplicates, ordering, retries and signatures in the HubSpot webhook API, each note checked against HubSpot's own developer pages.

20 of 85 notes

  • Up to 100 events per requestWebhooksTreat every request body as an array and handle each event in it on its own.
    What happens
    HubSpot sends webhook events in batches: one request can carry up to 100 events. The batch size varies from request to request.

    Source: developers.hubspot.com (opens in a new tab)

  • Duplicate deliveries, eventId not uniqueWebhooksMake handlers idempotent and deduplicate on several fields together, such as portalId, subscriptionId, eventId, objectId and occurredAt.
    What happens
    HubSpot can send the same notification more than once. The eventId field is not guaranteed to be unique, so it is not a safe key on its own.

    Source: developers.hubspot.com (opens in a new tab)

  • Events arrive out of orderWebhooksOrder changes by occurredAt and ignore an event older than the state you already hold.
    What happens
    Notifications can arrive in a different order from the changes that caused them. Each event's occurredAt field is a millisecond timestamp of when the change happened.

    Source: developers.hubspot.com (opens in a new tab)

  • 10 retries over 24 hoursWebhooksExpect a retried batch up to a day after the change, and never treat a late event as new.
    What happens
    A failed delivery is retried up to 10 times, spread over the next 24 hours with varying gaps. The attemptNumber field starts at 0 and counts the tries.

    Source: developers.hubspot.com (opens in a new tab)

  • A 4xx answer is retried tooWebhooksAnswer 2xx to a batch you have accepted or chosen to ignore, and keep error codes for real failures.
    What happens
    Any 4xx or 5xx answer counts as a failure and is retried. Rejecting a bad batch with a 400 does not stop HubSpot from sending it again.

    Source: developers.hubspot.com (opens in a new tab)

  • Five seconds to answerWebhooksStore the batch and answer at once, then process the events in the background.
    What happens
    Your endpoint has five seconds to answer a whole batch. A slower answer counts as a failure and the batch is retried.

    Source: developers.hubspot.com (opens in a new tab)

  • 10 requests in flightWebhooksSize the endpoint for 10 parallel requests of up to 100 events each, or lower the setting to what it can take.
    What happens
    HubSpot sends at most 10 requests in flight at a time by default. The maxConcurrentRequests setting can change this, but it must be greater than five.

    Source: developers.hubspot.com (opens in a new tab)

  • Settings cached for five minutesWebhooksKeep the old target URL working for at least five minutes after changing it.
    What happens
    Webhook settings can be cached for up to five minutes. A new target URL or concurrency limit may not take effect straight away.

    Source: developers.hubspot.com (opens in a new tab)

Photo of Utku Zihnioglu

By

ยท CEO & co-founder

Updated Nov 11, 2026

Shorter page: the tool first, the answer in a few lines.

The HubSpot webhook API delivers at least once and in no fixed order. One request carries a batch of events, the same event can arrive twice, retries arrive mixed in with new events, and any error status, a client error included, gets the whole batch sent again. Treat each event as a hint that something changed, and build the handler for that.

Each note above says what HubSpot does and what to plan for, citing HubSpot's Webhooks API guide and its request validation pages, with the day we last checked it.

Build the handler in this order

  1. Answer, then work. Store the batch, answer with success at once, and process the events in the background. Answer with success to a batch you chose to ignore, too.

  2. Verify the signature on the raw bytes, before you parse the JSON. The v3 signature covers the method, the URI and a timestamp; v1 covers no time, so bound replays yourself. The webhook signature checker shows where a mismatch comes from.

  3. Deduplicate on several fields. The eventId is not unique, so combine portalId, subscriptionId, eventId, objectId and occurredAt.

  4. Order by occurredAt, and drop an event older than the state you already hold.

Subscriptions belong to the app

A subscription applies to every account that installs the app, and each event names its account in portalId. A property change subscription watches one property and stays silent in an account that lacks it. The last modified date cannot be watched, so you cannot use it to hear about every change.

Some single changes fire two events. An association change fires one for each side, and a privacy deletion also sends a plain deletion for the same contact.

What to do next

The webhooks journal keeps only a short history, so an outage longer than that loses events for good. A scheduled read of recently modified records catches what a webhook never delivered, and those reads count against HubSpot API limits.

For HubSpot's changes in Oneprofile, there is no handler to write: connect HubSpot through Oneprofile's app and turn on live changes for a table imported from it.

HubSpot webhook API: questions

What is the HubSpot webhook API?

It is the part of HubSpot's developer platform that pushes CRM changes to your app. You subscribe an app to events, such as a contact created or a property changed, and HubSpot posts each change to one URL for every account that installed the app.

How do I create a webhook subscription in HubSpot?

Add it to your app's webhook settings, one subscription per event type, and one per property for property changes. A public app or a standalone private app can manage them in code; a legacy private app manages them in its settings only.

Does a HubSpot webhook event include the whole record?

No. An event names the account, the record and what happened to it, not the full record. Most handlers read the record back through the CRM API, and those reads count against your HubSpot API limits.

About this article

Photo of Utku Zihnioglu

Utku Zihnioglu

CEO & co-founder

Serial entrepreneur who built infrastructure companies handling billions of requests. Now leads engineering at Oneprofile, which finds the people worth talking to, researches each one, and follows up until they reply.

Drafted with AI from our product docs and code. Utku Zihnioglu answers for what it says.

Get HubSpot changes without a handler

Turn on live changes for a table imported from HubSpot, and each change arrives as it happens.

Free plan: 200 credits a month, 3 integrations, no card

Get HubSpot changes without a handler

Turn on live changes for a table imported from HubSpot, and each change arrives as it happens.

Free plan: 200 credits a month, 3 integrations, no card