A site owner posted on the WordPress forums with a specific and frustrating problem. When someone submitted their CF7 form with the same name or similar data as an existing lead in Zoho CRM, the plugin was updating that existing record instead of creating a new one. Duplicate names were colliding. Real new leads were being lost by being merged into old records.
The plugin support team's reply was two sentences. The free version does not support this. Buy the Pro version.
Thread closed as resolved. The problem was not resolved for anyone who did not want to pay for a Pro upgrade just to control whether new leads get created or merged.
This post explains why this happens, what the Zoho API actually does with duplicate records, and how to handle it correctly without being forced into a Pro upgrade.
Why the Plugin Overwrites Records Instead of Creating New Ones
Zoho CRM's API has two different endpoints for creating Lead records:
Create (always new):
POST https://www.zohoapis.com/crm/v2/Leads
This always creates a brand new record regardless of whether a record with the same name or email already exists.
Upsert (create or update):
POST https://www.zohoapis.com/crm/v2/Leads/upsert
This checks for a matching record first. If it finds one, it updates it. If it does not find one, it creates a new record.
Most dedicated CF7 to Zoho plugins use the upsert endpoint by default because it avoids true duplicate records for the same person. But "same person" in Zoho's matching logic is determined by the duplicate check fields you configure in your Zoho account - typically email address.
The problem in the forum thread was that the plugin was matching on name rather than email, or the Zoho account had duplicate check fields set to something other than email. When two leads had the same name or similar data, Zoho treated them as the same person and updated the existing record instead of creating a new one.
How Zoho's Duplicate Check Actually Works
In your Zoho CRM account, under Setup, then CRM Settings, then Modules and Fields, you can configure which fields are used to identify duplicate records. For Leads, the default is typically Email.
If duplicate check is set to Email and two different people submit your form with different email addresses, Zoho will create two separate Lead records even if their names are identical. The email address is the unique identifier.
If duplicate check is configured to include Last Name or Company, two leads with the same last name or company will collide and the second submission will update the first record.
The forum user's problem was almost certainly in this Zoho-side configuration, not in the plugin itself. Checking and correcting the duplicate check fields in Zoho settings would have resolved it without needing the Pro version.
To check this in Zoho: go to Setup, then Zoho CRM Settings, then Duplicate Check Preferences under the Leads module. Confirm that Email is the primary deduplication field and that Name is not included.
When You Genuinely Need Always-Create Behaviour
Some businesses do need to always create a new Lead regardless of whether a matching record exists. For example, a business that tracks every enquiry separately even from returning contacts, or one where the same person might legitimately submit multiple distinct enquiries.
For this use case, the correct API call is the basic create endpoint, not upsert. The free plugin defaulting to upsert is not wrong - it prevents genuine duplicates. But the option to override this and always create a new record should not require a paid upgrade.
Controlling This With a Direct API Integration
Contact Form to API lets you configure exactly which Zoho endpoint receives your form data. You choose the create endpoint if you always want new records, or the upsert endpoint if you want deduplication. That choice lives in your settings, not behind a paywall.
For always-create behaviour, configure the endpoint as:
POST https://www.zohoapis.com/crm/v2/Leads
With a payload like:
{
"data": [
{
"Last_Name": "[your-name]",
"Email": "[your-email]",
"Phone": "[your-phone]",
"Lead_Source": "Web Form"
}
]
}
For upsert behaviour with email as the matching field, use:
POST https://www.zohoapis.com/crm/v2/Leads/upsert
With the same payload. Zoho will match on the duplicate check fields configured in your account settings.
You also get a response log for every submission so you can see whether Zoho created a new record or updated an existing one, and the exact record ID returned.
Fixing the Duplicate Check in Zoho First
Before changing any plugin settings, go into your Zoho CRM account and confirm your duplicate check configuration. This is the most likely cause of the forum user's problem and it costs nothing to fix.
In Zoho CRM: Setup, then CRM Settings, then Modules, then Leads, then Duplicate Check Preferences. Ensure Email is selected as the duplicate check field and that Last Name is not included unless you specifically want last name matching.
If you want Zoho to always create new records regardless of any matching field, you can also disable the duplicate check entirely for the Leads module. New leads will always be created and no merging will happen.
Summary
Leads being overwritten instead of creating new records in Zoho CRM is almost always a duplicate check configuration issue, not a plugin bug. The fix is in Zoho's settings, not in buying a Pro plugin upgrade.
For businesses that need explicit control over create vs upsert behaviour without depending on which tier of a dedicated plugin they are on, a direct API integration gives you that control from a configuration setting rather than a pricing tier.
Top comments (0)