Keep the campaign attached to the conversion.
Someone clicks your ad. Three pages later, they send a form or place an order. By then the campaign is usually gone, and the lead looks like it came from nowhere.
ClickTrail keeps what the visitor arrived with: the UTMs, the ad click ID, the referrer. It carries that context to the form entry or the WooCommerce order, and to a Calendly booking. You open the record and see where it came from.
ClickTrail records what arrived. It does not decide what caused the sale.
Read in English
Leia em Portugues (Brasil)
Contributor Guide
Guia de Contribuicao
Technical Docs
WordPress Readme
Pick the path that matches your site.
- WooCommerce store: turn on Capture and WooCommerce. Orders carry the campaign. Add storefront events later if you want funnel signals.
- Lead forms: turn on Capture and Forms. Fluent Forms gets hidden fields on its own; Contact Form 7 fills the
ct_*tags you reference ([hidden ct_gclid]in the form or[ct_gclid]in the mail). Gravity Forms, WPForms and Formidable Forms fill thect_*fields you add. Forminator fills the Hidden fields you give the custom CSS classct_<key>. - GTM or server-side GTM: turn on Capture, Events, and Delivery. Events go to the
dataLayer, and ClickTrail can send canonical JSON to an endpoint you set.
Then place one test order or send one test form, and look at what was stored. The use-case guide and tutorials walk through each path.
ClickTrail only acts on the paths you turn on and set up in its settings. That is what "configured" means everywhere in these docs.
- Capture: first-touch and last-touch UTMs, ad click IDs, and the referrer, with organic, social, and referral fallback when there are no UTMs. When a visitor comes back through a new ad, the newest click is the one that travels. Context lives in first-party storage, falls back to
sessionStoragewhen cookies are blocked, and your own admin browsing stays out of it. - WooCommerce: attribution saved on the order, an enriched purchase event on the thank-you page, optional storefront events (
view_item,view_item_list,view_cart,add_to_cart,remove_from_cart,begin_checkout), and optional order-status milestones. Order metadata has export, erase, retention, and uninstall handling. - Easy Digital Downloads (3.0+): attribution saved on the order when it is created, and one
purchasepushed from the order confirmation receipt (event_idpurchase_edd_<order ID>, not repeated on reload). Nothing is stored or pushed without the consent your settings require. Order metadata has export, erase, retention, and uninstall handling. - Ultimate Member: a registration through an Ultimate Member form stores the visitor's attribution on the new user (
_clicutcl_*user meta, only with marketing consent) and sends onesign_upevent. Users registered from wp-admin get nothing. The meta has export, erase, retention and uninstall handling. Source-present; runtime-unverified beyond one pinned test run. - Forms: Fluent Forms gets hidden fields automatically; Contact Form 7 fills the
ct_*tags you reference ([hidden ct_gclid]or[ct_gclid]in the mail). Gravity Forms, WPForms, Formidable Forms and Forminator fill thect_*fields you add; Gravity Forms also gets a channel label, nine{clicutcl_*}merge tags, and a per-form switch. Elementor Forms (Pro) and Ninja Forms keep attribution with the submission record. A client-side fallback covers cached pages and forms that load late, and WhatsApp links can carry the context too. - WhatsApp: a click on a
wa.me,api.whatsapp.comorwhatsapp://link pushes onecontact_whatsapp_startevent (with consent). With Append attribution to message on (off by default) the pre-filled text ends with a shortRef: CT-XXXXXXXXcode instead of the attribution payload; an administrator pastes it into Diagnostics to see the stored first/last touch and click ID. - Bookings and your other domains: links to domains you approve carry the campaign, with a signed token between your own sites. Calendly booking links hold the newest click and the visitor's consent decision, and the signed Calendly webhook records the booking as
book_appointmentwith its UTMs. Booking or form iframes your own script loads can carry the campaign too, throughwindow.ClickTrail.decorateEmbedUrl(), for hosts you list. - Events and delivery: browser events to the
dataLayer, a REST intake, webhooks from Calendly, HubSpot, and Typeform, lifecycle updates, and one-time WordPress events such aslogin,sign_up, andcomment_submit. Optional server-side delivery adds a retry queue and diagnostics.
When consent is required, nothing is stored until the visitor agrees. ClickTrail listens to its own banner, Cookiebot, OneTrust, Complianz, GTM, or a custom source, or detects the source for you. ClickTrail follows Cookiebot and Complianz decisions, including changes the visitor makes on the page. On withdrawal, ClickTrail clears its storage and removes the parameters it added to links. Queued deliveries check current consent again right before they are sent, and the consent decision stays in sync across tabs. Consent behavior can be strict, relaxed, or geo-based. ClickTrail helps you implement consent; compliance still depends on your legal requirements and your settings.
- It does not prove which click caused a sale, and it does not decide which channel deserves the revenue.
- It does not resolve one person's identity across devices.
- It is not an attribution dashboard, a hosted server-side GTM platform, a lead manager, or an ad optimizer. It works alongside GA4 and GTM. For call tracking, lead scoring, or ad-spend optimization, pair it with a specialist tool.
- It does not install ad pixels. The Meta Pixel, Google tag, TikTok Pixel, LinkedIn Insight Tag, Pinterest Tag, and Reddit Pixel stay yours, usually through GTM.
- Server-side delivery sends JSON to the endpoint you configure. The adapters named after Meta, Google Ads / GA4, LinkedIn, Pinterest, and TikTok exist in the code, but we have not verified that any provider accepts them end to end. Reddit is a relay-only destination.
- We have not yet verified a live Calendly booking round trip.
Having code for an integration is not proof that it works in production. Current status lives in the integration reference and the machine-readable ledger. The release-phasing plan shows what gets checked next.
The current release is 1.14.0 on GitHub and WordPress.org. The full reference (click IDs, integrations, installation) lives in README.en.md; history is in the changelog.
- GitHub visitors: start with README.en.md or README.pt-BR.md.
- Contributors and reviewers: use CONTRIBUTING.md or CONTRIBUTING.pt-BR.md.
- Engineers and agents: use docs/README.md.
- Implementation teams: start with use cases and the tutorial index.
- docs/README.md: engineering index by task and subsystem
- docs/guides/IMPLEMENTATION-PLAYBOOK.md: practical rollout guide for lead-gen, WooCommerce, cross-domain, consent-aware, and server-side setups
- docs/architecture/PLUGIN-OVERVIEW.md: runtime architecture and module map
- docs/reference/INTEGRATIONS.md: evidence-labelled forms, commerce, consent, webhook, GTM, platform, and delivery paths
- docs/reference/integration-capabilities.json: machine-readable integration status and evidence ledger
- docs/guides/RELEASE-PHASING-AND-INTEGRATION-DOCS.md: separately gated release plan
- docs/guides/COMPETITIVE-POSITIONING-AND-ACQUISITION-ROADMAP-2026-08-22.md: proposition, copy, and client-acquisition roadmap
- docs/guides/SETTINGS-AND-ADMIN.md: current admin IA and option mapping
- changelog.txt: full plain-English release history aligned with the WordPress readme
- .github/PULL_REQUEST_TEMPLATE.md: PR checklist for repo changes
- Read CONTRIBUTING.md.
- Use docs/README.md to find the canonical doc for the area you will change.
- Keep product docs, technical docs, and changelog entries aligned with the implementation.
- WordPress 6.5+
- PHP 8.1+
GPL-2.0-or-later. See LICENSE.

