Formidable Forms UTM Tracking & Lead Source Guide

A client rings you up, thrilled: their Formidable Forms enquiry form just produced eleven leads this week. Then comes the question every agency dreads. “Which campaign produced them?” You open the entries in WordPress, and every single one tells you the lead’s name, email and message — and absolutely nothing about where they came from. Was it the Google Ads campaign? The LinkedIn push? The organic blog post you spent a fortnight writing? You genuinely cannot say.

We have lived this exact moment more times than we would like to admit. Formidable Forms is a brilliant form builder — flexible, developer-friendly, properly powerful. But out of the box it captures what the visitor types, not where the visitor came from. This guide walks through the three ways to fix that, with honest verdicts on where each one quietly fails.

TL;DR — three ways to track lead source in Formidable Forms

  • Native hidden fields — add a Hidden field per UTM and pull each value from the URL with the [get param] shortcode. Free, built in, but loses data on navigation, caching and Safari.
  • JavaScript + cookies — a script grabs the parameters into a cookie and writes them into the hidden fields. More resilient, but still client-side and breaks under strict privacy browsers.
  • Server-side captureLead Source records the attribution on the visitor’s very first request and attaches it to every submission automatically. No hidden fields to configure.

Why Formidable Forms doesn’t track lead source by default

It helps to understand that this is not a bug or an oversight — it is simply outside what a form builder is designed to do. Formidable Forms collects the fields you put on the form. If you do not add a field for campaign data, no campaign data gets stored. The plugin has no opinion about the ?utm_source=google sitting in the address bar; as far as the form is concerned, that information does not exist.

Formidable Pro does store a little entry metadata — things like the user agent and, where available, the referring page on the entry record. That is genuinely useful, but it is not campaign attribution. It will not tell you which ad group, which keyword or which UTM term produced the lead. For that, you have to capture the parameters yourself, and that is where the three methods below come in.

What “lead source” actually means

“Lead source” is shorthand for a small bundle of signals. The UTM parameters (utm_source, utm_medium, utm_campaign, utm_term, utm_content) describe the campaign. Ad click IDs like gclid identify the exact click for paid platforms. The referrer tells you which site sent the visitor, and the landing page shows where they first arrived. Finally, first touch is the campaign that introduced someone, while last touch is the one that closed the deal. Good attribution keeps both, because the journey rarely happens in a single visit.

The three methods at a glance

  • Method 1 — Native hidden fields: built into Formidable, zero extra plugins, populated from the URL via the [get param] shortcode.
  • Method 2 — JavaScript + cookies: a custom script persists the parameters in a cookie and injects them into the hidden fields, surviving multi-page journeys.
  • Method 3 — Server-side capture: the source is recorded before the page even renders and attached to the submission automatically.

Method 1 — Native hidden fields in Formidable Forms

This is the approach Formidable itself documents, and it costs nothing — the Hidden field is part of the core free plugin. The idea is to add one Hidden field for each value you want to capture, then tell that field to read its value straight from the URL. Here is the exact sequence we use.

  1. Open your form in the Formidable form builder and drag a Hidden field onto the form from the field panel.
  2. Click the field to open its settings, then go to the Advanced tab.
  3. In the Default Value box, enter the shortcode [get param=utm_source]. This tells Formidable to read the utm_source value from the page URL and store it in the field.
  4. Repeat for each parameter you care about — a separate Hidden field with [get param=utm_medium], [get param=utm_campaign], [get param=utm_term], [get param=utm_content], and one for [get param=gclid].
  5. Give each field a clear label so the data is readable in your entries and email notifications, then save the form.

When a visitor lands on a page like yoursite.com/contact/?utm_source=google&utm_medium=cpc and submits, those values land in the hidden fields and travel with the entry. For a single-page, freshly clicked ad, this works beautifully.

Works when: the visitor lands on the page with the form, the URL still carries the parameters, and they submit without navigating away. Breaks when: they browse to another page first, your page is cached, or their browser strips the parameters — all of which we cover next.

Why hidden fields lose most of your lead source data

This is the section that matters most, because hidden fields fail silently. You will not get an error. You will just get blank columns and a slow creeping doubt about whether your tracking works at all. There are four common ways the data evaporates.

