Build scalable client campaign workflows in Webflow with HubSpot integration

Connect Webflow forms to HubSpot CRM to set up scalable client campaign workflows. Read more to learn exactly how.

Build scalable client campaign workflows in Webflow with HubSpot integration

Route Webflow form submissions to HubSpot CRM with serverless functions, webhooks, or middleware platforms.

Connecting Webflow lead capture forms to HubSpot CRM enables automated contact creation, lifecycle stage management, and marketing workflow triggers without manual data entry. This integration creates a direct pipeline from visitor engagement to sales-ready leads.

This guide covers the architectural patterns, authentication requirements, and implementation approaches for syncing Webflow form submissions with HubSpot CRM at scale.

Integration architecture overview

The core challenge in Webflow-to-HubSpot integration is browser security. Direct client-side submissions from Webflow to HubSpot's authenticated API endpoints fail due to Cross-Origin Resource Sharing (CORS) restrictions. HubSpot's secure form submission endpoint does not support CORS, meaning browsers block these requests before they reach HubSpot's servers.

This technical limitation requires implementing a server-side intermediary architecture where form data is submitted from the browser to your own backend server, which then forwards the data to HubSpot's APIs, eliminating CORS issues through server-to-server communication.

Several architectural approaches address this constraint:

  • Serverless function intermediary for custom logic, data transformation, and multi-system integration with server-stored credentials and CORS control
  • Webhook-based integration for decoupled form submission with custom retry logic and audit trails
  • Middleware platforms (Zapier, Make) for no-code visual workflows and field mapping without infrastructure management
  • Embedded HubSpot forms for built-in tracking, CAPTCHA support, and rapid deployment with limited design flexibility

The optimal approach depends on technical capability, customization requirements, cost structure preferences, and integration complexity.

Prerequisites and account setup

Successful integration requires API credentials from both platforms with properly configured OAuth scopes and a server-side execution environment.

At a high level, you'll need:

  • A Webflow account with API access enabled
  • A HubSpot account with forms and contacts access
  • A server-side execution environment (serverless platform or webhook endpoint)

HubSpot authentication setup

HubSpot supports two primary authentication methods for CRM operations: private app tokens (legacy but functional for single-account integrations) and OAuth 2.0 (for multi-tenant applications). To create a private app, navigate to your HubSpot account settings > Development > Legacy apps > Create legacy app, then select "Private." Complete the Basic Info section and configure required scopes through the Scopes tab. After creating the app, generate your access token from the Auth tab. All HubSpot API requests require the Authorization header: Authorization: Bearer [YOUR_TOKEN]. Note that private apps are the recommended approach for single-account integrations, while OAuth 2.0 is required for multi-tenant SaaS applications and HubSpot App Marketplace listings.

Required OAuth scopes for form and contact operations:

Scope Purpose
crm.objects.contacts.read Retrieve contact records
crm.objects.contacts.write Create and update contacts
automation Trigger workflow enrollments

Note: The authenticated Forms API endpoint (/submissions/v3/integration/secure/submit) uses your private app token for authentication. Verify current scope requirements in HubSpot's scopes documentation as these may change.

Store your access token securely as an environment variable. Tokens reflect configured scopes and automatically lose access to specific scopes if your HubSpot account is downgraded.

Webflow API credentials

Generate an API token in your Webflow account with sites:write and forms:read scopes using OAuth authentication. This token is required to authenticate API requests for creating webhooks through the Webflow API endpoint (POST https://api.webflow.com/v2/sites/{site_id}/webhooks) and retrieving form submission data via the Forms API.

Step 1: Choose your integration pattern

The right integration approach depends on your customization requirements, technical capacity, and volume expectations.

Pattern 1: Embedded HubSpot forms

Embedding HubSpot forms directly in Webflow provides the fastest path to integration with built-in tracking, CAPTCHA support, and automatic contact creation.

At a high level, you'll:

This approach requires no custom code but limits design flexibility. Style forms through HubSpot's editor or apply custom CSS on your Webflow site.

Pattern 2: Native Webflow forms with API submission

Building forms in Webflow gives you complete design control while routing submissions to HubSpot through the Forms API v3.

HubSpot Forms API endpoint:

POST https://api.hsforms.com/submissions/v3/integration/secure/submit/{portalId}/{formGuid}

Request payload structure:

{
  "fields": [
    { "objectTypeId": "0-1", "name": "email", "value": "jane@example.com" },
    { "objectTypeId": "0-1", "name": "firstname", "value": "Jane" },
    { "objectTypeId": "0-1", "name": "lastname", "value": "Doe" }
  ],
  "context": {
    "hutk": "hubspotutk_cookie_value",
    "pageUri": "https://yoursite.webflow.io/contact",
    "pageName": "Contact Form"
  }
}

Retrieve the HubSpot tracking cookie (hubspotutk) from browser cookies for contact attribution. See HubSpot tracking code documentation.

Implement through a serverless function or webhook handler as described in the architecture section.

Pattern 3: Webhook-based integration

Webflow webhooks send POST requests with JSON payloads to your specified endpoint when form submissions occur. Because Webflow processes and stores the form submission independently of your webhook endpoint's availability, submissions are recorded even if your endpoint is temporarily unavailable and can be retrieved later via the Forms API.

Create a webhook via the Webflow API:

curl -X POST https://api.webflow.com/v2/sites/{site_id}/webhooks \
  -H "Authorization: Bearer {your_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "triggerType": "form_submission",
    "url": "https://your-endpoint.com/webhook"
  }'

