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
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
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"]
Step 3: Check the payload structure. Your JSON should look like:
{
"name": "[your-name]",
"email": {
"email": "[your-email]",
"category": "work"
}
}
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"
}
}
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
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)