# HubSpot: update subscription

The **HubSpot: update subscription** Point template writes the push subscription state and the journey step onto an existing HubSpot contact, so sales and email marketing see what the person already gets from the app.

This point authenticates with its own HubSpot private app token — it doesn't use any account-level HubSpot integration configured elsewhere in Settings.

## Configure the point

1. Drag **HubSpot: update subscription** from the **Integrations** section onto the canvas.
2. Double-click the point and enter a **Step Name**.
3. In **Private app token**, enter a HubSpot private app token with the `crm.objects.contacts.write` scope. It's stored masked, like a webhook secret header.
4. In **Look the contact up by**, enter the internal name of the HubSpot property that holds the identifier — `email` by default, or a property of your own that carries the Pushwoosh User ID. HubSpot only looks a contact up by a property whose values it keeps unique.
5. In **Identifier value**, enter the value to look up, for example `{{device:user_id}}` or a tag of the traveler.
6. In **Properties to write**, add a row per HubSpot property's internal name mapped to what to write into it — see [key/value fields](/product/customer-journey/journey-elements/integrations/#configuring-list-and-keyvalue-fields). Besides tags, the value can use the new `{{device:push_subscribed}}` macro for the push subscription state, `{{now}}` for the moment the traveler passed here, or `{{journey:name}}`/`{{point:name}}` for where. A cell holding a single macro keeps that macro's own type — `{{device:push_subscribed}}` alone arrives as a boolean, not the string `"true"`.
7. Click **Save**.

<Aside type="note">
Each property in **Properties to write** has to already exist on the HubSpot contact object — this point doesn't create new properties, set them up in HubSpot first. If one doesn't exist, HubSpot rejects the whole request instead of writing the rest: none of the properties in this step get written, and the traveler drops from the journey the same way as any other failed request.
</Aside>

## Response

After the step runs, the HubSpot contact's ID is available in later steps as attribute **`hubspot_contact_id`** — use it the same way you'd use a [Webhook response attribute](/product/customer-journey/journey-elements/channels/webhook/#map-webhook-response-data-to-variables), for example to set a Tag with [Update user profile](/product/customer-journey/journey-elements/flow-controls/update-user-profile/#use-a-value-from-a-webhook-response).

A failed request, including a contact HubSpot can't find by the identifier you gave, drops the traveler from the journey — see [Errors and failed requests](/product/customer-journey/journey-elements/integrations/#errors-and-failed-requests).