> ## Documentation Index
> Fetch the complete documentation index at: https://developers.hubspot.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

---
id: 550164f0-1272-4ec9-bc1e-803e9396ddf1
---

# Create generic webhook subscriptions (BETA)

> Learn how to create and manage generic webhook subscriptions (BETA)

export const PublicAppCreationSunsetBanner = () => <Danger>
        <p>As of June 23, 2026, legacy public apps can no longer be created. Existing legacy public apps will continue to be supported, but don't have access to the latest app features. Learn more about this sunset on the <a href="https://developers.hubspot.com/changelog/legacy-public-app-creation-sunset">HubSpot Developer Changelog</a>.</p>
        <p>To get started building apps on HubSpot's developer platform, learn how to <a href="/apps/developer-platform/build-apps/migrate-an-app/migrate-to-the-latest-platform-version#migrate-a-legacy-public-app-non-project-based">migrate an existing legacy public app</a> or <a href="/apps/developer-platform/build-apps/create-an-app">create a new app</a>.</p>

    </Danger>;

<PublicAppCreationSunsetBanner />

Generic webhooks allow you to subscribe to events in a [public app](/apps/legacy-apps/public-apps/overview) or [private app](/apps/legacy-apps/private-apps/overview) to listen and react to changes to any standard CRM object (e.g., contacts, companies, etc), engagement (call, engagement, etc.), or other objects in your account.

