HubSpot + Drupal integration
Drupal runs the site: its Webforms, member logins and directory. What reaches HubSpot, what has to come back into Drupal, and what a keyed build takes.
Connects by APIScope this integration Book a scoping call Estimate the cost
- Into HubSpot
- Two way
- Out of HubSpot
Is there an official Drupal + HubSpot integration?
Not from HubSpot or the Drupal project. As of September 2026 the HubSpot App Marketplace lists one third-party app, Drupal Bridge from Pumex Infotech, which sends Webform entries to HubSpot and lists Drupal users, Drupal Commerce orders and companies as two-way sync. For a membership site we recommend a custom API integration at 70 to 150 build hours: neither its listing nor its module claims role or member directory sync, and both have to follow HubSpot back into Drupal.
- Recommended route
- Custom API integration
- Build effort
- 70 to 150 hours
- In the HubSpot App Marketplace?
- Yes, Drupal Bridge by Pumex Infotech Pvt Ltd.
- Typical elapsed time
- 4 to 8 weeks
Marketplace checked September 2026.
Why teams connect Drupal to HubSpot
A membership organization’s Drupal site carries more than pages. It holds the member’s login, the profile behind the member directory, the pages only members can open, and the forms for joining, renewing and registering for events. HubSpot holds the other half: the marketing record, the email subscriptions and the workflows that chase a renewal. Left unconnected, a member who lapses in HubSpot keeps their access on the site. A newsletter preference changed on the site never reaches the system that sends the email.
Not every Drupal site has members, and a site that only needs its forms and page views in HubSpot has a smaller job. HubSpot’s help centre has a Drupal site paste the tracking code into a block. A form either embeds HubSpot’s own form or sends a Webform submission to HubSpot’s form endpoint. The decisions there are which of the two the site uses, and whether its domain sits in HubSpot’s tracking settings. HubSpot marks embedded submissions from a domain missing there as spam.
The membership case turns on ownership. Sign-in stays in Drupal’s user accounts: HubSpot’s memberships gate content HubSpot hosts on its own connected domains, so they cannot stand in for a Drupal login. Email consent belongs to HubSpot, which keeps subscription status per email address. The membership record belongs wherever renewals are managed, and when that is HubSpot, the site’s roles have to follow it.
What syncs
Five records carry a membership site. The member’s account becomes a HubSpot contact, keyed on the account’s UUID in a unique HubSpot property rather than on the email address. Members change their address. The UUID is the identifier JSON:API itself uses for the account, and HubSpot allows partial upserts only on a custom unique property, never on email. Email still makes the first match, for people who were contacts before they had an account.
Webform submissions arrive as HubSpot form submissions, sent with the visitor’s hutk tracking cookie, so the form’s workflows fire and the page history joins the right contact. Member organizations, where the site keeps them as content, become companies keyed on the node’s UUID.
Two records follow HubSpot. The membership state lives there, and a change sets the member’s role in Drupal, which is what the directory view and the gated pages read. Email preferences are the one place email is the key, because HubSpot keeps subscription status against the address. The site’s preferences form reads the current status from HubSpot and writes each change back to it.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| User account | Contact | Two way | Drupal user UUID held in a unique HubSpot property, with email for the first match | Profile fields go to HubSpot, and only the membership state comes back. |
| Webform submission | Contact | Into HubSpot | Email, sent as a HubSpot form submission with the visitor's hutk cookie | Arriving as a form submission keeps HubSpot's form workflows and attribution working. |
| Member role | Contact | Out of HubSpot | Drupal user UUID, set from the membership status HubSpot holds | A lapsed membership removes the role, and the directory and gated pages follow it. |
| Member organization content | Company | Into HubSpot | Node UUID held in a unique HubSpot company property | Only where the site keeps member organizations as a content type. |
| Email preferences form | Contact | Two way | Email address, the key HubSpot keeps subscription status on | HubSpot stays the record of consent, and the form reads it before it shows. |
Architecture
The shape is a webhook queue running both ways, with a reconciliation sweep behind it. Drupal core sends no webhooks, and the contributed Webhooks module offers only a release candidate. So a small custom module hooks the account save and the Webform submission, and posts a signed event to our service. The service queues each event and writes HubSpot. Accounts become a batch upsert on the UUID property, each Webform entry a form submission, and each preference change a subscription update by email address.
HubSpot’s changes come back through a webhook subscription on the app that holds the integration’s token. A workflow’s Send a webhook action also works, and needs Data Hub Professional or Enterprise. The service checks HubSpot’s signature, queues the event and passes the membership state to a narrow route in the module, which sets the role.
The sweep reads the JSON:API user collection filtered on the changed timestamp past a stored watermark, and replays whatever the events missed. Drupal documents no API rate limit, so the sweep paces itself for the host. The watermark, the UUID to contact links and a replay endpoint live in the service.
What the API allows
- API style
- REST
- Authentication
- OAuth 2.0
- Webhooks
- No
- Changed-since filter
- Yes
- Sandbox
- Yes
- Rate limit
- Not documented
Developer documentation drupal.org
Three ways to connect
What decides the route on a Drupal site is direction. If records only travel into HubSpot, contributed modules can do it. Hubspot Forms embeds HubSpot’s own forms and has a stable release covered by drupal.org’s security advisory policy. The HubSpot module sends Webform submissions instead, but it offers only release candidates, which the policy does not cover.
Drupal Bridge, the app in the HubSpot App Marketplace, sends Webform entries to HubSpot and lists Drupal users, Commerce orders and companies as two-way sync. Its published code takes one HubSpot webhook, for contact deletions, and marks the linked Drupal user’s sync status as deleted. Neither the listing nor the code claims role or member directory sync, and the module has no drupal.org release or advisory coverage, which matters on a site with member logins.
Once roles, the directory and email preferences have to follow HubSpot back into Drupal, the job needs a custom API integration. Zapier and Make both document Drupal connectors, but each triggers on new content only, which leaves accounts and roles to raw API calls.
-
Custom API integration
RecommendedOnly a custom API integration carries membership state back into Drupal. HubSpot's webhook reaches our service, a small module on the site applies the role, and no outside account ever holds the administer users permission.
-
Marketplace app
PossibleDrupal Bridge from Pumex Infotech sends Webform entries to HubSpot and lists Drupal users, Commerce orders and companies as two-way sync, a fit for a site without member roles. Neither its listing nor its module claims role or member directory sync, and the module has no drupal.org release or security advisory coverage.
-
iPaaS
AvoidZapier's and Make's Drupal connectors trigger only on new content, so member accounts, roles and Webform submissions would each need hand-built API calls, billed per task or operation.
What breaks and how we prevent it
Role writes need administer users
Drupal lets an account edit only itself unless it holds the administer users permission, so writing roles through JSON:API needs it. Drupal’s security team lists that permission among those that can already take over a site. We keep role changes inside Drupal, where the module applies the membership state through its own route. The sweep’s read account holds only access user profiles and view user email addresses.
Short pages before the last page
JSON:API caps a page at fifty resources and drops the ones the account cannot see after the query runs, so a short page need not be the last. A client that stops there misses every member after it. The sweep follows the next link until it is absent, as Drupal’s documentation asks, and compares its total with HubSpot’s.
HubSpot form edits reject submissions
Each Webform posts to one HubSpot form. HubSpot rejects a submission carrying a field that form does not define, and every submission once reCAPTCHA is switched on for it. Marketing edits those forms freely. We check every mapping against the form’s definition on each deploy and each night. Failed entries wait in the queue with HubSpot’s error until the mapping is fixed.
A 4xx that ends HubSpot’s retries
A workflow webhook is retried for up to three days, but never after a 4xx answer other than 429. HubSpot’s ten retries over 24 hours apply to legacy public apps, and its private-app webhook documentation states no retry policy. So Drupal never answers HubSpot directly: the service acknowledges at once, re-reads the contact before it acts, and the sweep catches any event that never arrives.
Our approach
- Scope. We settle who owns each record: the login in Drupal, consent in HubSpot, the membership wherever renewals run. Then we list the forms, roles and directory fields in scope.
- Architect. We fix the UUID key and its HubSpot property, the role mapping, the webhook route, the sweep cadence and the permissions the API account holds.
- Build. Drupal has no vendor sandbox and needs none, because the software carries no licence fee. We build against a copy of your site on a staging host and a HubSpot sandbox, with a portal allowlist that fails closed.
- Validate. We load every existing account, compare counts by role, and submit each form once to confirm HubSpot accepts it.
- Operate. Cutover is a token swap. We watch the queue and the sweep, and retest the module on each Drupal minor release and on Drupal 12.
Common questions
Is Drupal Bridge covered by drupal.org's security advisory policy?
No. Its Drupal module is listed on drupal.org as DrupalBridge, maintained by Dwarakesh T Babu, and the project page says it is not covered by the security advisory policy. No release is published there, and Pumex's setup guide installs a beta from the project's Git repository. The policy covers stable releases only, so the Drupal Security Team issues no advisories for this code.
Which drupal.org modules connect a Drupal site to HubSpot?
Several contributed modules, none of them published by HubSpot or the Drupal project. Hubspot Forms, maintained by minnur, embeds HubSpot's own forms. The HubSpot module, backed by Ergasia, Current and Digett, sends Webform submissions to HubSpot. Hubspot Connect adds the tracking code as a Drupal library rather than a pasted block. Hubspot Forms and Hubspot Connect have stable releases covered by the security advisory policy; the HubSpot module offers release candidates only.
Can HubSpot's memberships replace the Drupal login for members?
No. HubSpot's memberships control access to content HubSpot hosts, such as pages and blog posts on Content Hub Professional or Enterprise, on subdomains connected to HubSpot. A Drupal page never passes through that check. Members keep signing in with their Drupal accounts, and after sign-in the page identifies the member to HubSpot's tracking code by email, so their page views land on the right contact.
How quickly does a lapsed membership in HubSpot reach the Drupal site?
As soon as HubSpot's webhook arrives. Our service queues the change and the module removes the member's role, which the directory and the gated pages read. HubSpot's documentation states no retry policy for a private app's webhooks, so the design does not rely on one. If the site is down, our queue holds the change, and a scheduled comparison of roles against HubSpot catches any event that never arrives.
What happens when a Drupal form submission cannot reach HubSpot?
It waits in the queue with HubSpot's error instead of disappearing. HubSpot's form endpoint names the cause, such as a field missing from the HubSpot form or reCAPTCHA switched on, so we fix the mapping and replay the entry once. The queue keys every entry on its Webform submission ID, which is what stops a replay from sending the same entry to HubSpot twice.
Does Drupal core include an API an integration can read?
Yes. Drupal core ships the JSON:API module, which exposes every non-internal entity type once a site owner enables it and starts in read-only mode. Collections return fifty resources a page at most, and the changed and created fields filter on a Unix timestamp. Core authenticates calls with HTTP Basic or a session cookie; OAuth 2.0 comes from the contributed Simple OAuth module, which we use.
Which Drupal versions can connect to HubSpot?
Drupal 11 is current: 11.4 gets new features and 11.3 gets security fixes until December 2026. Drupal 10 reaches end of life that month, when Drupal 12 is due, and Drupal 7 lost support in January 2025. We build on Drupal 11, test against Drupal 12's pre-releases, and treat a Drupal 7 site as an upgrade before an integration.
How long does a Drupal and HubSpot integration take?
Plan on 10 to 20 hours of discovery and 70 to 150 hours of build for a membership site: accounts, Webform submissions, roles, member organizations and email preferences, with a queue, a sweep and replay endpoints. A site that only needs forms and page views in HubSpot is a much smaller job, often an embedded HubSpot form and the tracking code, and needs no build of that size.
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Trust and compliance
We design integrations to support the security and privacy rules your business works under, and we build them on independently audited platforms.
-
SOC 2
We build to support SOC 2 security controls, on platforms that hold SOC 2 reports of their own.
-
ISO/IEC 27001:2022
We build to support your information security program under ISO/IEC 27001:2022.
-
HIPAA
We scope BAA needs in discovery, then design builds around them for covered entities and their business associates.
-
GDPR
We scope data-processing needs in discovery and design builds to support your GDPR duties.
About the GDPR at the European Commission (opens in a new tab)
-
PIPEDA
We design builds to support your accountability for personal information as it moves between systems.
-
CASL
We can build consent capture and sync that support your CASL consent records.
Our builds run on
How we build
- Sandbox first. We build and test in a sandbox before anything reaches production.
- Fail-closed allowlists. An integration runs only against the HubSpot accounts it is approved for.
- Least-privilege access. Each integration gets only the API scopes it needs.
- Secrets in a vault. Keys and tokens live in a secrets vault, never in plain text.
- Sensitive data scoped early. Discovery covers sensitive data, access controls and any BAA or data-processing needs.
- A compliance package for regulated industries: audit logging, field-level encryption and sensitive-data handling.
Scope a Drupal integration
Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.
Thanks, we will reply within one business day
Prash or Sean reads every one of these and comes back with a scope, or with the one question we need answered first.
Sources
- JSON:API module drupal.org
- API Overview drupal.org
- Filtering drupal.org
- Pagination drupal.org
- Security considerations drupal.org
- Using other authentication protocols drupal.org
- Simple OAuth (OAuth2) & OpenID Connect drupal.org
- class UserAccessControlHandler api.drupal.org
- function hook_ENTITY_TYPE_update api.drupal.org
- Security advisory process and permissions policy drupal.org
- Drupal core release schedule drupal.org
- Drupal core drupal.org
- About drupal.org
- Webhooks drupal.org
- HubSpot drupal.org
- Hubspot Forms drupal.org
- Hubspot Connect drupal.org
- DrupalBridge drupal.org
- DrupalBridge Installation Guide hubspot.pumexinfotech.com
- Drupal Bridge - Form Builder and Lead Scoring and Routing App for HubSpot | Pumex Infotech Pvt Ltd. ecosystem.hubspot.com
- Submit data to a form (supporting authentication) developers.hubspot.com
- Install the HubSpot tracking code knowledge.hubspot.com
- HubSpot tracking code API developers.hubspot.com
- Style and embed HubSpot forms on an external site knowledge.hubspot.com
- How to Trigger Webhooks in HubSpot Contact-Based Workflows knowledge.hubspot.com
- Webhooks API guide (2026-03) developers.hubspot.com
- Create and edit webhook subscriptions in legacy private apps developers.hubspot.com
- Communication preferences API guide developers.hubspot.com
- Contacts API developers.hubspot.com
- Create and manage access groups for private content knowledge.hubspot.com
- Drupal Integrations | Connect Your Apps with Zapier zapier.com
- Drupal Integration | Workflow Automation | Make make.com