Your desktop test looks perfect. You paste a tagged URL, fill the form, and the entry shows utm_source and the campaign. Then a real phone lead arrives with a name and a message, and the source fields are blank.
That gap shows up a lot. People click ads inside Instagram, Facebook, TikTok, or Gmail. They land on your WordPress page in an in-app browser. Later they finish the form in Safari. Desktop Chrome never saw that path, so your “it works on my laptop” check missed the break.
This post walks through why UTM tracking fails on mobile WordPress forms more than on desktop, what free LeadSource 1.0.8 actually stores on a phone fill, and how to test a tagged visit on a real device. It stays honest about same-session limits. It does not invent a 90 day cookie or a first-plus-last stamp.
Why mobile looks blank when desktop looks fine
Desktop tests are usually one browser, one window, one continuous session. You open the tagged landing page, click to the form, and submit. The query string is still in living memory, or a session cookie you set a minute ago is still there.
Mobile traffic is messier. The visitor may open your link inside an app browser, bounce to another tab, hand off to Safari, or come back hours later after the app killed the WebView. The form still submits. The UTM values often do not.
WordPress form builders still do their job. Contact Form 7, WPForms, Gravity Forms, and the rest save name, email, and message. Many also store the URL of the page that held the form. That is the conversion page, not the tagged arrival. Hidden fields that only read the current page URL go empty when the tags never made it onto that page. The same confusion shows up when people expect the first page and get the form page instead. That landing-page mix-up is covered in Which Landing Page Produced Each WordPress Lead.
If your “source” only lives in a hidden field filled on the form page, mobile visitors who arrived tagged on a service page and then browsed will look like they came from nowhere.
In-app browsers and a new session when they leave the app
A large share of paid clicks never open “full” Safari or Chrome first. They open inside the social app. That WebView has its own cookie jar. A first-party session cookie set there belongs to that in-app browser.
When the visitor taps “Open in Safari,” or closes the app and later types your domain into Safari, that is a new browser context. The session cookie from the in-app visit does not travel with them. Free LeadSource is same session only. The cookie ends when that browser closes. Closing the in-app browser, or moving to a different browser, starts a fresh session with no UTM stamp.
So the story people describe as “UTM tracking not working on mobile WordPress” is often “the person who clicked the ad is not the same browser session as the person who submitted.” Desktop rarely does that handoff. Phones do it every day.
If they stay inside the in-app browser, browse a few pages, and submit before that WebView dies, the session cookie can still be present. The break is the exit, not the phone itself.
Same-session honesty is the whole point of Same Session Attribution vs 90 Day UTM Cookies. LeadSource will not pretend a visit from Tuesday’s Instagram WebView still owns Friday’s Safari form fill.
Safari, privacy tools, and scripts that never run
Safari on iOS is stricter about storage and third-party behaviour than a typical desktop Chrome profile. Intelligent Tracking Prevention and related privacy features cut down long-lived tracking cookies. A same-session first-party cookie is a smaller target than a 90 day tracker, which is why LeadSource keeps the window short on purpose.
That still leaves a simpler failure. The capture script never runs. Ad blockers, content blockers, and consent banners that delay or block scripts until a click can leave the URL unread. If JavaScript does not run on the tagged landing page, nothing gets written into the session cookie. The form still works. The source fields stay empty.
Mobile Safari form pain shows up in support threads even when UTM is not the ask. WPForms Lite has a long thread about fills that will not submit from iOS devices. Another thread reports forms that fail in Safari only. Those are submit bugs, not attribution bugs, but they remind you that the phone path is not the same as your laptop path. Test on a real device, not only in a desktop private window.
Redirect chains and security tools can also strip query tags before the page paints. That problem is not mobile-only, yet phones hit more short-link and in-app redirect hops. WordPress Stripping UTM Parameters and UTM Parameters Disappear on WordPress cover the stripping and vanish cases in more detail.
Delayed JS, cache, and the race before Submit
Plenty of WordPress sites “fix” UTM capture with hidden fields and a small script. On a cold desktop load that can look fine. On a cached mobile page it falls apart.
A common failure mode is the race. The form HTML renders from cache with empty hidden fields. The UTM script runs late, or not at all on that paint. The visitor hits Submit before the fields fill. A wordpress.org thread titled “UTM Parameters not captured” describes that exact pattern with Gravity Forms and host caching. Values lived in a cookie while browsing, yet the hidden fields on the form page stayed empty unless the form URL was hit directly. Excluding the form page from cache, or whitelisting query args, was part of their workaround.
Performance plugins that defer or delay JavaScript make the race worse on slower phones. Consent tools that hold scripts until Accept is tapped do the same. The visitor can reach Submit before your capture code has run.
LeadSource is built to avoid depending on hidden UTM fields for its native form hooks. Capture still needs the browser script to run on the tagged page so the session cookie can be set. If a cache or delay plugin blocks that script on first paint, you get the same blank source. The difference is you are not also fighting empty hidden inputs on every form.
What free LeadSource 1.0.8 actually stores on a mobile fill
The free LeadSource plugin hooks the form plugins you already use. Native hooks in 1.0.8 are Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Formidable Forms, Fluent Forms, Elementor Pro Forms, Everest Forms, and Forminator. Forminator is hooked in 1.0.8. You do not maintain hidden UTM fields for those builders.
Capture runs in the visitor’s browser. A small vanilla script reads the URL on page load and stores the data in a first-party session cookie. On a successful submit, the form hook attaches that session data to a LeadSource row. It is not a server-side first-request database save of UTM before anyone submits. The stamp rides in the browser session until the form fires.
When the URL has UTM parameters or a recognised click ID, the script writes those values and can set the landing page to the current page. While the visitor browses inside your site with no new tags, the existing cookie stays. Closing the browser ends the session.
Click IDs named in the readme today are gclid, fbclid, msclkid, li_fat_id, and ttclid. The listing does not name gbraid or wbraid.
The form plugin’s own entries screen is unchanged. LeadSource keeps the attribution row in its dashboard. Notification mail can show source fields beside the name. The overview is in How to Track Lead Sources in WordPress Forms. The click-to-dashboard flow is in How It Works.
Free 1.0.8 stays fully functional for basic UTM on mobile inside one session. You do not need Pro to see utm_source on a phone fill that stayed in the same browser. LeadSource Pro is $99 a year when the real ask is lead journeys, per-source routing, scheduled reports, or white label. Reach for that only when journey depth or routing is the job.
How to test a tagged visit on a real phone
A desktop private window is useful. It is not enough if most of your leads come from phones.
- On the phone, open a private Safari or Chrome tab (not the Instagram in-app browser first).
- Hit a landing page with a test tag, for example /services/repairs?utm_source=mobiletest&utm_medium=manual&utm_campaign=phone-check.
- Confirm the address bar still shows the UTM keys. If they vanish on first load, fix stripping before you blame the form.
- Browse to the form the way a visitor would. Do not paste the tags onto the form URL.
- Submit with a name you will recognise.
- Open the LeadSource dashboard row. Confirm source, campaign, and landing page match the tagged arrival, while the form page URL is the conversion page.
- Repeat once inside an in-app browser if that is where your ads open. Submit without leaving the app. Then try the handoff to Safari and expect a new empty session if the WebView closed.
If desktop is full and the phone private tab is empty, check script delay, consent blocking, and cache on the landing page. If the in-app path is empty only after “Open in Safari,” that is the new-session rule working as designed, not a plugin bug.
What this plugin still does not fix
LeadSource records source for the current session. It does not keep a 90 day cookie. It does not stamp first touch and last touch as two separate values. It does not save UTM into the database on the first request before submit. It does not capture gbraid or wbraid. It does not export CSV from free 1.0.8.
It will not make an Instagram WebView session survive in Safari after the visitor leaves the app. Same session means same browser session.
It will not run if an ad blocker or a consent wall blocks the script. The form can still submit. The source fields will be blank.
It will not repair a host or security plugin that strips query parameters before the page loads. Fix stripping first, then retest capture.
Cross-origin embeds (Typeform, Calendly, a form in another site’s iframe) sit outside the native WordPress form hooks. LeadSource stamps the hooked WordPress form plugins listed above. It does not see a submit that never hits those hooks.
Short checklist
- Confirm your form is one of the nine native hooks in free 1.0.8, including Forminator if that is your builder.
- Install LeadSource from wordpress.org, finish the setup wizard, and leave the session cookie on.
- Make sure the capture script is not delayed behind a consent click on the tagged landing page.
- Exclude form and landing pages from aggressive cache rules that serve empty fields or strip query tags.
- Test on a real phone private tab from a tagged service page, then browse to the form.
- Separately test the in-app browser path your ads actually open. Expect a new session if they leave the app.
- Read the LeadSource row. Source and landing page should match the tagged arrival for that session only.
Blank mobile UTM is usually a session break, a blocked script, a stripped query string, or a hidden-field race, not “WordPress cannot track phones.” Free LeadSource keeps the stamp for the length of the browser session and attaches it when a hooked form submits. That is enough for same-session mobile fills. It is not a promise that every ad click still owns a form fill days later in a different browser.

Leave a Reply