Skip to content

1.2.0

Choose a tag to compare

@garrettatx garrettatx released this 29 Sep 22:05
· 3 commits to main since this release

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_config filter, 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, msclkid and click_time.
  • Consent modes: auto (WP Consent API when present), wp_consent_api, event and off. 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=1 console output, and window.gdLeadSource for inspection.
  • Tests: PHP harness, engine suite, mutation check, browser fixture.
  • Docs: setup guides, QA and E2E plan, roadmap.

Changed

  • Sources are lowercase (google, not Google), so referrer and UTM visits group together.
  • gd_ls_landing_page, gd_ls_referrer and gd_ls_timestamp describe the last touch, not the
    first visit. The first visit is in gd_ls_first_touch.
  • The referrer keeps origin and path only. The landing page keeps only UTM parameters.
  • GD_LS_COOKIE_DAYS sets 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, content or term. It
    overwrote visible fields. Bare v1.1 names on hidden inputs still work.
  • The separate wp-engine branch. main holds 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.com links had no medium and were never counted as AI.
  • Form population ran undebounced on every DOM change and set values without input or change
    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