How does UTM tracking work on WordPress?

WordPress UTM tracking means saving the utm_source, utm_medium and utm_campaign values from the landing URL and attaching them to each form submission. You can add hidden fields in every form plugin, install a UTM tracker plugin that stores the values in a cookie, or add one site-wide snippet that covers every form at once.

  1. Decide where you need the source: form entries, CRM, or both.
  2. Add hidden fields per plugin, or a site-wide snippet.
  3. Store the values in a cookie so they survive navigation.
  4. Map them into your CRM.
  5. Test each form with a tagged URL.

A tagged link lands on your WordPress page, the UTMs go into a cookie, any form plugin can use them, and the entry reaches your CRM with its source.

Option 1: hidden fields in each form plugin

Every major plugin can fill a hidden field from the URL:

PluginHowGuide
Contact Form 7[hidden] tag plus a default value from the URLCF7 UTM tracking
WPFormsHidden field with a query-var smart tagWPForms UTM tracking
Gravity FormsHidden field, dynamic populationGravity Forms UTM parameters

The catch: these read the current URL. A visitor who lands on a blog post and fills in the contact form two pages later has no UTMs in the URL any more.

Option 2: a UTM tracker plugin

UTM plugins set a cookie on arrival and fill matching hidden fields later. That fixes the navigation problem, but you still add fields to every form, and plugin support varies by form builder. Check that the plugin is maintained and supports your form plugins.

Option 3: one site-wide snippet

A snippet in the theme header (or through Google Tag Manager) can store UTMs in a first-party cookie and write them into every form on submit. It covers forms added later, by any plugin. You need to maintain the code, and respect consent.

That's the manual menu. To skip it, pre-register for Trakt and every WordPress form submission arrives with its source attached.

Testing every form

Open the site with ?utm_source=test&utm_campaign=wp-test, browse to each form, submit, and check the entry. Repeat after any plugin update.

Why WordPress UTM tracking drifts (and how Trakt helps)

New plugins arrive, landing pages get new forms, a cache plugin serves a stale page without the script. Each form becomes its own project.

How Trakt closes the gap

The Trakt WordPress integration installs one snippet that adds auto-injected hidden UTM fields to every form, whatever the plugin, and keeps the source in a first-party cookie. Trakt keeps the first touch, syncs source and revenue into your CRM, and sends new-lead alerts by email and Slack.

Options vs. Trakt, by requirement

RequirementPer-plugin fieldsUTM pluginTrakt
Covers every form pluginSet up eachDepends on pluginYes
UTMs from earlier pagesNoYesYes
Forms added laterManualManual fieldsAutomatic
Source in CRMMap per formMap per formSynced
Good offers on the pageSame either waySame either waySame either way

FAQ

What is the best UTM tracking plugin for WordPress?

The best fit stores UTMs in a cookie, supports every form plugin you use, and is actively maintained. If you run several form plugins, a site-wide approach saves setting up each one.

Does WordPress track UTM parameters by default?

No. WordPress doesn't save UTMs with form entries on its own. Analytics tools see them, but your form entries and CRM need hidden fields or a snippet.

How do I add UTM parameters to Contact Form 7?

Use a [hidden] field and fill it from the URL, or use a snippet that does it for you. Our CF7 UTM tracking guide has the steps.

Why are UTMs missing from my WordPress form entries?

Usually the visitor navigated away from the tagged landing page before submitting, or a cache plugin served a page without the script. Store UTMs in a cookie and test across pages.

Can I track UTMs in WordPress with Google Tag Manager?

Yes. GTM can store UTMs and write them into form fields, which keeps code out of the theme. You still need to test every form.

Does one snippet work with every WordPress form plugin?

A well-written one does, because it works on the page's form elements, not the plugin. Trakt's WordPress snippet works this way.

What to do first

List every form plugin on your site, then submit one form from each with ?utm_source=test. Any entry without "test" is a leak to fix.