TrackWP releasesself-updates
TrackWP — server-side tracking proxy + cookie consent for WordPress (GA4, Meta CAPI, Google Ads, Consent Mode v2)
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/alphawebdk/trackwp/releases/download/v1.10.0/trackwp-1.10.0.zipShips its own WordPress updater (Plugin Update Checker), so new versions show up under Dashboard → Updates.
Readme
=== TrackWP - Server-Side Tracking & Consent === Contributors: trackwp Tags: analytics, tracking, ga4, meta pixel, consent, gdpr, server-side, google ads, cookie consent, consent mode v2, gtm, google tag manager Requires at least: 6.0 Tested up to: 6.8 Requires PHP: 7.4 Stable tag: 1.10.0 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html
Server-side tracking proxy med indbygget cookie consent og Consent Mode v2. Understøtter GA4, Google Ads, Meta og GTM. Ingen eksterne services, ingen månedlige gebyrer.
== Description ==
TrackWP er et gratis, open-source WordPress-plugin der leverer server-side tracking, cookie consent og Consent Mode v2 — uden eksterne services og uden månedlige omkostninger.
Hvad det erstatter:
- Stape / Addingwell / Taggrs (server-side tracking) — $20-150/måned
- Cookiebot / CookieYes / Osano (cookie consent) — $10-40/måned
- Samlet besparelse: $360-2.280/år pr. site
Funktioner:
- Server-side tracking proxy — Events videresendes fra dit eget domæne via REST API
- GA4 Measurement Protocol — Server-side event-forwarding til Google Analytics 4
- Google Ads konverteringer — Med Consent Mode v2 signaler
- Meta Conversions API (CAPI) — Server-side med deduplikering
- NYT i 1.1: Google Tag Manager — Container ID indtastes i admin, snippet injiceres automatisk
- NYT i 1.1: GTM-aware Consent Mode v2 timing — Defaults emitteres FØR GTM, garanteret rækkefølge
- NYT i 1.1: Editable endpoint slug — Omgå adblockers ved at ændre
/wp-json/trackwp/v1/eventtil fx/metrics - NYT i 1.1: Dedup-strategi — 3 tilstande (klient+server, kun server, kun klient) + "Jeg bruger GTM"-genvej
- NYT i 1.1: GA4 event_id propagation for browser↔server dedup
- Cookie consent banner — 3 stile: centreret pop-up, bjælke i bunden, diskret hjørne-pop-up
- Consent Mode v2 — Fuld implementering med cookieless pings ved afvisning
- Auto-detect tracking — Telefon-links, e-mail-links, formularindsendelser
- Form-support — Contact Form 7, WPForms, Fluent Forms, Gravity Forms, HTML fallback
- Enhanced Conversions — SHA-256 hashing klient-side for bedre attribution
- Førsteparts-cookies — Server-sat for bedre Safari ITP-håndtering
- Event-dedup — Forhindrer dobbelttælling via event_id på tværs af klient og server
- NYT i 1.1: Build pipeline — esbuild + cssnano med transparent .min fallback
- NYT i 1.10: WooCommerce — view_item, add_to_cart, begin_checkout og purchase, med produktdata, valgfrit værdigrundlag (moms/fragt), understøttelse af både klassisk checkout og Cart/Checkout-blokkene, og ordrenummeret som transaction_id
- Lille fodaftryk — ~7 KB total frontend (vs. 120 KB+ for GTM + Cookiebot + pixels)
Understøttede platforme:
- Google Analytics 4 (GA4)
- Google Ads
- Meta / Facebook
- Google Tag Manager (NYT i 1.1)
- WooCommerce e-commerce events (NYT i 1.10)
Understøttede formular-plugins:
- Contact Form 7
- WPForms (free + pro)
- Fluent Forms
- Gravity Forms
- Standard HTML form (fallback)
== Installation ==
- Upload
trackwp-mappen til/wp-content/plugins/ - Aktivér pluginet via 'Plugins'-menuen i WordPress
- Gå til TrackWP i admin-menuen
- Indtast dit GA4 Measurement ID og/eller Meta Pixel ID (eller GTM Container ID hvis du foretrækker GTM)
- Konfigurér dine begivenheder og samtykke-banner
- Færdig — tracking starter automatisk
== Frequently Asked Questions ==
= Skal jeg bruge Google Tag Manager? =
Nej — det er valgfrit. TrackWP håndterer GA4, Google Ads og Meta uden GTM. Men siden v1.1 kan du også indtaste et GTM Container ID hvis du foretrækker at styre tags via GTM. Consent Mode v2 defaults emitteres altid FØR GTM-snippet, så samtykke-status respekteres fra første millisekund.
= Er det GDPR-compliant? =
Ja. TrackWP indeholder cookie consent-banner med Consent Mode v2. Ingen tracking-cookies sættes uden samtykke. Cookieless pings sendes ved afvisning så Google kan modellere konverteringer (lovligt og GDPR-compliant).
= Virker det med adblockers? =
Ja. Da events sendes via dit eget domæne (først-parts), kan adblockers ikke skelne tracking-requests fra normale site-requests. I v1.1 kan du desuden ændre endpoint-slug fra /event til noget eget, hvilket gør adblocker-bypass endnu mere robust.
= Hvordan virker Consent Mode v2? =
Når en bruger afviser samtykke, sender TrackWP cookieless pings til Google. Google bruger machine learning til at estimere ~70-85% af konverteringsdata fra afviste brugere. Dette er fuldt lovligt og GDPR-compliant.
= Vil det forsinke mit site? =
Nej. Det totale frontend-fodaftryk er ~7 KB (vs. 120 KB+ for GTM + Cookiebot + pixel-scripts). Alle scripts indlæses asynkront. Siden v1.1 produceres minified .min.* filer via en indbygget build pipeline (esbuild + cssnano).
= Understøtter det WooCommerce? =
WooCommerce-integration er planlagt til v1.5 med fuld e-commerce event tracking.
= Kan jeg tilpasse consent-banneret? =
Ja. Farver, tekst, stil (centreret pop-up / bjælke i bunden / diskret hjørne-pop-up) og samtykke-kategorier er alle konfigurerbare i admin-panelet.
= Hvordan gemmes API-secrets? =
API-secrets gemmes base64-encoded i WordPress' options-tabel. Databasen er beskyttet af WordPress-authentication.
= Server-side vs. klient-side dedup? =
I v1.1 kan du vælge mellem 3 dedup-tilstande: "Klient + server" (default — begge fyrer, dedup via event_id), "Kun server" (anbefalet hvis du bruger GTM), eller "Kun klient" (spring server-proxy GA4/Meta over). "Jeg bruger GTM"-checkboxen auto-vælger "Kun server".
== Screenshots ==
- Platform-indstillinger — Indtast GA4, Google Ads, Meta og GTM-credentials
- Begivenheds-konfiguration — Konfigurér hvilke events der trackes og deres værdier
- Samtykke-banner — Cookiebot-style consent banner med tilpasselig design
- Avancerede indstillinger — Endpoint-slug, førsteparts-cookies, Consent Mode v2, dedup-strategi, debug
== Changelog ==
= 1.10.0 =
WooCommerce-fanen virker nu. Den har siden 1.5 kun indeholdt en "kommer snart"-besked; class-trackwp-woocommerce.php var en tom stub og assets/js/woocommerce.js indeholdt ingen kode.
- Ny: Shop-begivenhederne
view_item,add_to_cart,begin_checkoutogpurchase. Slået fra som standard — det ændrer hvad der sendes til Google og Meta, så det skal være et bevidst valg - Ny: Begivenhederne oprettes i den almindelige liste på fanen Begivenheder, ikke i en separat opsætning. Dermed arver de platform-routing (send_to), Meta-event-mapping, Google Ads-label, leveringsloggen og dedup-tilstanden. Kun
purchaseer som standard routet til Google Ads — en konverteringsupload skal være et aktivt valg - Ny: Ny trigger-type "WooCommerce" der styres fra WooCommerce-fanen. Den binder intet i browseren, men sidebetingelser (fx Page URL) virker stadig, så en shop-begivenhed kan afgrænses til bestemte sider
- Ny: Valg af konverteringsværdi: inkl. moms og fragt, uden moms, uden fragt, eller uden moms og fragt. Grundlaget gælder både ordre- og kurvværdi og bestemmer også om produktpriserne sendes med eller uden moms — alle fire begivenheder bruger samme grundlag
- Ny: Valg af produkt-ID: WooCommerce-ID eller SKU, så
item_idkan matche Merchant Center-feedet. Både serveren og browseren følger valget, så samme produkt ikke optræder under to id'er - Ny: Produktdata sendes med som GA4
items(item_id, item_name, item_category til item_category5, item_variant, quantity, price, discount) og som Metacontentsmedcontent_typeogorder_id - Ny: Priser sendes som pris FØR rabat med rabatten i
discount, hvilket er GA4's egen model. At lægge rabatten ind i prisen fjerner forskellen på en billig vare og en nedsat vare - Ny:
purchasesendes fra ordrebekræftelsessiden, hvor klient-ID, session og annonce-cookies stadig findes. En server-side afsendelse ved statusskift ville køre uden for den besøgendes request, hvor GA4 opfinder et nyt client_id og hvert salg bliver til en ny Direct-bruger. Prisen er ordrer hvor kunden aldrig når siden - Ny: Ordrenummeret bruges som
transaction_id, ikke et tilfældigt event-id. Det er det GA4 og Google Ads deduplikerer på, og det der gør en senere refusion mulig at koble til ordren - Ny: Ordren tælles kun én gang. Et flag på ordren forhindrer gentagelse ved genindlæsning (HPOS-sikkert via CRUD-API'et, aldrig
update_post_meta), og et ekstra værn i browseren fanger det tilfælde hvor ordrebekræftelsen genbruges fra browserens egen cache — WooCommerce sender den med kortmax-age, så serveren aldrig bliver spurgt. GA4 og Ads deduplikerer på ordrenummer, men Meta gør ikke, så uden det værn blev salget talt to gange dér - Ny: Ordrebekræftelsen kontrolleres med ordrenøglen (
hash_equals). Ordre-id'et står i URL'en, så uden den kontrol kunne enhver besøgende afspille en fremmed ordre ind i butikkens statistik - Ny:
add_to_cartdækker alle tre veje WooCommerce har: klassisk formularindsendelse (registreres server-side og afspilles ved næste sidevisning), klassisk AJAX i produktlister, og Cart/Checkout-blokkene - Ny: Blok-understøttelse aflytter svarene fra Store API'et (
/wc/store/v1/cart/*) i stedet for at læse et JavaScript-globalt objekt. WooCommerce har flyttet blokkene til Interactivity API'et, ogwindow.wp.datafindes ikke længere på en aktuel installation — verificeret mod WooCommerce 11 og WordPress 7.1. Antallet rapporteres som ændringen, ikke som den nye total, og nedjustering eller fjernelse udløser ingen begivenhed - Fix: GTM-snippet'et pushede
event: 'gtm.start'i stedet for Googlesevent: 'gtm.js'. Alle "All Pages"-triggere i GTM lytter pågtm.js, så med TrackWP som container-loader fyrede ingen af dem — hverken Google-tagget, conversion linkeren eller tredjeparts-tags. Fejlen var usynlig i GTM Preview, fordi Tag Assistant selv indsætter en korrekt container-load - Fix: 404 på
/wp-json/trackwp/v1/c/_/service_worker/.../sw_iframe.htmli konsollen ved førsteparts-loader.first_party_collection: truefik gtag.js til at behandle proxyen som en server-side GTM-container og lede efter dens service worker, som proxyen ikke er. Flaget er fjernet — hits sendes fortsat tiltransport_url, uændret. Sidegevinst: gtag vedhæfter nu igen førsteparts Google Ads-klik-id'er (gclgs/gclst/gcllp), som en rigtig server-container ellers selv skulle have læst - Fix: GA4 og Meta udelod
valueogcurrencypå et køb til 0 kroner (100% rabatkode eller gavekort), fordi feltet kun blev sat når værdien var forskellig fra nul. Begge platforme kræver dem på Purchase - Fix:
transaction_idsættes nu uafhængigt af om varelinjerne kunne opløses. Før lå det inde i items-blokken, så en ordre uden genkendelige linjer mistede det felt GA4 deduplikerer på - Fix: Ecommerce-data valideres nu ét sted, før det når Google og Meta. Ukendte felter fjernes, varer uden
item_idelleritem_namedroppes (GA4 afviser dem alligevel), ikke-numeriske priser fjernes, et antal på nul eller derunder gemmes ikke, og der sendes højst 50 varelinjer pr. begivenhed - Fix: Google Ads-konverteringen fra browseren brugte et tilfældigt event-id som
transaction_id. Den bruger nu ordrenummeret, så klient og server peger på samme konvertering - Fix: Meta Pixel i browseren sendte hverken produktdata eller
order_id, så de to halvdele af et dedupliceret par var uenige om deres parametre.num_itemssendes kun på InitiateCheckout, som Metas dokumentation foreskriver - Ny: Leveringsloggen skriver nu én "modtaget"-række pr. indkommende begivenhed, så oversigten viser hvad der faktisk fyrede — også på sites uden platform konfigureret eller i client_only-tilstand
- Test: Pluginets phpunit-suite er udvidet med 20 nye tests af ecommerce-sanitizeren, shop-skabelonerne og WooCommerce-indstillingerne. Hele funktionaliteten er desuden verificeret mod en kørende WooCommerce-butik med moms, rabatkoder, HPOS og blok-baseret kurv og checkout, samt i en rigtig browser
= 1.9.0 =
- Ny: Custom events med firing triggers og betingelser — bygget efter Google Tag Managers model: en begivenhed sendes når EN AF dens triggere matcher, og en trigger matcher når ALLE dens betingelser er sande (OR mellem triggere, AND indeni)
- Ny: Betingelser på sidevariable (Page URL, Hostname, Path, URL Fragment, Query Parameter, Page Title, Referrer), klikvariable (Click ID, Classes, Text, URL, Element) og formularvariable (Form ID, Classes, Action, Element)
- Ny: Operatorer equals / does not equal / contains / does not contain / starts with / ends with / has CSS class / matches CSS selector / exists — med GTM's egne betegnelser
- Ny: Klassematching er token-baseret ("has CSS class btn" matcher ikke "btn-primary"), og kliktekst normaliseres (whitespace kollapses)
- Ny: URL-triggere reevalueres ved SPA-navigation (pushState/replaceState/popstate/hashchange) med dedup pr. URL — tidligere blev de kun tjekket ved sideindlæsning
- Ny: Leveringslog (fra som standard) — gemmer i egen databasetabel hvilke begivenheder der blev sendt til hver platform og om de kom frem. Gemmer KUN begivenhedsnavn, tilfældigt begivenheds-id, tidspunkt afrundet til minut, platform, leveringsstatus og samtykketilstand — hverken IP, browseroplysninger, side-URL, formularindhold, e-mail, telefon, client_id, gclid eller Facebook-cookies
- Ny: Oversigt i admin over hvilke begivenheder der faktisk er sendt de seneste dage, med graf pr. dag og leveret/fejlet pr. platform
- Ny: Automatisk advarsel i admin når loggen viser samme begivenhed sendt flere gange til samme platform inden for samme minut (dobbelttælling)
- Ny: Slettefrist 7 dage som standard, maks. 30. Dagligt oprydningsjob, "Tøm leveringslog"-knap, tabellen fjernes ved afinstallation
- Fix: /my-data beskriver nu korrekt hvad der gemmes server-side når leveringsloggen er slået til
- Fix: Endpoint-sluggen kunne skygge for pluginets egne ruter — kun "consent-log" var reserveret, så "loader", "keepalive", "consent", "c" og "my-data" kunne overskrive førsteparts-loaderen eller GDPR-endpointet. Hele sættet er nu
Read the full README on GitHub →