Typeform → HubSpot Integration Guide
About 60% of the Typeform-HubSpot integrations I audit are missing leads. Usually it’s because someone set up Zapier three years ago and never checked if it was still working, or they’re using the native integration but never mapped custom fields properly.
The good news? This integration is actually one of the more reliable ones once you set it up right. HubSpot has solid API documentation and Typeform’s webhook system is pretty stable.
What You’ll Have Working By The End
- Every Typeform submission automatically creates or updates a contact in HubSpot
- Custom form fields mapped to the right HubSpot properties
- Lead source attribution so you know which forms are converting
- Error handling so you get notified when leads go missing
- A test process to verify everything’s flowing correctly
Prerequisites
- Admin access to your Typeform account
- Marketing Hub Professional or higher in HubSpot (needed for custom properties)
- Ability to create custom properties in HubSpot
- Basic understanding of field mapping concepts
Method 1: HubSpot Native Integration (Recommended)
This is the most reliable approach I’ve seen. HubSpot built this integration specifically for Typeform, so it handles edge cases better than third-party tools.
In your Typeform account, go to Connect tab → Integrations → search for “HubSpot”. Click Connect.
You’ll authenticate with HubSpot (make sure you’re logged into the right portal). Once connected, configure these settings:
Field Mapping Setup:
- Email field: Must map to HubSpot’s “Email” property (this is automatic)
- First Name: Map to “First Name” property
- Last Name: Map to “Last Name” property
- Phone: Map to “Phone Number” property
- Company: Map to “Company Name” property
For custom fields, you’ll need to create matching properties in HubSpot first. Go to Settings → Properties → Contact Properties and create a new property for each Typeform field you want to capture.
Lead Source Configuration: Under “Additional Settings” in the Typeform integration:
- Set Lead Source to “Typeform”
- Set Lead Source Detail to your form name (like “Contact Form - Homepage”)
This creates proper attribution so you can track which forms are actually converting.
Duplicate Handling: Choose “Update existing contact” if the email already exists. This prevents duplicate contacts but updates their information with new form data.
Method 2: Zapier Connection
I recommend this when you need more complex logic, like different HubSpot actions based on form responses, or when you’re already using Zapier for other integrations.
Create a new Zap with Typeform as the trigger and HubSpot as the action.
Trigger Setup:
- Choose “New Entry” as your trigger event
- Select your specific Typeform
- Test the trigger by submitting a test form entry
Action Setup:
- Choose “Create or Update Contact” as the HubSpot action
- Map fields exactly like in Method 1
- Set up conditional logic if needed (like different list enrollment based on responses)
Error Handling: In Zapier’s advanced settings, enable “Send Error Notification” and add your email. When the integration breaks, you’ll know within minutes instead of discovering missing leads weeks later.
I see about 15% of Zapier integrations fail at some point due to API changes or authentication expiring, so monitoring is critical.
Method 3: Webhook + API Approach
This is for developers or when you need custom logic that the native options can’t handle. I use this for complex scenarios like progressive profiling or custom lead scoring.
Typeform Webhook Setup: In your Typeform, go to Connect → Webhooks and add:
Webhook URL: https://your-server.com/typeform-webhook
Secret: your-webhook-secret
Webhook Handler Code (Node.js example):
const hubspot = require('@hubspot/api-client');
const hubspotClient = new hubspot.Client({ accessToken: 'your-hubspot-token' });
app.post('/typeform-webhook', async (req, res) => {
const formResponse = req.body.form_response;
// Extract answers from Typeform payload
const answers = formResponse.answers.reduce((acc, answer) => {
acc[answer.field.id] = answer[answer.type];
return acc;
}, {});
// Map to HubSpot properties
const contactData = {
properties: {
email: answers['email_field_id'],
firstname: answers['first_name_field_id'],
lastname: answers['last_name_field_id'],
hs_lead_source: 'Typeform',
hs_lead_source_detail: formResponse.form_id
}
};
try {
await hubspotClient.crm.contacts.basicApi.create(contactData);
res.status(200).send('Contact created');
} catch (error) {
console.error('HubSpot API error:', error);
res.status(500).send('Integration failed');
}
});
This approach gives you complete control but requires maintaining server infrastructure.
Testing & Verification
Step 1: Submit Test Data Fill out your Typeform with fake but realistic data. Use an email address you control for testing.
Step 2: Check HubSpot Contact Creation Within 2-3 minutes, search for the test email in HubSpot contacts. The contact should exist with all mapped fields populated.
Step 3: Verify Lead Source Attribution Check the contact’s “Lead Source” and “Lead Source Detail” properties. These should match what you configured in your integration.
Step 4: Test Edge Cases
- Submit with an existing email (should update, not duplicate)
- Submit with missing optional fields (should still create contact)
- Submit with special characters or long text (should handle gracefully)
Acceptable Variance: Integration delays of 1-5 minutes are normal. If leads take longer than 10 minutes to appear, something’s broken.
I expect 98%+ of form submissions to create contacts successfully. Anything below 95% indicates a configuration problem.
Troubleshooting
Problem: Contacts are being created but custom fields are empty The field mapping is incorrect or the HubSpot properties don’t exist. Go back to your integration settings and verify each field is mapped to an actual HubSpot property. Check that custom properties were created with the exact names you’re using.
Problem: Duplicate contacts being created for existing emails Your integration is set to “Create new contact” instead of “Update existing.” Change this setting in your integration configuration. Also check if you have multiple integrations running simultaneously.
Problem: Integration worked initially but stopped working after a few weeks This is usually authentication expiring (common with Zapier) or API rate limits being hit. Check your integration’s error logs and re-authenticate if needed. For high-volume forms, consider implementing retry logic.
Problem: Some submissions are missing entirely, not just delayed Look for pattern in the missing submissions. Are they from specific traffic sources? Mobile devices? This often indicates JavaScript errors preventing form submission or webhook delivery failures.
Problem: Form submissions create contacts but don’t trigger HubSpot workflows Check your workflow enrollment criteria. The contact must meet all conditions at the time of creation. If you’re using lifecycle stage criteria, make sure new contacts are being assigned the right stage initially.
Problem: Special characters in form responses are causing integration failures This happens with names containing apostrophes, accented characters, or emojis. Your integration needs proper character encoding. In webhooks, ensure your payload is UTF-8 encoded before sending to HubSpot.
What To Do Next
Once your Typeform-HubSpot integration is working, consider setting up:
- Typeform to Salesforce integration if you’re using multiple CRMs
- Typeform Google Ads conversion tracking to measure ad performance
- Typeform to ActiveCampaign integration for email marketing automation
Need help auditing your current setup or implementing advanced lead routing? Get a free tracking audit and I’ll show you exactly what’s broken and how to fix it.
This guide is part of the HubSpot Integrations Hub — covering every major tool integration with HubSpot CRM.