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.
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.
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 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 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.
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.
Added
- New “Engagement events” settings section emits GA4 standard
login,sign_up,search, andgenerate_leadevents out of the box. Each event has its own toggle and defaults to on, so customers see the events the moment they upgrade. - Rebuilt WooCommerce block tracking on stable data-store APIs. Cart, Checkout, Mini Cart, All Products, Product Collection, Single Product, Related Products, the Cart block cross-sells, and product filter blocks now all emit ecommerce events end to end, including add_to_cart and view_cart from the Mini Cart, list and select tracking for the All Products grid and cart cross-sells, and view_item_list re-fires when a filter or pagination control updates a Product Collection.
Fixed
- The Contact Form 7 integration now loads reliably on form pages when “Load JavaScript” is set to the recommended “Only on pages where the Contact Form 7 script is registered” mode, even when a performance plugin (e.g. WP Rocket) defers Contact Form 7’s own scripts until shortcode render. Previously the integration could be skipped on legitimate form pages and
gtmkit.CF7MailSentwould not fire.
Changed
- New developer filters let extensions tag the method, normalise the search term, assign a lead value, rename the handoff cookie, veto any event, or opt custom search templates into the
searchevent. - New
gtmkit_blocks_supportedfilter lets developers add custom block names to the list that loads GTM Kit’s block tracking. - Raised the minimum WooCommerce version to 10.3 for the new block tracking integration. Sites on earlier WooCommerce continue to receive classic-template tracking unchanged.
- Added Vitest and Playwright test harnesses covering the block tracking path, plus PHPUnit coverage for the block detection and Store API extension.
Fixed
- The “Exclude pages from GTM” feature now also holds back the WooCommerce, Contact Form 7, and Easy Digital Downloads tracking scripts on excluded pages. Previously those add-on scripts could still load on an excluded page and fail, because the core GTM Kit runtime they rely on was withheld there.
Added
- New “Exclude pages from GTM” section on the Container settings page lets you list URL patterns where GTM Kit should stay off. Useful for third-party checkout iframes, partner-hosted subpages, or in-app webview routes that have their own tracking.
- New
window.gtmkit.events.push()helper now sits in front of every GTM Kit event push, so an add-on can defer consent-sensitive events in the browser without server-side suppression.
Changed
- The existing
gtmkit_container_activefilter now receives the actual computed container-active value instead of a hardcodedtrue, so callbacks that return the value through unchanged automatically honor the new URL exclusion. - PHP-rendered initial dataLayer content is now emitted through the same client helper, so deferral works the same on full-page-cached and uncached pages.
Added
- New welcome modal greets fresh installs on their first GTM Kit admin page and links to the documentation. Existing installs are not interrupted.
- GTM Kit can now surface launch and upgrade announcements from gtmkit.com without a plugin release.
Fixed
- Prevent a fatal error on WooCommerce shop and archive pages when another plugin (e.g. WP Grid Builder) re-runs the product loop without a current product in context. GTM Kit now skips its hidden product-data tag instead of crashing the page.
- No more “headers already sent” PHP warning when running WP-CLI commands on sites that use the Cookie Keeper option.
Changed
- New
gtmkit_introductionsfilter andIntroduction_Interfacecontract let add-ons register their own announcement modals through a documented public API.
Added
- “Exclude tax” toggle now controls every standard e-commerce event the data layer emits:
view_cart,begin_checkout,purchase, variation prices on variable product pages (re-firedview_item+add_to_cart), and the per-item coupondiscountfield. - Heads up: GA4 numbers may move after this update. Stores with prices entered ex-tax and tax-inclusive cart display will see
valuechange from ex-tax to inc-tax in cart and checkout events. - New
gtmkit_resolve_tax_modeandgtmkit_resolve_item_discountfilters let developers override the toggle programmatically (per-event or per-context) and override the per-item coupon discount calculation. - Minimum required WordPress version is now 6.8 (was 6.7). Sites still on WordPress 6.7 won’t get this update via the dashboard until they upgrade WordPress.
Fixed
- Cart, checkout, variation, and coupon-discount events now follow the “Exclude tax” toggle consistently across
value,price, anddiscountfields. The GTM Kit Woo and GTM Kit Premium add-ons extend the fix to refund and order-paid events in their paired releases. - Silence the “translation loading triggered too early” notice that WordPress 6.7+ logs against the
gtm-kittext domain by registering translations at the very start ofinitbefore any other code can request a translated string. - Close an edge case where a script-dependency notice could still appear under WordPress 6.9.1+ when a consent or CMP plugin toggled the GTM Kit container active mid-request, by asking the WordPress script registry directly which scripts were actually registered instead of re-evaluating the container gate.
Added
- New
gtmkit_consent_admin_badgesfilter lets add-ons (e.g. Premium’s WP Consent API integration) push status banners onto the Consent settings page so users see immediately when a higher-priority consent source has taken over.
Added
- New “CMP script attributes” section on the Consent settings page lets you toggle Cookiebot, Iubenda, and CookieYes script-blocking attributes with one click and add a custom attribute for any other CMP — no PHP filters required.
- Fresh installs auto-detect a known CMP plugin (Cookiebot, Iubenda, CookieYes) and pre-select the matching toggle so the right attribute is on from day one.
- New “Script gating” mode on the Consent settings page lets you choose between always loading GTM, letting it load under Consent Mode v2 control, or holding it back entirely until consent is granted. Default stays as “Always load” so existing installs see no change.
- Strong-block mode masks the Google Tag Manager container until visitors consent. Works alongside any CMP and falls back gracefully when no consent signal arrives.
- Power users can override which consent categories must be granted before strong-block mode unmasks GTM via the new
gtmkit_strong_block_required_categoriesfilter. window.gtmkit.consent.stateexposes the current consent state so partner scripts and integrators can inspect it without subscribing to events.- New developer hooks let CMP integrations and consent add-ons plug into GTM Kit’s consent flow without forking the plugin — sites running Cookiebot, CookieYes, WP Consent API or in-house consent solutions can now feed their state straight into GTM Kit.
- Server-side broadcast
gtmkit_consent_updatedso other plugins can react to consent state changes without polling. - Per-event
gtmkit_event_should_deferfilter so future deferral features can hold individual events back when consent is missing.
Fixed
- Eliminate “dependencies that are not registered: gtmkit-container” warnings logged by WordPress 6.9.1+ on sites that have GTM Kit’s container active.
Changed
- The Cookiebot script attribute (
data-cookieconsent="ignore") is now configurable via Settings → Consent → CMP script attributes. Existing installs keep the attribute on by default to preserve current behavior; turn it off explicitly if you do not use Cookiebot.
Added
- Scope Google Consent Mode defaults to specific countries or regions (e.g. DK, DE, US-CA) instead of applying them everywhere. Useful for sites with visitors both inside and outside the EU.
- Consent updates from other plugins or partner scripts can now talk to GTM Kit through a simple JavaScript API, making CMP integrations easier.
Fixed
- Webhooks for Server-side Tracking on the WooCommerce integrations page no longer stay locked after entering an sGTM Container Domain on premium installs.
Changed
- “Wait For Update” is now a proper number field with a sensible 500 ms default on new installs. Your existing value is kept.
- Clearer warning on the Consent Mode page — if Cookiebot, Complianz, CookieYes, or Cookie Information already handles your consent, leave this setting off.
- Introduced an internal automated test suite (PHPUnit + Vitest) and continuous integration across PHP 7.4–8.4 × WordPress 6.9. No functional change — every future release is now verified by unit and integration tests before shipping, raising the bar on quality and reliability.