HubSpot Forms → Zoho CRM Integration Guide
I see this setup broken in about 35% of B2B companies I audit. You’re using HubSpot Forms for lead capture but Zoho CRM for your sales process, and half your form submissions are getting lost between the two systems. Either the integration stops working without anyone noticing, or leads are ending up as duplicates with missing field data.
The main issue? Most people try to hack this together with Zapier when there are better native options, or they set up webhooks that fail silently when Zoho’s API rate limits kick in.
What You’ll Have Working By The End
- Every HubSpot form submission automatically creates a lead in Zoho CRM within 30 seconds
- Custom field mapping that preserves your lead source data and form context
- Error handling so you get notified when submissions fail to sync
- Duplicate prevention that updates existing contacts instead of creating new ones
- A testing workflow to verify the integration stays working
Prerequisites
- Admin access to your HubSpot account (need to access forms and integrations)
- Admin or CRM administrator role in Zoho CRM
- Access to your Zoho Developer Console (for API keys if using webhook method)
- List of which HubSpot form fields should map to which Zoho CRM fields
Method 1: HubSpot Native Integration to Zoho CRM
HubSpot actually has a built-in Zoho CRM integration that works better than third-party connectors in about 80% of cases. This is your best option if you don’t need complex field mapping or conditional logic.
Navigate to Settings → Integrations → Connected Apps in your HubSpot account. Search for “Zoho CRM” and click Connect.
You’ll need to authenticate with your Zoho account and grant permissions. The integration will ask you to map your HubSpot contact properties to Zoho CRM fields. Here’s the mapping I use most often:
Standard Field Mapping:
- Email → Email (required)
- First Name → First Name
- Last Name → Last Name
- Company → Account Name
- Phone → Phone
- Website → Website
- Lead Source → Lead Source (create this custom field in Zoho if it doesn’t exist)
Form-Specific Fields:
- hs_form_id → Lead Source Detail (use this to track which specific form they filled out)
- hs_analytics_source → Original Source
- hs_analytics_source_data_1 → Source Data 1
Once connected, go to Marketing → Forms and select each form you want to sync. In the form settings, navigate to the Options tab and enable “Create contact for new email addresses.” This ensures every submission becomes a contact in HubSpot first, which then syncs to Zoho.
The sync typically happens within 5-10 minutes. If you need real-time syncing, you’ll need the webhook method below.
Method 2: Zapier Integration Setup
If the native integration doesn’t support your field mapping requirements, Zapier is your next best option. I’ve set this up for clients who need conditional logic (like sending different lead types to different Zoho modules).
Create a new Zap with HubSpot as the trigger and Zoho CRM as the action.
Trigger Setup:
- Choose “New Form Submission” as the trigger
- Connect your HubSpot account
- Select the specific form(s) you want to sync
- Test the trigger with a recent form submission
Action Setup:
- Choose “Create Lead” in Zoho CRM (or “Create Contact” if you prefer)
- Map your fields carefully - here’s where most setups break
Critical Zapier Field Mapping:
HubSpot Field → Zoho CRM Field
email → Email (required)
firstname → First Name
lastname → Last Name
company → Company
phone → Phone
hs_form_id → Lead Source (I map this to a custom "Form ID" field)
Advanced Zapier Setup: Add a “Lookup Spreadsheet Row” step before creating the lead to translate form IDs into readable names. Create a Google Sheet with two columns: Form ID and Form Name. This way “form-123-abc” becomes “Contact Us Page Form” in your Zoho lead source field.
Enable the “Update Contact” option in Zapier to prevent duplicates. Set the lookup field to Email - if a contact with that email already exists, Zapier will update them instead of creating a duplicate.
Method 3: Webhook + API Integration
This is the most reliable method for high-volume forms or when you need real-time syncing. I use this approach for clients processing 500+ leads per day.
Step 1: Set up the Webhook Endpoint
You’ll need a server endpoint to receive HubSpot webhooks. Here’s the basic structure:
// Node.js webhook receiver
app.post('/hubspot-webhook', async (req, res) => {
const formSubmission = req.body[0]; // HubSpot sends an array
const leadData = {
email: formSubmission.email,
first_name: formSubmission.firstname,
last_name: formSubmission.lastname,
company: formSubmission.company,
phone: formSubmission.phone,
lead_source: 'HubSpot Form',
lead_source_detail: formSubmission.hs_form_id
};
// Send to Zoho CRM API
await createZohoLead(leadData);
res.status(200).send('OK');
});
Step 2: Configure HubSpot Webhooks
In HubSpot, go to Settings → Integrations → Private Apps and create a new private app. Give it “Forms” read permissions and generate the access token.
Then set up the webhook subscription:
POST https://api.hubapi.com/webhooks/v3/subscriptions
{
"eventType": "contact.creation",
"active": true,
"propertyName": "hs_form_id",
"webhookUrl": "https://your-server.com/hubspot-webhook"
}
Step 3: Zoho CRM API Integration
Here’s the function to create leads in Zoho:
async function createZohoLead(leadData) {
const response = await fetch('https://www.zohoapis.com/crm/v2/Leads', {
method: 'POST',
headers: {
'Authorization': `Zoho-oauthtoken ${process.env.ZOHO_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: [{
Email: leadData.email,
First_Name: leadData.first_name,
Last_Name: leadData.last_name,
Company: leadData.company,
Phone: leadData.phone,
Lead_Source: leadData.lead_source,
Lead_Source_Detail: leadData.lead_source_detail
}]
})
});
return response.json();
}
Rate Limiting Consideration: Zoho allows 100 API calls per minute. If you’re processing more than that, implement a queue system using Redis or a database to batch requests.
Testing & Verification
Always test your integration before going live. Here’s my standard testing process:
Test Form Submission:
- Fill out your HubSpot form with a test email (use your own email with a +test suffix like john+test@company.com)
- Submit the form
- Check that the contact appears in HubSpot within 2 minutes
- Verify the lead appears in Zoho CRM within your expected timeframe (5-10 minutes for native/Zapier, 30 seconds for webhooks)
Field Verification: Check that all mapped fields populated correctly in Zoho. Pay special attention to:
- Lead source is correctly attributed
- Phone numbers formatted properly (Zoho is picky about international formats)
- Company name didn’t get truncated
- Custom fields populated if you’re using them
Duplicate Testing: Submit the same form twice with the same email address. Your integration should either update the existing contact or create a duplicate with clear identification (depending on your setup preference).
Volume Testing: If you expect high volume, test with 10-15 rapid submissions to ensure your integration doesn’t break under load.
Troubleshooting
Problem: Form submissions appear in HubSpot but not Zoho
Check your integration connection status. For native integration, go to Connected Apps and look for error messages. For Zapier, check the Zap history for failed runs. For webhooks, check your server logs for API errors.
Problem: Leads created in Zoho but missing field data
This is usually a field mapping issue. Verify that the HubSpot property names match exactly what you’re using in your integration. HubSpot uses lowercase, underscore-separated names (like “first_name” not “First Name”).
Problem: Duplicate contacts being created instead of updated
For native integration, enable “Update existing contacts” in the Zoho settings. For Zapier, add a “Find Contact” step before the “Create Contact” action. For webhooks, implement a lookup API call first to check if the email already exists.
Problem: Integration randomly stops working
This happens with all three methods but for different reasons. Native integration: check if your Zoho or HubSpot admin changed permissions. Zapier: usually hits rate limits or the Zap got paused due to errors. Webhooks: API tokens expire or your server went down.
Problem: Phone numbers not syncing correctly
Zoho CRM expects phone numbers in specific formats. Clean your phone data before sending:
function cleanPhoneNumber(phone) {
return phone.replace(/[^\d]/g, '').replace(/^1/, ''); // Remove formatting, strip US country code
}
Problem: Some form submissions sync but others don’t
Usually indicates a field validation issue in Zoho. Check which fields are required in your Zoho lead layout. If HubSpot allows optional fields that Zoho requires, leads without those fields will fail to sync.
What To Do Next
Once your HubSpot Forms are syncing to Zoho CRM, you might want to set up HubSpot Forms to HubSpot CRM tracking for cross-platform attribution, or connect to Salesforce if you’re evaluating a CRM migration.
For ad attribution, definitely set up HubSpot Forms Google Ads conversion tracking so you can see which campaigns are driving your form submissions.
Want me to audit your current form-to-CRM setup for free? I’ll check for the silent failure points that break these integrations and send you a specific fix list. Get your free audit here.
This guide is part of the Zoho CRM Integration Hub — connect Zoho CRM to your forms, ads, and marketing tools.