{
  "slug": "drupal",
  "url": "https://apps.sectorgrowth.com/integrations/drupal/",
  "name": "Drupal",
  "vendor": "Drupal community",
  "aliases": [
    "Drupal CMS",
    "Drupal 11",
    "Drupal 10",
    "Drupal 7",
    "Drupal Webform"
  ],
  "website": "https://www.drupal.org/about",
  "category": {
    "slug": "websites-and-content-management",
    "name": "Websites and content management",
    "url": "https://apps.sectorgrowth.com/categories/websites-and-content-management/"
  },
  "summary": "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.",
  "answer": "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.",
  "nativeApp": {
    "status": "third-party",
    "name": "Drupal Bridge",
    "developer": "Pumex Infotech Pvt Ltd.",
    "verifiedAt": "2026-09-29"
  },
  "api": {
    "style": "rest",
    "auth": "oauth2",
    "webhooks": "no",
    "changedSince": "yes",
    "sandbox": "yes",
    "docsUrl": "https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module"
  },
  "objects": [
    {
      "source": "User account",
      "hubspot": "contact",
      "direction": "two_way",
      "key": "Drupal user UUID held in a unique HubSpot property, with email for the first match",
      "notes": "Profile fields go to HubSpot, and only the membership state comes back."
    },
    {
      "source": "Webform submission",
      "hubspot": "contact",
      "direction": "to_hubspot",
      "key": "Email, sent as a HubSpot form submission with the visitor's hutk cookie",
      "notes": "Arriving as a form submission keeps HubSpot's form workflows and attribution working."
    },
    {
      "source": "Member role",
      "hubspot": "contact",
      "direction": "to_source",
      "key": "Drupal user UUID, set from the membership status HubSpot holds",
      "notes": "A lapsed membership removes the role, and the directory and gated pages follow it."
    },
    {
      "source": "Member organization content",
      "hubspot": "company",
      "direction": "to_hubspot",
      "key": "Node UUID held in a unique HubSpot company property",
      "notes": "Only where the site keeps member organizations as a content type."
    },
    {
      "source": "Email preferences form",
      "hubspot": "contact",
      "direction": "two_way",
      "key": "Email address, the key HubSpot keeps subscription status on",
      "notes": "HubSpot stays the record of consent, and the form reads it before it shows."
    }
  ],
  "approaches": [
    {
      "kind": "custom",
      "fit": "recommended",
      "why": "Only 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."
    },
    {
      "kind": "native",
      "fit": "possible",
      "why": "Drupal 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."
    },
    {
      "kind": "ipaas",
      "fit": "avoid",
      "why": "Zapier'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."
    }
  ],
  "connectionMethods": [
    "api"
  ],
  "effort": {
    "discoveryHours": [
      10,
      20
    ],
    "buildHours": [
      70,
      150
    ],
    "buildBand": "70 to 150 hours",
    "typicalElapsed": "4 to 8 weeks"
  },
  "pattern": "webhook-queue",
  "faqs": [
    {
      "q": "Is Drupal Bridge covered by drupal.org's security advisory policy?",
      "a": "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."
    },
    {
      "q": "Which drupal.org modules connect a Drupal site to HubSpot?",
      "a": "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."
    },
    {
      "q": "Can HubSpot's memberships replace the Drupal login for members?",
      "a": "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."
    },
    {
      "q": "How quickly does a lapsed membership in HubSpot reach the Drupal site?",
      "a": "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."
    },
    {
      "q": "What happens when a Drupal form submission cannot reach HubSpot?",
      "a": "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."
    },
    {
      "q": "Does Drupal core include an API an integration can read?",
      "a": "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."
    },
    {
      "q": "Which Drupal versions can connect to HubSpot?",
      "a": "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."
    },
    {
      "q": "How long does a Drupal and HubSpot integration take?",
      "a": "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."
    }
  ],
  "sections": [
    {
      "depth": 2,
      "text": "Why teams connect Drupal to HubSpot",
      "anchor": "#why-teams-connect-drupal-to-hubspot",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#why-teams-connect-drupal-to-hubspot"
    },
    {
      "depth": 2,
      "text": "What syncs",
      "anchor": "#what-syncs",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#what-syncs"
    },
    {
      "depth": 2,
      "text": "Architecture",
      "anchor": "#architecture",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#architecture"
    },
    {
      "depth": 2,
      "text": "Three ways to connect",
      "anchor": "#three-ways-to-connect",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#three-ways-to-connect"
    },
    {
      "depth": 2,
      "text": "What breaks and how we prevent it",
      "anchor": "#what-breaks-and-how-we-prevent-it",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#what-breaks-and-how-we-prevent-it"
    },
    {
      "depth": 3,
      "text": "Role writes need administer users",
      "anchor": "#role-writes-need-administer-users",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#role-writes-need-administer-users"
    },
    {
      "depth": 3,
      "text": "Short pages before the last page",
      "anchor": "#short-pages-before-the-last-page",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#short-pages-before-the-last-page"
    },
    {
      "depth": 3,
      "text": "HubSpot form edits reject submissions",
      "anchor": "#hubspot-form-edits-reject-submissions",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#hubspot-form-edits-reject-submissions"
    },
    {
      "depth": 3,
      "text": "A 4xx that ends HubSpot’s retries",
      "anchor": "#a-4xx-that-ends-hubspots-retries",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#a-4xx-that-ends-hubspots-retries"
    },
    {
      "depth": 2,
      "text": "Our approach",
      "anchor": "#our-approach",
      "url": "https://apps.sectorgrowth.com/integrations/drupal/#our-approach"
    }
  ],
  "caseStudies": [],
  "guides": [
    "https://apps.sectorgrowth.com/guides/choose-a-hubspot-integration-approach/",
    "https://apps.sectorgrowth.com/guides/how-sector-growth-scopes-an-integration/"
  ],
  "status": "published",
  "verifiedAt": "2026-09-29",
  "updatedAt": "2026-09-29",
  "authors": [
    {
      "name": "Prash",
      "role": "Lead of Technical Integrations and AI Solutions"
    }
  ],
  "sources": [
    {
      "title": "JSON:API module",
      "url": "https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module"
    },
    {
      "title": "API Overview",
      "url": "https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module/api-overview"
    },
    {
      "title": "Filtering",
      "url": "https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module/filtering"
    },
    {
      "title": "Pagination",
      "url": "https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module/pagination"
    },
    {
      "title": "Security considerations",
      "url": "https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module/security-considerations"
    },
    {
      "title": "Using other authentication protocols",
      "url": "https://www.drupal.org/docs/8/core/modules/rest/using-other-authentication-protocols"
    },
    {
      "title": "Simple OAuth (OAuth2) & OpenID Connect",
      "url": "https://www.drupal.org/project/simple_oauth"
    },
    {
      "title": "class UserAccessControlHandler",
      "url": "https://api.drupal.org/api/drupal/core%21modules%21user%21src%21UserAccessControlHandler.php/class/UserAccessControlHandler/11.x"
    },
    {
      "title": "function hook_ENTITY_TYPE_update",
      "url": "https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21entity.api.php/function/hook_ENTITY_TYPE_update/11.x"
    },
    {
      "title": "Security advisory process and permissions policy",
      "url": "https://www.drupal.org/drupal-security-team/security-advisory-process-and-permissions-policy"
    },
    {
      "title": "Drupal core release schedule",
      "url": "https://www.drupal.org/about/core/policies/core-release-cycles/schedule"
    },
    {
      "title": "Drupal core",
      "url": "https://www.drupal.org/project/drupal"
    },
    {
      "title": "About",
      "url": "https://www.drupal.org/about"
    },
    {
      "title": "Webhooks",
      "url": "https://www.drupal.org/project/webhooks"
    },
    {
      "title": "HubSpot",
      "url": "https://www.drupal.org/project/hubspot"
    },
    {
      "title": "Hubspot Forms",
      "url": "https://www.drupal.org/project/hubspot_forms"
    },
    {
      "title": "Hubspot Connect",
      "url": "https://www.drupal.org/project/hubspot_connect"
    },
    {
      "title": "DrupalBridge",
      "url": "https://www.drupal.org/project/drupalbridge"
    },
    {
      "title": "DrupalBridge Installation Guide",
      "url": "https://hubspot.pumexinfotech.com/drupal-installation-guide"
    },
    {
      "title": "Drupal Bridge - Form Builder and Lead Scoring and Routing App for HubSpot | Pumex Infotech Pvt Ltd.",
      "url": "https://ecosystem.hubspot.com/marketplace/listing/drupalbridge"
    },
    {
      "title": "Submit data to a form (supporting authentication)",
      "url": "https://developers.hubspot.com/docs/api-reference/legacy/marketing/forms/v3-legacy/submit-data-authenticated"
    },
    {
      "title": "Install the HubSpot tracking code",
      "url": "https://knowledge.hubspot.com/reports/install-the-hubspot-tracking-code"
    },
    {
      "title": "HubSpot tracking code API",
      "url": "https://developers.hubspot.com/docs/api-reference/2026-03/account/settings/tracking-code/overview"
    },
    {
      "title": "Style and embed HubSpot forms on an external site",
      "url": "https://knowledge.hubspot.com/forms/set-up-and-style-your-form-on-an-external-site"
    },
    {
      "title": "How to Trigger Webhooks in HubSpot Contact-Based Workflows",
      "url": "https://knowledge.hubspot.com/workflows/how-do-i-use-webhooks-with-hubspot-workflows"
    },
    {
      "title": "Webhooks API guide (2026-03)",
      "url": "https://developers.hubspot.com/docs/api-reference/2026-03/webhooks/guide"
    },
    {
      "title": "Create and edit webhook subscriptions in legacy private apps",
      "url": "https://developers.hubspot.com/docs/apps/legacy-apps/private-apps/create-and-edit-webhook-subscriptions-in-private-apps"
    },
    {
      "title": "Communication preferences API guide",
      "url": "https://developers.hubspot.com/docs/api-reference/2026-03/communication-preferences/guide"
    },
    {
      "title": "Contacts API",
      "url": "https://developers.hubspot.com/docs/api-reference/2026-03/crm/objects/contacts/guide"
    },
    {
      "title": "Create and manage access groups for private content",
      "url": "https://knowledge.hubspot.com/website-pages/require-member-registration-to-access-private-content"
    },
    {
      "title": "Drupal Integrations | Connect Your Apps with Zapier",
      "url": "https://zapier.com/apps/drupal/integrations"
    },
    {
      "title": "Drupal Integration | Workflow Automation | Make",
      "url": "https://www.make.com/en/integrations/drupal"
    }
  ]
}