CHANGELOG
Everything new in GTM Kit
Releases for GTM Kit and GTM Kit Premium, newest first.
Find out about what's new in our our release post.
Added
- If your server-side container is hosted on Stape, GTM Kit can now use the loader Stape issues for it, which ad blockers find harder to recognise. Switch it on under Server-side Tagging. GTM Kit asks Stape for the loader only when you save or refresh it, and you can paste the code from Stape instead.
Fixed
- With Cookie Keeper enabled, Safari visitors now load your Stape custom loader when its identifier is longer than eight characters, as every identifier Stape issues today is. Safari previously asked Stape for a loader address it rejects, so those visitors were not tracked.
- On sites with a persistent object cache such as Redis, GTM Kit no longer re-runs its update routine on every admin page load when the cache still holds the previous version number. The update routine also no longer logs a notice from Action Scheduler on its first run.
Changed
- The description of serving the Google tag from your own domain now says what the setting does and does not do: it changes where the tag loads from, while the measurement it sends still goes to Google unless Google's tag gateway is provided by your CDN or host.
Find out about what's new in our our release post.
Added
- When Google for WooCommerce adds a Google tag beside your container, GTM Kit now names it as the source instead of saying it could not tell.
- Site Health now checks that GTM Kit's settings can be saved, and shows the error it got back when they cannot.
- When sending your system data from the Support screen cannot get through, the screen now says so instead of claiming your ticket was not found. With GTM Kit Premium you can then copy the data or download it to email instead.
- You can now serve the Google tag from your own domain, so ad blockers and browser tracking restrictions interfere less with your measurement. If it stops working, GTM Kit falls back to the standard loader and tells you. It is off by default, and an alternative to your own sGTM container domain.
- GTM Kit now points out setups that leave data unmeasured, such as a WooCommerce store with its ecommerce events switched off. At most one such notice appears at a time, and dismissing it keeps it away for 90 days.
Fixed
- A Google tag loading beside your container is no longer reported as duplicate tracking in the dashboard. It is now a notice, since the tag is only counted twice when it also fires inside your container. Two containers, or the same container loaded twice, are still reported as problems.
- When settings will not save, the settings screen now tells you why instead of quietly showing your old values again. It names any rejected setting, and on a site with a persistent object cache it names the cache as the likely cause.
- Password managers no longer fill in GTM Kit's settings fields. A filled-in value could previously be saved without you typing it, and came back after you removed it.
- Event names such as purchase and add_to_cart can no longer be renamed by translations in the settings screens, where they disagreed with the events GTM Kit actually sends.
- The order confirmation page now sends purchase data only to visitors WooCommerce or Easy Digital Downloads would show the order to. Anyone opening a shared or guessed link previously received the order contents, its value and the shopper's details. The buyer's own visit still reports the purchase.
Changed
- New
gtmkit_active_cmpandgtmkit_cmp_display_namefilters let a site declare a consent platform GTM Kit cannot detect, such as one loaded by the theme or a code snippet, so Site Health stops reporting consent as unconfigured. - The customer details sent with a purchase now come from the order itself, so they describe the buyer rather than whoever opened the confirmation page.
WooCommerce::include_customer_data()now takes the order as its second argument, before the order value, and reads every customer field from it. Code that calls this method directly must pass the order.
Fixed
- With the event deferral queue holding the purchase event, the browser now waits for the queue to release it before confirming the purchase. Stores sending the server-side purchase only when the browser does not confirm it no longer receive every order twice, and a queue timeout raised in the settings is still covered.
- On cached pages with WP Rocket's Delay JavaScript execution turned on, the event deferral queue only started once the visitor interacted with the page, so the ecommerce events it should hold until consent is granted were sent straight away. The queue is now exempt from that delay and holds those events again.
Changed
- The webhook log now states why a server-side order body carries no tracking cookies (none captured, or stripped by consent), and the order screen lists which tracking cookies were captured.
Find out about what's new in our release post.
Added
- Orders can now report their gross profit, so you can bid on margin instead of turnover. Profit is worked out from your WooCommerce cost prices plus a cost model you configure (payment fees, shipping, packaging and handling, and a default margin for products without a cost price), stored on the order when it is placed, and sent with the server-side event as
gross_profit; your container decides what to do with it, so point a Google Ads conversion tag or a GA4 custom metric at that field before anything changes in your bidding. It stays out of the page source unless you switch on the browser option, every cost field starts at zero rather than a guessed rate, and the settings screen shows how much of your catalogue has a cost price so an incomplete figure is visible instead of silent. - New read-only REST endpoint returns an order's stored profit, for headless storefronts that need the same figure the server-side event reports.
- Purchases now report whether they came from a new or a returning customer, on the browser purchase event and on every server-side order and refund event. The answer is worked out once when the order is placed and stored on the order, so a resent or retried event always says the same thing as the original. To feed a Google Ads new-customer-acquisition goal, enable new customer reporting on your conversion tag and set its source to event data; it ships switched off because until now the plugin did not send the data, and note that GTM Kit sends the new-versus-returning flag only, not a customer lifetime value.
Fixed
- Orders and form entries now record the page a visitor actually arrived on, and the site that sent them, instead of being overwritten with the last page they viewed before converting. Server-side events report the entry page as the conversion's page location, and a visitor who arrived directly is no longer recorded as having been referred by another page on your own site. When a new campaign brings someone back, the entry page and referrer are recorded afresh, so they always describe the visit the campaign belongs to.
- Event names such as purchase and add_to_cart are now marked as literal values in the settings screens, so translations can no longer rename them. On translated sites some of these names were being translated, which made the settings disagree with the events GTM Kit actually sends.
Changed
- The
new_customervalue now follows GTM Kit's own definition, matching a shopper on their account or, for guests, on the billing email they checked out with, and counting only orders that were actually paid. It previously came from WooCommerce Analytics, which reports every customer as new on stores that have never run the Analytics import. Sites using new-customer bidding may see the segment shift once after updating. - Recovered purchases (the server-side purchase sent when the browser did not confirm the event) are attributed to the visit that produced them, including its source and campaign, when the server container's Google Analytics client has "Migrate from JavaScript Managed Client ID" enabled. Server containers generated by the Template Assistant before 2 September 2026 shipped with it disabled, so their recovered purchases show a traffic source of (not set). Re-import your server container template from the Template Assistant, or open the Google Analytics client in your server container, expand More Settings and tick the box. This applies whichever advertising platform the container was generated for.
- Licence checking and integration start-up were consolidated into one place, so every feature answers the same question the same way and each integration states for itself what it needs to run. No change to what any site does today.
Find out about what's new in our release post.
Added
- New setting adds the customer's hashed email address and phone number to server-side events, so ad platforms match conversions more accurately. Off by default.
- The server-side purchase event can now be sent only when the browser did not confirm the purchase reached Google Tag Manager, so a healthy checkout is counted once.
Fixed
- Conversions recovered by the webhook keep the traffic source of the visit they belong to. Re-import your server container template from the Template Assistant after updating.
- Admin-created orders and background subscription renewals no longer pick up another customer's tracking data.
- Server-side events are recorded as the visitor who was browsing, instead of a new person each time.
- A slow tagging server no longer causes purchases to be counted twice.
- Server-side events carry the visitor's Google Analytics session details again.
- The Template Assistant shows the configuration fields for premium services such as TikTok again.
Changed
- The Preview test-send confirmation now tells you that live orders stay out of Preview until you switch that option on.
- Requires GTM Kit 2.18.1 or later, and will not run until GTM Kit is updated.
- Minimum versions are now WordPress 6.9 and WooCommerce 10.3. Tested with WooCommerce 11.0.
- The flat Event Data setting is renamed “Flat GA4 Event Data and shared purchase event ID”. The shared ID deduplicates for Meta, TikTok, Reddit, Snap and Pinterest, but not for Google Analytics 4.
- The test suite now also covers the oldest supported WordPress and WooCommerce versions, and a stale build dependency was removed.
Find out about what's new in our our release post.
Fixed
- The daily check of your pages now keeps running on schedule on WooCommerce sites. It could previously stop after one run until an administrator next opened wp-admin.
- On a site using a Google Tag Manager environment, the fallback for visitors without JavaScript pointed at your live container instead of the environment. It now matches the rest of your setup.
Find out about what's new in our our release post.
Added
- GTM Kit now checks one of your pages once a day and tells you when nothing on your site is loading your container, or when your pages load tracking twice.
- GTM Kit now reports on itself in WordPress's Site Health, with checks for your container, your consent setup, and what the daily page check found.
- GTM Kit no longer loads your container on sites WordPress reports as staging, development or local, so test traffic stays out of your analytics.
- You can now import settings from another Google Tag Manager plugin at any time from the Tools page, not only during setup.
Fixed
- The fallback for visitors who have JavaScript turned off is now added to your pages. It was missing on every placement setting, and you can switch it off under "Container code noscript implementation".
- On a block theme, adding a product to the cart from the product page no longer reloads the page.
- Importing settings during the setup wizard works again, reads the right customer data setting, and no longer produces an unusable container ID on sites with more than one container.
Changed
- The footer fallback now sits at the standard WordPress footer position. If you added a body_footer hook to your theme to make that option work, you no longer need it.
- GTM Kit now requires WordPress 6.9 or later, and is tested with WordPress 7.1.
Find out about what's new in our our release post.
Added
- Sharing system data with the support team now starts a live sync session: while your ticket is open (at most 7 days), saving GTM Kit settings automatically sends the support team a fresh copy of the same data. The Support page shows an indicator while sync is active, and a Stop sharing button ends it immediately.
- A new Premium page in the settings screen explains what GTM Kit Premium adds on top of the free plugin, covering server-side tracking, purchase accuracy, consent-safe measurement, forms and subscriptions, and debugging tools, with a link to the documentation behind each point. Cards are ordered to match your site, so a WooCommerce store sees the commerce topics first.
- The setup wizard now includes a short step introducing GTM Kit Premium, worded for the site it is running on: order tracking for WooCommerce stores, consent handling for sites in the EU and EEA, and a general overview otherwise. The step is informational and one click continues past it.
Fixed
- Adding a product from a block product grid on a page that also shows the cart or Mini Cart no longer reports add_to_cart twice. The event also keeps the name of the product list it came from, which was missing from the second, duplicate event.
- On block themes, product lists no longer report every view and every add to cart twice. WooCommerce runs the classic product-loop hooks inside its block templates so older plugins keep working, and GTM Kit was responding both there and through its own block tracking, which doubled view_item_list and add_to_cart on shop, category and tag pages. List names are unchanged, so existing reports stay comparable.
- Removing a product from the cart now sends the remove_from_cart event again. The product details attached to the cart's remove link were encoded twice, so the browser could not read them and the event was silently skipped on the classic cart page.
Changed
- GTM Kit is now tested with WooCommerce 11.0. Shop, cart, checkout and purchase tracking were verified against the new release on both classic and block themes.
- Customers who already have GTM Kit Woo or GTM Kit Premium no longer see upgrade prompts anywhere. The Premium page and the wizard step are hidden entirely, and settings that need a paid add-on no longer show an upgrade link. Those settings still appear with their Premium label, so you can see what the product includes without being sold something you already own.
- New
gtmkit_support_sync_configfilter lets developers tune the support sync timings (coalesce delay, session cap, and status-check interval). - Added a non-blocking continuous-integration check that runs the settings-app test suite against React 19, so the admin interface is verified ahead of WordPress bundling React 19 in a future core release.
- Building the settings screen now regenerates the compiled Tailwind stylesheet automatically, so new interface styling can no longer be silently missing from a build.
- The plugin's WooCommerce integration is now covered by an automated test suite that runs against a real WooCommerce install, and the suite runs against the oldest supported WordPress and WooCommerce versions as well as the newest. Faults in shop, cart and checkout tracking are caught before release instead of in the browser, and the compatibility stated in the plugin header is verified on every change rather than assumed.
Find out about what's new in our release post.
Added
- New "Server-side GA4 measurement ID" setting routes each site's webhook events to its own GA4 property when several sites share one server GTM container. The destination travels with each webhook, so adding a site needs no container edit, and a site with the field empty keeps using the measurement ID configured in the container itself. Requires re-importing the updated server container template once.
- Server-side webhook events now also carry their GA4 ecommerce, cookie, attribution and consent values as flat top-level fields, so standard GA4, Meta CAPI and Google Ads tags in your server container pick them up through default parameter inheritance, with no per-parameter mapping variable and no GTM template to import. The original nested objects are kept, so nothing in your container breaks.
- Purchases now carry a stable, transaction-based event_id on both the browser event and the server-side webhook. When the same order reaches a shared server container from both the browser and the webhook, a destination that deduplicates on event_id treats the two as one event, and a retried webhook stays idempotent. (Corrected after publication: this entry originally said your GA4 tag would merge the two copies. Later testing established that it does not, even when every identifier matches, so send the purchase to Google Analytics 4 from one side only. The shared ID is the deduplication key for Meta, TikTok, Reddit, Snap and Pinterest.)
- New setting to turn the flat fields and the shared purchase event ID on or off, plus an optional event_id prefix (defaults to your site name) so several stores can safely share one server container.
- While the sGTM Preview/Debug session is active, server-side webhook events carry GA4's debug signal (the same one browser debug traffic carries), scoped to the Preview session and never marking normal traffic. Note that GA4's DebugView does not reliably list purely server-originated events; verify webhook delivery in the server container's Preview panel and in GA4 Realtime.
Find out about what's new in our our release post.
Fixed
- When the Template Assistant cannot generate a container, the page now shows the reason reported by the server inline (and logs the full detail to the browser console), instead of a generic "Error generating template" message that hid what actually went wrong.
Changed
- The settings screen now ships an sGTM Preview test-send control that GTM Kit Premium registers into the Setup → Environment section, so Premium users can send a server-side webhook event to their server container's Preview/Debug panel.
- The Event Deferral setting no longer warns about Consent Mode when a consent platform supplies consent through the WP Consent API. The notice now appears only when neither Consent Mode nor the WP Consent API can release deferred events, and its wording names both consent sources instead of implying Consent Mode is required.
Find out about what's new in our release post.
Added
- New "Send test webhook to sGTM Preview" tool (Setup → Environment). Send a server-side event to your server container with the Preview token attached, so it appears in the container's Preview/Debug panel on demand, without placing a real order. Pick any event type, send a synthetic sample or replay a real order, and read the container's response inline. An optional, self-expiring developer toggle can also show live orders in Preview; it disarms automatically when the token expires, so it can never break live tracking.
- New
gtmkit_webhook_request_argsfilter lets developers add headers (such as the sGTM Preview token) or otherwise reshape outgoing server-side webhook requests, without patching core.
Fixed
- Generating a GTM container from the Template Assistant with a premium service selected (such as Server-Side Webhooks – GA4) now works. The request is sent to the licensed template endpoint with your license key, so the premium service is recognised as part of your plan instead of being rejected with a generic error.
Added
- Event Deferral now works when your Consent Management Platform drives Google Consent Mode itself (via the WP Consent API), without turning on GTM Kit's own Consent Mode. Deferred ecommerce events fire the moment a visitor accepts consent, with no duplicate Consent Mode signals and no changes to your GTM container.
Fixed
- With a Consent Management Platform that publishes through the WP Consent API, deferred ecommerce events now fire the instant a visitor accepts the consent banner, instead of waiting out the fallback timeout (or being dropped). This closes the gap where a first-time visitor's add to cart, checkout or purchase could be lost while the page waited for the timeout.
Find out about what's new in our our release post.
Added
- The Event Deferral setting now warns when it is switched on while Consent Mode is off, because deferred events have no consent signal to wait on and never release in that state.
Fixed
- The Commerce "Brand" selector now lists your product brand taxonomies again, instead of showing only "(not set)". The redesigned settings screen stopped loading the taxonomy and page lists, so the Brand selector (and other taxonomy- or page-based options) appeared empty regardless of how brands were configured.
Find out about what's new in our our release post.
Added
- The Event Deferral setting now warns when it is switched on while Consent Mode is off, because deferred events have no consent signal to wait on and never release in that state.
Fixed
- The Commerce "Brand" selector now lists your product brand taxonomies again, instead of showing only "(not set)". The redesigned settings screen stopped loading the taxonomy and page lists, so the Brand selector (and other taxonomy- or page-based options) appeared empty regardless of how brands were configured.
Find out about what's new in our our release post.
Added
- The settings screen now uses a redesigned, capability-based interface, organising everything into Setup, Events & data layer, Commerce, Consent & privacy, Tools and more.
Fixed
- The Contact Form 7 "Load JavaScript" setting now shows the recommended choice as selected when the setting has never been saved.
Changed
- Clarified the Debug log setting description so it reflects that it also logs the server-side webhooks GTM Kit sends, not only the purchase event.
Added
- The Debug log now records every server-side webhook GTM Kit sends, including the full payload and the HTTP status your tagging server returned, not just the purchase event. You can read the exact request for purchases, order-status changes, refunds and subscription events in WooCommerce → Status → Logs.
- The "Send webhooks from a background queue" setting now links to WordPress' Scheduled Actions screen, filtered to GTM Kit's queued dispatches, so you can inspect pending, completed and failed webhook jobs.
Fixed
- Premium templates no longer fail to download when the stored licence key goes missing while the licence still reads as valid. The plugin now treats a missing key as not licensed, so the templates page prompts you to re-activate instead of producing a broken request.
- Licence activation now confirms the key was actually saved and shows a clear message when a server caching layer or hosting restriction prevents it, instead of appearing to activate and then reverting on the next page load.
- The License screen now shows the first characters of your license key behind the mask, so you can recognise which key is active. Previously the whole key was masked.
Changed
- GTM Kit Premium now requires GTM Kit core 2.16.0 or later. The redesigned License screen and the new Scheduled Actions link rely on capabilities added in core 2.16.0.
- License details on the License screen (key, status and renewal date) are now added through GTM Kit's
gtmkit_settingsfilter instead of rewriting the enqueued settings script, and the unused admin pages that the redesigned settings interface replaced have been removed.
First public release
Find out about what's new in our release post.
Added
- Initial release. GTM Kit Premium has been used in production for a year and is considered stable. Requires GTM Kit core 2.15.0 or later.
Fixed
- Security hardening: Links served to the settings interface from remote content (upgrade offers, templates, tutorials) and notifications are now validated before they are used for navigation.
Changed
- New
gtmkit_settings_registryfilter lets add-ons register their settings fields with the GTM Kit settings screen at runtime. The settings screen now exposes its field registry and related metadata, preparing for GTM Kit’s new settings interface.
Added
- WooCommerce block tracking now loads on block (FSE) themes where Cart, Checkout, Mini Cart, Product Collection, or Related Products are rendered from block templates and template parts. Previously the block tracking bundle could fail to load on these sites, so block ecommerce events never fired.