DEV Community

Rahul Sharma
Rahul Sharma

Posted on

CF7 Submissions Not Reaching Zoho? Here Is Why the Test Passes But Live Forms Do Not

CF7 Submissions Not Reaching Zoho? Here Is Why the Test Passes But Live Forms Do Not<br>
A developer posted this on the WordPress support forums:

"We successfully set up the connection and when testing it shows everything as working. We can see a list of the forms and their fields. However, when the form is submitted, the submissions are not going into Zoho."

The fix in that thread was a plugin patch update plus IP whitelisting. That is enough to resolve the immediate issue. But it does not explain why this happens, how to prevent it, or what to do when you need a more reliable path than a middleware webhook chain.

This post covers all of it.

Why the Test Passes But Live Submissions Do Not

This is the most disorienting part of the problem. The Zoho Flow plugin connected successfully. It listed the CF7 forms and their fields correctly. The debug test showed no errors. Then real form submissions produced nothing.

There are three distinct reasons this happens.

Reason 1: Trigger vs. Connection Are Two Different Things

The connection test in Zoho Flow verifies that the plugin can authenticate with Zoho Flow's API and retrieve form metadata. It does not verify that the webhook trigger will fire when a form is actually submitted on the live site.

These are different operations:

  • Connection test: plugin calls Zoho Flow to read form configuration (outbound, on demand)
  • Submission trigger: form submission on your site fires a webhook to Zoho Flow (outbound, event-driven)

A successful connection test tells you the API credentials work. It tells you nothing about whether the webhook event fires correctly on form submit.

Reason 2: IP Restrictions Block the Outbound Webhook

WordPress can be configured with security plugins or server-level firewall rules that restrict outbound HTTP requests. When a CF7 form submits and the plugin tries to POST data to Zoho Flow's webhook URL, that outbound request gets blocked before it leaves your server.

The form submission appears to succeed from the user's perspective (no error shown). Nothing arrives at Zoho. No error is logged unless you are specifically watching for failed wp_remote_post calls.

Similarly, Zoho accounts can have IP restriction settings that block inbound requests from unknown IP ranges. If your WordPress server's IP is not whitelisted in Zoho, requests that arrive will be rejected at Zoho's end with no notification back to your site.

Reason 3: Plugin Bug in the Trigger Hook

The actual resolution in this thread was a plugin patch (v2.13.2) that fixed a trigger issue. This means the webhook was never firing in the first place due to a bug in how the plugin hooked into CF7's submission event. The connection test passed because it used a different code path than the live trigger.

This is worth noting: plugin-based webhook triggers have a layer of abstraction between the CF7 submission hook and the actual HTTP request to the middleware service. Bugs in that abstraction layer produce exactly this symptom: working connection test, silent failure on live submission.

The IP Whitelisting Problem in Depth

Zoho Flow's support reply mentioned two separate whitelisting requirements. Most developers miss the second one.

Requirement 1: Whitelist Zoho Flow's IPs on your WordPress server

When Zoho Flow needs to reach back into your WordPress site (for example, to poll for new submissions or to verify webhook delivery), it makes requests from a set of known IP ranges. If your server has an outbound/inbound firewall that blocks unknown IPs, these requests fail.

Zoho Flow publishes its IP ranges in their help documentation. You add these to your server's allowlist (or your security plugin's whitelist, such as Wordfence).

Requirement 2: Whitelist your WordPress server's IPs in your Zoho account

Your WordPress site makes outbound requests to Zoho Flow's webhook endpoints. If your Zoho account has IP restrictions enabled under Settings, those requests will be rejected unless your server's IP is explicitly allowed.

This is the requirement that catches most developers. They whitelist Zoho's IPs on their server but forget that Zoho itself may be configured to reject requests from unknown IPs.

To check: in your Zoho account, go to Settings > Security > Allowed IPs. If this list is non-empty, your WordPress server's IP needs to be added.

Finding your WordPress server's outbound IP:

# Run this in your server's terminal or via WP CLI
curl -s https://ipinfo.io/ip
Enter fullscreen mode Exit fullscreen mode

Or from WordPress directly:

// Temporary diagnostic - add to functions.php, check, then remove
add_action('wp_footer', function() {
    if (current_user_can('administrator')) {
        $response = wp_remote_get('https://ipinfo.io/ip');
        echo '<!-- Server outbound IP: ' . wp_remote_retrieve_body($response) . ' -->';
    }
});
Enter fullscreen mode Exit fullscreen mode

Diagnosing Silent Webhook Failures in WordPress

When submissions appear to succeed but nothing reaches Zoho, work through this sequence:

Step 1: Check whether the CF7 hook fires at all

add_action('wpcf7_before_send_mail', function($contact_form) {
    error_log('[CF7 Debug] Submission hook fired. Form ID: ' . $contact_form->id());
});
Enter fullscreen mode Exit fullscreen mode

If this appears in wp-content/debug.log on form submit, CF7 is processing the submission. If it does not appear, the form submission itself is failing before hooks fire (spam filter, validation issue, etc.).

Step 2: Check for blocked outbound requests

Some security plugins (Wordfence, iThemes Security) restrict outbound HTTP requests from WordPress. Check your security plugin logs for blocked requests to *.zohoflow.com or *.zoho.com domains around the time of your test submissions.

Step 3: Test the webhook URL directly

Get the webhook URL that Zoho Flow generated for your trigger. Then call it manually from your WordPress server:

// Temporary diagnostic - remove after testing
add_action('admin_init', function() {
    if (!isset($_GET['test_zoho_webhook'])) return;

    $response = wp_remote_post('YOUR_ZOHO_FLOW_WEBHOOK_URL', [
        'headers' => ['Content-Type' => 'application/json'],
        'body'    => wp_json_encode([
            'your-name'  => 'Test User',
            'your-email' => 'test@example.com',
        ]),
        'timeout' => 15,
    ]);

    error_log('[Webhook Test] Status: ' . wp_remote_retrieve_response_code($response));
    error_log('[Webhook Test] Body: ' . wp_remote_retrieve_body($response));
    wp_die('Webhook test complete. Check debug.log.');
});
Enter fullscreen mode Exit fullscreen mode

Visit yoursite.com/wp-admin/?test_zoho_webhook=1 while logged in as admin. Check debug.log for the response. A 200 confirms the webhook URL is reachable from your server. A connection error or timeout points to an outbound block.

Skipping the Middleware Layer Entirely: Direct Zoho CRM API

Zoho Flow is a middleware service that sits between your WordPress site and Zoho CRM. Every submission travels: CF7 plugin > Zoho Flow > Zoho CRM. Each hop is a potential point of failure.

If you need CF7 submissions to go directly into Zoho CRM as leads or contacts without the middleware layer, use Zoho CRM's API directly with Contact Form to API.

The Zoho CRM v2 API endpoint for creating leads:

POST https://www.zohoapis.com/crm/v2/Leads
Authorization: Zoho-oauthtoken YOUR_ACCESS_TOKEN
Content-Type: application/json

{
  "data": [
    {
      "Last_Name": "Smith",
      "First_Name": "Jane",
      "Email": "jane@example.com",
      "Phone": "1234567890",
      "Lead_Source": "Web Form"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

The main requirement is a Zoho OAuth 2.0 access token. Zoho tokens expire every hour and require a refresh token flow. For a simpler implementation, use Zoho's self-client OAuth option to generate a long-lived token for server-to-server use.

Direct API integration removes the Zoho Flow middleware, the IP whitelisting dependency, and the plugin trigger bug risk entirely. The only dependency is your WordPress server being able to reach zohoapis.com on port 443, which is standard on any server that can load external resources.

Summary

The forum fix (plugin update + IP whitelist) was correct. The deeper explanation:

Cause What Breaks Fix
Plugin trigger bug Webhook never fires despite working connection test Update plugin to latest version
Server outbound IP blocked by Zoho Requests reach Zoho but get rejected Whitelist server IP in Zoho account settings
Zoho Flow IPs blocked on WordPress server Zoho cannot reach back to WordPress Whitelist Zoho Flow IP ranges in server/security plugin
Middleware reliability Any Zoho Flow outage breaks the integration Use direct Zoho CRM API instead

Top comments (0)