Webflow sends this payload structure:

{
  "triggerType": "form_submission",
  "payload": {
    "name": "Contact Form",
    "siteId": "65427cf400e02b306eaa049c",
    "data": {
      "First Name": "Jane",
      "Last Name": "Doe",
      "email": "jane@example.com"
    },
    "submittedAt": "2024-01-15T12:35:16.117Z",
    "formId": "65429eadebe8a9f3a30f62d0"
  }
}

Your handler transforms this payload and forwards it to HubSpot's Contacts API or Forms API.

Step 2: Configure HubSpot contact properties

Map Webflow form fields to HubSpot contact properties for consistent data storage. HubSpot provides default properties for common fields, but custom properties handle form-specific data.

Default contact properties

Use these internal names when submitting data to HubSpot:

Form Field HubSpot Property Type
Email email string
First Name firstname string
Last Name lastname string
Phone phone string
Company company string

Create custom properties

For form fields without default mappings, create custom properties via the Properties API using the POST /crm/v3/properties/contacts endpoint.

{
  "groupName": "contactinformation",
  "name": "lead_source_form",
  "label": "Lead Source Form",
  "type": "string",
  "fieldType": "text"
}

Valid type and fieldType combinations:

type fieldType
bool booleancheckbox
enumeration checkbox, radio, select
date date
datetime date
string text, textarea, html, phonenumber, file
number number

Critical: Both type and fieldType are required when creating properties, and they must be compatible combinations.

When mapping Webflow form fields to HubSpot properties via API, use the internal name value in all API calls, not the display label.

Step 3: Implement webhook signature verification

Both platforms implement HMAC-based signature verification for webhooks. Webflow uses HMAC SHA256 with signatures in the x-webflow-signature header, while HubSpot uses HMAC SHA-256 with signatures in the X-HubSpot-Signature header.

Webflow signature verification:

const crypto = require('crypto');

function verifyWebflowSignature(secret, body, signature) {
  const hash = crypto.createHmac('sha256', secret)
    .update(body)
    .digest('hex');
  return hash === signature;
}

app.post('/webhook', (req, res) => {
  const signature = req.headers['x-webflow-signature'];
  if (verifyWebflowSignature(WEBFLOW_WEBHOOK_SECRET, req.rawBody, signature)) {
    console.log('Webhook verified:', req.body);
    res.status(200).send('OK');
  } else {
    res.status(401).send('Unauthorized');
  }
});

Note: Webhooks created through the Webflow dashboard may not include security verification headers. API-created webhooks include these headers for HMAC-based signature validation. Verify current behavior in Webflow's webhook documentation.

For HubSpot signature verification implementation, see HubSpot's request validation documentation.

Step 4: Set up lifecycle stage automation

HubSpot workflows automate lifecycle stage progression based on form submissions and contact engagement through event-based enrollment triggers. Configure enrollment triggers through the HubSpot Automation API v4 with form submission event types and property update actions.

Valid lifecycle stage values:

  • subscriber
  • lead
  • marketingqualifiedlead
  • salesqualifiedlead
  • opportunity
  • evangelist
  • customer

Update lifecycle stage via Contacts API:

{
  "properties": {
    "lifecyclestage": "marketingqualifiedlead"
  }
}

Use internal enumeration names (not display labels) in API requests. Reference HubSpot's workflow enrollment triggers documentation for form submission trigger configuration.

Step 5: Verify integration success

Test your integration end-to-end before production deployment.

Webflow form submission:

  1. Submit a test form on your Webflow site
  2. Verify the submission appears in Webflow's Forms dashboard
  3. Check webhook delivery logs if using webhook pattern

HubSpot contact creation:

Use POST /crm/v3/objects/contacts with required crm.objects.contacts.write scope. For batch operations (up to 100 contacts), use /crm/v3/objects/contacts/batch/create. See HubSpot Contacts API documentation.

  1. Search for the test contact in HubSpot CRM
  2. Verify all mapped properties contain expected values
  3. Confirm lifecycle stage assignment

