Copper CRM and WordPress: How to Track Lead Source Through to Your CRM

Copper is the CRM built for Google Workspace. It lives inside Gmail, syncs your contacts automatically, and gives sales teams a pipeline that feels native to the tools they already use every day. But if your leads come through a WordPress contact form, Copper still has the same attribution gap as every other CRM: a name, email, and phone number arrive, with no record of which campaign or channel brought that person to your site.

This guide covers exactly how to fix that — connecting your WordPress forms to Copper so that lead source, campaign, and keyword data flows into every new contact and lead automatically.

Why Copper users lose attribution data

Copper’s Gmail integration means contacts often get created automatically when a new email arrives. But the email that arrives from a WordPress contact form submission contains only what the visitor typed — it does not carry UTM parameters from the URL they clicked to reach your site.

If someone clicked a Google Ad tagged with utm_source=google&utm_medium=cpc&utm_campaign=accounting-software, visited your site, filled out a contact form, and triggered a notification email that created a Copper contact, that contact record has no UTM data attached. The traffic source is gone.

The fix is to intercept those UTM parameters before the form submits and route them into Copper alongside the standard contact fields.

Step 1: Add custom fields to Copper

Copper lets you add custom fields to People, Companies, Leads, and Opportunities records. For attribution tracking, create text fields on your Leads (or People) record type:

  • Lead Source (utm_source)
  • Lead Medium (utm_medium)
  • Lead Campaign (utm_campaign)
  • Lead Term (utm_term)
  • Lead Content (utm_content)
  • Landing Page
  • GCLID (for Google Ads offline conversions)

In Copper, go to Settings > Custom Fields, select the record type, and add each as a Text field. Note the field names exactly as you create them — you will need them when mapping data from your form integration.

Step 2: Tag your traffic with UTM parameters

Every link pointing to your site from an ad, email, or campaign should include UTM parameters. At minimum, use utm_source and utm_medium. For paid campaigns, add utm_campaign and utm_term.

For Google Ads, enable auto-tagging in your account settings (which adds the gclid parameter automatically) or use a URL suffix:

utm_source=google&utm_medium=cpc&utm_campaign={campaign}&utm_term={keyword}

For Facebook and Instagram ads, add UTM parameters in the “URL Parameters” field. For email campaigns, tag every link before sending.

Step 3: Capture UTMs in WordPress with JavaScript

When a visitor lands on your site with UTMs in the URL, JavaScript should capture and store them immediately — including in a cookie so the data persists if they navigate to another page before submitting a form.

Add this script to your WordPress site via Google Tag Manager (Custom HTML tag, All Pages trigger) or through your child theme’s functions.php:

<script>
(function() {
  function getParam(name) {
    return new URLSearchParams(window.location.search).get(name) || '';
  }
  function getCookie(name) {
    var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
    return match ? decodeURIComponent(match[2]) : '';
  }
  function setCookie(name, value, days) {
    if (!value) return;
    var expires = new Date(Date.now() + days * 864e5).toUTCString();
    document.cookie = name + '=' + encodeURIComponent(value) + '; path=/; expires=' + expires;
  }

  // Store UTMs from URL into 30-day cookies
  ['utm_source','utm_medium','utm_campaign','utm_term','utm_content','gclid'].forEach(function(p) {
    var val = getParam(p);
    if (val) setCookie(p, val, 30);
  });

  // Store first landing page
  if (!getCookie('landing_page')) {
    setCookie('landing_page', window.location.href, 30);
  }

  // Populate hidden form fields when DOM loads
  document.addEventListener('DOMContentLoaded', function() {
    var map = {
      'field_utm_source': getCookie('utm_source') || getParam('utm_source'),
      'field_utm_medium': getCookie('utm_medium') || getParam('utm_medium'),
      'field_utm_campaign': getCookie('utm_campaign') || getParam('utm_campaign'),
      'field_utm_term': getCookie('utm_term') || getParam('utm_term'),
      'field_utm_content': getCookie('utm_content') || getParam('utm_content'),
      'field_gclid': getCookie('gclid') || getParam('gclid'),
      'field_landing_page': getCookie('landing_page') || window.location.href
    };
    Object.keys(map).forEach(function(id) {
      var el = document.getElementById(id);
      if (el && map[id]) el.value = map[id];
    });
  });
})();
</script>

Replace the field IDs (field_utm_source, etc.) with the actual IDs of the hidden fields in your WordPress form. Find these in your form plugin’s field configuration.

Step 4: Connect WordPress forms to Copper

Copper does not have a native WordPress plugin, so you need one of the following approaches to get form submissions into Copper with the UTM data attached.

Option A: Zapier (most common approach)