Navigation loss. The [get param] shortcode reads the URL of the page the form is on. A visitor who lands on a UTM-tagged blog post, clicks through to your contact page and then submits has already left the tagged URL behind. By the time they reach the form, the parameters are gone, and your hidden fields fill with empty strings.

Page caching. Caching plugins and CDNs serve a saved copy of the page. Because the cached HTML was generated for an earlier visitor, server-rendered default values can resolve to whatever was in the URL when the cache was built — or to nothing at all. We have written at length about why UTM parameters disappear in WordPress, and caching is one of the biggest culprits.

Safari and ITP. Apple’s Intelligent Tracking Prevention and similar privacy features in modern browsers increasingly strip known tracking parameters from URLs and clamp down on client-side storage. Anything that depends on the parameter still being readable in the browser is exposed to this, and the share of traffic affected only grows.

Organic and direct show blank. Hidden fields can only capture what is in the URL. Organic search, direct visits and most referral traffic arrive with no UTM tags at all, so those leads record an empty source. That is often half your enquiries showing up as “unknown” — the opposite of useful attribution.

Method 2 — JavaScript + cookies

The next step up is to stop relying on the form’s URL and instead capture the parameters the moment the visitor arrives, stash them in a first-party cookie, and read them back when the form is submitted. A small script runs on the landing page, parses the query string, and saves the UTMs and click IDs. A second snippet then writes those cookie values into your Formidable hidden fields before submission.

This genuinely solves the navigation problem — the source persists across pages because it lives in the cookie, not the URL. It is the approach a lot of “UTM grabber” plugins take, and it is a real improvement over raw hidden fields. But it is still client-side code, which means it inherits client-side limitations.

Works when: JavaScript runs, cookies are allowed, and the visitor stays within their browser session. Breaks when: a browser caps or clears first-party script-set cookies (ITP again), a consent banner blocks the script until after the landing parameters are gone, or the parameter was stripped before the page loaded. It is better than Method 1, but it is fighting the same privacy tide.

Method 3 — server-side capture with Lead Source

Here is the mechanism, because the mechanism is the whole point. When a visitor makes their very first request to your site, that request reaches your server before any page renders, before any JavaScript runs, and before any browser privacy feature has a chance to interfere with client-side storage. At that exact moment the full URL — UTMs, click IDs, referrer and all — is sitting in the request. Lead Source reads it there, on the server, and writes a first-party attribution record into your WordPress database.

From then on it keeps both first touch and last touch for that visitor, and it survives the things that wreck the other methods: page navigation (the record is stored, not re-read from each URL), page caching (capture happens at the request layer, not in cached HTML) and Safari/ITP cookie limits (because the heavy lifting is server-side, not dependent on browser storage). When someone submits any Formidable Forms form, Lead Source hooks the submission save and attaches the stored source automatically — no Hidden fields to add, no [get param] shortcodes to maintain, no per-form setup.

We did not build this as a theoretical product. We are a digital ad agency, and we built Lead Source in-house to solve our own attribution problem — the exact “which campaign produced this lead?” phone call from the top of this article. If you want the broader picture beyond Formidable, our guide on tracking lead source across WordPress forms covers the same approach for other plugins.

What server-side capture still can’t fix

Honesty matters here, so the caveat gets its own heading. If a parameter is stripped from the URL before the request ever reaches your server — for example, a browser or network layer that removes fbclid in transit — then nothing server-side can recover it, because it never arrived. Server-side capture is the most resilient option available, but it is not magic. It captures everything that reaches the server; it cannot reconstruct what was deleted en route.

Capturing ad click IDs

UTMs are only half the picture for paid traffic. The ad platforms append their own click identifiers, and these are what let you reconcile leads back to spend inside each ad account. The ones worth capturing are gclid, gbraid and wbraid (Google Ads), fbclid (Meta), msclkid (Microsoft Advertising), li_fat_id (LinkedIn) and ttclid (TikTok).

With hidden fields you would need a separate Hidden field and [get param] shortcode for every one of these — and they are exactly the parameters most likely to be stripped or lost on navigation, so the failure rate is high. Lead Source captures all of them server-side on the first request alongside the UTMs. If you want to go deeper on why these IDs matter and how they map to each platform, we have a dedicated guide on tracking ad click IDs in WordPress.

