# HubSpot: create or update contact

The **HubSpot: create or update contact** Point template upserts one HubSpot contact by email: it creates a new contact when the email isn't found, or updates the listed properties when it is.

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: create or update contact** 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 permission to write contacts. It's stored masked, like a webhook secret header.
4. In **Contact email**, enter the email HubSpot uses to find an existing contact. It takes the same macros as **Properties**, for example `{{tag:Email}}`, so each traveler upserts their own contact instead of all of them colliding on one fixed address. Don't repeat it in **Properties**.
5. In **Properties**, add HubSpot's internal property name (for example `firstname`, `phone`) mapped to the value to set — see [key/value fields](/product/customer-journey/journey-elements/integrations/#configuring-list-and-keyvalue-fields).
6. Click **Save**.

## 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 drops the traveler from the journey — see [Errors and failed requests](/product/customer-journey/journey-elements/integrations/#errors-and-failed-requests).