DEV Community

Rahul Sharma
Rahul Sharma

Posted on

CF7 to Copper CRM Not Creating Leads: A Complete Troubleshooting Guide

You have built a Contact Form 7 form. You have connected it to Copper CRM through the "Contact Form to Any API" plugin. You have entered your API key and mapped the fields. And yet, when a user submits the form, no lead appears in your Copper CRM.

This is a frustratingly common problem. The good news? The issue is almost always one of four things, and each has a clear fix. This guide walks through the exact debugging process, common error patterns, and verified solutions.

Understanding the Data Flow

When a user submits your CF7 form with Copper lead creation enabled, here is what should happen:

User submits form → Plugin captures data → POST request sent to Copper API → Lead created

When it breaks, the failure happens at one of the last two stages. Your first diagnostic tool is the plugin's API Logs page. It shows whether a request was sent, the exact JSON payload, and the response from Copper. If no request appears in the logs, the problem is on the WordPress side. For a deeper breakdown of that specific scenario, see this guide on Contact Form 7 data not reaching the API.

Failure #1: The Endpoint URL Is Wrong

What you see: No lead is created. The API logs show a 404 Not Found error, or a successful request that creates a Person instead of a Lead.

Why it happens: Copper separates People and Leads into distinct API endpoints. The plugin requires you to manually enter the endpoint URL. If you paste the People endpoint instead of the Leads endpoint, the plugin will create a Person record, not a Lead.

The fix:

Verify your endpoint URL in the plugin settings. For creating leads, it must be:

https://api.copper.com/developer_api/v1/leads
Enter fullscreen mode Exit fullscreen mode

The People endpoint is /people. The Leads endpoint is /leads. These are not interchangeable.

How to verify: After submitting a test form, check your Copper account. Navigate to the Leads section. If no new lead appears, the endpoint is wrong.

Failure #2: The Authentication Headers Are Missing or Incorrect

What you see: Copper returns a 401 Unauthorized or 403 Forbidden error. No lead is created.

Why it happens: Copper requires three specific headers for API authentication. The plugin provides a static textarea for request headers. If any of these are missing or incorrectly formatted, authentication fails.

The fix:

In the plugin's Request Headers field, add all three required headers:

X-PW-AccessToken: YOUR_API_KEY
X-PW-Application: developer_api
X-PW-UserEmail: your-login-email@example.com
Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode

Key details:

  • X-PW-AccessToken: Your Copper API key, generated from Profile → Email Settings & Templates.
  • X-PW-Application: Must be exactly developer_api. This is not your application name; it is a fixed value required by Copper.
  • X-PW-UserEmail: The email address you use to log in to Copper. This must match exactly.

How to verify: After saving, submit a test form. Check the plugin's API Logs. A 200 OK response means authentication succeeded.

For a comprehensive breakdown of authentication errors across different APIs, see this guide on Contact Form 7 API authentication errors.

Failure #3: The Required "Name" Field Is Missing

What you see: Copper returns a 400 Bad Request error. The response mentions a missing required field.

Why it happens: Copper requires a name field to create a lead. Without it, the API rejects the request.

The fix:

Step 1: Verify your mapping. In the plugin's JSON Payload section, ensure at least one CF7 field is mapped to the Copper name field.

Step 2: Use a hidden field if needed. If your form does not have a natural field for the lead name, add a hidden field with a default value:

[hidden lead-name default:get "Website Lead"]
Enter fullscreen mode Exit fullscreen mode

Step 3: Check the payload structure. Your JSON should look like:

{
  "name": "[your-name]",
  "email": {
    "email": "[your-email]",
    "category": "work"
  }
}
Enter fullscreen mode Exit fullscreen mode

Copper's email field uses a nested object with email and category properties. The category is typically work.

For a deeper dive into JSON structure mapping, read this guide on Contact Form 7 JSON mapping.

Failure #4: The Payload Structure Is Incorrect

What you see: Copper returns a 400 Bad Request error with a message about invalid fields or unexpected structure.

Why it happens: Copper's API expects a specific JSON structure. Sending flat key-value pairs instead of the expected nested format will cause the request to fail.

The fix:

Step 1: Start with a minimal payload. Use only the required fields:

{
  "name": "[your-name]",
  "email": {
    "email": "[your-email]",
    "category": "work"
  }
}
Enter fullscreen mode Exit fullscreen mode

Step 2: Add fields one at a time. Once the minimal payload works, add additional fields like phone_numbers, company_name, or title. Test after each addition.

Step 3: Use the correct field names. Copper's Lead object supports fields like name, email, phone_numbers, company_name, and title. Field names must match exactly.

Step 4: Check the Content-Type header. Ensure your request includes:

Content-Type: application/json
Enter fullscreen mode Exit fullscreen mode

The Debugging Checklist

Work through this sequence every time a lead fails to create:

Step Action What It Tells You
1 Check the plugin's API Logs Was a request sent? What response code came back?
2 Verify the endpoint URL Does it target /leads, not /people?
3 Check all three auth headers Are X-PW-AccessToken, X-PW-Application, and X-PW-UserEmail present?
4 Confirm name field is mapped Is the required field present in the payload?
5 Test with minimal payload Hardcode a name value to isolate mapping issues.
6 Inspect the JSON structure Is email a nested object with email and category?

Beyond Leads: Creating Related Records

Once you can create leads reliably, you may want to create related records. Copper's data model connects these objects:

  • Lead → Person: When a lead is qualified, it can be converted to a Person.
  • Person → Opportunity: Opportunities represent deals and are associated with People.

Copper also supports an upsert endpoint for leads (/leads/upsert), which matches on email and updates existing records instead of creating duplicates. This is useful if you want repeat submissions to update the same lead rather than creating multiple records.

Beyond Copper: One Form, Multiple Destinations

Once your Copper integration works, you might want to send the same submission to other tools: a different CRM, an email marketing platform, or a help desk system.

A good connector plugin supports multiple API integrations from a single form submission. You can create a Copper lead, add the contact to HubSpot, and send an SMS via Twilio, all from one CF7 submission. For a cost comparison, see this article on Zapier vs a dedicated API plugin.

Key Takeaways

Copper separates People and Leads into distinct endpoints. Using /people instead of /leads creates the wrong record type.

Three authentication headers are required. X-PW-AccessToken, X-PW-Application (fixed value developer_api), and X-PW-UserEmail must all be present and correct.

The name field is required for lead creation. Ensure it is mapped and never empty.

The email field uses a nested structure. Use {"email": {"email": "...", "category": "work"}} rather than a flat string.

Start with a minimal payload. Hardcode the name value first. Once that works, add additional fields one at a time.

With the correct endpoint, all three authentication headers, and a properly structured payload containing the required name field, your CF7-to-Copper integration will create leads reliably.

Top comments (0)