HubSpot

CRM OAuth, or a service key / private app token you paste Windmill docs

Read and write HubSpot contacts, companies, deals, tickets and custom objects from any Windmill script, flow or app. Search and batch records, link them, log notes, tasks and meetings, manage lists, forms, marketing emails, blog posts, pages and workflows, and answer conversations.

Set up in 4 steps

1

Create a service key

In HubSpot, open Development, then Keys, then Service keys. Create a key, tick the scopes your scripts need, and copy it. On older accounts the same thing lives under Settings, then Integrations, then Private apps.

2

Add the resource in Windmill

Open Resources, add a resource of type hubspot, and paste the key in the token field.

3

Or connect with OAuth

If your Windmill admin has set up a HubSpot OAuth app, pick hubspot from the OAuth APIs list and click Connect, then choose the account and approve the scopes. Windmill refreshes the 30-minute access token for you. The scopes you get are the ones your admin declared on the HubSpot app: its required scopes always, and its optional ones (tickets, lists, forms, content, conversations, automation and so on) when you tick them on HubSpot's consent screen.

4

Run your first script

Fork List CRM Objects, pick contacts in the object type dropdown, and run it before writing anything.

Scripts

Building blocks, if none of the projects above fit. Fork one, run it, or call it as a step inside your own flow.

Submit a script →

Trigger flows from HubSpot

HubSpot is not only a destination. These inbound paths are supported today.

HubSpot webhooks on an HTTP route

HubSpot pushes events (contact.creation, deal.propertyChange, ticket.creation and the like) to one target URL per app. Create a Windmill HTTP route, set it as the target URL in your HubSpot app's webhooks settings, and subscribe to the events you want. Each delivery is a JSON array of events, so loop over it in your flow.

Check the signature

Every delivery carries X-HubSpot-Signature-v3 and X-HubSpot-Request-Timestamp. In the route's script, compute the base64 HMAC-SHA256 of method + full URL + raw body + timestamp with your app's client secret, compare it to the header, and drop requests whose timestamp is older than 5 minutes.

Workflows can call a route too

On Professional and Enterprise accounts, a workflow's Send a webhook action can POST the enrolled record to a Windmill HTTP route, with no app needed.

Resource type

The shape of the credential every script on this page expects.

FieldTypeRequiredWhat it is
tokenstringYesService key or private app access token (pat-...). In HubSpot: Development > Keys > Service keys, or Settings > Integrations > Private apps on accounts that still have them. Filled automatically when you connect with OAuth.

Questions

A call fails on a missing scope

HubSpot answers 403 and names the scopes it would accept. Edit the service key or private app to add one (the key itself does not change), or for OAuth ask your admin to add it to the HubSpot app, then reconnect and tick it on HubSpot's consent screen. Some scopes, like automation and sequences, also need a paid HubSpot tier.

Service key, private app or OAuth?

A service key (or a private app token on older accounts) is the quickest for your own account. Use OAuth for the features that act as a user, such as meeting links and sequence enrollment, which a service key cannot reach.

How do I work with tickets, line items or custom objects?

The CRM scripts take the object type from a dropdown that lists the standard objects and your custom ones, and the properties list follows the object you pick.

Does it work with EU-hosted accounts?

Yes. HubSpot serves every account from api.hubapi.com, wherever its data is hosted.

Is my key stored on the hub?

Never. It lives only in your own Windmill workspace, encrypted at rest.