<Info>
  **Please note:**

  This feature is currently in beta and is subject to change based on testing and feedback. By using this functionality, you agree to adhere to [HubSpot's Developer Terms](https://legal.hubspot.com/hs-developer-terms) & [Developer Beta Terms](https://legal.hubspot.com/hubspot-beta-terms). You also acknowledge the risk associated with testing an unstable API.
</Info>

## Supported object types

The following object types are currently supported when creating generic webhook subscriptions, subject to the restrictions in the alert below:

* Appointment
* Call
* Cart
* Commerce payment
* Communication
* Company
* Contact
* Course
* Deal
* Discount
* Email
* Fee
* Feedback submission
* Goal target
* Invoice
* Lead
* Line item
* Listing
* Meeting event
* Note
* Order
* Partner client
* Postal mail
* Product
* Quote
* Quote template
* Service
* Subscription
* Task
* Tax
* Ticket
* User

<Warning>
  **Please note:**

  * Creating `EMAIL` subscriptions for the `hs_email_html` and `hs_email_subject` properties is not currently supported.
  * Creating `COMMUNICATION` subscriptions for the `hs_communication_body` property is not currently supported.
  * You can also create generic webhook subscriptions for custom objects, but only when developing a private app.
  * Generic webhook subscriptions are not currently supported for `conversation.*` and `contact.privacyDeletion` events. If you want to subscribe to these events, you should use the old format for webhooks detailed in [this article](/api-reference/latest/webhooks#webhook-subscriptions).
</Warning>

## Create a generic webhook in a private app

To create a generic webhook subscription in a private app:

* In your HubSpot account, click the **settings icon** in the main navigation bar.
* In the left sidebar menu, navigate to **Integrations** > **Private Apps**.
* Click the **name** of your private app. If you haven't created a private app yet, follow the instructions in [this article](/apps/legacy-apps/public-apps/overview) to create one.
* In the top right, click **Edit app**.
* Click the **Webhooks** tab.
* Under *Target URL*, enter the **URL** that HubSpot will make a `POST` request to when an event triggers.
* Click **Create subscription**.
* In the right panel, configure your subscription:
  * Click to toggle the **Use expanded object support** switch on.
  * Select the **object types** that you want to subscribe to, then select the **events** associated with those objects (e.g., created, merged, deleted, etc.) that will trigger HubSpot to send a request to the endpoint you configured.
  * If you select an object type that requires scopes your app hasn't been authorized for, you'll be prompted to add those scopes to your app.
  * If you select *Property changed* for the event type, you can select any of the associated object properties that you want to subscribe to changes for.
* Click **Subscribe**.

<Frame>
  <img src="https://www.hubspot.com/hubfs/Knowledge_Base_2023_2024/create-generic-webhook-subscription-panel.png" alt="create-generic-webhook-subscription-panel" />
</Frame>

* If you don't want your webhook subscriptions to be active immediately, or if you want to delete a subscription you mistakenly created, you can hover over the webhook and manage its status, unsubscribe to delete it, or review the subscription details. If you've configured multiple webhook subscriptions, you can edit their statuses in bulk by selecting the **checkboxes** next to each one then clicking **Activate** or **Pause**.

* When you're ready to save your changes, click **Commit changes** in the top right.

After you've configured your webhook subscriptions, HubSpot will begin sending `POST` requests to your *Target URL* once any of the events associated with your active subscriptions are triggered.

<Warning>
  **Please note:**

  For each private app, HubSpot sets a concurrency limit of 10 requests when sending subscription event data. This concurrency limit is the maximum number of in-flight requests that HubSpot will attempt at a time. Each request can contain up to 100 events.
</Warning>

## Create a generic webhook in a legacy public app

To create a generic webhook subscription for a legacy public app:

* In your HubSpot account, navigate to **Development**.
* In the left sidebar menu, navigate to **Legacy apps**.

<Frame>
  <img src="https://www.hubspot.com/hubfs/Knowledge_Base_2023-24-25/legacy-apps/updated-navigation-to-legacy-apps.png" alt="Navigate to legacy apps in new developer overview" />
</Frame>

* Click the **name** of an existing public app.

* In the left sidebar menu, navigate to **Webhooks**.

* Under *Target URL*, enter the **URL** that HubSpot will make a `POST` request to when events trigger.

* Click **Create subscription**.

* In the right panel, configure your subscription:

  * Select the **object types** that you want to subscribe to, then select the **events** associated with those objects (e.g., created, merged, deleted) that will trigger HubSpot to send a request to the endpoint you configured.

* * If you select *Property changed* for the event type, you can then select any of the associated object properties that you want to subscribe to changes for.

* Click **Subscribe**.

<Frame>
  <img src="https://www.hubspot.com/hubfs/Knowledge_Base_2023_2024/create-generic-webhook-subscription-panel.png" alt="create-generic-webhook-subscription-panel" />
</Frame>

* After you've created your subscription, hover over the associated object type and click **View subscriptions**. When you're ready to activate the subscription, hover over the event subscription and click **Activate**.

<Frame>
  <img src="https://www.hubspot.com/hubfs/Knowledge_Base_2023_2024/activate-generic-webhook-subscription-in-public-app-settings.png" alt="activate-generic-webhook-subscription-in-public-app-settings" />
</Frame>

After you've configured your webhook subscriptions, HubSpot will begin sending `POST` requests to your *Target URL* once any of the events associated with your active subscriptions are triggered in an account that's installed your app.

## Parse generic webhook payloads

The endpoint at the target URL that you specify in your app's webhooks settings will receive `POST` requests containing JSON formatted data from HubSpot.

To ensure that the requests you're getting at your webhook endpoint are actually coming from HubSpot, HubSpot populates a `X-HubSpot-Signature` header with a SHA-256 hash built using the client secret of your app combined with details of the request. Learn more about [validating request signatures](/apps/legacy-apps/authentication/validating-requests).

For generic webhook payloads, the subscriptionType will follow the format of `object.*` (e.g., `object.propertyChange` instead of the previous format that was specific to each object type like `contact.propertyChange`). For creation, deletion, merge, restore, and property change events, the associated object type will be provided in the `objectTypeId` field of the payload, as defined in the table [here](/guides/crm/understanding-the-crm#object-type-id).

The tables below define the fields provided in different event payloads.

### General

The following fields will appear in all webhook event payloads:

| Field              | Description                                                                                                                                                                                                                                                         |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `objectId`         | The ID of the object that was created, changed, or deleted. For example, for contact event changes this is the contact ID; for companies, the company ID; for deals, the deal ID; and for conversations the [thread ID](/api-reference/legacy/conversations/guide). |
| `eventId`          | The ID of the event that triggered this notification. This value is not guaranteed to be unique.                                                                                                                                                                    |
| `subscriptionId`   | The ID of the subscription that triggered a notification about the event.                                                                                                                                                                                           |
| `portalId`         | The specific [HubSpot account ID](https://knowledge.hubspot.com/account-management/manage-multiple-hubspot-accounts#check-your-current-account) where the event occurred.                                                                                           |
| `appId`            | The ID of your public app or private app. This is used in case you have multiple applications pointing to the same webhook URL.                                                                                                                                     |
| `label`            | When this event occurred as a unix timestamp (in milliseconds).                                                                                                                                                                                                     |
| `attemptNumber`    | Starting at 0, which number attempt this is to notify your service of this event. If your service times-out or throws an error as describe in the *Retries* section below, HubSpot will attempt to send the notification again.                                     |
| `changeSource`     | The source of the change. This can be any of the change sources that appear in contact property histories.                                                                                                                                                          |
| `subscriptionType` | The webhook subscription type. This can be one of the following types: `object.creation`, `object.deletion`, `object.merge`, `object.restore`, `object.propertyChange`, or `object.associationChange`.                                                              |
| `objectTypeId`     | The type of the object that triggered the event. See the [table in this article](/guides/crm/understanding-the-crm#object-type-ids) for a full reference of each `objectTypeId`.                                                                                    |
| `sourceId`         | The user or source of the triggered webhook event (e.g., a user in the HubSpot account updating a value).                                                                                                                                                           |

### Property change events

The following fields are specifically included in the payload of `object.propertyChange` events:

| Field           | Description                                                                             |
| --------------- | --------------------------------------------------------------------------------------- |
| `propertyName`  | The name of the object property that changed (e.g., the `city` property for a contact). |
| `propertyValue` | The new value of the property.                                                          |

### Merge events

The following fields are specifically included in the payload of `object.merge` events:

| Field                     | Description                                                                                                                                                                    |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `primaryObjectId`         | The ID of the merge winner, which is the record that remains after the merge. In the HubSpot merge UI, this is the record on the right.                                        |
| `mergedObjectIds`         | An array of IDs that represent the records that are merged into the merge winner. In the HubSpot merge UI, this is the record on the left.                                     |
| `newObjectId`             | The ID of the record that is created as a result of the merge. This is separate from `primaryObjectId` because in some cases a new record is created as a result of the merge. |
| `numberOfPropertiesMoved` | An integer representing how many properties were transferred during the merge.                                                                                                 |

### Association events

The fields below are specifically included in the payload of `object.associationChange` events.

| Field                 | Description                                                                                                                                                                                                                                                                               |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `fromObjectTypeId`    | The ID of the object you're associating. To find the ID values, refer to this [list of object type IDs,](/guides/crm/understanding-the-crm#object-type-id) or for contacts, companies, deals, tickets, and notes, you can use the object name (e.g., `contact`, `company`).               |
| `toObjectTypeId`      | The ID of the object you're associating the record to. To find the ID values, refer to this [list of object type IDs,](/guides/crm/understanding-the-crm#object-type-id) or for contacts, companies, deals, tickets, and notes, you can use the object name (e.g., `contact`, `company`). |
| `associationTypeId`   | The type of association you want to create. A full list of association types is provided [here](/api-reference/latest/crm/associations/associate-records/guide#association-type-id-values).                                                                                               |
| `associationCategory` | Whether the association type was created by HubSpot (`HUBSPOT_DEFINED`) or by a user (`USER_DEFINED`).                                                                                                                                                                                    |

Association change events will trigger on both incoming and outgoing associations. This means that an `object.associationChange` for an `objectName` of `contact` will trigger on a `DEAL_TO_CONTACT` association change with `toObjectTypeId: 0-1` and the corresponding `associationTypeId` in the payload.

<Warning>
  **Please note:**

  * The `associationChange` event is not currently supported for custom objects, nor is it supported for [app objects](/apps/developer-platform/add-features/app-objects/overview) when creating an app on version 2025.2 of the developer platform.
  * Associations with user-defined labels are not currently supported with generic webhook subscriptions.
</Warning>