Comparing the three methods

CapabilityHidden fieldsJavaScript + cookiesServer-side (Lead Source)
CostFree (core)Free / pluginFree plugin
Survives page navigationNoYesYes
Survives page cachingUnreliablePartialYes
Resists Safari/ITPNoPartialYes
Keeps first & last touchNoLimitedYes
Captures ad click IDsManual, per fieldManualAutomatic
Per-form setupRequiredRequiredNone

Which method should you use

Your situationRecommended method
One landing page, paid traffic only, quick testHidden fields — fast to set up and good enough for a single tagged page
Multi-page site, visitors browse before convertingJavaScript + cookies, or server-side
You run real ad spend and need to reconcile leads to campaignsServer-side capture with Lead Source
You need organic and direct traffic attributed tooServer-side capture — only it records sources with no UTMs
You want first-touch and last-touch for multi-visit journeysServer-side capture with Lead Source
You manage client sites and cannot babysit per-form configServer-side capture — no hidden fields to maintain

If your sales cycle spans several visits over days or weeks, it is also worth reading how multi-touch attribution and conversion windows change which method actually gives you trustworthy numbers.

Setup checklist

  • Decide which signals you need — UTMs, click IDs, referrer, landing page, first vs last touch.
  • Choose a method based on the decision matrix above, not on what is quickest to bolt on today.
  • If using hidden fields, add one Hidden field per parameter and set each Default Value with [get param=…].
  • If using server-side capture, install Lead Source — there is nothing to add to the form itself.
  • Run a test: click a UTM-tagged link, browse to another page, then submit — and confirm the source still arrives.
  • Check an organic and a direct visit too, so you know what blank really means.
  • Confirm the source data flows into your entries, notifications and any connected CRM.

Frequently asked questions

Does Formidable Forms track UTMs by default?

No. Formidable Forms stores the fields you place on a form. It does not capture UTM parameters automatically — you have to add hidden fields, run a script, or use a server-side plugin. Formidable Pro records some entry metadata such as user agent and referrer, but that is not campaign-level attribution.

How do I populate a hidden field from the URL in Formidable?

Add a Hidden field, open its Advanced settings, and put [get param=utm_source] (swapping in the parameter name you want) into the Default Value box. The field then reads that value from the page’s URL when the form is submitted. Repeat for each parameter.

Why are my hidden fields blank?

Almost always because the parameters were not in the URL of the page that held the form. The visitor navigated away from the tagged landing page first, the page was served from cache, the browser stripped the parameters, or the traffic was organic or direct and never had UTMs to begin with. Hidden fields can only read what is in the current URL.

How do I attribute organic and direct leads?

You cannot do it with UTM-only methods, because those visits carry no UTMs. Server-side capture records the referrer and landing page for every visitor, so an organic search lead shows the search engine as its source and a direct visit is logged as direct rather than an empty “unknown”.

Will this slow down my site?

Server-side capture is extremely lightweight — it reads data already present in the incoming request and writes a small record, with no extra front-end scripts for the browser to download or run. If anything it is gentler on page speed than client-side UTM scripts, which add JavaScript and can clash with consent and caching layers.

Is this GDPR-friendly, and can it feed my CRM?

Lead Source stores first-party attribution data in your own WordPress database rather than shipping it off to a third party, which keeps you in control of the data. Because the source is attached to each submission, it flows through wherever your entries go — email notifications and any connected CRM. As always, document campaign-data collection in your privacy policy and honour consent requirements for your region.

Stop guessing which campaign produced the lead

Hidden fields will get you started, and a cookie script will get you further. But if you are spending real money on ads and you need every Formidable Forms lead tied back to its source — including the organic and direct ones — server-side capture is the only approach that holds up against navigation, caching and modern browser privacy.

Install Lead Source — it is a free WordPress plugin, it captures UTMs, click IDs, referrer and landing page server-side on the first request, and it attaches the source to every Formidable Forms submission automatically. We built it to answer that dreaded client phone call, and now you can answer it too.

Comments

Leave a Reply

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