Zapier connects virtually every WordPress form plugin to Copper with no custom code. The flow is straightforward:

  1. Add hidden fields to your WordPress form for each UTM parameter (utm_source, utm_medium, utm_campaign, utm_term, utm_content, gclid, landing_page)
  2. In Zapier, create a Zap: Trigger = New submission in your form plugin (WPForms, Gravity Forms, Ninja Forms, etc.), Action = Create Lead or Create Person in Copper
  3. Map each hidden field value to the corresponding Copper custom field
  4. Test with a real form submission and verify the contact record in Copper shows the correct custom field values

Zapier’s Copper integration supports creating Leads, People, Companies, and Opportunities, and can also look up existing records to avoid duplicates. Use “Find or Create Lead” if you want to update an existing record when the same email submits again.

Option B: Copper API via webhook

If you want to avoid Zapier’s cost or need more control, you can send form submissions directly to the Copper REST API using a WordPress webhook. Gravity Forms and WPForms both support webhooks natively.

In your form plugin’s webhook settings, point the webhook to a small intermediary script (or a service like Pipedream or Make) that forwards the payload to https://api.copper.com/developer_api/v1/leads with your Copper API key and user email in the headers.

The Copper API endpoint for creating a lead accepts a JSON body with name, email, phone, and a custom_fields array. Each custom field entry needs the Copper field ID and the value you want to store.

Option C: Google Sheets as an intermediary

Since Copper is built for Google Workspace, a Google Sheets middle layer works well: form submissions go to a Google Sheet (via WPForms or Gravity Forms native Sheets integration), and a Zapier Zap or Google Apps Script processes each new row and creates a Copper lead. This approach gives you a backup log of every submission and makes it easy to audit attribution data.

Step 5: Track attribution through to Opportunities

Copper’s pipeline tracks People through stages to Opportunities. To maintain source attribution all the way to revenue, copy the custom attribution fields from your Lead or Person record to the Opportunity when it is created.

You can do this with a Zapier automation: when a new Opportunity is created in Copper, find the linked Person, pull their attribution custom fields, and update the Opportunity record with the same values. This means your closed-won report can show not just how much revenue you closed, but which campaign it came from.

Step 6: Report on lead source in Copper

With UTM data in custom fields, you can filter and report by source in several ways:

  • Copper’s built-in filters: In the Leads or People list view, filter by any custom field value to see all leads from a specific source or campaign.
  • Pipeline reports: Use Copper’s reporting to see how many Opportunities were created from each source, and how many reached “Closed Won” status.
  • Google Sheets reports: Export your Copper data to Sheets (Copper has a native Google Sheets integration) and build pivot tables showing conversion rate and revenue by utm_source and utm_campaign.

The Google Sheets export path is particularly useful for Copper users since it keeps everything in the Google Workspace ecosystem and makes the data easy to share with clients or stakeholders.

Google Ads offline conversions with GCLID

If you are running Google Ads, capturing the gclid parameter opens up offline conversion import — telling Google Ads which clicks actually turned into leads or customers, not just which clicks happened.

Once you have gclid stored on your Copper lead records, you can export a CSV of leads (with gclid, conversion date, and conversion value) and upload it to Google Ads under Tools > Conversions > Upload. Google matches the gclid to the original click and credits the campaign, ad group, and keyword that drove the actual lead.

This is especially powerful for service businesses where the value of a lead varies significantly by type. Uploading offline conversions with revenue values lets Google’s smart bidding optimize toward the campaigns that drive your most valuable customers, not just the most form fills.

Common mistakes to avoid

Letting Copper auto-create contacts from Gmail without UTM data. Copper’s Gmail integration creates contacts from email threads automatically. Those contacts will never have UTM data because the email arrives after the source visit. Make sure your Zapier or webhook path creates the lead FIRST, before the email auto-create adds a duplicate record with no attribution.

Storing UTMs only in URL, not cookies. If a visitor lands on a blog post with UTMs and then navigates to your contact page before submitting, the UTMs are no longer in the URL. Cookie-based capture preserves them across the full session.

Not testing with a real UTM-tagged URL. Submit a form from a URL that includes UTM parameters and verify the resulting Copper record has the correct values in each custom field. A missing Zapier field mapping or incorrect field ID is easy to miss without a real test.

What attribution looks like when it works

When everything is connected, every lead in Copper tells a complete story. A new lead arrives from a Google Ad campaign — utm_source: google, utm_medium: cpc, utm_campaign: cloud-accounting, utm_term: accounting software for small business, landing_page: /features/accounting/. The lead converts to a customer at $4,800 per year. That revenue traces back to the specific campaign and keyword that drove it.

Over time, that data shows you which campaigns produce customers (not just leads), which keywords drive your highest-value deals, and where to shift budget to improve return on ad spend. And because Copper lives in Google Workspace, the data flows naturally into the Sheets reports your team already uses.

The setup takes an afternoon. The data it produces is what makes every marketing budget decision going forward more defensible.