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.
- Decide where you need the source: form entries, CRM, or both.
- Add hidden fields per plugin, or a site-wide snippet.
- Store the values in a cookie so they survive navigation.
- Map them into your CRM.
- 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:
| Plugin | How | Guide |
|---|---|---|
| Contact Form 7 | [hidden] tag plus a default value from the URL | CF7 UTM tracking |
| WPForms | Hidden field with a query-var smart tag | WPForms UTM tracking |
| Gravity Forms | Hidden field, dynamic population | Gravity 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
| Requirement | Per-plugin fields | UTM plugin | Trakt |
|---|---|---|---|
| Covers every form plugin | Set up each | Depends on plugin | Yes |
| UTMs from earlier pages | No | Yes | Yes |
| Forms added later | Manual | Manual fields | Automatic |
| Source in CRM | Map per form | Map per form | Synced |
| Good offers on the page | Same either way | Same either way | Same 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.

