How Do I Get WordPress Form UTM and GCLID Data onto a CRM Contact

Sales opens the new enquiry in HubSpot or Salesforce and the source is blank, or it says Direct. The name and email are there. The job is sitting in the pipeline. Nobody can see which ad, which campaign, or which click produced the form fill.

How do you take UTM parameters, a gclid, and a usable source from a WordPress form and land them on the CRM contact so a salesperson can see which click booked the job?

The form and the CRM are two different systems

Your form plugin stores what the visitor typed. Your CRM stores the person sales will ring. A Zap, a native add-on, or a CSV import copies name, email, phone, and message across. Source data is almost never in that copy, because it was never on the form submission in the first place.

UTM tags and click IDs live in the landing URL. The visitor reads a service page, then submits on /contact/. The query string is gone. The CRM integration only sees the fields you mapped. If those fields were empty, HubSpot and Salesforce have nothing to write.

This is the same gap as counting Ads conversions against named form rows. We covered that mismatch in Why Google Ads Conversions Don’t Match WordPress Form Leads. The capture side, before any CRM mapping, is in How to Track Lead Sources in WordPress Forms.

What to put on the contact

Do not try to overwrite HubSpot’s Original Source or Salesforce’s campaign influence model. Those are platform-owned. Create your own fields and treat them as the WordPress form’s account of the visit.

Create these contact (or lead) properties as single-line text.

  • Traffic source (a human label such as Google Ads or Organic Search)
  • UTM source
  • UTM medium
  • UTM campaign
  • UTM term
  • UTM content
  • Google Click ID (gclid)
  • Other click IDs you actually buy (fbclid, msclkid, li_fat_id, ttclid)
  • Landing page
  • Form page

The gclid field is the one that lets you send a later sale back to Google Ads as an offline conversion. UTM campaign is the one sales can read without decoding a click ID. You want both.

If you only create a coarse Lead Source picklist, you will lose the campaign and the click. Store the raw values in text fields.

Capture the source on the WordPress form first

Mapping cannot invent data. If the form entry has no UTMs and no gclid, the CRM contact will not grow them.

Three common ways people try this.

Hidden fields that read the current URL. These work only when the visitor lands on the form page with the tags still in the address bar. Most people browse first. The fields submit blank.

A JavaScript cookie that copies UTMs into those hidden fields. Better across pages. Still a script to maintain, and still blank for organic and direct visits that never had UTMs.

A plugin that stamps the source onto the submission through the form plugin’s own hook. The free LeadSource plugin does this. It stores UTM parameters and ad click IDs for the browser session, then attaches them when Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Formidable Forms, Fluent Forms, Elementor Pro Forms, or Everest Forms saves an entry. You do not add hidden fields for those eight plugins.

LeadSource 1.0.7 does not hook Forminator. If your enquiry form is Forminator, this plugin will not stamp that submission. Use one of the supported form plugins, or keep a hidden-field setup on Forminator and accept the gaps.

The free plugin is same-session. The source persists until the browser is closed. That is the visit that produced the enquiry, which is usually what sales means by “which click booked the job.” It is not a 90-day first-touch cookie. If someone clicked an ad last month, came back typed-in today, and submitted, same-session will show Direct (or whatever this visit actually was), not last month’s ad.

HubSpot

In HubSpot settings, create custom contact properties for the list above. Leave Original Source alone. HubSpot fills that from its own tracking code when the code is on the site. It will not reliably give you gclid, and it will not always match the WordPress form visit.

If your form plugin already talks to HubSpot (a Gravity Forms or WPForms HubSpot add-on, a HubSpot form embed, Zapier, or Make), map each stamped field to the matching property. Test with a tagged URL, browse to another page, submit, and open the contact. If UTM campaign and gclid are empty, the integration is not seeing those values on the form entry.

LeadSource writes into its own WordPress table and the form plugin hook. It does not push contacts to HubSpot by itself. Two paths that work without inventing a native integration.

  1. Export CSV from the LeadSource dashboard and import into HubSpot, matching on email. Map the CSV columns to your custom properties so you update the existing contact instead of creating a duplicate.
  2. If your form plugin’s HubSpot action can include extra entry meta, map those keys. If it cannot, use the CSV.

Do a real test. A contact created from an untagged internal submit will look like Direct. That is correct, not a broken map.

Salesforce

In Object Manager, add custom fields on Lead (and on Contact, if you convert). Text is enough for UTMs and gclid. You can also fill the standard Lead Source picklist with a coarse label for list views.

Web-to-Lead and most WordPress-to-Salesforce add-ons only send fields you map. Same rule as HubSpot. If gclid is not a mapped field, it never arrives.

LeadSource does not have a Salesforce connector. Export CSV and use Data Import Wizard or Data Loader, matching on email. Or keep using the form plugin’s Salesforce add-on or Zapier, and map only fields that actually exist on the entry.

If you later upload offline conversions to Google Ads, you still need gclid on the record. That is a separate job from showing sales the campaign name.

A generic CRM, Zapier, or a spreadsheet

The same field list applies to Pipedrive, Dynamics, a custom CRM, or a Google Sheet. Create the properties. Map them. Test a tagged visit that is not the form page.

Zapier and Make can only send what they receive. If the WordPress trigger is “new form entry” and the entry has no UTM keys, the Zap will write blanks. The LeadSource CSV is the fallback that always contains the source columns.

What the plugin does not do

It does not replace HubSpot’s tracking cookie or Salesforce campaign influence. It does not upload conversions to Google Ads. It does not hook Forminator. It does not claim multi-year first-touch in the free plugin.

The free plugin on wordpress.org stamps UTM and click IDs onto supported form submissions and lets you export them. Lead Source Pro is $99 a year if you want journeys, saved reports, and scheduled client reports. You do not need Pro to get source fields into a CRM.

Ben Harris’s book Which Click Booked the Job is on Amazon if you want the longer argument for putting the click on the person, not only in an ads dashboard.

A short checklist

  1. Create the CRM properties before you map anything.
  2. Confirm the WordPress form actually stores source on the entry (tagged URL, then a second page, then submit).
  3. Map those stored values, or import the LeadSource CSV on email.
  4. Spot-check five real leads. If sales still sees blank, the map is wrong or the capture never ran.
  5. Tell sales the field is the visit that produced the enquiry, not a lifetime first-touch score.

Once the contact carries UTM campaign and gclid, the argument moves from “where did this come from” to “is this campaign worth the spend.” That is the point of putting the click on the record.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *