Repository navigation
1.2.0
One core for every host. Browser capture, introduced in 1.1.0, is now the only code path. Field
names, shortcodes and the mu-plugin install are unchanged from 1.1.0.
Added
- Field maps for embedded forms that use their own field names, such as a CRM form rendered on the
page. Fields are added or taken over at page load and filled again at submit; the embed code isn't
edited. - Site config through the
gd_ls_configfilter, from a per-site file beside the core. - Fields
channel(GA4-style channel groups, including AI Assistant and Google Business Profile),
source_medium,first_touch,form_page,gbraid,wbraid,msclkidandclick_time. - Consent modes:
auto(WP Consent API when present),wp_consent_api,eventandoff. Nothing
is stored or filled until consent allows it, and cookies are deleted on refusal. - Server fill at submit for Formidable, Gravity Forms and Contact Form 7, from the visitor's cookies.
- A REST route that re-sends cookies from the server after a new touch, for Safari's 7-day limit on
cookies set by JavaScript. ?gd_ls_debug=1console output, andwindow.gdLeadSourcefor inspection.- Tests: PHP harness, engine suite, mutation check, browser fixture.
- Docs: setup guides, QA and E2E plan, roadmap.
Changed
- Sources are lowercase (
google, notGoogle), so referrer and UTM visits group together. gd_ls_landing_page,gd_ls_referrerandgd_ls_timestampdescribe the last touch, not the
first visit. The first visit is ingd_ls_first_touch.- The referrer keeps origin and path only. The landing page keeps only UTM parameters.
GD_LS_COOKIE_DAYSsets the last-touch window. First touch and click IDs default to 90 days.- Domain lists live once in PHP and are passed to the browser as JSON.
Removed
- The rule that filled any input inside an element with class
source,contentorterm. It
overwrote visible fields. Bare v1.1 names on hidden inputs still work. - The separate
wp-enginebranch.mainholds the only version.
Fixed
- Hosts were matched as substrings: Target, Dropbox, Home Depot and Microsoft Copilot were recorded
as Twitter. - Search was checked before AI: Gemini, Gmail and Google Docs were recorded as Google organic.
- A first direct visit locked the source for the whole cookie window.
- A new tagged visit kept term, content and campaign from older visits, and landing page and
referrer from the first visit. - ChatGPT's
utm_source=chatgpt.comlinks had no medium and were never counted as AI. - Form population ran undebounced on every DOM change and set values without
inputorchange
events.
Security
- Hidden-field values rendered into cached pages are replaced in the browser and again on the
server, so one visitor's values can't reach another. - Click IDs are format-checked; all values are length-capped and stripped of tags, quotes and
control characters. - Personal data in landing-page query strings is no longer stored.
Full changelog: CHANGELOG.md