This page is the reference for what SmartDingo Form Tracker captures in the browser: the full list
of tracked fields per plan, how first-touch and last-touch attribution differ, how the referrer
channel is worked out, and where the data is stored. For mapping these values into your form, see
Field mapping & auto-fill.
Everything is captured client-side by the tracker script (sdft-tracker.js) that loads on your
pages. On each page view it reads the URL query string, the referrer, and the browser environment,
then writes the enabled values into browser storage under an sdft_ key prefix. When a mapped form
is submitted, the stored values are filled into your form fields (and, on paid plans, sent to the
Leads page).
Only enabled fields are captured — turn fields on under SmartDingo Form Tracker → Settings →
Tracking Fields. Fields above your plan are shown but locked.
Note Because capture happens in the browser, values only exist once the tracker has run and
(if you use a consent mode) consent has been granted. Until then, data is buffered in memory and
written once consent arrives. See GDPR & consent.
Attribution decides what happens when a value is already stored and a new page view brings a new
one:
utm_id areref/affiliate_id are overwritten only when thatfirst_utm_* set, landing page, device12 fields on Free, +14 on Starter, +8 on Pro (34 total). Badges show the plan a field
requires; unbadged fields are on every plan.
| Field | Plan | Attribution | What it captures |
|---|---|---|---|
| UTM Source | Last-touch | utm_source from the URL | |
| UTM Medium | Last-touch | utm_medium from the URL | |
| UTM Campaign | Last-touch | utm_campaign from the URL | |
| UTM Term | Last-touch | utm_term from the URL | |
| UTM Content | Last-touch | utm_content from the URL | |
| Google Click ID (gclid) | Last-touch | Google Ads gclid | |
| Landing Page | First-touch | Path of the first page of the session (home for the root) | |
| Device Type | First-touch | desktop, mobile or tablet (see limitations) | |
| Visit Timestamp | First-touch | Visitor-local date/time with timezone offset, ISO-style | |
| Referrer URL | First-touch | document.referrer (empty if none) | |
| Search Term | First-touch | Search query pulled from the referrer (see limitations) | |
| Conversion Page | At submit | Path of the page where the form was submitted | |
| UTM ID | (Starter) | Last-touch | utm_id from the URL |
| Facebook Click ID (fbclid) | (Starter) | Last-touch | Meta fbclid |
| Microsoft Click ID (msclkid) | (Starter) | Last-touch | Microsoft/Bing Ads msclkid |
| Google Ads Source (gad_source) | (Starter) | Last-touch | gad_source |
| Google Ads iOS (gbraid) | (Starter) | Last-touch | gbraid |
| Google Ads iOS (wbraid) | (Starter) | Last-touch | wbraid |
| First UTM Source | (Starter) | First-touch | Original utm_source |
| First UTM Medium | (Starter) | First-touch | Original utm_medium |
| First UTM Campaign | (Starter) | First-touch | Original utm_campaign |
| First UTM Term | (Starter) | First-touch | Original utm_term |
| First UTM Content | (Starter) | First-touch | Original utm_content |
| Referrer Category | (Starter) | First-touch | Derived marketing channel (see below) |
| Visitor Type | (Starter) | Derived | new or returning, based on a stored visitor identifier |
| Visited Pages | (Starter) | Cumulative | Comma-separated list of recent page paths, capped per plan |
| LinkedIn Click ID (li_fat_id) | (Pro) | Last-touch | LinkedIn li_fat_id |
| X/Twitter Click ID (twclid) | (Pro) | Last-touch | X/Twitter twclid |
| TikTok Click ID (ttclid) | (Pro) | Last-touch | TikTok ttclid |
| Referral ID (ref) | (Pro) | Last-touch | ref query parameter |
| Affiliate ID | (Pro) | Last-touch | affiliate_id query parameter |
| Pages Viewed Count | (Pro) | Cumulative | Total page views, incremented on every page |
| Session Duration (seconds) | (Pro) | At submit | Seconds between session start and submission |
| Visit Count | (Pro) | Cumulative | Number of distinct visits/sessions |
Note The Visited Pages list is capped at 10 (Free) / 30 (Starter) / 50 (Pro) entries;
once full, the oldest paths drop off.
Referrer Category (Starter) turns the raw referrer and URL into one marketing channel. It is
evaluated in this order:
email — if utm_medium is email or e-mail.gclid, gbraid, wbraid, msclkid, fbclid, li_fat_id, twclid, ttclid, gad_source.paid_search if a paid signal is present, otherwise direct.paid_search with a paid signal, otherwise organic_search.t.co, LinkedIn, Pinterest, TikTok, Reddit,paid_social with a paid signal, otherwise organic_social.referral.So the possible values are email, paid_search, organic_search, paid_social,organic_social, referral and direct. Categorisation is based on a built-in list of well-known
domains; a niche search engine or network not on the list is reported as referral.
Be realistic about these two fields — both are best-effort.
Warning Device Type is inferred from the browser user-agent string. It is a coarse
desktop/mobile/tabletguess, not a device database: spoofed or unusual user agents, and
some tablets that identify as desktop, can be misclassified.
Warning Search Term only works when the referring URL actually contains a
q=orp=
query parameter. Modern search engines (Google in particular) strip the query from the referrer
for privacy, so this field is frequently empty even for genuine organic-search visits. Treat a
populated value as a bonus, not something to rely on.
The tracker uses one of two browser stores, chosen on the Settings page:
| Backend | Plans | Lifetime |
|---|---|---|
| sessionStorage | Free (forced), or chosen on paid | Cleared when the tab/session ends |
| localStorage | Starter / Pro | Persists across sessions until cleared |
On the Free plan localStorage is locked, so tracking is forced into sessionStorage.
Starter and Pro can pick either backend.
Note Two values are the exception and always use
localStorage, even when sessionStorage
is selected: the visitor identifier and the visit-count total. That is what lets
Visitor Type and Visit Count recognise a returning visitor across sessions.
If the browser blocks storage entirely — Safari Private mode, hardened privacy settings — the
tracker falls back to an in-memory store so the current page still works. That fallback holds
nothing between page loads.
localStorage visitorGDPR Stored visitor data becomes personal data once it is tied to a submitted form. Pick a
storage backend and consent mode deliberately — see
GDPR & consent.
You’ve spent the budget. You’ve run the campaigns. You deserve to know what actually worked. SmartDingo gives you complete, accurate, first-party attribution for every WordPress form submission. Start today on the forms you already use.
SmartDingo is a WordPress lead tracking plugin built for online marketers and WordPress developers who need accurate, cookieless attribution. It captures UTM parameters, traffic sources, landing pages, and full visitor journeys for every form submission, working seamlessly with Fluent Forms, Gravity Forms, Ninja Forms, WPForms, and other major WordPress form plugins. Whether you’re tracking leads from Google Ads, Meta, LinkedIn, or organic search, SmartDingo connects every lead to the marketing campaign that generated it.