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.
Find out about what's new in our release post.
Added
- AI assistants connected through the WordPress Abilities API can now change a short list of GTM Kit settings, such as the container ID, consent defaults and integrations. Every change is previewed first and only applied with the one-time code from that preview. This is off until you turn it on with the gtmkit_write_abilities_enabled filter.
- Product variations in the data layer now also carry their parent product's ID, in a field named item_group_id and in the same format as the item ID, so a variation can be tied back to its product in reports and in Merchant Center feeds.
- Open any GTM Kit settings section, the setup wizard or Google Tag Manager from the WordPress command palette (Ctrl+K or Cmd+K).
Fixed
- GTM Kit's abilities now reach AI assistants on sites where another plugin loads an older copy of the MCP Adapter.
- The consent status that AI assistants and Site Health report is now the default a new visitor gets, not the consent of the administrator viewing it.
- Saving the settings no longer fails when a switch was stored as the text "true" or "false", which can happen when a setting is changed outside the settings screen. The save now stores it as a proper on or off value, and a Google tag gateway stored as "false" is saved as off.
- A search from the Product Search block is now counted once. Block themes counted it twice, and classic themes lost it when engagement search tracking was off.
- A product search with a single match, which WooCommerce sends straight to the product page, is now counted as a search when engagement search tracking is on.
- Searches from the Product Search block that WooCommerce now adds as a version of the WordPress Search block are counted when engagement search tracking is off.
- The data layer name is now checked when you save it. A name that is not a valid JavaScript name, such as one with a space, is refused instead of breaking the container on every page.
- Importing from GTM4WP now brings over a server-side domain that uses GTM4WP's default script path, and a re-import clears a domain an earlier import saved but could not use.
- The Stape loader notice now also appears when a saved loader no longer matches your settings, and the Google tag gateway's custom-domain message says the Stape loader is off too.
Changed
- When an AI assistant previews a change to the data layer name, the preview now warns that other scripts using the old name will need updating.
- Clearer consent advice in Site Health.
Find out about what's new in our release post.
Fixed
- With "Just the container" turned on, GTM Kit outputs the Google Tag Manager container again. It was left out of the page, so no tags fired.
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
- The GTM Kit settings screen now checks that your browser can reach your site's settings API when it opens, and shows a notice if it cannot, if your site answers with an error, or if it is slow to answer. The notice explains the usual causes, such as a browser extension, ad blocker, VPN or firewall, and lets you copy the details for support. The check talks only to your own site and sends nothing anywhere else.
Changed
- The event deferral warning in the settings, shown when GTM Kit cannot see a consent state, now names the two fixes that work with a consent banner running inside Google Tag Manager: the GTM Kit consent bridge tag in the container, or a consent plugin that supports the WP Consent API. It no longer suggests turning on Consent Mode.
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.
Find out about what's new in our our release post.
Added
- Consent set by a consent platform that runs inside Google Tag Manager can now reach GTM Kit's purchase consent check through GTM Kit's consent bridge template, which you can add to your container from the Template Assistant. The template reports the visitor's consent state to GTM Kit through Google Tag Manager's documented template interfaces.
- System data you share with GTM Kit support now includes the installed versions of GTM Kit Premium and the GTM Kit Woo Add-On, so support can see which build a site runs. The anonymised site data is unchanged.
Fixed
- Product variations loaded over admin-ajax, which some themes use instead of the WooCommerce variation form, now carry the tax-resolved price GTM Kit adds to every variation, so the variation events those themes send report the same price as the rest of the data layer.
Changed
- Add-ons can now add data stored on a cart line or an order line to the items of the cart, checkout and purchase events through two new filters that receive the WooCommerce line next to the item.
- The cart tracking for WooCommerce blocks now keeps the last reported cart in one shared place (window.gtmkit.wc.cartSnapshot), so a cart change another script has already recorded there is not reported again by the block tracking.
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.
Find out about what's new in our our release post.
Added
- AI assistants connected to your site through the WordPress Abilities API can now read how GTM Kit is set up, which consent defaults apply, and whether tracking is healthy. Only administrators can use them, nothing can be changed through them, and they send nothing off your site.
- If you use the loader Stape issues but GTM Kit has none stored for your site, the GTM Kit dashboard now tells you that your pages use the standard loader and how to get Stape's loader back with Refresh.
Fixed
- If the Google tag gateway is switched on while a custom server-side tagging domain is set, the GTM Kit dashboard now says the two cannot be used together and how to choose between them, instead of reporting that the gateway is not working. The settings screen explains why one of the two is unavailable only while it is.
- Site Health no longer reports that consent is configured when the Consent Mode defaults deny analytics and no consent platform was found to grant it, a setup where every visitor is measured without cookies. It now recommends adding a consent platform or changing the defaults, and the Consent settings page shows the same warning.
- Site Health no longer says consent is not configured when the Consent Mode defaults are off because a consent integration, such as one using the WP Consent API, sets and updates the visitor's consent.
- Importing settings from GTM4WP no longer sets a server-side tagging domain when GTM4WP loads the container from a custom path, which produced a loader address that did not serve your container. The import now says the domain was skipped.
Changed
- On stores with a classic theme, shop, product and category pages without WooCommerce blocks no longer load GTM Kit's block tracking script, so those pages load less JavaScript. Pages that show a WooCommerce block anywhere, including a Mini Cart in a widget area, still load it, and block themes are unchanged.
- If you send customer details with the purchase event and use Consent Mode, GTM Kit now adds the email, phone, name and address, hashed or not, only once the visitor has granted both advertising storage and advertising user data consent. If consent is denied, or a denying default has not been lifted within three seconds, the purchase is still sent, without those details. GTM Kit reads consent from its own data layer, from
dataLayerif that is a different one, and from the consent state Google Tag Manager holds, so consent a consent platform sets through its Google Tag Manager template counts too. A denial in any of them withholds the details. If GTM Kit finds no consent state at all within three seconds, it sends the details, as it did before, and a developer can make GTM Kit withhold them in that case with a filter.
Find out about what's new in our our release post.
Fixed
- If you use the loader Stape issues, GTM Kit no longer uses a loader stored by an earlier version, because it cannot tell whether that loader was checked against your data layer name. Your pages use the standard loader until you click Refresh under Server-side Tagging, which gets a checked loader from Stape.
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.
Find out about what's new in our our release post.
Fixed
- If refreshing or pasting your Stape loader fails, the settings screen now names the loader your pages keep using, instead of claiming they fell back to the standard loader. A request that fails before reaching Stape, for example because your login has expired, now says so instead of reporting that Stape could not be reached.
- If saving your settings fails because the connection to your site dropped, the settings screen now says there is a network problem instead of reporting a server error.
- If activating your licence fails because the request itself failed, for example because the connection dropped, the licence screen now says so instead of telling you to check your licence key. If deactivating fails, the button no longer keeps spinning: the screen shows what went wrong and lets you try again.
- If a Stape loader is made for a different data layer name than GTM Kit uses, whether you paste it or GTM Kit gets it from Stape, the settings screen now refuses it and says why, instead of using a loader that listens to the wrong data layer.
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.