CHANGELOG
Everything new in GTM Kit
Releases for GTM Kit and GTM Kit Premium, newest first.
Find out about what's new in our release post.
Added
- AI assistants can read the server-side webhook queue and see how consent resolves for a given order's purchase webhook. Where GTM Kit lets assistants change settings, they can also change how unknown consent is treated and switch the Gravity Forms integration.
Fixed
- Gravity Forms now shows among the active integrations that AI assistants read.
- With the WP Consent API as the consent source, the consent status reported to AI assistants and Site Health is the new-visitor default.
- A product list that loads more products into the same list, with a "Load more" button or infinite scroll, now reports only the new products, numbered on from those already shown, instead of reporting the earlier products again.
- Product lists removed from the page are no longer watched for visibility.
- The webhook queue and order consent abilities now reach AI assistants on sites where another plugin loads an older copy of the MCP Adapter.
- Two different products with the same name, added to the cart close together, are no longer reported as one.
- GTM Kit Premium now runs on release candidates, betas and development builds of the GTM Kit version it requires.
- An empty list of required consent categories now means the default categories everywhere, not only in the browser.
- On stores that send the server-side purchase when the order is paid, or only when the browser does not confirm it, orders that WooCommerce completes without passing through Processing, such as virtual and downloadable orders, now send it too.
- Checking for GTM Kit Premium updates no longer contacts the update server on every admin page load, which slowed the admin down when that server was slow to answer. The answer is kept for two hours, and Check again on the Updates screen asks afresh.
Changed
- GTM Kit Premium now requires GTM Kit 2.24.0 or later, and will not run until GTM Kit is updated.
Added
- Site Health check for the event deferral queue. When the queue is on, Site Health now says whether the queue can see your visitors' consent. If GTM Kit's Consent Mode is off and no consent plugin reports through the WP Consent API, it explains that the queue holds every configured event until the timeout unless the Google Tag Manager container runs the GTM Kit consent bridge tag, and how to fix it.
Fixed
- On stores that send the server-side purchase only when the browser does not confirm it, a purchase that other code sends to the data layer while Google Tag Manager is running a tag is now confirmed, so the server-side purchase is no longer sent as well.
- The licence notices' "Activate license", "check your license key" and "Retry now" links now open the licence screen instead of a page WordPress refuses to show.
Changed
- Removed the licence and integrations admin scripts left over from GTM Kit's old settings screens. GTM Kit's settings app has handled the licence and integrations pages since 2.22.0, so these scripts no longer loaded anywhere. No change to what any site does.
Find out about what's new in our release post.
Added
- Custom product list tracking API. Themes that render product lists themselves, such as JavaScript-rendered grids, search-index results and AJAX carousels, can mark lists and products with data attributes or call a small JavaScript API, and GTM Kit sends view_item_list, select_item and list-attributed add_to_cart for them through its usual consent handling. Lists are sent once per set of products, by default when they scroll into view, and now carry item_list_id. Two template functions build the product data for server-rendered cards and search indexes.
- Cart sync API. Themes that change the cart with their own calls to the WooCommerce Store API can hand each cart response to gtmkit.cart.sync(), and GTM Kit sends add_to_cart and remove_from_cart for what changed, with the net quantity, the value and the full item data, through its usual consent handling. Adds from a tracked product list keep their list attribution, an add already reported through the list API is not reported twice, and nothing is sent on page load or for changes made in another tab. Loads with the custom product list tracking API and shares its cart baseline with the block cart tracking, so a response a theme also hands to the block cart is reported once, with its list attribution.
- Revenue per product list. When a product is added from a tracked custom list, the list is stored with the cart line and copied to the order, so the items of view_cart, begin_checkout, add_shipping_info, add_payment_info and purchase, including the purchase webhook, carry the list the product came from and GA4 can report which lists generate sales. Works with the custom product list tracking setting on. When the same product is added from more than one list the most recent list wins; a filter can keep the first instead.
- Consent from the GTM Kit consent bridge. On stores whose consent banner runs inside Google Tag Manager and reports to GTM Kit through the consent bridge template, the consent stored with the order at checkout now follows the visitor's answer in that banner, so the server-side purchase carries hashed customer details only when advertising consent was given. Requires the GTM Kit consent bridge template, available in the Template Assistant.
- German translation. GTM Kit Premium's settings, notices and order screen are now available in German, alongside Danish and Spanish.
Fixed
- On stores that send the server-side purchase only when the browser does not confirm it, and anonymize webhooks by consent, the anonymized purchase is now also sent for shoppers who denied analytics consent. Previously the browser's confirmation stopped it, so these purchases were missing from the server side.
- The event deferral queue now sends the events it is holding when the visitor leaves the page, so a purchase held for consent on the order confirmation page is no longer lost when the shopper closes the tab before the timeout. Applies to the flush expiry mode. Where the GTM Kit consent bridge is installed, the queue also follows the consent it reports instead of waiting for the timeout.
Changed
- GTM Kit Premium now requires GTM Kit 2.22.0 or later, and will not run until GTM Kit is updated.
Fixed
- On stores that send customer details with the purchase event, the purchase confirmation now waits while GTM Kit holds the purchase for consent, so the server-side purchase is no longer sent for orders the browser already delivered.
- On stores that send the server-side purchase only when the browser does not confirm it, the order confirmation page no longer reveals an order's key to a visitor whose link does not include it.
Changed
- The Unknown consent setting now also decides whether the purchase event in the browser carries customer details when GTM Kit finds no consent state, the same setting the server-side webhook uses for orders with no recorded consent. Requires GTM Kit 2.21.0 or later.
Fixed
- Removed a leftover test pop-up titled "GTM Kit Premium feature launch" that appeared once for every administrator opening a GTM Kit admin page.
- On sites with a persistent object cache such as Redis, GTM Kit Premium no longer re-runs its update routine on every admin page load when the cache still holds the previous version number. It also no longer clears the server's shared PHP code cache before updating.
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 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 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.
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.