Workflow enrollment:

  1. Check the contact's workflow history in HubSpot
  2. Verify enrollment trigger fired correctly
  3. Confirm subsequent workflow actions executed

Step 6: Handle rate limits at scale

Both platforms enforce rate limits that require careful architectural consideration for high-volume implementations. Webflow enforces a technical limit of 75 webhook registrations per trigger type per site.

HubSpot rate limits

HubSpot enforces rate limits on a per-10-second burst window basis. These limits apply across all API endpoints including the Forms API.

Account Tier Requests per 10 seconds
Free/Starter 100 requests
Professional 190 requests
Enterprise 190 requests
With API Limit Increase add-on 250 requests

HubSpot returns HTTP 429 with a Retry-After header when rate limits are exceeded. If your system receives 10 HTTP 429 errors within a single second, that IP address is blocked from API requests for one minute.

Implement proactive rate limit monitoring:

Monitor the X-HubSpot-RateLimit-Remaining header in API responses to track remaining requests in the current window. Implement exponential backoff when approaching limits:

async function hubspotRequestWithBackoff(requestFn, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await requestFn();
    
    if (response.status === 429) {
      const retryAfter = response.headers['retry-after'] || Math.pow(2, attempt);
      await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
      continue;
    }
    
    return response;
  }
  throw new Error('Max retries exceeded');
}

Batch operations reduce API consumption:

Use batch endpoints (/crm/v3/objects/contacts/batch/create) to process up to 100 contacts per request, significantly reducing API call volume.

Webflow limits

Webflow enforces 75 webhook registrations per trigger type per site. Form submission volumes are limited by your Webflow plan.

Reference HubSpot's API usage documentation and Webflow's webhook documentation for current limits.

Security and compliance considerations

HTTPS encryption: All data transmission between Webflow forms and HubSpot APIs must use HTTPS with TLS encryption.

GDPR consent fields: HubSpot provides consent field functionality for capturing explicit opt-in. Include legalConsentOptions in Forms API submissions.

Data processing agreements: Execute DPAs with HubSpot (available at https://legal.hubspot.com/dpa) and Webflow (must be requested separately through your Webflow account management). Update your privacy policy to disclose the data flow between platforms.

Troubleshoot common issues

CORS errors: See Integration architecture overview.

401 Unauthorized: Invalid or expired authentication token. Verify token is correctly stored and has not been revoked.

403 Forbidden: Token lacks required OAuth scopes. Check scope configuration in your HubSpot private app settings.

429 Too Many Requests: Rate limit exceeded. Respect the Retry-After header value and implement exponential backoff. Monitor X-HubSpot-RateLimit-Remaining headers proactively.

400 Validation errors: Invalid property values or malformed request body. Verify required fields are present and data types match HubSpot property definitions.

Reference HubSpot's error handling documentation and Webflow's form submissions management resources for detailed resolution steps.

Additional resources

Alex Halliday
CEO
AirOps
En savoir plus
Aleyda Solis
International SEO Consultant and Founder
Orainti
En savoir plus
Barry Schwartz
President and Owner
RustyBrick, Inc
En savoir plus
Chris Andrew
CEO and Cofounder
Scrunch
En savoir plus
Connor Gillivan
CEO and Founder
TrioSEO
En savoir plus
Eli Schwartz
Author
Product-led SEO
En savoir plus
Ethan Smith
CEO
Graphite
En savoir plus
Evan Bailyn
CEO
First Page Sage
En savoir plus
Gaetano Nino DiNardi
Growth Advisor
En savoir plus
Jason Barnard
CEO and Founder
Kalicube
En savoir plus
Kevin Indig
Growth Advisor
En savoir plus
Lily Ray
VP SEO Strategy & Research
Amsive
En savoir plus
Marcel Santilli
CEO and Founder
GrowthX
En savoir plus
Michael King
CEO and Founder
iPullRank
En savoir plus
Rand Fishkin
CEO and Cofounder
SparkToro, Alertmouse, & Snackbar Studio
En savoir plus
Stefan Katanic
CEO
Veza Digital
En savoir plus
Steve Toth
CEO
Notebook Agency
En savoir plus
Sydney Sloan
CMO
G2
En savoir plus

Read now

Last Updated
January 16, 2026
Category

Related articles


Commencez gratuitement

Essayez Webflow aussi longtemps que vous le souhaitez grâce à notre plan Starter gratuit. Achetez un plan de site payant pour publier, héberger et débloquer des fonctionnalités supplémentaires.

Get started — it’s free
Regardez la démo

Essayez Webflow aussi longtemps que vous le souhaitez grâce à notre plan Starter gratuit. Achetez un plan de site payant pour publier, héberger et débloquer des fonctionnalités supplémentaires.