Category: Lead Tracking

Lead source attribution, UTM tracking, cookie-based tracking, and CRM integration guides.

  • Form Spam Is Destroying Your Conversion Rate Data

    You ran Google Ads last month. Your dashboard says you got 50 form leads at £40 each. Decent return. But what if 15 of those “leads” were spam submissions — and your real cost per lead was actually £67?

    Most businesses never find out. They look at form spam as an inbox annoyance — something to delete and move on from. But the real damage happens upstream, in your conversion data. Every spam submission that your tracking counts as a conversion inflates your numbers, lowers your apparent cost per lead, and tells your ad platforms that everything is working brilliantly. It isn’t.

    This article shows you exactly how form spam corrupts your conversion rate data, walks you through an audit of your existing numbers, and gives you a system for getting clean data that you can actually trust when making budget decisions.

    Key takeaways

    • Every spam form submission that triggers a conversion event inflates your reported conversion rate and lowers your apparent cost per lead
    • Smart Bidding algorithms treat spam conversions as real signals, creating a feedback loop that attracts more spam
    • Display and Performance Max campaigns are most vulnerable because they reach broader, less qualified audiences
    • Auditing your existing data typically reveals that your true cost per lead is significantly higher than your dashboard reports
    • Clean conversion data requires tracking the traffic source for every submission, then separating spam from real leads before feeding data back to your ad platforms

    What Counts as a “Conversion” — and Why Spam Inflates It

    How form submissions become conversion events

    When you set up conversion tracking in Google Ads, GA4, or Meta, you are typically telling the platform: “Count it as a conversion whenever someone submits a form.” The tracking pixel or event fires when the form submission succeeds — either by loading a thank-you page or triggering a JavaScript event.

    The platform has no idea what was in the form. It cannot tell the difference between a genuine enquiry from a potential customer and a gibberish submission from a bot. Both fire the same conversion event. Both get counted.

    GA4 does filter some known bot traffic automatically, using the IAB/ABC International Spiders & Bots List combined with Google’s own detection research. But this only catches the most basic automated crawlers. Sophisticated bots that mimic real browser behaviour — and human spam farms — sail straight through.

    The gap between your reported and actual conversion rate

    Suppose your site had 2,000 visitors last month and 60 form submissions. Your reported conversion rate is 3%. But if 18 of those submissions were spam, your actual conversion rate is 2.1%. That difference changes how you evaluate every channel, campaign, and keyword in your account.

    The problem compounds when different channels have different spam rates. If your Google Search campaigns attract mostly real leads but your Display campaigns are riddled with spam, the raw conversion data makes Display look competitive with Search — even though the underlying reality is completely different. More on this below.

    The Real Cost of Contaminated Conversion Data

    Your cost per lead is better than you think — or worse

    Here is an illustrative example based on common patterns we see in small business Google Ads accounts. Say you spent £1,000 on a campaign that generated 25 form submissions. Your dashboard says your cost per lead is £40. But 8 of those submissions are spam. Your actual cost per lead is £59 — a 47% increase over what the dashboard told you.

    The table below shows how different spam rates distort your cost-per-lead calculations, assuming £1,000 in ad spend and 25 total form submissions.

    Spam rateSpam submissionsReal leadsReported CPLActual CPLCPL inflation
    0%025£40£400%
    10%2–322–23£40£43–£45+8–13%
    20%520£40£50+25%
    30%7–817–18£40£56–£59+40–47%
    40%1015£40£67+67%

    At a 30% spam rate — which is not unusual for campaigns running on Display or Performance Max — your reported cost per lead understates the true figure by nearly half. Budget decisions based on the reported number are budget decisions based on fiction.

    Smart Bidding learns from spam

    This is where the damage escalates. Google’s automated bidding strategies — Target CPA, Maximise Conversions, Target ROAS — use your conversion data to decide who to show your ads to. When spam submissions get counted as conversions, the algorithm learns from them.

    If a bot from a data centre in Eastern Europe fills in your form, Google records the conversion and notes the characteristics of that session: the placement, the time of day, the audience segment, the device. Then it optimises to find more sessions like that one. The result is a feedback loop: spam triggers a conversion, the algorithm targets similar traffic, that traffic generates more spam, and the cycle repeats.

    Google does have invalid traffic detection systems that filter some fraudulent clicks and impressions. But these systems focus on click fraud — invalid clicks on your ads — not on what happens after the click. A real human from a click farm who clicks your ad and fills in your form with fake details passes every invalid traffic filter. As far as Google is concerned, that was a legitimate conversion.

    Channel comparison goes wrong

    The most dangerous consequence of spam-contaminated data is not the inflated headline numbers — it is the distorted comparison between channels. Consider this illustrative scenario:

    ChannelSpendReported leadsReported CPLSpam rateReal leadsActual CPL
    Google Search£2,00045£445%43£47
    Performance Max£1,50035£4340%21£71

    On the surface, Performance Max looks like it is matching Search — £43 CPL versus £44. A reasonable person might shift budget from Search to PMAX. But strip out the spam and the picture reverses entirely: Search delivers leads at £47 each while PMAX costs £71. Moving budget to PMAX would not just waste money. It would actively reduce the number of real leads you get.

    How to Audit Your Existing Conversion Data for Spam

    Before you fix anything going forward, you need to understand how badly spam has already contaminated your data. This four-step audit takes about an hour and can fundamentally change how you see your ad performance.

    Step 1: Export your form submissions

    Pull all form entries for the past 90 days from your WordPress form plugin. Most plugins — WPForms, Gravity Forms, Contact Form 7, Formidable — let you export entries as a CSV file. Include every field: name, email, phone, message content, submission date, and any source or UTM data if you are capturing it.

    If you are not currently capturing which traffic source brought each submission, you will need to cross-reference submission timestamps with your Google Analytics sessions. This is tedious and imprecise — which is exactly why capturing UTM parameters alongside every form submission matters so much.

    Step 2: Flag suspicious entries

    Work through your export and flag entries that match any of these patterns:

    • Gibberish names — random characters, keyboard mashing, or obviously fake names like “asdfgh” or “Test Test”
    • Disposable email domains — guerrillamail.com, tempmail.com, mailinator.com, yopmail.com, and similar throwaway services
    • Empty or single-word messages — real enquiries almost always include context about what the person needs
    • Submission clusters — multiple submissions within seconds of each other from different “people” suggest automated filling
    • Mismatched phone formats — a UK form receiving phone numbers in formats from countries you do not serve
    • Generic sales pitches — messages offering SEO services, web design, or link building are human spam, not leads
    • Identical or templated messages — the same phrasing appearing across multiple submissions with different names

    Warning: Be careful not to flag legitimate submissions that simply look unusual. A short message from someone who prefers brevity is not spam. When in doubt, keep the entry and mark it as “uncertain” rather than removing it from your numbers.

    Step 3: Calculate your true conversion rate

    Remove the flagged entries from your totals and recalculate. For each channel or campaign, work out:

    1. Clean lead count = total submissions minus flagged spam
    2. True conversion rate = clean leads ÷ total visitors (or clicks, for paid campaigns)
    3. Actual cost per lead = ad spend ÷ clean leads

    Compare these numbers side by side with your reported figures. The gap between the two is the cost of spam contamination in your data.

    Step 4: Identify your most contaminated channels

    Break your spam percentage down by traffic source. You will almost certainly find that some channels are far worse than others. In many small business accounts, the pattern looks like this:

    • Google Search: low spam rate (typically under 10%), because the searcher has specific intent
    • Google Display: high spam rate, because ads appear on third-party sites where click fraud is more common
    • Performance Max: variable but often high, because PMAX includes Display and Discover inventory
    • Facebook/Instagram: moderate spam rate, with most spam coming from broad-audience campaigns
    • Organic search: low spam rate, though you may see SEO service pitches submitted through your contact form
    • Direct traffic: variable — can be high if bots are hitting your form URL directly

    This channel-level breakdown is the most valuable output of your audit. It shows you which channels are genuinely performing and which ones just look good because of spam.

    Where Form Spam Comes From (And Why Your Defences Miss It)

    Understanding the source of spam helps explain why prevention alone does not solve the data problem.

    Bot spam vs. human spam farms

    Automated bots scan the web for forms and fill them in bulk. They are fast but relatively unsophisticated — honeypot fields and basic CAPTCHAs catch most of them. The bigger threat to your conversion data comes from human spam farms: real people, often paid pennies per submission, who click your ads and fill in your forms with fake details. These submissions look legitimate to every automated filter because they are made by actual humans using real browsers.

    Why CAPTCHAs and honeypots are not enough

    CAPTCHAs stop basic bots but do nothing against human spam. Honeypot fields are invisible to humans but advanced bots now detect and skip them. Even reCAPTCHA v3, which scores users based on behaviour, can be bypassed by services that use real human operators to solve challenges at scale.

    These tools reduce the volume of spam, which is useful. But they do not eliminate it — and even a small percentage of spam submissions that slip through will distort your conversion data over time. Prevention is necessary but not sufficient.

    The false positive problem

    There is a second, less obvious data distortion. Aggressive spam filtering does not just block spam — it blocks real customers too. If your spam filter silently discards genuine leads, your conversion rate drops below its true value. You can end up with both problems simultaneously: spam getting counted as conversions (inflating your numbers) and real leads getting blocked (deflating your numbers). The result is data you cannot trust in either direction.

    How to Get Clean Form Spam Conversion Data Going Forward

    Track the source for every single lead

    You cannot calculate per-channel spam rates if you do not know which channel brought each submission. Capturing UTM parameters, click IDs, and landing page data alongside every form entry is the foundation. Without it, you are stuck with aggregate numbers that hide the real story.

    TrueConversion automatically captures the traffic source, UTM parameters, click IDs (including GCLID), and landing page for every form submission across all major WordPress form plugins. This gives you the per-lead source data you need to separate spam from real leads by channel — without adding hidden fields or editing your forms.

    Classify submissions before they reach your conversion data

    Rather than trying to block spam at the form level (and risking false positives), a more reliable approach is to let every submission through and then classify it. Sort entries into “real lead” and “spam” categories after submission, then only count the real leads as conversions.

    You can do this manually by reviewing entries each day, but this does not scale and introduces delays. AI classification handles this automatically — examining the content, sender patterns, and source data to determine whether each submission is a genuine enquiry or spam. TrueConversion Pro includes AI classification that processes up to 5,000 submissions per month, marking real leads as conversions and flagging the rest.

    Feed clean data back to Google Ads

    This is the step that breaks the spam feedback loop. Instead of relying on your thank-you page conversion event (which counts everything), use offline conversion tracking to send only verified leads back to Google Ads.

    The process works like this: capture the GCLID (Google Click ID) with each form submission, classify submissions as real or spam, then upload only the real leads back to Google Ads as offline conversions. When Smart Bidding receives this clean data, it learns to optimise toward the traffic that generates genuine enquiries rather than the traffic that generates spam.

    This requires two things: a way to capture and store the GCLID alongside each form submission, and a way to upload verified conversions back to Google. Google now recommends enhanced conversions for leads as the preferred setup, which supplements GCLID data with hashed user information for better matching. TrueConversion Pro handles both approaches — it stores the GCLID automatically and pushes verified leads to your Google Ads account.

    Layer your defences (but understand their limits)

    Prevention still has a role — it reduces the volume of spam you need to classify and keeps your inbox cleaner. A sensible defence stack includes:

    • Honeypot fields for catching basic bots (free, zero user friction)
    • Cloudflare Turnstile or reCAPTCHA v3 for moderate bot protection (minimal friction)
    • Email domain validation for blocking disposable email addresses on higher-value forms
    • Rate limiting to prevent the same IP from submitting multiple times in quick succession

    None of these catch everything. That is why the classify-then-count approach matters more than the prevention layer. Prevention reduces volume; classification fixes your data.

    Monitor your spam rate monthly

    Set a benchmark: what percentage of your form submissions are spam, and what does that look like per channel? Track this monthly. If your spam rate spikes — especially on a particular campaign — investigate immediately, before a full month of contaminated data gets fed into Smart Bidding and distorts your optimisation.

    A sudden increase in spam often correlates with changes in your campaign settings: expanding to Display network, broadening audience targeting, or launching Performance Max without placement exclusions.

    What Clean Conversion Data Actually Looks Like

    Here is an illustrative before-and-after scenario based on common patterns in small business accounts running Google Search alongside Performance Max.

    Before: raw conversion data

    MetricGoogle SearchPerformance MaxTotal
    Ad spend£2,000£1,500£3,500
    Reported conversions453580
    Reported CPL£44£43£44

    The data says both channels are performing almost identically. A logical next step would be to shift budget toward PMAX, which appears to deliver the same cost per lead with less effort.

    After: spam-cleaned conversion data

    MetricGoogle SearchPerformance MaxTotal
    Ad spend£2,000£1,500£3,500
    Total submissions453580
    Spam removed2 (4%)14 (40%)16 (20%)
    Real leads432164
    Actual CPL£47£71£55

    The picture reverses entirely. Search is delivering leads at £47 each. PMAX costs £71 — over 50% more expensive once spam is removed. The business that was about to increase its PMAX budget would have been throwing money at a channel that, after accounting for spam, was significantly underperforming.

    This is not an edge case. It is what happens when conversion data includes spam and nobody checks.

    Frequently Asked Questions

    Does form spam actually affect Google Ads performance?

    Yes. When spam submissions get counted as conversions, Google’s automated bidding strategies (Target CPA, Maximise Conversions) learn from those signals and optimise toward the traffic sources that generate spam rather than real leads. This creates a feedback loop that worsens over time.

    How do I calculate my real conversion rate without spam?

    Export your form submissions, flag entries that match common spam patterns (gibberish names, disposable emails, empty messages, submission clusters), remove them from your totals, and recalculate. Your true conversion rate equals clean leads divided by total visitors or clicks.

    What percentage of form submissions are typically spam?

    It varies widely by channel and industry. Google Search campaigns might see under 10% spam, while Display and Performance Max campaigns can see 30–50% or more. The only way to know your specific spam rate is to audit your submissions by channel.

    Isn’t Google supposed to filter out invalid traffic?

    Google’s invalid traffic detection focuses on fraudulent clicks — people or bots clicking your ads without genuine interest. It does not evaluate what happens after the click. A human from a click farm who clicks your ad and fills in your form with fake details passes Google’s invalid traffic filters because the click itself was “valid.” The form submission is the problem, and that is your responsibility to catch.

    Can I use offline conversion tracking to fix this?

    Yes, and this is the most effective long-term solution. By capturing the GCLID with each form submission, classifying submissions as real or spam, and uploading only verified leads back to Google Ads as offline conversions, you give Smart Bidding clean data to learn from. This breaks the spam feedback loop and improves your campaign optimisation over time.


    Remember the numbers from the top of this article — £40 per lead versus £67? That gap is not hypothetical. It is what happens when 30% of your form submissions are spam and nobody separates the real leads from the noise. The dashboard looks fine. The budget decisions feel justified. But the data underneath is fiction, and every pound you allocate based on it is a pound allocated on false premises.

    Fixing this is not complicated. It starts with capturing the traffic source for every form submission so you can see which channels are genuinely performing and which ones are just generating spam. From there, classify each entry as a real lead or junk, and feed only the clean data back to your ad platforms.

    See your true conversion numbers

    TrueConversion captures traffic source, UTM parameters, click IDs, and landing page data for every form submission across 10+ WordPress form plugins. Pro includes AI classification that automatically identifies real leads, marks them as conversions, and pushes them to your Google Ads account — so Smart Bidding learns from clean data, not spam.

  • Why UTM Tracking Breaks on Mobile (And How To Fix It)

    You spent $2,000 on Facebook ads last month. Your form captured 40 leads. You open your tracking spreadsheet and find that UTM source is blank on 15 of them. You dig into the submission timestamps, cross-reference with your ad platform data, and spot the pattern: all 15 were mobile submissions.

    This is not a tagging error. Your UTM parameters were correct when the user clicked the ad. The tracking script was present on your landing page. The hidden fields existed in your form. Everything was configured properly — and the data still vanished.

    Mobile browsers introduce a set of technical failures that desktop browsers simply do not have. In-app browsers isolate cookies. Safari enforces aggressive cookie expiration. Back/forward navigation skips your scripts entirely. These are not edge cases — they affect a substantial portion of mobile traffic, which now accounts for the majority of web browsing worldwide.

    This article covers seven specific failure modes that cause UTM tracking to break on mobile devices, why each one happens at a technical level, and how to fix or work around every single one. If you are losing lead source data on mobile form submissions, at least one of these is responsible.

    TL;DR

    Mobile UTM tracking breaks because of in-app browser cookie isolation, Safari ITP cookie limits, back/forward cache skipping scripts, form submission timing issues, redirect chains stripping parameters, privacy browsers removing tracking data, and form plugin rendering bugs. The permanent fix is server-side cookie reading, which TrueConversion handles automatically for every WordPress form submission.

    How Mobile UTM Tracking Fails Differently

    To understand why mobile breaks UTM tracking, you need to understand the chain of events that must complete successfully for a form submission to include source data. Every link in this chain has a mobile-specific vulnerability that desktop browsers do not share.

    The chain works like this. A visitor clicks your ad, which appends UTM parameters (or a click ID like gclid) to your landing page URL. JavaScript reads those parameters and stores them in a first-party cookie. On the form page, JavaScript reads the cookie and populates hidden fields. The visitor submits the form, and the hidden field values are sent with the form data.

    On desktop, this chain is reliable. The browser is a single, persistent application. Cookies set by JavaScript persist according to their expiration settings. Scripts execute predictably before form submission. Redirects generally preserve query strings.

    On mobile, every link in that chain can fail independently. The browser might be an embedded in-app view with isolated cookies. The operating system might enforce cookie expiration limits. Navigation might restore a cached page without re-executing your scripts. Each of these failures is silent — no error in the console, no broken page, just empty hidden fields and missing attribution data.

    If your hidden fields are not capturing UTM parameters, the cause is almost certainly one of the seven failures described below. For a broader overview of how attribution works with WordPress forms, see our guide to lead source tracking for WordPress forms.

    The 3 Most Common Mobile Failures

    These three failure modes account for the majority of lost mobile UTM data. If you are troubleshooting missing attribution on mobile form submissions, start here.

    1. In-App Browsers Create Isolated Cookie Jars

    When someone taps an ad or link inside Facebook, Instagram, LinkedIn, TikTok, or Twitter, the link does not open in Safari or Chrome. It opens in an embedded browser built into the app. On iOS, this is a WKWebView. On Android, it is either a Custom Tab or a WebView, depending on the app and Android version.

    These embedded browsers have their own cookie storage that is completely separate from the device’s default browser. A cookie set inside Facebook’s in-app browser does not exist in Safari. A cookie set inside LinkedIn’s in-app browser does not exist in Chrome. They are isolated environments with no shared state.

    Here is why this matters. A user clicks your Facebook ad. Your landing page JavaScript reads the UTM parameters and sets a cookie. The user browses but does not fill out the form. Two days later, they open Safari, navigate to your contact page, and submit the form. Your JavaScript checks for the UTM cookie — it does not exist. The form submits with empty attribution fields.

    A common misconception is that server-side cookies bypass this problem. They do not. The Set-Cookie header is also stored in the in-app browser’s isolated cookie jar. The isolation applies to all cookies, regardless of how they were set. The real advantage of server-side processing is capturing the UTM data into your database on the very first page load, before the user ever leaves the in-app browser.

    The fix is twofold. First, keep your conversion path short — encourage form completion before the user leaves the in-app browser. Second, use server-side parameter capture that writes to your database on the initial page load, preserving data even if the cookie disappears when the user switches browsers.

    If you are seeing click IDs like gclid vanish between pages, the in-app browser is likely the cause. See our detailed breakdown of why gclid disappears between pages for additional fixes.

    2. Safari ITP Limits Cookie Lifetime

    Apple’s Intelligent Tracking Prevention (ITP) in Safari enforces strict limits on cookie lifetimes. If your tracking cookie is set by client-side JavaScript — which is how nearly every WordPress UTM tracking plugin works — that cookie is capped at seven days. After seven days, Safari deletes it automatically, regardless of the expiration value you set in your code.

    It gets worse. If the user arrived from a domain Safari classifies as a tracker, and the URL contains link decoration (gclid, fbclid, and other parameters Safari classifies as link decoration), that cap drops to 24 hours. A user who clicks your Google ad on Saturday and returns on Monday may already have no tracking cookie.

    An important distinction: these caps apply to cookies set by client-side JavaScript using document.cookie. Cookies set by the server via the Set-Cookie HTTP header are not subject to the seven-day cap. If your hosting environment allows you to set first-party cookies from your server, those cookies persist for their full specified lifetime.

    The scale of this problem is substantial. Safari accounts for approximately 27% of mobile browser usage globally as of early 2026, and over 50% in the US, UK, and Australia (StatCounter data; figures are approximate and vary by month). If you target English-speaking markets, Safari is likely the primary mobile browser for a large share of your audience.

    The practical fixes: shorten your conversion window (session-based or one-day expiration stays within ITP limits), use server-set cookies where your hosting supports it, and capture UTM data into your database on the first page load. For more on how click IDs like wbraid and gbraid were designed to work around these restrictions, see our guide to Google’s wbraid and gbraid click IDs.

    3. Redirects and URL Shorteners Strip Parameters

    Every HTTP redirect is an opportunity for your UTM parameters to be dropped. On desktop, most sites have a single canonical URL and minimal redirects. On mobile, the redirect chain is often longer and more complex, introducing more points of failure.

    Mobile-specific redirects include HTTP to HTTPS, www to non-www, trailing slash normalisation, mobile subdomain redirects (e.g., m.example.com), and AMP cache pages served from Google’s domain. Each redirect must explicitly preserve query string parameters. If any single redirect drops them — the default behaviour for many server configurations — your UTM data is gone before your tracking script runs.

    URL shorteners compound this problem. Social media posts frequently use link-in-bio tools, bit.ly links, or platform-specific shorteners. These services perform their own redirects, and not all of them forward query parameters reliably. If your tracked URL passes through two or three shorteners before reaching your landing page, the odds of your UTM parameters surviving the full chain decrease with each hop.

    The fix requires an audit. Open your browser’s developer tools (Network tab), navigate to your tracked URL, and confirm that each 301 or 302 response includes the full query string in the Location header. Avoid URL shorteners for any link carrying UTM parameters. If you must use one, test it by appending ?utm_source=test and verifying the parameter arrives at the final destination.

    TrueConversion captures UTM parameters and click IDs server-side for every WordPress form submission — surviving in-app browsers, Safari ITP, and redirect chains. No hidden fields required. Works with Contact Form 7, WPForms, Gravity Forms, and 7 more form plugins.

    Download TrueConversion free

    4 More Technical Failures That Cost You Data

    The three failures above account for most lost mobile UTM data, but they are not the only causes. These four additional failure modes are more technical and harder to diagnose, but each one can silently strip attribution from your form submissions.

    4. Back/Forward Cache Skips Your Tracking Script

    Mobile browsers use back/forward cache (bfcache) to make navigation instant. When a user taps back or forward, the browser restores a frozen snapshot of the page — including the DOM, JavaScript state, and rendered content — without reloading from the server.

    Your DOMContentLoaded and load event handlers do not re-fire on bfcache restoration. If your UTM tracking script relies on these events, it does not run and hidden fields remain empty. A significant share of mobile navigations use bfcache (the exact proportion varies), making this a meaningful source of data loss.

    The fix is to listen for the pageshow event and check the event.persisted property, which is true when the page was restored from bfcache:

    window.addEventListener('pageshow', function(event) {
      if (event.persisted) {
        // Page was restored from bfcache — re-populate hidden fields
        populateUTMFields();
      }
    });
    

    Important nuance: if the user navigated away and came back, the URL may no longer contain UTMs. Your pageshow handler should read from the stored cookie, not the URL. If the cookie is also missing, the data is unrecoverable client-side. Server-side tracking that captures data on initial page load avoids this dependency.

    5. Form Submission Fires Before JavaScript Populates Hidden Fields

    On desktop, JavaScript execution is nearly instantaneous — your tracking script populates hidden fields in milliseconds, well before the user finishes the form. On a mobile device with a slow 3G or unstable 4G connection, the timing is entirely different.

    WordPress performance plugins make this worse. WP Rocket, LiteSpeed Cache, and Flying Scripts offer “delay JavaScript execution” features that prevent scripts from running until user interaction. If your UTM tracking script is in this delayed group, it has not fired by the time the user taps Submit. The hidden fields are empty because your own optimisation plugin held back the script that populates them.

    This is a race condition between script execution and form submission. Mobile makes it worse because connections are slower, CPUs are less powerful, and performance plugins are more aggressive about deferring scripts.

    The fix: exclude your UTM tracking script from JavaScript delay settings. In WP Rocket, add the script handle to “Excluded JavaScript Files.” In LiteSpeed Cache, add it to “JS Excludes.” Alternatively, server-side cookie reading eliminates this race condition entirely — PHP reads the cookie at submission time with no form-page JavaScript dependency. For more, see our article on AJAX forms and Google Ads tracking.

    6. Privacy Browsers and Ad Blockers Strip Tracking Parameters

    A growing number of mobile users browse with privacy-focused tools that interfere with UTM tracking. Brave browser removes known tracking parameters (gclid, fbclid, utm_source, utm_medium, utm_campaign) from URLs by default before the page loads. Your tracking script never sees them.

    Firefox Enhanced Tracking Protection blocks certain tracking scripts and cookies based on its disconnect.me-derived block list. While it does not strip URL parameters in the same way as Brave, it can block the cookies your tracking script sets, producing the same end result: empty attribution data on form submission.

    On iOS specifically, content blockers like 1Blocker, AdGuard, and Wipr can strip URL parameters, block tracking cookies, or prevent tracking scripts from loading. These content blockers run at the system level via Safari’s Content Blocker API, meaning they affect all Safari browsing — not just specific apps.

    There is no complete fix. If parameters are stripped from the URL before your page loads, no client-side script can recover them. Server-side tracking offers a partial solution: if your server processes the request before client-side stripping occurs, it can capture the data first. Realistically, accept that a percentage of privacy-conscious users will not be trackable and factor that into your attribution modelling.

    If you are seeing blank UTM fields on mobile and these technical fixes feel like whack-a-mole, TrueConversion handles all of this server-side — no hidden fields, no JavaScript timing dependencies.

    7. WordPress Form Plugin Mobile Rendering Bugs

    Form plugins occasionally introduce mobile-specific bugs that silently clear your hidden field values. This is the hardest failure to diagnose because it is not a browser limitation or an architectural flaw — it is a bug in third-party software that manifests only on mobile devices.

    The pattern: your tracking script populates hidden fields on page load. The form plugin detects a mobile viewport and re-renders the form for responsive layout or conditional logic. During re-render, hidden fields are replaced with fresh DOM elements carrying empty defaults. Gravity Forms community threads have documented this exact behaviour — hidden fields showing correct values but submitting empty data on mobile.

    The fix requires Chrome remote debugging. Connect your phone via USB, open chrome://inspect on your desktop, and check hidden field values at two points: after page load (they should be populated) and before form submission (if empty, the plugin re-rendered them). Enable AJAX submission mode, which often prevents the re-render. Or bypass hidden fields entirely with server-side cookie reading. See how TrueConversion works for details.

    How to Test UTM Tracking on Mobile

    Desktop browser emulators do not replicate in-app browser cookie isolation, Safari ITP, or bfcache timing. You need actual devices. Here is a five-device protocol covering the most common mobile failure modes.

    1. iOS Safari — Test ITP cookie expiration. Set a UTM cookie via JavaScript, wait 24 hours, then check whether the cookie still exists. This confirms whether your cookies are being capped. Navigate to a classified tracker domain first (e.g., click through from a Facebook ad) to trigger the 24-hour cap specifically.
    2. iOS Chrome — Test cross-browser cookie access. Set a cookie in Safari, then open the same page in Chrome. The cookie should not exist, confirming that cookies are browser-specific on iOS. This simulates the user who clicks an ad in one browser and returns in another.
    3. Android Chrome — Baseline mobile test. Verify that your tracking script loads, reads parameters, sets cookies, and populates hidden fields correctly on the most common mobile browser. Test with both fast Wi-Fi and throttled 3G (use Chrome DevTools network throttling).
    4. Facebook in-app browser — Test cookie isolation. Post a tracked link in a Facebook post or message, tap it on your phone, verify the UTM cookie is set, then open the same URL in Safari or Chrome. The cookie should be absent, confirming in-app browser isolation. Fill out the form in both contexts and compare the submitted data.
    5. LinkedIn in-app browser — Test redirect chain parameter preservation. LinkedIn’s in-app browser sometimes handles redirects differently from Facebook’s. Post a tracked link that goes through at least one redirect (e.g., HTTP to HTTPS), tap it, and verify the UTM parameters survive to the final page.

    For all five tests, use Chrome remote debugging to inspect the actual DOM. Connect your phone via USB, open chrome://inspect on desktop Chrome, and select the target page. In the Elements panel, search for your hidden fields and verify their values. In the Console, run document.cookie to check whether your tracking cookie exists. Do this both after landing page load and immediately before form submission.

    If you want to test whether your landing pages are correctly passing UTM data through to form submissions, see our guide on tracking which landing page each lead came from for a broader testing methodology.

    The Server-Side Fix That Survives All 7 Failure Modes

    Every failure mode in this article shares a common root cause: dependence on client-side JavaScript executing correctly at the right time. Hidden fields require JavaScript to read the cookie, populate the field, and the form plugin to preserve that value through submission. On mobile, each requirement introduces a point of failure.

    Server-side cookie reading takes a different approach. A lightweight JavaScript snippet on the landing page sets a first-party cookie containing UTM parameters and click IDs. When the visitor submits a form, PHP reads the cookie from the HTTP request headers and attaches the attribution data to the entry. No hidden fields. No JavaScript on the form page. No race conditions.

    This approach eliminates failures 4, 5, and 7 entirely. Bfcache cannot affect it because there is no form-page JavaScript to skip. Submission timing cannot affect it because PHP reads the cookie at submission time, not before. Form plugin re-rendering cannot affect it because there are no hidden fields to overwrite.

    For failures 1, 2, 3, and 6, server-side reading reduces the impact. The initial cookie still needs to be set on the landing page. But once it exists, the form-page side is bulletproof — no second JavaScript dependency that can fail.

    TrueConversion implements this architecture for WordPress. It works with 10 form plugins (Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Formidable Forms, Fluent Forms, Elementor Pro Forms, Forminator, Jetpack Forms, plus a shortcode fallback). It captures all five UTM parameters plus gclid, fbclid, wbraid, gbraid, and msclkid. The free tier includes full tracking with no attribution feature restrictions.

    The table below compares hidden field tracking and server-side cookie reading across all seven mobile failure modes:

    Failure ModeHidden FieldsServer-Side Cookie Reading
    In-app browser cookie isolationCookie lost when user switches to main browser. Hidden fields empty on return visit.Cookie still isolated, but data captured to database on first hit. No form-page JS dependency.
    Safari ITP cookie expirationJS cookie capped at 7 days (or 24 hours with link decoration). Hidden fields empty if cookie expired.Only needs landing-page JS. Server-set cookies bypass the 7-day JS cap.
    Redirects stripping parametersParameters lost before JS can read them. Hidden fields never populated.Same initial vulnerability. Server can capture params before redirect if architecture allows.
    Back/forward cacheDOMContentLoaded does not re-fire. Hidden fields empty unless pageshow handler added.Reads existing cookie at submission time. No form-page event dependency.
    Form submission timingJS may not execute before user taps Submit. Race condition on slow connections.PHP reads cookie during form processing. No race condition possible.
    Privacy browsers stripping paramsParameters removed from URL before JS runs. No data to capture.Both affected for initial capture. Server processing may capture data before some client-side stripping occurs.
    Form plugin re-renderingRe-render overwrites populated hidden fields with empty defaults.No hidden fields to overwrite. Cookie read happens server-side.

    For pricing details, see the TrueConversion pricing page. For a complete technical overview, read our guide to lead source tracking with WordPress forms.

    FAQ

    Why do UTM parameters work on desktop but not mobile?

    Desktop browsers provide a stable environment where cookies persist reliably and JavaScript executes before form submission. Mobile introduces in-app browser cookie isolation, Safari ITP cookie caps, back/forward cache that skips script execution, slower connections creating race conditions, and privacy tools that strip tracking parameters. The tracking logic is identical — mobile simply has more ways for it to fail silently.

    Does Safari block UTM parameters?

    Safari does not block UTM parameters from appearing in the URL. The parameters arrive on your page intact. What ITP does is limit how long JavaScript-set cookies persist — seven days normally, or 24 hours when the referring domain is classified as a tracker. The parameters are not blocked; it is the cookies that store them which expire prematurely.

    Do Facebook ads lose UTM data on mobile?

    Yes, frequently. Facebook opens ad links in its in-app browser, which has cookie storage isolated from Safari and Chrome. If the user does not fill out your form during that session, the UTM cookie is lost when they return in their main browser. Server-side tracking that captures data to your database on the first page load is the most reliable mitigation.

    How do I test if hidden fields are populated on a mobile device?

    Use Chrome remote debugging. Connect your phone via USB, open chrome://inspect on desktop, and select the page on your device. Search for hidden input fields by name (e.g., utm_source) and check their value attribute at two points: after page load and immediately before tapping Submit.

    Can I still import offline conversions if mobile UTMs are missing?

    Yes, but your match rate will be lower. Offline conversion imports rely on matching submissions to ad clicks using a click ID. If the click ID is missing, that submission cannot be matched, reducing the data available to Smart Bidding algorithms. For guidance, see our articles on offline conversion tracking without a CRM, enhanced conversions for leads in WordPress, and optimising Smart Bidding for real sales.

    Fix Mobile UTM Tracking in 2 Minutes

    TrueConversion captures UTM data server-side, surviving in-app browsers, Safari ITP, and every other mobile tracking failure covered in this article. It works with 10 WordPress form plugins, tracks all major click IDs, and the free tier includes full attribution tracking with no feature limits.

    Download TrueConversion free

  • How To Track Which Landing Page Each Lead Came From

    You run three landing pages for your business — one for each service. Last month you got 47 leads through your WordPress forms. Which page produced the ones that actually became customers?

    You open Google Analytics and see that /services/repairs got 1,200 sessions and /services/installations got 800. The bounce rates look reasonable and the average session duration is healthy. But your inbox has 47 form submissions with nothing more than a name, email, phone number, and message. There is no indication of which page the visitor originally landed on before they filled out your form.

    This is the gap that catches most small business owners off guard. Google Analytics shows aggregate traffic patterns — sessions per page, bounce rates, channel breakdowns. What it cannot do is attach a specific lead to a specific landing page. You know 47 people submitted forms and three pages received traffic, but you cannot draw a line between the two. The result is you keep spending money on all three pages — or worse, you cut the wrong one based on traffic volume alone.

    This guide shows you two methods to solve the problem. Method 1 uses a plugin and takes about two minutes. Method 2 is a manual implementation with hidden fields and JavaScript that takes roughly 30 minutes. Both capture the exact landing page URL with every WordPress form submission so you can finally see which pages are pulling their weight.

    TL;DR

    WordPress forms only capture what visitors type. To see which landing page each lead arrived on, you need to store the entry URL in a cookie on first page load and attach it to the form submission. You can do this automatically with a plugin like TrueConversion or manually by adding hidden fields and a small JavaScript snippet to your site.


    Why You Cannot See Which Landing Page Sent Each Lead

    No tool in your default WordPress stack is designed to record this. Google Analytics tracks pages. Form plugins track submissions. Neither connects the two at the individual lead level.

    What Google Analytics Shows (And What It Does Not)

    Google Analytics 4 gives you a Landing Page report under the Engagement section. This report shows the first page visitors see when they arrive on your site, along with metrics like sessions, engaged sessions, engagement rate, and conversions. If you have set up a form submission event, you can even see the conversion rate per landing page.

    What you get is an aggregate view. You can see that /services/repairs had a 3.2% conversion rate from 1,200 sessions, meaning roughly 38 conversions. But you cannot click into that number and see a list of the 38 people who converted, their names, or what they wrote in your form. GA4 deals in anonymised, aggregated behavioural data — not individual lead records.

    When you follow up with a lead and they become a customer, you need to trace that revenue back to a specific landing page. Aggregate conversion rates cannot tell you whether the leads from /services/repairs were worth more than those from /services/installations. For that, you need per-lead data.

    Landing Page vs Traffic Source vs Conversion Page

    These three terms get conflated constantly, so let us define them clearly.

    Landing page is the URL of the first page a visitor sees in a session. If someone clicks a Google Ad pointing to /services/repairs, that remains the landing page even after they navigate to /about, /pricing, and /contact.

    Traffic source is the channel, medium, campaign, or platform that sent the visitor — what UTM parameters capture (utm_source=google, utm_medium=cpc). The traffic source tells you where the visitor came from. The landing page tells you where they arrived.

    Conversion page is the URL where the form was submitted. If your contact form lives on /contact, the conversion page is /contact regardless of where the visitor first landed. Many form plugins record this natively, which causes confusion — people assume it is the landing page when it is just the page the form sits on.

    For proper attribution, you want all three. Together, they tell you which entry point is working, which campaign drove the visit, and which form converted the lead.

    Why WordPress Forms Do Not Capture This By Default

    Form plugins like WPForms, Contact Form 7, and Gravity Forms collect what visitors type plus some metadata — timestamp, IP address, and the URL of the page containing the form. But the landing page URL is not metadata a form plugin can access. By the time the visitor reaches the form, the original entry URL exists only in the browser’s session history.

    This is a fundamental architectural gap. The information lives in the browser. The form submission is processed on the server. Without a bridge between the two — typically a cookie or hidden field populated by JavaScript — the data is lost.


    How Landing Page Tracking Works

    Every reliable method for capturing landing page data uses the same fundamental approach: store the URL early, retrieve it later. The specifics vary, but the pattern is consistent.

    The Cookie Method

    On the first page load in a session, a small JavaScript snippet reads window.location.href and stores it in a first-party cookie. On subsequent page loads, the script checks whether the cookie already exists. If it does, the script does nothing. This is critical: the cookie must not be overwritten on subsequent pages, or you record the most recent page rather than the first one.

    When the visitor submits a form, the landing page URL is read from the cookie and attached to the submission — either via a hidden form field that JavaScript populates, or via a server-side cookie read.

    The cookie method is lightweight and reliable. It works across page loads, survives navigation through your site, and requires no server-side session management. The only question is how long the cookie should last.

    Conversion Windows

    The conversion window determines how long the landing page cookie persists. There are three common options.

    A session cookie is deleted when the browser closes — the most conservative option. A 1-day cookie persists for 24 hours, covering visitors who leave and return the same day. A 7-day cookie covers visitors with longer consideration cycles who might visit multiple times before submitting a form.

    There is an important caveat for Safari users. Apple’s Intelligent Tracking Prevention (ITP) limits client-side JavaScript cookies to a maximum of 7 days. If the referring domain is classified as a tracker and the URL contains link decoration (query parameters like gclid or fbclid) — which is the case for most ad clicks — that limit drops to 24 hours. According to StatCounter, Safari holds roughly 16% of the global browser market as of early 2026, so this affects a meaningful share of visitors. For most businesses, a session cookie is sufficient and avoids ITP complications entirely.

    For a deeper look at how click IDs like gclid can disappear between pages, see our guide on fixing gclid loss between pages in WordPress.


    Method 1 — Capture Landing Page Data Automatically (Recommended)

    If you want landing page tracking working today without writing any code, TrueConversion handles the entire process automatically. It captures the landing page URL, conversion page URL, traffic source, UTM parameters, and ad platform click IDs (gclid, fbclid, wbraid, gbraid, msclkid) for every form submission on your site.

    The plugin stores the entry URL and any UTM or click ID parameters in a first-party cookie on first page load. When a visitor submits a form, TrueConversion reads the cookie and attaches the data to the submission record — no hidden fields to configure, no JavaScript to write, and no cache exclusion rules to set up.

    TrueConversion works with 10 form plugins out of the box:

    1. Contact Form 7
    2. WPForms
    3. Gravity Forms
    4. Ninja Forms
    5. Formidable Forms
    6. Fluent Forms
    7. Elementor Pro Forms
    8. Forminator
    9. Jetpack Forms
    10. Any form via the [utm_tracker_fields] shortcode

    Here is what a tracked entry looks like in the TrueConversion dashboard:

    FieldExample Value
    NameSarah Mitchell
    Emailsarah@example.com
    Landing Page/services/repairs?utm_source=google&utm_medium=cpc
    Conversion Page/contact
    Traffic SourceGoogle Ads (CPC)
    UTM Sourcegoogle
    UTM Mediumcpc
    UTM Campaignspring_repairs_2026
    GCLIDEAIaIQobChMI…
    Submission Date2026-02-28 14:32:07

    Every submission is stored with the full attribution trail. You can filter, sort, and export entries as CSV from the WordPress dashboard. No data leaves your server.

    If you just want this working today, install TrueConversion and you are done. The free plan supports all tracking features and all 10 form integrations. Method 2 below is for teams who prefer a manual implementation.

    To learn more about how the plugin works under the hood, see the How It Works page.


    Method 2 — Add Hidden Fields Manually

    If you prefer a manual implementation, you need three components: a JavaScript snippet to store the landing page URL in a cookie, a hidden form field to hold the value, and a second script to populate the field from the cookie before submission.

    Before we start, a common mistake: most form plugins have a built-in “Page URL” or “Embed URL” feature. This captures the conversion page, not the landing page. If your form lives on /contact and the visitor landed on /services/repairs, the native feature gives you /contact. Useful, but not what we are capturing here.

    The JavaScript Snippet

    Add the following script to your site via your theme’s functions.php, a plugin like Code Snippets, or a custom JavaScript file.

    // Landing Page Cookie — runs on every page load
    (function() {
      // Check if the landing page cookie already exists
      if (document.cookie.indexOf('tc_landing_page=') === -1) {
        // Cookie does not exist — this is the first page of the session
        var landingPage = window.location.href;
    
        // Set as a session cookie (no expires = deleted on browser close)
        document.cookie = 'tc_landing_page=' + encodeURIComponent(landingPage) + '; path=/; SameSite=Lax';
      }
    })();

    The indexOf check ensures that if the cookie already exists from an earlier page, the value is preserved. This keeps the first page recorded rather than the current page. For a longer conversion window, add an expires value: use 86400000 milliseconds for 1 day or 604800000 for 7 days.

    Adding the Hidden Field

    Add a hidden field to your form with a consistent name so JavaScript can target it. The process varies by plugin.

    WPForms (detailed walkthrough):

    1. Open your form in the WPForms builder.
    2. Drag a Hidden Field from the Fancy Fields section into your form. (Note: Hidden Field requires a paid WPForms licence — it is not available in WPForms Lite.)
    3. Click the hidden field to open its settings.
    4. Set the Label to Landing Page.
    5. Leave the Default Value empty — JavaScript will populate it.
    6. Note the field’s CSS class or ID. WPForms generates an ID like wpforms-{form_id}-field_{field_id}. You will need this for the JavaScript in the next step.
    7. Save the form.

    Contact Form 7: Add [hidden landing-page id:landing-page ""] to your form template. CF7 supports hidden fields natively.

    Gravity Forms: Add a Hidden field from the Standard Fields section. Set the field label to “Landing Page” and leave the default value blank. Note the field ID number shown in the form editor.

    Ninja Forms: Add a Hidden field from the Layout & Display section. Set the label to “Landing Page” and assign a key like landing_page.

    Populating the Hidden Field from the Cookie

    The final piece reads the cookie and writes the value into your hidden field. This must run after both the cookie-setting script and the form have loaded.

    // Populate hidden field with landing page URL from cookie
    document.addEventListener('DOMContentLoaded', function() {
      // Read the tc_landing_page cookie
      var cookies = document.cookie.split(';');
      var landingPage = '';
    
      for (var i = 0; i < cookies.length; i++) {
        var cookie = cookies[i].trim();
        if (cookie.indexOf('tc_landing_page=') === 0) {
          landingPage = decodeURIComponent(cookie.substring('tc_landing_page='.length));
          break;
        }
      }
    
      if (!landingPage) return;
    
      // WPForms: target by input name containing "landing-page" or by field ID
      var hiddenFields = document.querySelectorAll(
        'input[type="hidden"][name*="landing"], input[id*="landing-page"]'
      );
    
      hiddenFields.forEach(function(field) {
        field.value = landingPage;
      });
    
      // Contact Form 7: target by ID
      var cf7Field = document.getElementById('landing-page');
      if (cf7Field) {
        cf7Field.value = landingPage;
      }
    });

    Adjust the selectors to match the field IDs and names your form plugin generates. Inspect the rendered HTML to find the correct attributes.

    Testing Your Setup

    Test the entire flow end to end. A partial test will miss the most common failure modes.

    1. Open an incognito/private browser window. This ensures no existing cookies interfere with the test.
    2. Navigate to Page A with UTM parameters. For example: https://yoursite.com/services/repairs?utm_source=test&utm_medium=manual. This simulates a visitor arriving from a campaign.
    3. Navigate to your form on Page B. Click through your site naturally to reach /contact or wherever your form lives. Do not go directly — you need to confirm the cookie persists across pages.
    4. Submit the form and verify. Check the submission in your form plugin’s entries. The hidden field should contain the full URL from Page A — including the UTM parameters — not the URL of Page B where the form was submitted.

    If the hidden field shows Page B instead of Page A, the cookie is being overwritten on each page load — check the indexOf logic. If the field is empty, the population script is not running or the CSS selector does not match your hidden field.

    Important: Hidden fields depend on JavaScript executing before the form submits. Caching plugins, JavaScript delay/defer settings, and cookie consent banners can all prevent the population script from running in time. If your values are intermittently blank, caching is the most likely culprit. See our guide on why hidden fields fail to capture UTM parameters for detailed troubleshooting steps.


    Common Reasons Landing Page Tracking Breaks

    Even a correct implementation can fail under specific conditions. These are the issues we see most frequently.

    Caching Plugins Serve Stale Forms

    Page caching plugins like WP Rocket, W3 Total Cache, and LiteSpeed Cache serve pre-built HTML for faster load times. The JavaScript that populates hidden fields may be deferred or combined in a way that changes its execution order, leaving fields blank. The most reliable fix is to ensure your population script runs as an inline script rather than a deferred external file. For a full breakdown, see our guide on hidden fields not capturing UTM parameters.

    AJAX Forms Replace the DOM After Load

    AJAX submission itself is not the problem — the issue arises when the form plugin replaces DOM elements after the initial page load. If the form HTML is rebuilt dynamically, any values JavaScript wrote into hidden fields during DOMContentLoaded are wiped out. The solution is to re-populate hidden fields after the form’s AJAX events fire, or use a MutationObserver. For more detail, see our article on AJAX forms breaking Google Ads tracking.

    Embedded Forms Cannot Read the Parent Page

    If you embed a form using an iframe — common with Typeform, Cognito Forms, and some WordPress embed methods — the form inside the iframe cannot read cookies set on the parent page due to the browser’s same-origin policy. The workaround is to pass the landing page URL as a parameter on the iframe’s src attribute, which adds another layer of JavaScript to maintain. See our guide on tracking data lost in embedded forms and iframes.

    Safari ITP Limits Cookie Lifetime

    As covered above, Safari’s ITP caps JavaScript-set cookies at 7 days (24 hours for classified tracker domains). There is no client-side workaround. Server-side cookies set via HTTP headers are not subject to the same limit, which is one reason plugin-based solutions can offer more reliable tracking for longer conversion windows. For session-length tracking, ITP is not a factor.


    What To Do With Per-Lead Landing Page Data

    Capturing landing page data is the starting point for better decisions about your marketing spend. Here is how to use it.

    Find Your Highest-Converting Landing Pages

    Sort your form submissions by landing page URL and compare lead counts against traffic from Google Analytics. You now have a per-page conversion rate based on actual submissions, not just GA event counts.

    The real insight comes when you track which leads become customers. If /services/repairs generates 40 leads per month and 12 become customers, while /services/installations generates 15 leads and 10 become customers, the installations page has a dramatically higher lead-to-customer rate. Without per-lead data, you would only see that repairs gets more traffic. This is the core value of landing page tracking — it shifts analysis from volume to quality. For a broader look, see our guide on lead source tracking for WordPress forms.

    Feed Data Back to Google Ads

    If you are running Google Ads, per-lead landing page data combined with gclid capture lets you import offline conversions back into Google Ads. This tells Google’s Smart Bidding algorithm not just that a conversion happened, but which landing page and which keyword produced a real customer.

    When a visitor clicks an ad, a unique gclid is appended to the URL. Your tracking captures both the gclid and the landing page. When that lead becomes a customer, you upload the gclid and conversion value back to Google Ads via offline conversion import. Google associates the conversion with the specific click, keyword, ad, and landing page — and Smart Bidding uses this data to optimise future bids. Without this feedback loop, Smart Bidding optimises for form submissions, which may not correlate with actual revenue. For setup instructions, see our guides on offline conversion tracking without a CRM, Enhanced Conversions for Leads, and optimising Smart Bidding for real sales instead of junk leads.

    Kill Pages That Generate Junk Leads

    This is where the data pays for itself. When you can see that Page X generated 50 leads last quarter but zero became customers, while Page Y generated 10 leads and 8 converted to paying customers, the decision is clear. Reallocate ad spend from Page X to Page Y. Or rewrite Page X entirely — the copy may be attracting the wrong audience.

    Without per-lead landing page data, you would look at Page X’s 50 leads and conclude it is your best performer. The landing page data gives you the evidence to reallocate spend with confidence.

    If you are feeding conversion data back to Google Ads and encountering upload issues, see our troubleshooting guide on fixing offline conversion upload errors.


    Landing Page Tracking vs Other Approaches

    Here is how the main options compare.

    ToolLanding Page DataPer-Lead AttributionSetup EffortPrice
    Google Analytics 4Aggregate onlyNoLow (already installed)Free
    WPForms User JourneyFull page path per leadYesLowFrom $199/yr (Pro plan required)
    AttributerLanding page + sourceYesMedium (hidden fields per form)From $29/mo
    TrueConversionLanding page + source + click IDsYesLow (automatic)Free plugin; Pro from $9.99/mo
    Manual (hidden fields + JS)Landing page onlyYesHigh (custom code per form)Free

    Google Analytics gives you the broadest view but no per-lead detail. WPForms User Journey is excellent if you are already on WPForms Pro, though it captures page paths rather than full URLs with parameters. Attributer requires hidden field configuration for each form. TrueConversion handles everything automatically with no per-form setup. The manual method is free but requires ongoing maintenance when you add or change forms.

    For a full breakdown of plans and features, see the TrueConversion pricing page.


    Frequently Asked Questions

    Can Google Analytics show which landing page each lead came from?

    No. Google Analytics shows aggregate landing page data — total sessions, bounce rate, and conversion counts per page. It does not link individual leads to the specific landing page they arrived on. GA4 is designed for anonymised behavioural analysis, not per-lead attribution. You need a separate solution that captures the landing page URL alongside each form submission.

    Does this work with WPForms Lite (free)?

    WPForms Lite does not support hidden fields — that feature requires a paid licence. However, TrueConversion hooks into WPForms Lite automatically using server-side cookie reading, so you do not need hidden fields. Install TrueConversion and landing page data is captured for every WPForms Lite submission without any form modifications.

    What is the difference between landing page and referrer?

    The landing page is the first URL on your site that the visitor loaded. The referrer is the external URL they came from — google.com, facebook.com, or another website. The referrer tells you where the visitor was before your site. The landing page tells you where on your site they arrived. Both are useful, but they answer different questions.

    What if my form uses AJAX submission?

    AJAX submission itself does not break tracking. The issue occurs when a form plugin rebuilds the DOM after the initial page load, wiping out hidden field values. If values disappear on submit, check whether the form is replacing its HTML after load. You may need to re-populate the hidden field after the form’s initialisation event. See our guide on AJAX forms and tracking data.

    Do I need to capture landing page AND traffic source?

    Ideally you want both. The landing page tells you which entry point works. The traffic source tells you which campaign or channel drove the visit. Together, they answer questions like “Which Google Ads campaign sends the most leads to /services/repairs, and do those leads become customers?” Capturing only one gives you half the picture.


    Start Capturing Landing Page Data Today

    TrueConversion captures the landing page URL, conversion page, traffic source, UTM parameters, and ad platform click IDs for every form submission on your WordPress site. No hidden fields to configure. No JavaScript to maintain. No cache exclusion rules to set up.

    Install the free plugin and see which landing pages are actually producing your leads.

  • Fix Offline Conversion Upload Errors in Google Ads

    You followed the instructions. Captured the GCLID. Built the spreadsheet. Uploaded the file. And Google Ads either threw an error you do not understand, or — worse — accepted the upload and showed zero conversions. You have spent two hours on something that was supposed to take twenty minutes.

    Offline conversion upload errors are frustrating because they can happen at three different points in the pipeline: the click ID was never captured correctly, the upload file has formatting issues, or Google Ads accepted the data but cannot attribute it. Here is how to diagnose and fix each one.

    Before You Blame Google: Check Your GCLID Capture

    The most common reason offline conversion uploads fail is not a formatting error in your CSV — it is that the GCLID (Google Click Identifier) was never captured correctly in the first place. Before troubleshooting upload errors, verify that the data you are uploading is actually valid.

    Check 1: Is auto-tagging enabled?

    In Google Ads, go to Settings → Account Settings → Auto-tagging. If this is not turned on, no GCLID is appended to your ad URLs, and every upload will fail with “click can’t be found.”

    Check 2: Is the GCLID surviving your WordPress site?

    Click one of your own ads (or add ?gclid=test123 to your landing page URL). Then check:

    • Does the GCLID appear in the URL bar when the page loads? If not, a 301 redirect (www/non-www, HTTP/HTTPS, or trailing slash normalisation) may be stripping query parameters. This is a common WordPress and server configuration issue.
    • Navigate to two or three other pages on your site, then submit your form. Is the GCLID still stored? If not, your tracking does not persist the value through page navigation — which means any visitor who does not submit the form immediately on the landing page loses their GCLID.
    • Check the stored GCLID value. Is it the full string (GCLIDs can be lengthy strings (commonly 50-100+ characters)) or has it been truncated? Some form plugins limit hidden field values to 50 characters by default.

    If any of these checks fail, the problem is upstream of the upload. See our guide on why your GCLID disappears between pages for the full diagnosis.

    Other WordPress-specific causes of GCLID loss:

    • Caching plugins (WP Rocket, W3 Total Cache, LiteSpeed) serving stale pages without the GCLID parameter
    • AJAX form submissions that do not read URL parameters when submitting
    • Page builders (Elementor, Divi) with client-side navigation that drops URL parameters on internal page transitions
    • Embedded forms and iframes that cannot access the parent page URL due to browser security restrictions

    Skip the hidden field headache: TrueConversion automatically captures and persists the GCLID (plus WBRAID, GBRAID, and UTM parameters) with every WordPress form submission — no hidden fields, no custom code, no parameters to lose. See how it works.

    Upload Errors: What Each Message Means and How to Fix It

    If your GCLID capture is solid and you are hitting errors during the actual upload, here are the most common messages and their fixes.

    1. “The click for this conversion can’t be found”

    What it means: Google cannot match the GCLID in your upload to any click in its system.

    Common causes:

    • The GCLID is invalid or truncated. GCLIDs can be lengthy strings (commonly 50-100+ characters). If your form’s hidden field has a character limit (some WordPress form plugins default to 50), the GCLID gets cut off and becomes unmatchable.
    • The click came from an organic Google result, not a Google Ads click. Only paid clicks generate uploadable GCLIDs.
    • The GCLID was manually entered or copy-pasted incorrectly during testing.

    Fix: Check that your form’s hidden field accepts at least 100 characters. Verify auto-tagging is enabled. If spam submissions are cluttering your data, filter them before uploading — spam forms often contain garbage GCLID values.

    2. “This click is too old for its conversion to be imported”

    What it means: The time between the ad click and your upload exceeds the allowed window — 90 days for GCLID-based uploads.

    Fix: Upload more frequently. If your sales cycle routinely exceeds 90 days, upload an earlier-funnel conversion event instead — for example, “Qualified Lead” at the 2-week mark rather than “Closed Won” at the 4-month mark. You can create multiple conversion actions in Google Ads for different funnel stages.

    Tip: The 90-day window is for standard GCLID-based uploads. The lookback window for your conversion action (configured in Google Ads) may be shorter — check your conversion action settings to see the actual window that applies.

    3. “Conversion date precedes click date”

    What it means: Your upload says the conversion happened before the ad was clicked, which is impossible.

    Common cause: A timezone mismatch. Your Google Ads account is set to one timezone (e.g., US Eastern), but your conversion data uses a different timezone (e.g., UTC) without specifying the offset.

    Fix: Always include an explicit timezone offset in your Conversion Time column. Use the format 2026-02-15 14:30:00-05:00 (for US Eastern) rather than just 2026-02-15 14:30:00. Note: PHP’s default date() function may output UTC. Use wp_date() in WordPress to get the site’s configured timezone, or always append the offset explicitly.

    4. “We cannot find this conversion name in the target account”

    What it means: The conversion action name in your CSV does not match any conversion action in your Google Ads account.

    Common causes:

    • A typo, extra space, or capitalisation difference between your CSV and Google Ads
    • The conversion action’s source type is not set to “Import” — if it is set to “Website” or “App,” it will not accept uploaded data
    • You are uploading to the wrong Google Ads account in a multi-account (MCC) structure

    Fix: Copy-paste the conversion action name directly from Google Ads into your CSV — do not retype it. Verify the source type is set to “Import from clicks.”

    5. “We are still processing this click’s information”

    What it means: You uploaded the conversion too soon after the click occurred. Google needs time to process click data before it can accept conversion uploads.

    Fix: Wait at least 6 hours after the click before uploading. For scheduled uploads, build in a 12-24 hour buffer — upload data from 2+ days ago rather than from today.

    6. Duplicate conversion rejected

    What it means: Google has already recorded a conversion with the same combination of GCLID, conversion name, and conversion time.

    Two distinct mechanisms are at play here:

    • Order ID deduplication: If you include an Order ID (transaction ID) column in your upload, Google uses it to prevent duplicates. Two rows with the same Order ID are considered the same conversion, regardless of other fields.
    • Counting setting: If your conversion action is set to count “One” conversion per click, Google only records the first conversion for each GCLID. If you intentionally want multiple conversions per click (e.g., tracking multiple products from the same lead), set counting to “Every.”

    Fix: Deduplicate your CSV before uploading. If you need to re-upload a corrected row, change the Order ID or conversion time slightly.

    7. CSV formatting and template errors

    What it means: Your file structure does not match what Google Ads expects.

    Common causes:

    • Wrong template. If your account has Enhanced Conversions for Leads (ECL) enabled, the standard GCLID upload template does not work. You need the enhanced template with user-provided data columns (hashed email, hashed phone). Download the correct template from Google Ads → Tools → Uploads.
    • Wrong date format. Google requires yyyy-MM-dd HH:mm:ss+/-HH:mm. Formats like “Feb 15 2026” or “15/02/2026” will be rejected.
    • Column headers do not match exactly. Extra spaces, different capitalisation, or renamed columns will cause the upload to fail.

    Fix: Always download the template directly from Google Ads rather than creating your own. Copy-paste headers exactly.

    8. Consent mode blocking attribution (silent failure)

    What it means: The upload succeeds — no error message — but the conversions are not attributed to any clicks in your reports.

    Since March 2024, Google requires consent signals for EU/EEA traffic. If your upload does not include consent fields (ad_user_data), conversions from European visitors may be accepted but never attributed.

    The behaviour differs by upload method:

    • CSV upload via the Google Ads UI: May silently drop conversions that lack consent data — the upload appears successful but conversions do not appear in reports.
    • Google Ads API: Returns explicit consent-related error codes in API v15 and later, making the failure visible.

    Fix: If you serve EU/EEA traffic, include consent fields in your uploads. In the Google Ads UI, go to Tools → Data Manager → Consent settings and configure your default consent status. If consent status is unknown for a specific upload, set it to “DENIED” rather than leaving it blank (blank may cause unexpected behaviour).

    9. Cross-account or MCC attribution errors

    What it means: You are uploading conversions to the wrong account in a multi-account (MCC) structure, or the conversion action is owned by a different account than the one receiving the upload.

    Fix: Upload to the account that owns the conversion action. If you use cross-account conversion tracking (where conversion actions are managed at the MCC level), upload to the MCC account directly.

    10. Auto-tagging disabled or GCLID stripped by redirects

    What it means: No GCLID was ever appended to your ad URLs, or a redirect between the ad click and your landing page stripped it.

    Fix: Enable auto-tagging (Settings → Account Settings in Google Ads). Audit your redirect chain — check for HTTP-to-HTTPS redirects, www/non-www redirects, and third-party click trackers that strip query parameters. Note that having manual UTM tagging enabled does not interfere with auto-tagging unless the “Allow manual tagging to override” setting is turned on.

    “Upload Succeeded” But Conversions Do Not Appear

    This is the most maddening scenario. Google Ads accepted your file with no errors, but your conversion count stays at zero. Here is what to check:

    • Processing delay. Uploaded conversions can take up to 72 hours to appear in reports. New conversion actions may take longer for the first batch. Do not panic until at least 3 days have passed.
    • Reporting by click date. Google Ads attributes offline conversions to the click date, not the upload date. If the click happened 45 days ago and you uploaded today, the conversion appears in reports for 45 days ago — not today. Check the correct date range.
    • Conversion counting. If your conversion action is set to “One,” only the first conversion per click is counted. Subsequent conversions from the same GCLID are silently ignored.
    • Conversion window. If the conversion happened outside your configured conversion window (e.g., your window is 30 days but the lead converted after 60 days), the conversion is accepted but not attributed.
    • Consent mode. As described in error #8 above — the upload may succeed but attribution may be blocked for EU/EEA traffic.

    Tip: Check the Google Ads offline data diagnostics page (Tools → Uploads → click your upload → Diagnostics). This shows match rates, processing status, and specific row-level errors that the initial upload confirmation may not surface.

    The WBRAID and GBRAID Problem

    If a growing share of your leads show no GCLID at all, the issue may not be a capture failure. Visitors arriving from iOS devices via Safari or Google apps (YouTube, Gmail, Google Discover) often carry WBRAID or GBRAID parameters instead of GCLID. These are Google’s privacy-compliant click identifiers for Apple’s ATT framework.

    The critical limitation: Google’s CSV upload does not support WBRAID or GBRAID. You cannot include these identifiers in a file upload through the Google Ads UI. Only the Google Ads API supports them.

    For SMBs who have been uploading conversions via CSV, this means a growing segment of your Google Ads traffic — all iOS Safari users — cannot be attributed through your existing upload method.

    Workaround: Use Enhanced Conversions for Leads (ECL), which matches on hashed email addresses rather than click identifiers. ECL works regardless of whether the visitor arrived with a GCLID, WBRAID, or GBRAID. See our offline conversion tracking guide for setup options.

    Diagnostic Checklist: Before Your Next Upload

    Work through these steps in order before uploading:

    1. Is auto-tagging enabled in your Google Ads account?
    2. Click your own ad — does the GCLID appear in the landing page URL?
    3. Navigate to another page and submit a test form — is the GCLID captured and stored?
    4. Is the stored GCLID the full string (not truncated)?
    5. Is the conversion action created in Google Ads with source set to “Import from clicks”?
    6. Does the conversion action name in your CSV match exactly (copy-paste, do not retype)?
    7. Is the Conversion Time formatted correctly with an explicit timezone offset?
    8. Is the conversion time after the click time and within 90 days of it?
    9. Have you waited at least 6 hours since the click before uploading?
    10. Have you deduplicated your CSV?
    11. Are you using the correct template (standard vs enhanced conversions)?
    12. Have you set consent fields (required for EU/EEA traffic)?
    13. Are you uploading to the correct Google Ads account?

    Scaling Beyond CSV Uploads

    CSV uploads work for getting started and testing, but they are manual, error-prone, and limited. They do not support WBRAID/GBRAID, do not handle consent fields natively, and require you to format data precisely every time.

    When you are ready to move past CSV:

    • Google Sheets via Data Manager — automate scheduled uploads from a Google Sheet. Less error-prone than CSV because the connection persists and column mapping is saved.
    • Zapier or Make.com — connect your form submissions or CRM directly to Google Ads offline conversion uploads. Handles hashing and formatting automatically.
    • Google Ads API — the most powerful option, supporting WBRAID/GBRAID, consent fields, and real-time uploads. Requires developer resources or a tool that handles the integration.
    • WordPress tracking plugins — capture the GCLID and lead source data automatically with every form submission, giving you clean, complete data ready for upload via any method.

    Frequently Asked Questions

    How long do offline conversions take to appear in Google Ads?

    Up to 72 hours. New conversion actions may take longer for the first batch. Conversions appear under the click date, not the upload date — so check the correct date range in your reports.

    Why does Google say “click not found” when the GCLID looks correct?

    The GCLID may be truncated (GCLIDs can be lengthy strings (commonly 50-100+ characters)), from an organic click rather than a paid click, or you may have uploaded too soon after the click (wait at least 6 hours).

    Can I upload conversions for WBRAID and GBRAID clicks?

    Not via CSV. WBRAID and GBRAID uploads require the Google Ads API. Alternatively, use Enhanced Conversions for Leads, which matches on hashed email rather than click identifiers.

    What if my upload succeeds but conversions do not appear?

    Wait 72 hours, then check: (1) you are viewing the correct click date range, (2) the conversion window has not expired, (3) consent fields are included for EU traffic, and (4) the counting setting allows the conversion to be recorded.


    Capture Every GCLID Without the Headache

    Most upload errors trace back to a GCLID that was never captured correctly. TrueConversion stores the GCLID, WBRAID, GBRAID, and UTM parameters with every WordPress form submission — automatically, with no hidden fields or custom code. Your data arrives clean and complete, ready for upload.

  • What Are WBRAID and GBRAID? Google’s New Click IDs Explained

    You check your Google Ads landing page URLs and notice something unfamiliar. Instead of the ?gclid= parameter you are used to seeing, some URLs now carry ?wbraid= or ?gbraid=. Your tracking setup was built around GCLID. Are these new parameters breaking your data?

    Probably, yes — at least partially. WBRAID and GBRAID are Google’s privacy-compliant alternatives to GCLID, created in response to Apple’s App Tracking Transparency (ATT) framework. They appear on a growing share of your traffic, and most WordPress form tracking setups do not capture them. Here is what they are, why they matter, and what to do about it.

    Why Strange New Parameters Are Showing Up in Your URLs

    In April 2021, Apple released iOS 14.5 with App Tracking Transparency — a framework that requires apps to ask permission before tracking users across other apps and websites. Most users opt out. This broke the mechanism GCLID relies on for iOS users: cross-app tracking and deterministic click-to-conversion matching.

    Google’s response was to create two new click identifiers that comply with Apple’s privacy requirements: GBRAID and WBRAID. These parameters appear automatically in your ad URLs when the visitor is on an ATT-affected iOS device. Google’s auto-tagging system decides which parameter to use — you do not choose.

    This affects a significant share of traffic. Safari holds roughly 30-32% of the US browser market, according to StatCounter data. If you are running Google Ads, a meaningful portion of your paid clicks now arrive with one of these new identifiers instead of GCLID.

    What Is GCLID (Quick Refresher)

    GCLID (Google Click Identifier) is a unique string that Google appends to your landing page URL when someone clicks your ad with auto-tagging enabled. It links that specific click to your Google Ads account, campaign, ad group, and keyword. Google stores the GCLID in a first-party cookie and uses it to attribute conversions back to the exact click that produced them.

    GCLID uses deterministic attribution — one click, one identifier, one conversion match. The attribution window extends up to 90 days. It remains the primary click identifier for desktop browsers, Android, and iOS users who opted into tracking.

    GCLID is not going away. But for the growing share of traffic where Apple’s privacy controls block it, Google needed alternatives. That is where GBRAID and WBRAID come in.

    If you have encountered issues with GCLIDs not persisting as visitors navigate your site, that is a separate (but related) problem covered in our guide on why your GCLID disappears between pages.

    What Are GBRAID and WBRAID?

    Both are privacy-compliant click identifiers that Google uses on iOS devices where ATT restricts traditional tracking. They differ in their measurement context:

    GBRAID

    GBRAID (Google Browser Ad ID) appears when the conversion being measured involves an app — for example, when someone clicks a Google ad on iOS and the conversion happens within an app, or when the click originates from within a Google app (YouTube, Gmail, Google Discover, Google Maps). It is used in app-to-app and web-to-app measurement scenarios on iOS.

    Unlike GCLID, GBRAID does not function as a unique user-level identifier. It uses aggregated, modelled attribution that meets Apple’s privacy requirements. The attribution window is shorter than GCLID’s 90 days — typically limited by Safari’s Intelligent Tracking Prevention (ITP), which caps first-party cookie lifetime.

    WBRAID

    WBRAID (Web Browser Ad ID) is used when the conversion being measured happens on the web — specifically on iOS devices where GCLID cannot be used due to ATT restrictions. The most common scenario: someone clicks a Google ad inside the YouTube app on their iPhone and lands on your website. The URL carries ?wbraid= instead of ?gclid=.

    Like GBRAID, WBRAID uses privacy-preserving, aggregated attribution rather than deterministic user-level tracking.

    GCLID vs GBRAID vs WBRAID: Key Differences

    FeatureGCLIDGBRAIDWBRAID
    Full nameGoogle Click IdentifierGoogle Browser Ad IDWeb Browser Ad ID
    Use caseGeneral web conversion trackingApp-involved conversions on iOSWeb conversions on iOS
    PlatformsDesktop, Android, consented iOSiOS 14.5+ (ATT-affected)iOS 14.5+ (ATT-affected)
    Tracking methodDeterministic (individual click)Aggregated / modelledAggregated / modelled
    Attribution windowUp to 90 daysShorter (limited by Safari ITP)Shorter (limited by Safari ITP)
    Offline conversion uploadUI or APIAPI onlyAPI only
    Privacy complianceNot ATT-compliant on iOSATT-compliantATT-compliant

    The key takeaway: Google’s auto-tagging system selects the appropriate parameter automatically. You do not need to configure anything in your Google Ads account — this happens behind the scenes when auto-tagging is enabled.

    What This Means for Your WordPress Form Tracking

    This is where it gets practical — and where most existing guides on this topic fall short.

    Most WordPress form tracking setups — whether custom-built or using a plugin — only look for gclid in the URL. If a visitor arrives with ?wbraid=xyz or ?gbraid=xyz, the tracking captures nothing. That lead shows up in your inbox with zero source attribution.

    From a WordPress capture standpoint, the mechanism is identical for all three parameters. A visitor arrives, the parameter is in the URL, and your tracking needs to:

    1. Read the URL and detect whichever parameter is present — gclid, gbraid, or wbraid
    2. Store the value in a first-party cookie so it survives internal page navigation
    3. When the visitor submits a form (possibly on a different page), retrieve the stored value
    4. Attach the click identifier to the form submission data as a hidden field
    5. Store it alongside the lead in your database or CRM

    The capture process is the same. The difference is what happens downstream in Google Ads when you try to use that data — which we cover in the next section.

    If your current tracking only checks for gclid, you are blind to every iOS visitor who clicks your ad. Depending on your audience, that could be 25-35% of your paid traffic arriving with no attribution data at all.

    How TrueConversion handles this: TrueConversion automatically detects and captures all three Google Ads click identifiers — GCLID, GBRAID, and WBRAID — plus UTM parameters and click IDs from other ad platforms. It stores the correct identifier with every form submission across 10 WordPress form plugins. See how it works.

    Feeding Click Data Back to Google Ads: Where It Gets Complicated

    Capturing the click identifier with each form submission is step one. Step two — sending that conversion data back to Google Ads — is where the differences between GCLID and WBRAID/GBRAID create real friction.

    With GCLID, the workflow is straightforward:

    1. Capture the GCLID when the lead submits a form
    2. Store it alongside the lead record
    3. When the lead converts (e.g., becomes a paying customer), upload the conversion to Google Ads via CSV through the Google Ads UI or via the API
    4. Google matches the conversion to the original click and feeds this into Smart Bidding

    With WBRAID and GBRAID, the process is more limited:

    • No UI upload. The Google Ads web interface does not support offline conversion uploads using WBRAID or GBRAID. You cannot include these identifiers in a CSV upload. This is API-only.
    • API required. To upload conversions attributed to WBRAID or GBRAID, you must use the Google Ads API. For most SMBs, this means either hiring a developer or using a third-party tool that handles the API integration.
    • Processing delay. GCLID conversions typically process within 12 hours. WBRAID/GBRAID conversions can take up to 72 hours to appear in your Google Ads reporting, according to the Google Ads API documentation.

    In July 2025, Google announced an API update (effective October 2025) that allows combining GCLID and GBRAID conversions in a single upload request — previously, each identifier type required a separate upload call. This simplifies the API integration but does not change the fundamental limitation: you still need API access.

    For SMBs who have been manually uploading GCLID-based conversions via CSV, this is a significant gap. The leads that arrive via iOS are the ones you cannot upload through the interface you are used to.

    Enhanced Conversions for Leads: A Workaround

    There is an alternative path that sidesteps the click identifier entirely. Enhanced Conversions for Leads uses hashed first-party data — typically the email address collected in your form — to match conversions back to ad clicks. Instead of uploading a GCLID or WBRAID, you upload a SHA256-hashed email address and Google matches it on their end.

    This works regardless of which click identifier was used, and it can be uploaded through the Google Ads UI. The trade-off is lower match rates compared to GCLID-based uploads, and it requires that the user was signed into their Google account when they clicked the ad.

    For a detailed walkthrough of the full offline conversion tracking process, including how to set up uploads without a CRM like Salesforce or HubSpot, see our dedicated guide.

    iOS 17 and Safari’s Link Tracking Protection

    As if ATT was not enough, Apple introduced Link Tracking Protection (LTP) in iOS 17, which strips known tracking parameters from URLs in specific contexts:

    • Apple Mail — tracking parameters stripped from links in emails
    • Messages — tracking parameters stripped from links shared via iMessage
    • Safari Private Browsing — tracking parameters stripped from all URLs

    GCLID is confirmed to be stripped by LTP in these contexts. Whether GBRAID and WBRAID are also stripped depends on Apple’s parameter list, which is not publicly documented in full.

    Currently, regular Safari browsing (non-private) does not strip these parameters. However, Apple has been testing expanded privacy features in Safari Technology Preview builds. If LTP is extended to regular Safari browsing in a future update, even GBRAID and WBRAID could be affected for normal web sessions.

    Note: The expansion of LTP to regular Safari browsing is not confirmed — it is industry speculation based on Apple’s testing in Safari Technology Preview. Plan for it, but do not panic about it.

    The broader trend is clear: Apple is tightening privacy controls on each release. Building your tracking around a single identifier type — whether GCLID, GBRAID, or WBRAID — is increasingly risky. Server-side tracking and first-party data collection provide more durable foundations. Related challenges with tracking through embedded forms and iframes follow the same pattern: browser-side restrictions are getting stricter, and server-side approaches are becoming more important.

    How to Verify You Are Capturing All Three Click IDs

    Run through this checklist to make sure your WordPress site captures GCLID, GBRAID, and WBRAID correctly:

    1. Verify auto-tagging is enabled. In your Google Ads account, go to Settings → Account Settings → Auto-tagging. Without this, none of these parameters appear in your URLs.
    2. Test parameter acceptance. Add ?gclid=test123, ?gbraid=test456, and ?wbraid=test789 to your landing page URL and load each one. The parameter should appear in the URL bar. If your site strips or redirects away the parameter, your server configuration or a plugin is interfering.
    3. Check your tracking solution. Does your lead source tracking setup read all three parameters, or only GCLID? Test by submitting your form with each test parameter in the URL and checking whether the value was captured.
    4. Test on an actual iOS device. Borrow an iPhone, click one of your ads in Safari or the YouTube app, and check the landing page URL. Note which parameter appears — this is what your real visitors are seeing.
    5. Verify cookie persistence. After landing with a test parameter, navigate to two or three other pages on your site, then submit the form. Check whether the click identifier was still captured. If it was lost, your tracking does not persist the value through internal navigation.
    6. Check your stored data. Look at your recent form submissions in your CRM, email, or tracking dashboard. If some leads show a GCLID and others show no click identifier at all, the ones with missing data likely arrived via iOS with a WBRAID or GBRAID that your system did not capture.
    7. Confirm your offline upload method. If you upload conversions to Google Ads, check whether your upload method supports WBRAID/GBRAID (API) or only GCLID (UI CSV upload). If you rely on the UI, your iOS conversions cannot be uploaded.

    Quick check: Not sure if your forms are capturing GBRAID and WBRAID? Install TrueConversion’s free plugin and check the dashboard — you will see exactly which click identifier arrived with each lead.

    Frequently Asked Questions

    Is GCLID being replaced by GBRAID and WBRAID?

    No. GCLID remains the primary click identifier for desktop browsers, Android, and iOS users who opted into tracking. GBRAID and WBRAID only appear where Apple’s ATT framework prevents GCLID from functioning. All three coexist — Google selects the appropriate one automatically.

    Do I need to change my Google Ads settings?

    No changes needed in Google Ads itself. GBRAID and WBRAID are applied automatically when auto-tagging is enabled. The change you may need to make is on your website: ensuring your tracking solution captures all three parameters, not just GCLID.

    Can I see GBRAID and WBRAID data in Google Analytics 4?

    GA4 can attribute sessions from these parameters, but with less granularity than GCLID-attributed sessions. Since GBRAID and WBRAID use aggregated/modelled attribution, the data in GA4 is less precise at the individual session level.

    Why do some of my leads show GCLID and others show nothing?

    The leads with no click identifier likely arrived from iOS devices carrying WBRAID or GBRAID — parameters your tracking setup did not capture. Different devices and browsers determine which parameter Google uses, so a mix is normal. The fix is to ensure your tracking reads all three.

    Will WBRAID and GBRAID work with Contact Form 7 or WPForms?

    Only if your tracking solution captures them. Neither Contact Form 7 nor WPForms captures any click identifiers natively — you need either custom hidden fields that read the URL, or a tracking plugin that handles this automatically.

    How long does attribution take with GBRAID and WBRAID?

    GCLID-based conversions typically appear in Google Ads reporting within 12 hours. GBRAID and WBRAID conversions can take up to 72 hours to process, according to Google’s API documentation. Factor this lag into your reporting schedule.


    The Bottom Line

    GCLID still works for most of your Google Ads traffic. But the iOS/Safari share — roughly 30-32% in the US — is too large to ignore. If your WordPress forms only capture GCLID, you are losing attribution data on a quarter or more of your paid leads.

    The trend is moving in one direction. Apple is tightening privacy controls with each iOS release. Google is shifting toward aggregated, modelled attribution. Building your tracking around a single identifier is increasingly fragile.

    Three things to do now:

    1. Audit your current tracking to see if you are capturing GCLID, GBRAID, and WBRAID (use the checklist above)
    2. Store the click identifier type with each lead so you know which leads can be uploaded via the UI and which require the API
    3. Consider server-side tracking as insurance against future browser restrictions — it captures data regardless of what happens in the browser

    Capture Every Google Ads Click ID Automatically

    TrueConversion captures GCLID, GBRAID, and WBRAID from every visitor and attaches the correct identifier to your WordPress form submissions. No code changes, no GTM configuration, no missed iOS leads. Works with Contact Form 7, WPForms, Gravity Forms, and 7 more plugins.

  • Contact Form 7 Lead Source Tracking: The Complete Guide

    Contact Form 7 is the most popular form plugin on WordPress, powering millions of contact pages worldwide. But it has a glaring blind spot: it tells you nothing about where your leads come from. You get a name, an email, and a message — and that’s it. No UTM parameters, no ad click IDs, no referral data. If you’re running Google Ads, Facebook campaigns, or investing in SEO, you’re flying blind. This guide covers everything you need to know about contact form 7 lead source tracking — from manual hidden fields to zero-code plugins that handle the entire pipeline for you.

    What Contact Form 7 Tracks by Default

    Contact Form 7 is a form builder, not a lead management tool. When someone submits a CF7 form, the plugin sends an email to whatever address you configure. That email contains the fields the visitor filled in — name, email, phone, message — and nothing else.

    CF7 does not store submissions in the WordPress database. It does not capture UTM parameters. It does not record ad click IDs like gclid or fbclid. It does not detect whether the visitor arrived from organic search, a social media post, or a paid ad.

    This means every lead that comes through your contact form is untraceable by default. You can see aggregate traffic data in Google Analytics, but you cannot tie a specific lead to a specific campaign, keyword, or channel. For any business spending money on marketing, this is a serious gap.

    Three Types of Lead Source Data

    Before you pick a tracking method, it helps to understand the three categories of source data you want to capture.

    UTM Parameters

    UTM parameters are tags you append to your campaign URLs: utm_source, utm_medium, utm_campaign, utm_term, and utm_content. They tell you which campaign, channel, and variation brought the visitor. Google’s Campaign URL Builder makes it simple to generate tagged links. UTMs work across every traffic source — Google, Facebook, email, partner sites — but only if you tag your URLs consistently.

    Ad Platform Click IDs

    When someone clicks a Google ad, Google appends a gclid parameter automatically. Meta adds fbclid. Microsoft Ads adds msclkid. TikTok, LinkedIn, and other platforms have their own equivalents. These click IDs let you upload offline conversions back to the ad platform, enabling the algorithm to optimize for leads that actually convert — not just clicks. The challenge is that these IDs are long, ugly strings that often disappear between page navigations unless you actively persist them.

    Organic and Referral Sources

    Not every visitor arrives via a tagged link. Someone might find you through Google search, click through from a blog that linked to you, or type your URL directly. These visits carry no UTM parameters and no click IDs. Capturing the HTTP referrer and mapping it to a human-readable source (like “Google Organic” or “Facebook Referral”) fills in the gaps that UTMs and click IDs miss. If half your leads come from organic search, you need to know that — and CF7 won’t tell you on its own.

    5 Ways to Add Contact Form 7 Lead Source Tracking

    There is no single “right” approach. The best method depends on your technical comfort level, your budget, and how much attribution data you actually need. Here are five options, from fully manual to fully automated.

    Method 1: Manual Hidden Fields + JavaScript

    CF7 supports hidden fields, and you can use JavaScript to populate them from the current page URL. This is the free, DIY approach that gives you full control.

    First, add hidden fields to your CF7 form template for every parameter you want to capture:

    [hidden utm_source id:utm_source default:get]
    [hidden utm_medium id:utm_medium default:get]
    [hidden utm_campaign id:utm_campaign default:get]
    [hidden utm_term id:utm_term default:get]
    [hidden utm_content id:utm_content default:get]
    [hidden gclid id:gclid default:get]
    [hidden fbclid id:fbclid default:get]
    [hidden msclkid id:msclkid default:get]
    [hidden landing_page id:landing_page]

    The default:get attribute tells CF7 to pull the value from the URL query string. For the landing page field, you need a small JavaScript snippet to populate it with the current URL. Then update your CF7 mail template to include these fields:

    --- Lead Source ---
    UTM Source: [utm_source]
    UTM Medium: [utm_medium]
    UTM Campaign: [utm_campaign]
    UTM Term: [utm_term]
    UTM Content: [utm_content]
    Google Click ID: [gclid]
    Facebook Click ID: [fbclid]
    Microsoft Click ID: [msclkid]
    Landing Page: [landing_page]

    The limitation is significant: default:get only reads parameters from the URL at the time the form page loads. If a visitor lands on your homepage with UTM parameters and then navigates to your contact page, the parameters are gone. You would need to write additional JavaScript to store values in cookies or sessionStorage and retrieve them on the form page. You also get no organic or referral detection — only tagged traffic shows up.

    Verdict: Free and simple for single-page forms where the landing page is the form page. Breaks on multi-page journeys. No organic or referral tracking. Requires ongoing maintenance.

    Method 2: Free WordPress Plugins

    Several free plugins on WordPress.org add UTM tracking fields to CF7 and other form plugins. These typically work by injecting hidden fields into your forms and using JavaScript or cookies to persist UTM values across pages.

    The upside is that you avoid writing custom code. Many of these plugins handle multi-page persistence with cookies. The downside is that most free plugins only capture UTM parameters — they skip ad click IDs (gclid, fbclid) and do not detect organic or referral sources. Some store entries in the database, but the free tiers often limit storage or lack export features. Plugin maintenance varies — several popular UTM tracking plugins haven’t been updated in over a year.

    Verdict: A step above manual fields for UTM capture. Limited coverage — usually no click IDs, no organic detection. Check that the plugin is actively maintained before committing.

    Method 3: TrueConversion

    TrueConversion is a WordPress plugin purpose-built for lead source tracking across all major form plugins, including Contact Form 7. It captures UTMs, ad platform click IDs, and organic/referral sources automatically — no hidden fields or code edits required. Data persists across pages using a configurable conversion window (session, 1 day, or 7 days).

    The free tier includes all tracking features and supports nine form plugins plus a shortcode fallback. It stores entries in the WordPress database with CSV export. Paid plans add unlimited storage and email notifications. Because everything runs on your WordPress site, there is no external data processing or third-party dependency.

    Verdict: Broadest data capture of any free option — UTMs, click IDs, and organic detection. Zero configuration on the CF7 side. Paid plans unlock unlimited storage and notifications.

    Method 4: SaaS Tools (Attributer, WhatConverts)

    External SaaS platforms like Attributer and WhatConverts inject tracking fields into your forms and store attribution data in their cloud dashboards. They handle multi-touch attribution models and integrate with CRMs like Salesforce and HubSpot.

    The trade-off is cost. Attributer starts at $49/month. WhatConverts starts at $30/month for basic plans and goes up significantly for call tracking and multi-channel features. These tools make sense for mid-market companies with CRM workflows and complex multi-touch attribution needs. For a small business that just needs to know which channel a CF7 lead came from, they are expensive overkill.

    Verdict: Powerful multi-touch attribution and CRM integrations. Priced for agencies and mid-market teams, not SMBs. Requires external data processing.

    Method 5: Google Tag Manager + GA4

    You can use Google Tag Manager to fire a GA4 event when a CF7 form is submitted. CF7 triggers a JavaScript DOM event called wpcf7mailsent on successful submission, which GTM can listen for using a custom event trigger. This lets you track form submissions as conversions in GA4.

    GA4 will automatically associate the conversion with the traffic source for that session. For Google Ads specifically, gclid is auto-tagged and linked through the GA4-Google Ads connection, giving you partial click ID support. However, you cannot see lead source data on a per-submission basis — GA4 shows aggregate conversion data by channel, not “John Smith submitted from your Facebook campaign.” You also lose click IDs from non-Google platforms (Meta, TikTok, LinkedIn) unless you build custom tracking for each one.

    Verdict: Good for aggregate conversion tracking in GA4. No per-lead attribution. Partial click ID coverage (Google only via auto-tagging). Requires GTM expertise to set up and maintain.

    Comparison Table

    FeatureManual Hidden FieldsFree WP PluginsTrueConversion (Free)SaaS ToolsGTM + GA4
    UTM CaptureYesYesYesYesYes (aggregate)
    Click ID Capture (gclid, fbclid)Manual per IDRarelyYes (all major IDs)YesPartial (gclid auto-tagged)
    Organic / Referral DetectionNoNoYesYesYes (aggregate)
    Multi-Page PersistenceRequires custom JSUsually (cookies)Yes (configurable window)YesSession-based
    Per-Lead AttributionYesYesYesYesNo
    Database StorageNo (email only)SometimesYes + CSV exportYes (cloud)No (GA4 reports only)
    Setup ComplexityHighLow-MediumLowMediumHigh
    Ongoing MaintenanceHighLowNoneLowMedium
    CostFreeFreeFree (paid plans available)$30-$200+/moFree

    Want the easiest path to full lead source tracking? TrueConversion captures UTMs, click IDs, and organic sources automatically on every CF7 submission. Install the free plugin and start seeing where your leads come from in under two minutes.

    Step-by-Step: Setting Up TrueConversion with Contact Form 7

    TrueConversion works with CF7 out of the box. There are no hidden fields to add, no form templates to edit, and no JavaScript to write. Here is the full setup process.

    1. Install the plugin. Go to your WordPress dashboard. Navigate to Plugins > Add New. Search for “TrueConversion” and click Install Now, then Activate. Alternatively, download the plugin from the TrueConversion website and upload it manually via Plugins > Add New > Upload Plugin.
    2. Run the setup wizard. After activation, TrueConversion launches a 5-step setup wizard. The wizard auto-detects that Contact Form 7 is installed on your site and enables it by default. Confirm that CF7 is checked in the form integrations step.
    3. Configure your conversion window. Choose how long tracking data persists for each visitor. “Same Session” (the default) is recommended for most sites — it attributes the lead to the source that brought them to your site in that browsing session. Select “7 Days” if visitors commonly research over multiple visits before submitting a form.
    4. Set your notification email (optional). If you want to receive an email each time a lead is captured with source data, enter your email address in the notifications step. This feature requires a paid plan, but you can start a free 30-day trial during setup.
    5. Complete the wizard. Click Finish. TrueConversion is now tracking every Contact Form 7 submission on your site. No changes to your CF7 forms are needed.
    6. Verify in the dashboard. Navigate to TrueConversion > Entries in your WordPress admin. After your next form submission, you will see the lead’s name, email, source, medium, campaign, and any captured click IDs — all in one row.

    The entire process takes under two minutes. TrueConversion hooks into CF7’s wpcf7_before_send_mail action, so it captures data at the same moment the form fires its email. Your existing CF7 configuration, email templates, and conditional logic remain untouched. You can learn more about how the tracking pipeline works on the TrueConversion site.

    Testing Your CF7 Lead Source Tracking

    Setting up tracking is only half the job. You need to verify that data flows correctly for each traffic type before you trust your reports. Run through these tests after installation.

    1. Test UTM parameters. Open an incognito window and visit your site with a tagged URL, for example: yoursite.com/?utm_source=test&utm_medium=cpc&utm_campaign=verification. Navigate to your contact page and submit the form. Check that utm_source, utm_medium, and utm_campaign appear correctly in the TrueConversion dashboard entry.
    2. Test multi-page persistence. In a new incognito window, land on your homepage with UTM parameters. Click through to two or three other pages on your site, then go to the contact form and submit. Verify that the UTM values from your original landing page are still captured in the entry.
    3. Test click ID capture. Append a fake gclid to your URL: yoursite.com/?gclid=test123abc. Submit the form and confirm the click ID appears in the entry. Repeat with fbclid and msclkid if you run ads on those platforms.
    4. Test organic detection. Search for your site name on Google (or another search engine) and click through to your site. Submit the contact form. Check that the entry shows “Google Organic” or the equivalent detected source — not blank fields.
    5. Test direct traffic. Open a new incognito window and type your site URL directly into the address bar. Submit the form. The entry should show “Direct” as the source, confirming that the plugin correctly identifies sessions with no referrer data.
    6. Test the notification email. If you have email notifications enabled, confirm you received an email for each test submission and that the source data is included in the email body.

    Tip: Always test in an incognito or private browsing window. This ensures you start with a clean session — no cached cookies or stored parameters from previous visits that could give you false results.

    What to Do With Your Lead Source Data

    Capturing source data is the first step. The real value comes from acting on it. Here are three ways to use your CF7 lead source data to make better marketing decisions.

    Calculate Cost Per Lead by Channel

    Export your lead entries as CSV from TrueConversion. Group leads by source and medium. Compare the lead count per channel against your ad spend for the same period. If Google Ads generated 40 leads at $2,000 spend, your cost per lead is $50. If organic search generated 30 leads at $0 direct spend, that is your most efficient channel. These numbers tell you where to increase budget and where to cut.

    Optimize Campaign Performance

    UTM campaign and term data let you drill down beyond the channel level. You can identify which specific campaigns, ad groups, or keywords are generating form submissions — not just clicks. A campaign with a high click-through rate but zero leads needs different creative. A keyword with a low click volume but consistent leads deserves more budget.

    Upload Offline Conversions

    If you capture gclid values with each form submission, you can upload those conversions back to Google Ads. This tells the Google algorithm which clicks actually produced leads, enabling Smart Bidding to optimize for lead quality rather than click volume. The same principle applies to Meta’s conversion API with fbclid. Per-lead click ID capture — which most free tracking methods skip — is what makes this possible.

    Every business running paid ads and using Contact Form 7 should have contact form 7 lead source tracking in place. Without it, you are making budget decisions based on click data instead of lead data. The methods above range from free and manual to free and automated — there is no reason to leave your CF7 leads unattributed.

    Start Tracking Your CF7 Leads in Under 2 Minutes

    TrueConversion adds automatic lead source tracking to Contact Form 7 — UTMs, click IDs, and organic sources — with zero configuration on your forms. The free plan includes all tracking features, database storage, and CSV export. Install it now and see exactly where every lead comes from.

    Frequently Asked Questions

    Does Contact Form 7 have built-in UTM tracking?

    No. Contact Form 7 is a form builder and email sender — it does not capture UTM parameters, ad click IDs, or any traffic source data. CF7’s hidden field shortcode supports a default:get attribute that can read URL parameters on the current page, but this does not persist values across pages and does not detect organic or referral traffic. For full cf7 utm tracking, you need a plugin or custom JavaScript solution.

    How can I track where my Contact Form 7 leads come from without writing code?

    The simplest no-code approach is to install a lead source tracking plugin like TrueConversion. It auto-detects CF7 on your site, hooks into the form submission process, and captures source data (UTMs, click IDs, organic/referral) without any changes to your form templates or mail settings. Entries are stored in your WordPress database and can be exported as CSV. If you want to contact form 7 track where leads come from, this is the fastest path.

    Can I track gclid and fbclid with Contact Form 7?

    Yes, but not with CF7 alone. You can add hidden fields for gclid and fbclid manually (see Method 1 above), but you need JavaScript to persist those values across page navigations. Most free UTM plugins do not capture click IDs. TrueConversion captures gclid, fbclid, msclkid, and other platform click IDs automatically and persists them through the entire browsing session. This is essential for uploading offline conversions to Google Ads or Meta.

    Will adding lead source tracking slow down my Contact Form 7 forms?

    No. Lead source tracking plugins like TrueConversion add a small JavaScript file (under 3 KB) to your frontend that reads URL parameters and stores them in a cookie. The processing happens at form submission time via a WordPress action hook — there is no external API call, no additional HTTP request, and no delay to the form submission. Your CF7 forms will behave exactly the same as they do now, with attribution data captured silently in the background.

  • Embedded Forms and iFrames: Why Your Tracking Data Gets Lost

    You set up a HubSpot form on your WordPress landing page. Ads are running. Leads start coming in. But when you check your submissions, the traffic source fields are empty. No UTM parameters. No click IDs. Every single lead shows up as “direct” traffic, even though you know they clicked a Google ad. If you use embedded form tracking on your site, this problem is almost certainly costing you money right now.

    The issue is not your ad platform. It is not your tag manager. It is the embed itself. When you place a third-party form inside an iframe (an inline frame — an HTML element that loads a separate webpage inside your page), the browser treats that form as a completely different website. Your tracking data sits on one side of a wall. The form sits on the other.

    This article explains exactly why that wall exists, which form tools are affected, and what you can actually do about it.

    What Happens When You Embed a Form in an iFrame

    Think of an iframe like a glass wall in the middle of a room. You can see through it. From a visitor’s perspective, the form looks like it belongs on your page. But structurally, everything on the other side of that glass is a separate environment with its own address, its own cookies, and its own rules.

    When a visitor arrives on your landing page from a Google ad, the URL contains tracking parameters like gclid, utm_source, and utm_medium. These parameters belong to your domain. They exist in your page’s address bar, in your page’s JavaScript context, and in cookies your site sets.

    The iframe form loads from a different domain entirely — forms.hubspot.com, form.typeform.com, or calendly.com. That form cannot reach through the glass to read your URL. It cannot access your cookies. It does not know where your visitor came from. As far as the form is concerned, the visitor appeared out of thin air.

    This affects every tool that uses iframe embeds to place forms on external websites. HubSpot, Typeform, Calendly, Jotform, Google Forms, Cognito Forms, and dozens of others all work this way by default. If the form loads inside an <iframe> tag, the tracking data is on the wrong side of the glass.

    Three Reasons Your Embedded Form Tracking Breaks

    The data loss is not caused by a single issue. Three separate browser security mechanisms combine to block your tracking data from reaching an embedded form. Understanding all three matters because fixing just one still leaves the other two in place.

    1. Cross-Origin JavaScript Restrictions

    Browsers enforce a rule called the Same-Origin Policy. An “origin” is the combination of protocol, domain, and port — so https://yoursite.com and https://forms.hubspot.com are different origins. The Same-Origin Policy prevents JavaScript on one origin from reading or modifying content on another origin.

    This means your page’s JavaScript cannot reach into the iframe to pre-fill hidden fields. It cannot read what the visitor typed into the form. And the form’s JavaScript cannot reach out to read your page’s URL or DOM (Document Object Model — the structured representation of your page that scripts interact with).

    This restriction exists for good reason. Without it, any website could embed your bank’s login page in a hidden iframe and read your password as you type. But the same rule that protects your banking credentials also blocks your UTM parameters from reaching an embedded form.

    2. Cookie Isolation

    Even if JavaScript cannot cross the origin boundary, you might expect cookies to help. If your site stores UTM data in a cookie, could the form read that cookie? No. Cookies set by your domain are first-party cookies (small data files set by the site the visitor is actively browsing). When a browser loads an iframe from forms.hubspot.com, cookies from your domain are not sent with that request. The form platform only receives its own cookies.

    Browser vendors have been tightening these restrictions further. Safari’s Intelligent Tracking Prevention (ITP) already blocks third-party cookies entirely. Firefox’s Enhanced Tracking Protection does the same by default. Chrome is moving toward restricting third-party cookies as well, with ongoing changes to its Privacy Sandbox initiative.

    The practical result: even tracking approaches that once worked by sharing cookies across origins are becoming unreliable across all major browsers.

    3. Referrer Header Loss

    When a browser requests a page, it sends a referrer header telling the destination where the visitor came from. You might hope the iframe’s form would at least receive your page’s URL as a referrer so it could extract UTM parameters from it. Two separate mechanisms prevent this.

    First, the iframe’s referrer is its own origin. When the visitor interacts with the form and it submits, the form submission’s referrer is the iframe’s own URL — not your page. The form platform’s server sees forms.hubspot.com/embed/123 as the referrer, which tells it nothing about your visitor’s original traffic source.

    Second, browsers may further strip referrer information based on their referrer policy. Modern browsers default to strict-origin-when-cross-origin, which reduces the referrer to just the domain (e.g., https://yoursite.com) when making cross-origin requests. The UTM parameters in the full URL path are stripped away before the request is sent.

    Warning: These three mechanisms are enforced independently by the browser. Even if you find a workaround for one — say, passing data via URL parameters to the iframe — the other two can still block your tracking data. A reliable fix needs to address the architectural problem, not just one symptom.

    What This Costs You

    Missing tracking data is not just an analytics inconvenience. It directly affects how you spend money. When form submissions arrive without source attribution, you cannot calculate cost per lead for individual channels. You cannot tell whether your Google Ads campaign or your Facebook campaign produced more leads. You cannot shut off underperforming spend or double down on what works.

    Consider a business spending $3,000 per month across Google, Facebook, and LinkedIn ads. If 40% of leads come through an embedded form that loses all tracking data, nearly half the ad budget is effectively unattributable. That is $1,200 per month in spend with no way to measure return. Over a year, you are making $14,400 in allocation decisions blind.

    The problem compounds over time. Without attribution data, ad optimization relies on guesswork. Campaigns that look underperforming may actually be your best lead source — you just cannot see the submissions they generated because the iframe ate the data.

    Which Form Tools Are Affected

    Not every form tool embeds via iframe. Some use JavaScript to render the form directly in your page’s DOM (the page structure your browser builds), which keeps all tracking data accessible. The table below shows the default embed method for popular form tools and whether iframe tracking data loss applies.

    Form ToolDefault Embed MethodTracking Data Lost?Non-iFrame Option Available?
    HubSpotJavaScript embed or iframeDepends on methodYes — JS API (hbspt.forms.create())
    TypeformiFrameYesLimited — popup/slider modes still use iframe
    CalendlyiFrameYesNo
    JotformiFrameYesYes — JavaScript embed option
    Google FormsiFrameYesNo
    Cognito FormsJavaScript embedNoN/A — default is already non-iframe
    Gravity FormsNative WordPressNoN/A — runs on your server
    Contact Form 7Native WordPressNoN/A — runs on your server
    WPFormsNative WordPressNoN/A — runs on your server
    Fluent FormsNative WordPressNoN/A — runs on your server

    Key takeaway: Native WordPress form plugins (Gravity Forms, Contact Form 7, WPForms, Fluent Forms, and others) do not use iframes. They render directly in your page and process submissions on your server. This makes them inherently compatible with server-side tracking solutions. If tracking accuracy matters to your business, using a native form plugin is the most reliable path — not a workaround, but the genuinely best technical solution.

    Common Fixes and Why They Break

    Before looking at what actually works, it is worth understanding why the most common suggested fixes fall short. Each approach addresses one of the three barriers but leaves the others intact.

    URL Parameter Appending

    The most popular advice is to append UTM parameters to the iframe’s source URL. You modify the embed code so instead of loading forms.hubspot.com/embed/123, it loads forms.hubspot.com/embed/123?utm_source=google&utm_medium=cpc.

    This requires custom JavaScript on your page to read the current URL parameters and rewrite the iframe’s src attribute dynamically. It can work, but it has significant limitations. You need to write and maintain the script. If your URL parameters change format, the script breaks. The approach only passes the parameters you explicitly handle — miss one, and the data is lost. And the form platform must actually read URL parameters from the iframe URL and attach them to the submission, which not all platforms do.

    Most critically, this approach is fragile. It depends on your custom JavaScript running before the iframe loads, on the iframe URL format staying stable, and on the form platform preserving URL parameters through to the submission record. Any of those can change without warning.

    postMessage API

    The browser provides a legitimate cross-origin communication channel called window.postMessage(). Your page can send a message to the iframe, and the iframe can listen for it. In theory, you send the UTM data and the form receives it.

    In practice, this requires code running on both sides of the iframe. You control your page, but you do not control the form platform’s code. Unless HubSpot, Typeform, or Calendly specifically implements a postMessage listener that accepts and stores UTM data, this approach does nothing. Most form platforms do not offer this capability.

    Cookie Bridging

    Some enterprise-grade solutions attempt to bridge cookies between the parent page and the iframe by using a shared first-party subdomain or a server-side proxy. The idea is to make the iframe’s requests appear to come from your domain so first-party cookies are accessible.

    This is technically complex, often requiring DNS configuration, a reverse proxy server, and custom integration with each form platform’s API. It is overkill for most small and mid-sized businesses. The setup varies per form tool, breaks when the platform changes its infrastructure, and introduces security considerations around proxying third-party content through your domain.

    The Right Fix: Capture Data Before the iFrame Loads

    If the iframe is a glass wall that blocks your tracking data, the solution is not to find increasingly elaborate ways to push data through the wall. The solution is to capture the data on your side of the wall before the form even renders.

    Here is the concept. When a visitor arrives on your landing page, your server or your page’s JavaScript already has access to everything you need: the full URL with UTM parameters, click IDs like gclid and fbclid, the referrer header, and any first-party cookies you have set. All of this data is available before the iframe loads.

    A server-side tracking approach captures and stores this data the moment the page loads. The tracking record exists independently of whatever form the visitor eventually fills out. Even if the form is an iframe that sends its submission to a third-party server and loses every bit of context, your server already has the attribution data tied to that visitor’s session.

    The key shift is conceptual: stop trying to make the iframe aware of your tracking data and instead make your server aware of the submission. If the form is native to WordPress, your server processes the submission directly and can attach tracking data at that point. If the form is an iframe, you need a different matching strategy — or a different form.

    How TrueConversion Handles This

    TrueConversion is a WordPress plugin that captures UTM parameters, click IDs (gclid, fbclid, msclkid, and others), and referrer data when a visitor first lands on your site. It stores this data in a first-party cookie on your domain and then automatically attaches it to form submissions when a visitor completes a form.

    This works reliably with native WordPress form plugins — Contact Form 7, WPForms, Gravity Forms, Fluent Forms, Ninja Forms, Formidable Forms, Elementor Pro Forms, Forminator, and Jetpack Forms. TrueConversion hooks into each plugin’s server-side submission process using WordPress PHP hooks. When the form submits, the plugin reads the tracking data from the first-party cookie and attaches it to the entry. No JavaScript injection. No cross-origin issues. The data capture and the form processing happen on the same server.

    Here is what TrueConversion cannot do: it cannot attach tracking data to iframe form submissions that process on a third-party server. This is not a product limitation — it is an architectural constraint. PHP hooks only fire on your WordPress server. When a visitor submits a HubSpot iframe form, that submission goes to HubSpot’s servers. Your WordPress server never sees it, so TrueConversion’s hooks never fire. No WordPress plugin can intercept a form submission that never reaches WordPress.

    This is why switching to a native WordPress form plugin is not a workaround — it is the genuinely best technical solution for reliable embedded form tracking. Native forms submit to your server, where server-side tools can process them. The entire tracking chain stays on your domain, under your control, with no glass wall in the way. You can learn more about how TrueConversion works with each supported form plugin.

    Tip: If you are currently using an iframe form and losing tracking data, the fastest fix is to replace it with a native WordPress form plugin. TrueConversion’s free plan supports all major WordPress form plugins and captures UTM parameters, click IDs, and referrer data automatically.

    When You Must Use an iFrame Form

    Sometimes switching to a native WordPress form is not an option. Your CRM workflow might depend on HubSpot forms. Your booking system might require Calendly. Your team may have built complex conditional logic in Typeform that would take weeks to rebuild. In these cases, you need to work within the iframe constraint.

    Here are the most practical approaches, ranked by reliability.

    Option 1: Use HubSpot’s JavaScript API Instead of an iFrame

    HubSpot offers two embed methods, and most people use the wrong one. The standard embed code creates an iframe. But the HubSpot JavaScript API renders the form directly in your page’s DOM using hbspt.forms.create(). This is not an iframe. The form elements become part of your page, which means JavaScript on your page can interact with them and server-side tracking can capture submission data.

    Here is how to switch. In your HubSpot account, go to Marketing > Forms and select your form. Click “Share” and choose the “Embed code” option. Look for the JavaScript embed rather than the iframe embed. The code looks like this:

    <script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script>
    <script>
      hbspt.forms.create({
        region: "na1",
        portalId: "YOUR_PORTAL_ID",
        formId: "YOUR_FORM_ID"
      });
    </script>

    Paste this into an HTML block on your WordPress page. The form renders natively in your page’s DOM. Your page’s JavaScript can access the form fields, and tracking scripts can read the current URL’s parameters. HubSpot’s own tracking code also works better in this mode because it shares the page context.

    To pass UTM data into hidden fields, add the onFormReady callback:

    <script>
      hbspt.forms.create({
        region: "na1",
        portalId: "YOUR_PORTAL_ID",
        formId: "YOUR_FORM_ID",
        onFormReady: function($form) {
          var params = new URLSearchParams(window.location.search);
          var fields = ['utm_source', 'utm_medium', 'utm_campaign', 'gclid', 'fbclid'];
          fields.forEach(function(field) {
            var value = params.get(field);
            if (value) {
              var input = $form.find('input[name="' + field + '"]');
              if (input.length) {
                input.val(value).trigger('change');
              }
            }
          });
        }
      });
    </script>

    This requires that you have created corresponding hidden fields in your HubSpot form (named utm_source, utm_medium, etc.). Create these in the HubSpot form editor by adding hidden fields and naming them to match your UTM parameters.

    Option 2: Use Hidden Fields with URL Parameter Passing (Typeform, Jotform)

    Both Typeform and Jotform support hidden fields that can be populated via URL parameters. The approach is to append your tracking parameters to the embed URL so the form platform reads them when the iframe loads.

    For Typeform, create hidden fields in your form settings (e.g., utm_source, utm_medium, utm_campaign). Then modify your embed URL to include those parameters. You need JavaScript on your parent page to read the current URL’s parameters and dynamically rewrite the Typeform embed URL before the iframe loads.

    This works but inherits all the fragility described in the “URL Parameter Appending” section above. It requires ongoing maintenance and only passes the parameters you explicitly configure.

    Option 3: Dual Tracking — Capture on Your Page, Match Later

    If you cannot avoid an iframe and cannot use hidden fields, the remaining option is to capture tracking data on your page independently and match it to submissions later. Install TrueConversion (or similar server-side tracking) to record every visitor’s traffic source. Use timestamps and email addresses to manually match entries in your WordPress dashboard with submissions in your form platform.

    This is not automated. It requires manual matching or a custom integration between your WordPress database and your form platform’s API. But it preserves the tracking data rather than losing it entirely, and it gives you a foundation to build automation on later.

    Warning: URL parameter appending and hidden field approaches are inherently fragile. They depend on the form platform’s URL handling, which can change without notice. Always test your tracking after platform updates, and consider migrating to a native form as a longer-term investment in data reliability.

    Choosing the Right Approach for Your Situation

    The decision tree is straightforward. Ask yourself two questions.

    First: can you replace the iframe form with a native WordPress form plugin? If yes, do it. This is not a compromise. Native forms give you better performance (no external resource loading), full control over design, reliable server-side tracking, and no dependency on a third-party platform’s embed behavior. Plugins like WPForms, Gravity Forms, and Fluent Forms can replicate most form logic that people build in HubSpot or Typeform.

    Second: if you must keep the iframe form, does the platform offer a JavaScript (non-iframe) embed? HubSpot does. Jotform does. Cognito Forms does by default. Use the JavaScript embed and pair it with hidden field population.

    If neither option works, you are in the “capture and match” territory. Install server-side tracking to preserve the data, and plan a migration path when time allows.

    How Click IDs Complicate iFrame Tracking Further

    UTM parameters are only part of the picture. Ad platforms also append click IDs to your URLs — gclid for Google Ads, fbclid for Facebook, msclkid for Microsoft Ads. These are unique identifiers tied to specific ad clicks, and they are essential for offline conversion tracking and automated bid optimization.

    Click IDs are even harder to pass through iframes than UTM parameters. They are long, opaque strings that change with every click. You cannot pre-configure them as hidden field defaults. They must be captured dynamically from the landing page URL and forwarded to the form in real time.

    If you are running Google Ads and relying on gclid for conversion tracking, losing this value means Google cannot attribute the conversion back to the specific keyword, ad group, or campaign that produced it. Your automated bidding strategies lose signal, and your cost per acquisition climbs. For a deeper look at this specific problem, see our article on why gclid disappears between pages and how to fix it.

    Embedded Form Tracking Starts on Your Server

    The core lesson is architectural. Iframes create a hard boundary between your page and the form. Browser security rules make this boundary nearly impossible to bypass cleanly from the client side. The tools that reliably solve embedded form tracking are the ones that capture data server-side, on your domain, before any iframe enters the picture.

    If you are currently losing tracking data to iframe forms, start with the simplest change that fits your situation. Switch to a native form plugin if you can. Switch to a JavaScript embed if you cannot. And regardless of which form you use, install server-side tracking so your attribution data is always captured on the page where your visitor actually landed.

    TrueConversion’s how it works page walks through the full capture-to-submission flow. The free plan supports all nine major WordPress form plugins with no entry limits on tracking.

    Stop Losing Leads to iFrame Tracking Gaps

    TrueConversion captures UTM parameters, click IDs, and referrer data the moment a visitor lands on your site — before any iframe has a chance to lose it. Switch to a native WordPress form, install TrueConversion, and see every lead’s traffic source in your dashboard.

    Frequently Asked Questions

    Can Google Tag Manager pass UTM data into an iframe form?

    Google Tag Manager runs JavaScript on your page, which means it is subject to the same cross-origin restrictions as any other script. GTM can read your page’s URL parameters and cookies, but it cannot inject values into an iframe from a different origin. You could use GTM to rewrite the iframe’s src URL with appended parameters (the URL parameter appending approach), but GTM does not bypass the Same-Origin Policy. The iframe form must still be configured to read and store those URL parameters, which depends entirely on the form platform.

    Do any iframe form tools preserve UTM data automatically?

    A few form platforms read URL parameters from their iframe embed URL and store them in hidden fields automatically if configured. HubSpot can do this if you set up the tracking URL parameters in your form settings. Typeform supports it through hidden fields and URL parameter mapping. But none of these approaches are automatic out of the box — they all require explicit configuration, and they only capture the specific parameters you set up. Most platforms default to capturing nothing.

    Is the iframe tracking problem worse on mobile browsers?

    Yes, in practice. Mobile Safari on iOS uses the strictest cookie and tracking restrictions of any major browser, thanks to Apple’s Intelligent Tracking Prevention. Mobile browsers are also more likely to strip referrer headers aggressively. Additionally, mobile users are more likely to switch between apps (e.g., clicking an ad in the Facebook app that opens in an in-app browser), which can create additional context-switching issues that lose tracking parameters before the visitor even reaches your landing page.

    If I switch from a HubSpot iframe form to a WordPress form, will my HubSpot CRM still get the leads?

    Yes, but you need to set up a connection. Most WordPress form plugins offer HubSpot integration add-ons or you can use a tool like Zapier to send submissions from your WordPress form to HubSpot CRM. WPForms, Gravity Forms, and Fluent Forms all have HubSpot integration options. The lead still reaches HubSpot, but the form submission processes on your WordPress server first — which is exactly what allows server-side tracking tools like TrueConversion to attach the traffic source data before the lead is sent to your CRM.

  • Lead Source Tracking for Every WordPress Form Plugin

    You run Google Ads, Facebook campaigns, and maybe some LinkedIn outreach. Leads come in through your WordPress forms. But when your sales team asks “where did this lead come from?” — you check your form entries and find nothing. No channel, no campaign, no click ID. Just a name, an email, and a blank stare. This is the lead source tracking WordPress problem that costs small businesses thousands in wasted ad spend every month.

    Google Analytics tells you that 50 people visited your pricing page. Your CRM says you got 12 form submissions this week. But connecting visitor number 37 to submission number 9? That requires lead source data attached directly to each form entry — and most WordPress form plugins don’t do this out of the box.

    The Multi-Plugin Tracking Nightmare

    Consider a marketing agency that runs its own lead generation. They use Gravity Forms on their main site contact page, Elementor Pro Forms on PPC landing pages, and WPForms on a client referral portal. Three form plugins, three different dashboards, three different data structures — and zero unified tracking across any of them.

    This isn’t unusual. WordPress site owners frequently end up with multiple form plugins because each one excels in a different context. Elementor users want native form widgets. WPForms is quick for simple contact forms. Gravity Forms handles complex conditional logic. The problem isn’t the forms — it’s that none of them share a common attribution layer.

    When a lead submits a form on the Elementor landing page, you want to know they came from a Facebook ad targeting “marketing services.” When another lead fills out the Gravity Forms contact page, you want to know they found you through an organic Google search. Without a unified tracking system, you’re left manually cross-referencing timestamps between Google Analytics and your form entries — a process that breaks down the moment you get more than a handful of leads per day.

    What Lead Source Tracking Actually Means

    Lead source tracking captures the traffic origin data from a visitor’s URL and attaches it to their form submission. There are three categories of data that matter.

    1. UTM Parameters

    UTM parameters are tags you add to your campaign URLs. They follow a standard format: utm_source, utm_medium, utm_campaign, utm_term, and utm_content. When someone clicks a link tagged with ?utm_source=facebook&utm_medium=cpc&utm_campaign=spring_sale, those values ride along in the URL. A tracking system captures them and stores them alongside the lead’s form data.

    UTMs work across every advertising platform because they’re a universal convention. You control the values, so you can make them as specific or general as you need.

    2. Click IDs (GCLID, fbclid, msclkid)

    Ad platforms append their own tracking parameters automatically. Google Ads adds gclid (Google Click Identifier). Meta adds fbclid. Microsoft Ads adds msclkid. TikTok adds ttclid. These click IDs enable offline conversion tracking — you can feed the click ID back to the ad platform to tell it which clicks actually became leads.

    Click IDs are especially important because they connect your lead data directly to the specific ad click that generated it. UTMs tell you the campaign. Click IDs tell the ad platform the exact auction and ad variation. But there’s a catch: click IDs often disappear between pages as visitors navigate your site, which means they need to be captured immediately and persisted through the session.

    3. Organic and Referral Detection

    Not every visitor arrives through a paid campaign. Some find you through Google search, others click a link from a blog post or directory listing. Organic and referral detection uses the HTTP referrer header to identify the source. If the referrer is google.com, the lead came from organic search. If it’s yelp.com, it’s a referral. If there’s no referrer at all, it’s direct traffic.

    A complete lead source tracking system captures all three categories — UTMs for campaigns you control, click IDs for ad platform integration, and referrer detection for everything else. Without all three, you’re only seeing part of the picture.

    How the 9 Major WordPress Form Plugins Handle Lead Source Tracking

    Here’s what each of the major WordPress form plugins offers for lead source tracking natively — and whether it works with TrueConversion for automatic attribution.

    PluginNative UTM SupportNative Click ID CaptureHidden Field SupportTrueConversion Compatible
    Contact Form 7NoNoManual (HTML)Yes
    WPFormsNoNoYes (Pro)Yes
    Gravity FormsVia merge tagsNoYesYes
    Ninja FormsNoNoYesYes
    Formidable FormsVia lookup fieldsNoYesYes
    Fluent FormsNoNoYesYes
    Elementor Pro FormsNoNoYesYes
    ForminatorNoNoYesYes
    Jetpack FormsNoNoNoYes (partial)

    The pattern is consistent: none of the nine plugins capture click IDs natively, and only two offer any kind of UTM support — both requiring manual configuration per form. Hidden fields exist in most plugins, but they require custom JavaScript to populate them, and that code breaks when URLs change or visitors navigate to a different page before submitting.

    Plugin-by-Plugin Breakdown: Manual Setup vs. TrueConversion

    Contact Form 7

    Contact Form 7 is the most widely installed form plugin in the WordPress ecosystem, with over 5 million active installations according to the WordPress plugin directory. It handles form rendering and email delivery. It does not handle lead tracking in any form.

    Manual approach: You add hidden input fields to your CF7 form template, then write custom JavaScript that reads URL parameters on page load and injects the values into those hidden fields. You also need to include those fields in the CF7 mail template so the values actually appear in the notification email. If the visitor navigates to a different page before submitting (common with multi-page sites), the URL parameters are gone and the hidden fields stay empty.

    With TrueConversion: You install the plugin, select Contact Form 7 from the list of enabled forms, and you’re done. TrueConversion hooks into the wpcf7_before_send_mail action, captures all UTM parameters, click IDs, and referrer data from the persisted session cookie, and attaches it to the submission automatically. No hidden fields, no custom JavaScript, no form template edits.

    WPForms

    WPForms offers hidden fields in its Pro version, which means free users have no native path to UTM tracking at all. Even with Pro, you need to create a hidden field for each parameter you want to capture, then use the “smart tag” system or custom JavaScript to populate them.

    Manual approach: Create hidden fields for utm_source, utm_medium, utm_campaign, gclid, fbclid, and any other parameters you need. Configure each field’s default value using WPForms’ query string smart tags. This works on the landing page — but if the visitor clicks to your About page, then navigates to the Contact page, the query string is gone and your hidden fields capture nothing.

    With TrueConversion: Activate the WPForms integration in settings. TrueConversion captures parameters on the first page view, stores them in a session cookie, and injects the data at submission time via the wpforms_process_complete hook. Works on every page regardless of where the visitor navigates.

    Gravity Forms

    Gravity Forms is the closest to native UTM support thanks to its merge tags and query string population feature. You can set a hidden field’s default value to {utm_source:query} and it will pull the value from the URL.

    Manual approach: Add hidden fields, configure each one with the appropriate query string merge tag. This is cleaner than writing custom JavaScript, but it still only works when the parameters exist in the current page URL. Gravity Forms has no built-in mechanism to persist parameters across page navigations. You also need to repeat this setup for every form on your site, and you still can’t detect organic search or referral sources.

    With TrueConversion: Enable the Gravity Forms integration. Every submission gets the full attribution data — UTMs, click IDs, organic/referral source — attached via the gform_after_submission hook. No hidden fields needed in your form builder.

    Tip: Even if you already set up hidden fields in Gravity Forms, TrueConversion still adds value. It captures click IDs and organic/referral sources that merge tags can’t detect, and it persists data across page navigations where query strings disappear.

    Why a Single-Plugin Tracking Approach Falls Apart

    Suppose you solve the tracking problem for WPForms. You set up hidden fields, write the JavaScript, test it, and confirm it works. Now what about the Elementor form on your landing page? That’s a completely different form builder with its own field system, its own submission handler, and its own notification pipeline. Your WPForms JavaScript doesn’t help there.

    Every form plugin stores submissions in its own format. WPForms uses one database table structure. Gravity Forms uses another. Contact Form 7 doesn’t store submissions at all by default — it just sends emails. This means your tracking code, your hidden field configuration, and your data extraction process need to be rebuilt from scratch for each plugin.

    It gets worse when you need to report on the data. Pulling UTM values from three different database structures, normalizing the field names, and combining them into one view is a development project — not a quick settings tweak. Most small businesses either give up and rely solely on Google Analytics (which can’t attribute individual leads) or they abandon multi-plugin setups entirely and force everything through one form builder, sacrificing flexibility.

    The real cost isn’t the developer hours. It’s the leads that slip through without attribution data while you’re still building the solution. Every untracked lead is money spent on advertising that you can’t evaluate, optimize, or justify.

    How TrueConversion Solves Lead Source Tracking Across All 9 Form Plugins

    TrueConversion works at the WordPress level, not at the form plugin level. It captures attribution data before any form plugin gets involved, stores it independently, and injects it at submission time through each plugin’s native hooks. Here’s what that looks like in practice.

    Step 1: Automatic Parameter Capture

    When a visitor lands on any page, TrueConversion’s lightweight JavaScript (under 2KB) reads the current URL and extracts all UTM parameters and ad platform click IDs — gclid, fbclid, msclkid, ttclid, and others. It also checks the HTTP referrer to detect organic search engines and referral domains.

    This all happens on the first page view. The visitor doesn’t need to land directly on a page with a form.

    Step 2: Session Persistence

    The captured data is stored in a first-party cookie that persists through the browsing session. If a visitor lands on your homepage from a Google Ad, browses your services page, reads a case study, and then fills out a contact form three pages later — the original gclid, UTM parameters, and landing page URL are all still available.

    You can configure the conversion window to match your sales cycle. Session-based tracking (the default) covers the current visit. You can extend it to 1 day or 7 days if your leads tend to come back before converting. This is especially useful for higher-consideration purchases where prospects research over multiple visits.

    Step 3: Form Hook Integration

    When a visitor submits any supported form, TrueConversion reads the stored cookie data and attaches it to the submission through the form plugin’s native action hook. There’s no hidden field manipulation, no DOM injection, and no JavaScript form interception.

    Each integration uses the correct hook for the specific plugin:

    • Contact Form 7wpcf7_before_send_mail
    • WPFormswpforms_process_complete
    • Gravity Formsgform_after_submission
    • Ninja Formsninja_forms_after_submission
    • Formidable Formsfrm_after_create_entry
    • Fluent Formsfluentform/submission_inserted
    • Elementor Pro Formselementor_pro/forms/new_record
    • Forminatorforminator_custom_form_submit_before_set_fields
    • Jetpack Formsgrunion_pre_message_sent

    This architecture means TrueConversion doesn’t interfere with your form plugins at all. It doesn’t modify form markup, add fields, or change submission behavior. It simply listens for submissions and records the attribution data in its own database table.

    Step 4: Unified Dashboard

    Every tracked submission — regardless of which form plugin captured it — appears in one dashboard inside WordPress admin. You see the lead’s name, email, form source, UTM parameters, click IDs, detected traffic source, landing page, and submission timestamp in a single sortable, searchable, exportable table.

    No more switching between WPForms entries, Gravity Forms entries, and Contact Form 7 email logs. One view, all leads, all attribution data.

    Tip: TrueConversion’s CSV export includes all attribution columns, making it easy to import lead source data into spreadsheets or external CRMs for deeper analysis.

    Setting Up TrueConversion: 5 Minutes, All Forms

    The setup process is deliberately minimal. Here’s the full walkthrough.

    Install and activate. Download TrueConversion from the WordPress plugin directory or upload it via your dashboard. Activate it like any other plugin.

    Run the setup wizard. On activation, TrueConversion launches a 5-step wizard. It auto-detects which form plugins you have installed and pre-selects them. Confirm your notification email, choose your conversion window, and you’re done.

    Verify your form plugins. Go to Settings and confirm that all your active form plugins appear in the Enabled Forms list. TrueConversion detects Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Formidable Forms, Fluent Forms, Elementor Pro Forms, Forminator, and Jetpack Forms automatically.

    Choose your tracking parameters. The defaults cover all standard UTMs plus the major click IDs. If you use custom parameters (like utm_adgroup or platform-specific IDs), you can add those in settings.

    Set your conversion window. Session-based is the default and works for most sites. If your sales cycle is longer, switch to 1-day or 7-day persistence. This controls how long the tracking cookie lives before expiring.

    That’s the entire setup. No per-form configuration, no hidden field creation, no JavaScript to write. Every form on your site now captures full attribution data.

    How to Verify Your Lead Source Tracking Is Working

    After setup, you should test every form plugin you use. Here’s a reliable testing process.

    Test UTM Parameter Capture

    Open an incognito browser window (this ensures no existing cookies interfere). Navigate to any page on your site with UTM parameters appended to the URL:

    https://yoursite.com/contact/?utm_source=test&utm_medium=cpc&utm_campaign=verification&gclid=test123

    Now navigate to a different page — your homepage, an about page, anywhere without UTM parameters in the URL. Then navigate to a page with a form and submit a test entry. Check the TrueConversion dashboard. Your test submission should show all four parameters: utm_source=test, utm_medium=cpc, utm_campaign=verification, and gclid=test123.

    Test Organic/Referral Detection

    This is harder to simulate directly, but you can verify it works by searching for your site on Google and clicking through to a form page. Submit a test entry and check the dashboard — it should show “Organic Search (Google)” as the traffic source.

    Test Each Form Plugin

    If you use multiple form plugins, repeat the UTM test for each one. Open an incognito window with UTMs, navigate to a page with a Contact Form 7 form, submit it, and check the dashboard. Then do the same for your WPForms contact form, your Gravity Forms quote request, and any other forms across your site.

    Every submission should appear in the TrueConversion dashboard with identical attribution data, regardless of which form plugin handled the submission. If any form isn’t tracking, check that the plugin appears in your Enabled Forms list under TrueConversion settings.

    Tip: Delete your test entries from the TrueConversion dashboard after verification so they don’t pollute your real lead data. You can select them in bulk and remove them from the entries table.

    Common Tracking Pitfalls and How to Avoid Them

    Even with a unified tracking plugin, a few things can reduce the quality of your attribution data.

    Inconsistent UTM Naming

    If one campaign uses utm_source=Facebook and another uses utm_source=facebook, they appear as two different sources in your reports. UTM parameters are case-sensitive. Pick a convention (lowercase is standard) and stick with it across all campaigns. Google’s own Campaign URL Builder can help enforce consistency.

    Caching Plugins Serving Stale Pages

    Aggressive page caching can sometimes serve a cached version of your page where the tracking JavaScript hasn’t loaded fresh. TrueConversion’s script runs client-side and reads parameters from the visitor’s actual URL, so standard page caching shouldn’t cause issues. However, if you use a CDN that caches the entire HTML response including inline scripts, verify that tracking still fires by running the UTM test described above.

    Bot Submissions Clouding Your Data

    Spam bots submit forms too, and they rarely carry UTM data. This creates entries with blank attribution that can skew your tracking percentages downward. Reducing spam submissions through form protection measures keeps your lead source data clean. We covered practical approaches to this in our guide on stopping spam in WordPress forms.

    Missing Click IDs in Ad Platform Reports

    If you’re using TrueConversion’s click ID data for offline conversion imports, make sure auto-tagging is enabled in your Google Ads account (it’s on by default) and that your Facebook pixel is configured to append fbclid. Without these settings, the click IDs won’t appear in your URLs in the first place.

    What You Can Do With Proper Lead Source Data

    Once every form submission carries attribution data, you unlock several capabilities that were previously impossible without an enterprise marketing stack.

    Calculate real cost per lead by channel. If you spent $500 on Google Ads and TrueConversion shows 15 leads with utm_source=google, your cost per lead is $33.33 from that channel. Compare that with your Facebook spend and lead count to see which platform delivers better ROI.

    Identify your highest-converting campaigns. Sort your TrueConversion entries by utm_campaign to see which campaigns generate the most leads. This tells you where to increase spend and which campaigns to pause.

    Feed conversion data back to ad platforms. Export submissions with click IDs and upload them as offline conversions in Google Ads or Meta. This trains the platform’s algorithm to find more people like the ones who actually submitted forms — not just the ones who clicked. Our guide on offline conversion tracking without a CRM walks through this process in detail.

    Prove marketing ROI to clients or stakeholders. If you’re an agency, the TrueConversion dashboard and CSV export give you concrete data to show clients exactly which channels are delivering leads. No more “trust us, the campaigns are working.”

    Free vs. Pro: What You Get at Each Level

    TrueConversion’s free tier includes all tracking features, all 9 form plugin integrations, the admin dashboard, and CSV export. It stores up to 10 entries on a rolling basis, which is enough to verify that tracking works and to evaluate the data quality.

    The Business plan removes the entry limit, adds per-submission email notifications and monthly summary emails. The Enterprise plan adds daily and weekly summary emails for teams that need more frequent reporting.

    For most small businesses, the free plan is the right starting point. Install it, verify that your forms are tracking correctly, and upgrade when you need unlimited storage or email notifications.

    Stop Guessing Where Your WordPress Form Leads Come From

    Lead source tracking for WordPress forms doesn’t have to be a per-plugin problem. You shouldn’t need to configure hidden fields in WPForms, set up merge tags in Gravity Forms, and write custom JavaScript for Contact Form 7 — all to get the same data point attached to each submission.

    TrueConversion gives you lead source tracking across every major WordPress form plugin with a single five-minute setup. UTM parameters, click IDs, organic detection, and referral identification — all captured automatically and stored in one unified dashboard. Install it free, test it with your forms, and see exactly where your leads come from.

    Know Which Channel Brings Each Lead

    TrueConversion tracks UTM parameters, click IDs, and organic sources across all 9 major WordPress form plugins. Free plan includes full tracking, all integrations, and a unified dashboard. Set it up in 5 minutes and see exactly where your leads come from.

  • Stop Human Spam on WordPress Forms (When CAPTCHA Fails)

    The Problem: Real People, Fake Interest

    You open your WordPress dashboard to 15 new form submissions. Your heart rate picks up — busy week. Then you start reading.

    Five are from SEO agencies offering to “get you to page 1.” Three are offshore development teams pitching website redesigns. Two are job seekers attaching resumes to your contact form. Two are vague “partnership opportunity” messages that say nothing specific. That leaves three actual customer enquiries buried in the pile.

    The frustrating part: every one of these spammers passed your CAPTCHA, because they are all real humans. You’ve spent money on Google reCAPTCHA, you’ve set up honeypots, and your spam problem hasn’t changed one bit.

    This isn’t a bot problem. It’s a human intent problem. The people flooding your inbox are sitting at real computers, typing real messages, and solving every CAPTCHA challenge you throw at them. No amount of bot detection will help when the spam is coming from actual people.

    Meanwhile, those three genuine enquiries — the ones that could become paying customers — sit unread for hours because you’re busy sorting through pitches you never asked for. If you’re tracking where your leads come from, you already know how valuable each real submission is. Losing even one to inbox fatigue is a problem worth solving.

    Why Anti-Bot Tools Can’t Solve a Human Problem

    reCAPTCHA — including the invisible v3 version — scores “human-ness,” not intent. It asks one question: is this visitor a real person or an automated script? A human pitching SEO services scores 0.9 out of 1.0, indistinguishable from a genuine customer. reCAPTCHA does exactly what it was designed to do. The problem is that what it was designed to do isn’t what you need.

    Honeypot fields work by adding invisible form fields that only automated bots can see and fill in. Real humans never interact with them. That makes honeypots effective against scripts, but completely useless against a person manually typing a sales pitch into your contact form.

    Keyword filters are the blunt-instrument approach. Block the word “SEO” and you also block the genuine client asking “do you offer SEO services?” Block “partnership” and you lose a legitimate joint venture enquiry. Every keyword rule is a trade-off between spam caught and leads lost, and you’ll never get the balance right because spammers and customers use the same vocabulary.

    Time-based friction fields — requiring a minimum number of seconds before a form can be submitted — slow down bots that fill and fire in milliseconds. But human spammers spend 30 seconds or more filling out your form anyway. They clear that threshold without trying.

    The Five Types of Human Spam Hitting Your Form

    Not all human spam looks the same. Understanding the categories helps you see why single-rule defences always fail. Here are the five types you’re most likely dealing with.

    1. SEO and marketing agency pitches. “We noticed your website isn’t ranking for [keyword]…” These are templated outreach messages sent manually to thousands of contact forms. The sender doesn’t know your business and doesn’t care. They copied the same message into your form that they copied into 200 others today.
    2. Offshore development offers. “We are a team of expert developers…” Usually from agencies offering website redesigns, app development, or IT outsourcing at suspiciously low rates. The pitch is generic enough to send to any business with a website, which is exactly what they do.
    3. Guest post and link building requests. “I’d love to write a guest post for your blog…” These are link-building schemes disguised as content collaboration. The “guest post” will contain backlinks to their client’s site. They’re not interested in your audience. They want your domain authority.
    4. Job seekers and freelancers. People submitting resumes or offering their services through your general contact form instead of a careers page — which you may not even have. Well-intentioned, but irrelevant to your sales pipeline and time-consuming to sort through.
    5. Vague “partnership” messages. “I have an exciting business opportunity…” These say nothing specific, promise everything, and usually lead to a sales call for something you don’t need. They’re designed to get a reply, not to provide value.

    Every one of these senders is a real person. Every one passes CAPTCHA. Every one wastes your time. And every one looks legitimate enough in a notification email that you have to open and read the full message before you realise it’s junk.

    What Actually Works (And What Doesn’t)

    If anti-bot tools are out, what’s left? Three approaches exist for dealing with human spam, and they sit on a spectrum from crude to intelligent.

    Keyword and Phrase Blocking

    You can block submissions containing specific phrases: “I noticed your website,” “our team of experts,” “guest post opportunity.” This catches the most blatantly templated spam, and if you’re drowning in identical pitches it provides immediate relief.

    The problem shows up fast. A real customer writes “I noticed your website while searching for accountants in Brisbane” and gets blocked. A legitimate blogger asks about a “guest post opportunity” and never reaches you. Every phrase you add to the blocklist is another door you might be closing on revenue.

    Keyword blocking is better than nothing, but it’s fragile. Spammers adjust their wording, your rules go stale, and you end up maintaining a growing list of phrases that you’re never confident about. High false-positive risk means high anxiety.

    Email Domain Blocking

    Blocking known spam domains and disposable email providers (like Guerrilla Mail or Mailinator) catches a narrow slice of the problem. It works well for throwaway accounts used by bots and low-effort spammers.

    But most human spammers use legitimate email addresses. The SEO agency pitching you has a real Gmail account or a company domain. The offshore dev team uses a professional-looking company email. Domain blocking stops the least sophisticated offenders and misses everyone else. Low impact on the actual problem.

    AI Content Classification

    This is the only approach that reads the actual message and understands intent. Not keyword matching — context analysis. It examines the full text of a submission and determines what the sender wants.

    The difference is best shown with an example. “I need help with my website’s SEO” is a genuine customer looking for a service. “We offer SEO services starting at $99/month” is a sales pitch. Both contain the word “SEO.” A keyword filter treats them identically. AI classification reads the full message and understands the direction of intent — is this person asking for help, or offering services?

    That distinction — direction of intent — is something keyword rules can’t capture because it depends on context, sentence structure, and the relationship between ideas in a message. AI classification handles it naturally because it processes language the way humans do, just faster and more consistently.

    This is where TrueConversion Pro comes in. It runs every form submission through AI classification and labels it: genuine commercial enquiry, sales pitch, job seeker, or spam. You see the label in your dashboard instantly. No manual sorting. No keyword lists to maintain. No guessing.

    TrueConversion never deletes submissions. It labels them. Every message stays in your dashboard — genuine leads are highlighted, junk is categorised. You’re always in control, and you can always review anything the AI flagged.

    Protecting Real Leads While Filtering Junk

    The real fear isn’t spam. It’s missing a $10,000 client because your spam filter caught their message. That fear is completely rational, and it’s the reason many business owners tolerate spam rather than risk losing a single lead.

    This is exactly why classification is safer than filtering. A keyword filter makes a binary decision: block or allow. Once a message is blocked, it’s gone. You never see it. You never know what you missed. That uncertainty is the real cost of aggressive filtering — not the spam it catches, but the leads it might silently discard.

    AI classification works differently because it reads context, not just words. Consider a real estate agent who writes: “Do you do SEO for real estate agencies? We’re looking for help with our local search rankings.” That message contains the word “SEO” — a keyword filter blocks it. AI classification reads the full message and understands this person is looking for a service, not selling one. It labels the submission as a genuine enquiry and puts it at the top of your dashboard.

    The label-not-delete philosophy means every submission stays in your dashboard regardless of its classification. AI categories are suggestions, not judgments. You can review any category at any time. If a message was mislabelled, you see it and reassign it with one click. Nothing is hidden. Nothing is permanently removed.

    This approach lets you focus your time on the submissions that matter while keeping the safety net fully intact. Instead of reading 15 messages to find three leads, you read the three messages labelled “genuine enquiry” and glance at the rest only if you want to. The time savings are immediate. The risk is effectively zero.

    Tip: Check your “Sales Pitch” category once a week for the first month. After that, you’ll trust the classifications enough to ignore them — but the safety net is always there.

    For a deeper look at how AI classification works under the hood — including how it handles edge cases and ambiguous messages — read our detailed guide on AI lead classification for WordPress forms.

    Get Started

    Free: Install TrueConversion and see every lead in one dashboard with its traffic source. It works with nine form plugins out of the box — Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Formidable Forms, Fluent Forms, Elementor Pro Forms, Forminator, and Jetpack Forms. Even without AI classification, having all your submissions in one place with source tracking makes triage faster than jumping between plugins. Download TrueConversion free.

    Pro ($49/mo, 14-day free trial): AI classification sorts your submissions automatically the moment they arrive. If you spend 15 minutes a day reading through spam to find real leads, Pro pays for itself in the first week. Every submission gets labelled, every genuine enquiry gets highlighted, and you stop losing time to junk you never asked for.

    Stop Reading Spam, Start Closing Leads

    TrueConversion’s AI reads every form submission and tells you which ones are real customer enquiries. Genuine leads get highlighted. Sales pitches, job seekers, and junk get labelled and moved out of your way. Nothing is deleted — you’re always in control.

    Further reading: Learn how AI lead classification works for WordPress forms, or see how to stop wasting your Google Ads budget on junk leads.

  • WordPress Form Tracking Beyond Google Analytics — Per-Lead Attribution

    Google Analytics can tell you how many people visited your WordPress site, which pages they viewed, and where they came from. It can even show you that a form was submitted by tracking a thank-you page view or a custom event. But there’s one thing it fundamentally cannot do: connect a specific form submission to a specific visitor session.

    When John Smith fills out your contact form at 2pm on Tuesday, Google Analytics knows that someone from Sydney visited via Google Ads and submitted a form. Your form plugin knows that John Smith from john@example.com sent a quote request. But neither system connects these two facts together. You can’t look at John’s form submission and say “he came from our Google Ads plumbing campaign.”

    This is the gap between aggregate analytics and per-lead attribution — and it’s the gap that costs small businesses real money in misallocated marketing spend.

    The solution: TrueConversion bridges the gap between analytics and form submissions. See the traffic source for every individual lead. Free WordPress plugin.

    What Google Analytics Does Well (and Where It Stops)

    Google Analytics is excellent at aggregate traffic analysis. It shows you:

    • Total visitors by source (Google Ads, organic, social, direct)
    • Page-level engagement metrics (bounce rate, time on page)
    • Conversion events (form submissions, button clicks)
    • User flow through your site
    • Campaign performance at a traffic level

    This is useful for understanding overall trends. But when it comes to form leads, Google Analytics tells you how many people from each source submitted forms — not which specific people. And with GA4’s privacy-first approach, data sampling, and consent requirements, even the aggregate numbers can be unreliable for low-traffic sites.

    For a business that receives 5 to 50 leads per month, you don’t need statistical trends — you need to know where each lead came from. That requires per-lead attribution, which is a fundamentally different approach from analytics. And once you have per-lead data with click IDs attached, you can import offline conversions into Google Ads to improve your campaign targeting.

    Per-Lead Attribution: A Different Approach

    Per-lead attribution works by capturing the visitor’s traffic source data at the moment they land on your site and attaching it directly to their form submission. Instead of aggregate statistics, you get a clear, per-submission answer.

    The data you get for each lead includes:

    • Traffic source label — “Google Ads”, “Meta Ads”, “Organic Search”, “Referral”, or “Direct”
    • UTM parameters — the specific campaign, medium, and source from the URL
    • Click ID — the platform-specific identifier (gclid for Google, fbclid for Facebook)
    • Landing page — which page the visitor first arrived on
    • Referrer — which website sent them

    This is the data that Google Analytics knows about the session but can’t connect to the form submission. Per-lead attribution captures it at the session level and carries it through to the form.

    How TrueConversion Bridges the Gap

    TrueConversion is a free WordPress plugin that provides per-lead attribution for all 9 major WordPress form plugins. It works independently of Google Analytics — no GA4 configuration, no Tag Manager, no custom events needed.

    Here’s how it works:

    1. A lightweight JavaScript runs on every page, capturing UTM parameters and click IDs from the URL
    2. The data is stored in a cookie and localStorage, persisting through the browsing session
    3. When the visitor submits any form, TrueConversion reads the stored data and saves it alongside the submission
    4. Every entry appears in a dashboard with a colour-coded traffic source badge

    The setup takes two minutes: download the plugin, install, run the wizard, done. No analytics configuration, no tracking code, no developer needed.

    No GA4 setup required. TrueConversion captures traffic source data independently. Works even if you don’t have Google Analytics installed.

    TrueConversion vs Google Analytics: What Each Does Best

    These tools solve different problems and work well together:

    Google Analytics is best for understanding overall traffic patterns, user behaviour across your site, audience demographics, and page-level performance. Use it for big-picture marketing strategy.

    TrueConversion is best for connecting specific leads to specific marketing channels. Use it to answer “where did this lead come from?” and “which channel generates real customers?” It also lets you send real conversions to Google Ads (available on the Pro plan) — something Google Analytics can’t do. For teams using Tag Manager, our GTM conversion tracking guide covers the standard setup process.

    Use both. Google Analytics for traffic analysis. TrueConversion for per-lead attribution and conversion tracking. Together they give you a complete picture of your marketing performance. See the How It Works page for more details.

    Works With 9 WordPress Form Plugins

    TrueConversion supports Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Formidable Forms, Fluent Forms, Elementor Pro Forms, Forminator, and Jetpack Forms. See the full list of supported plugins.

    Download TrueConversion — Free

    Go beyond Google Analytics. See where each individual form lead comes from. Free forever, works with 9 form plugins.

    Frequently Asked Questions

    Do I still need Google Analytics?

    Google Analytics and TrueConversion solve different problems. Keep Google Analytics for overall traffic analysis and site behaviour. Use TrueConversion for per-lead attribution. They complement each other.

    Does TrueConversion use Google Analytics data?

    No. TrueConversion captures traffic source data independently using its own JavaScript. It doesn’t require or connect to Google Analytics in any way.

    Will TrueConversion work if I don’t have Google Analytics installed?

    Yes. TrueConversion is completely independent. It works regardless of whether you have Google Analytics, Tag Manager, or any other analytics tool installed.