Integrating Zoho CRM with WordPress lets you automatically capture leads from contact forms, quote requests, and landing pages into your CRM — without manual copy-paste between systems. Every submission goes straight to a Zoho CRM Lead or Contact record, ready for follow-up.
There are four approaches: a plugin like CRM Perks (handles OAuth and field mapping with a UI), a native form plugin addon (if you’re already on WPForms Pro or Gravity Forms), a no-code bridge via Zapier or Zoho Flow, or a direct REST API call for custom requirements. This guide covers all four so you can pick the one that fits your stack.
Before you start: create a Zoho Connected App
Every integration method except Zapier requires OAuth 2.0 credentials from Zoho. You create these once and reuse them across any integration:
- Go to api-console.zoho.com and sign in with your Zoho account
- Click Add Client → choose Server-based Applications
- Fill in:
- Client Name: anything descriptive (e.g. “My WordPress Site”)
- Homepage URL: your WordPress site URL
- Authorized Redirect URIs: the callback URL from your plugin or integration (each plugin provides this — set it after installing)
- Click Create — Zoho generates a Client ID and Client Secret
Keep both values — you’ll paste them into whichever integration method you use below. The access tokens are refreshed automatically by the integration layer; you won’t need to manage them manually.
Method 1: CRM Perks Zoho Integration plugin
CRM Perks Zoho Integration is the most widely used plugin for this connection. It supports Contact Form 7, WPForms, Gravity Forms, Ninja Forms, and Elementor Forms — so whichever form plugin you use, one plugin handles the CRM sync. The core integration is free; some premium form types require a paid add-on.
Setup
- In WordPress: Plugins → Add New → search “CRM Perks” → install and activate
- Go to CRM Perks → Zoho CRM in the WordPress admin sidebar
- Paste your Client ID and Client Secret from the Zoho Connected App
- Click Authorize — the plugin redirects to Zoho’s OAuth consent screen. Accept, and Zoho redirects back with tokens stored in WordPress
- Copy the Redirect URI shown by the plugin and paste it into your Zoho Connected App’s Authorized Redirect URIs field (back in api-console.zoho.com)
Field mapping
Once connected, open any form in the editor. CRM Perks adds a Zoho CRM tab to each form’s settings. Here you configure:
- CRM Module: Leads, Contacts, or Deals
- Field mapping: match each form field to a Zoho CRM field (First Name, Last Name, Email, Phone, Lead Source, Description, etc.)
- Conditional sync: only send to CRM if a specific field is filled or has a particular value (e.g. only sync “Request a quote” form, not newsletter signups)
Common mapping for a contact form:
- Name (split or combined) → First Name / Last Name
- Email → Email
- Phone → Phone
- Message → Description
- Fixed value “WordPress Website” → Lead Source
Method 2: WPForms or Gravity Forms native Zoho addon
If you’re already using WPForms Pro or Gravity Forms, their native Zoho addons are the cleaner option — no separate plugin needed.
WPForms + Zoho CRM Addon: Available with WPForms Elite (or the Zoho CRM addon purchased separately). Go to WPForms → Addons → Zoho CRM → Install. Then in any form’s settings, open the Zoho CRM tab, connect with your Client ID/Secret via OAuth, and map form fields to Zoho modules.
Gravity Forms + Zapier addon: Gravity Forms has a Zapier addon (free from the Gravity Forms account) that fires a webhook on form submission. Wire it to a Zoho CRM Zap in Zapier (covered in Method 3 below).
For a full breakdown of which form plugin to use for your site, see the WordPress contact form plugins comparison — it covers WPForms, Gravity Forms, Contact Form 7, and Fluent Forms with their integration capabilities.
Method 3: Zapier or Zoho Flow (no-code)
Zapier and Zoho Flow both act as middleware between WordPress form submissions and Zoho CRM, without writing code or installing a Zoho-specific plugin. The tradeoff: both cost money for meaningful automation volume.
Zapier
- In Zapier, create a new Zap
- Trigger: Webhooks by Zapier (Catch Hook) — Zapier gives you a webhook URL
- In WordPress, configure your form to POST to that webhook URL on submission (WPForms and Gravity Forms both support webhooks natively)
- Action: Zoho CRM → Create/Update Lead — map the webhook payload fields to Zoho CRM Lead fields
- Test with a form submission — Zapier shows the payload and the created Lead
Zapier’s free tier allows 100 tasks/month (each form submission = 1 task). Paid plans start at around $20/month for 750 tasks.
Zoho Flow
Zoho Flow is Zoho’s own automation platform — like Zapier but with deeper Zoho ecosystem integration. If you’re already in the Zoho One suite, Zoho Flow is included. The WordPress connector in Zoho Flow triggers on form submissions via webhook; the Zoho CRM action creates records natively.
Method 4: Direct Zoho CRM REST API (developer approach)
For custom integration logic — conditional routing to different modules, enriching data before sending, or integrating from a custom PHP flow — the Zoho CRM REST API gives full control. The current API version is v7.
Get a server-to-server access token using a Self Client in Zoho API Console, then create a Lead via wp_remote_post():
function create_zoho_lead( array $data ): bool {
$access_token = get_option( 'zoho_crm_access_token' ); // stored after OAuth
$response = wp_remote_post(
'https://www.zohoapis.com/crm/v7/Leads',
[
'headers' => [
'Authorization' => 'Zoho-oauthtoken ' . $access_token,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode( [
'data' => [
[
'First_Name' => sanitize_text_field( $data['first_name'] ),
'Last_Name' => sanitize_text_field( $data['last_name'] ),
'Email' => sanitize_email( $data['email'] ),
'Phone' => sanitize_text_field( $data['phone'] ),
'Description' => sanitize_textarea_field( $data['message'] ),
'Lead_Source' => 'WordPress',
],
],
] ),
]
);
if ( is_wp_error( $response ) ) {
error_log( 'Zoho CRM error: ' . $response->get_error_message() );
return false;
}
$body = json_decode( wp_remote_retrieve_body( $response ), true );
return isset( $body['data'][0]['code'] ) && $body['data'][0]['code'] === 'SUCCESS';
}
// Hook into a Contact Form 7 submission:
add_action( 'wpcf7_mail_sent', function( $contact_form ) {
$submission = WPCF7_Submission::get_instance();
if ( $submission ) {
$data = $submission->get_posted_data();
create_zoho_lead( [
'first_name' => $data['your-name'] ?? '',
'last_name' => '',
'email' => $data['your-email'] ?? '',
'phone' => $data['your-phone'] ?? '',
'message' => $data['your-message'] ?? '',
] );
}
} );
Zoho CRM access tokens expire every hour. For a production integration, implement a refresh flow: store the refresh token in WordPress options, and refresh the access token when an API call returns a 401. The Zoho OAuth documentation covers the refresh endpoint.
Testing the integration
Whichever method you use:
- Submit a test form entry with recognisable data (e.g. email:
zoho-test-[timestamp]@example.com) - In Zoho CRM, go to Leads (or whichever module you’re syncing to) and look for the record
- Check that all mapped fields populated correctly — name, email, phone, lead source
- If using CRM Perks or a plugin, check CRM Perks → Logs for the submission record and any error details
If data isn’t appearing in Zoho CRM: check the OAuth connection is still valid (re-authorize if needed), verify the Redirect URI in Zoho Connected App matches exactly what the plugin shows, and confirm your Zoho CRM user has API access enabled (Zoho CRM → Setup → Developer Space → API).
Common troubleshooting
- Authentication error / invalid token: Re-authorize the OAuth connection from the plugin settings. If using the API directly, check that the access token hasn’t expired and implement refresh logic.
- Required field errors (202 error from Zoho): Zoho CRM requires Last Name for Lead records. If your form only has a single Name field, split it before sending or map the entire name to Last Name.
- Duplicate records: Zoho CRM creates a duplicate if the email already exists and you’re not using the Upsert endpoint. Switch to
POST /crm/v7/Leads/upsertwith theduplicate_check_fieldsparameter set toEmailto update existing records instead of creating duplicates. - Data sync delay: Plugin-based integrations send synchronously on form submission. If there’s a delay, check if your server’s outbound HTTP requests are rate-limited or if Zoho’s API is rate-limiting your account (Zoho CRM API limit is 5,000 calls/day on standard plans).
Zoho CRM is one of several CRM and marketing platforms you can connect to WordPress. For similar setups with other platforms, see the guides to integrating HubSpot with WordPress, connecting Mailchimp to WordPress contact forms, and connecting Marketo to your WordPress site. The hosting and plugin decisions that affect how reliably outbound integrations work are covered in five things to decide before building a WordPress site.


