Limited-Time Offer

Get Extra 20% off on FullCharge Yearly Plan — available for first 10 users only. Don’t miss out! 🚀

GTM4WP · Version history

GTM4WP changelog and version history

Latest version
2.1.1
Nov 5, 2026 (5 days ago)
Releases
83
since 2013
In the last year
13
about one every 29 days
Tested up to
WordPress 7.1.4
PHP 8.0 or later

Releases each year

  • 20135 releases
  • 20147 releases
  • 20156 releases
  • 20166 releases
  • 20175 releases
  • 20183 releases
  • 20197 releases
  • 20204 releases
  • 20218 releases
  • 20227 releases
  • 20234 releases
  • 20244 releases
  • 20256 releases
  • 202611 releases

202611 releases

  1. GTM4WP 2.1.1Latest

    • Fixed: some sites received an incomplete 2.1.0 package and stopped with a fatal error naming EasyDigitalDownloadsModule. 2.1.1 is the same code as a complete package. A site already showing the error needs the plugin folder removed and the plugin installed again.
  2. GTM4WP 2.1.0

    • Changed: for developers, ContainerCode::header_top() always prints its block; the never-used argument that made it return the block instead is gone.
    • Changed: the container loader requests gtm.js over https:// instead of the protocol-relative // form the plugin has emitted since 1.x, matching the snippet Google publishes today. Only a site still served over plain http sees a difference; the <noscript> iframe already used https://.
    • Fixed: the <noscript> part of the container code stays on the page on WordPress 7.2, whose new HTML filter would have removed it. Sites verified in Search Console through Tag Manager rely on this part.
    • Fixed: with the container code placement set to “Off” and no container ID entered, the data layer and the server-side WooCommerce events, purchase included, were not written. “Off” is the data-layer-only setup and needs no container ID, so these sites now get the full data layer.
    • Fixed: the plugin no longer buffers every WooCommerce template part on every page. That buffering only fed the classic “Products” widget, whose tracking had been dead since 2017. If a GTM trigger filters on an item_list_name ending in “(widget)”, remove that condition.
    • Fixed: the description of the WooCommerce “Order data in data layer” setting now says it needs “Track e-commerce” and where orderData appears: the order received page, even for a tracked order, the next page of the reliable purchase fallback without the cache-safe data layer, and theme or builder t…
    • Fixed: the description of the WooCommerce “Customer data in data layer” setting now names everything it adds: the logged-in customer’s account name and hashed billing email, and the Enhanced Conversions user_data block (hashed email, phone and name, plain billing address) on the purchase event. It…
    • Fixed: a settings import file with a checkbox written as the text “false” switched that option on; it now means off, as it does when saving the settings screen.
    • Fixed: every REST API request on the site built the plugin’s settings schema, and with WooCommerce that loaded every published page for the custom order received page selector. On sites with many pages and a persistent object cache, this slowed down every request.
    • Fixed: a request to the plugin’s settings REST route from someone without access to the settings is refused as unauthorized before its values are checked, instead of answering with a validation error.
    • Changed: a settings export carries only the plugin’s own options. Keys another plugin wrote into GTM4WP’s option row, and 1.x options not yet cleaned up, are left out; importing the file gives the same settings as before.
    • Fixed: a password-protected WooCommerce product no longer reports view_item or its product data before the password is entered.
    • Fixed: with “Exclude tax” on and the shop showing prices with tax, WooCommerce product (selected variation included), list, add_to_cart and cart prices included tax while the purchase did not. They now use the purchase’s basis, so on such stores an Ads or Meta tag reading add_to_cart values sees pr…
    • Fixed: WooCommerce items the gtm4wp_eec_cart_item or gtm4wp_eec_order_item filter excludes are left out of every event, including remove_from_cart, the block cart and checkout, and Undo. Classic cart and checkout views and the purchase also follow WooCommerce’s own item visibility filters, and serv…
    • Fixed: a WooCommerce order is flagged as tracked only when its purchase event is really printed, on the order received page, a third-party thank-you page and the reliable purchase fallback alike, so a site filter that breaks the event no longer suppresses the purchase for good.
    • Fixed: WooCommerce add_to_cart and remove_from_cart events now always report value and the item price as numbers, rounded to cents and 0 when a price is missing, on every product, list, cart and block path. Check your GTM setup if a trigger or variable compares value against a string.
    • Fixed: with “Do not flag orders as being tracked” and the cache-safe data layer on, WooCommerce’s “Reliable purchase tracking” could report the same purchase again on later pages. It now has no effect in that combination, as in Easy Digital Downloads.
    • Fixed: page-caching issues in WooCommerce purchase tracking. Details are withheld until the fix reaches every supported version.
    • Fixed: with the cache-safe data layer on, a site filter putting a value JSON cannot encode (such as NAN) into one visitor data field no longer empties the whole response; only that field is left out.
    • Fixed: a site filter returning a non-numeric product price, or something other than an item, order data or purchase array, no longer stops WooCommerce pages with a PHP error or adds an empty item to the data layer. A non-numeric price counts as zero; anything else leaves that item, orderData or pur…
    • Fixed: a gtm4wp_compile_datalayer or gtm4wp_visitor_scoped_fields filter callback that returns something other than an array no longer stops WooCommerce pages, pages with tag restrictions, or every page with the cache-safe data layer on, with a PHP error.
    • Fixed: on a site whose address uses non-Latin characters (an internationalised domain), the WooCommerce and Easy Digital Downloads purchase and re-add confirmations from the browser were refused, so orders could be counted again on another device.
    • Fixed: behind a server that reports visitors’ IPv4 addresses in IPv6 form (::ffff:…), visitorIP was left out and the trusted proxy list and the Cloudflare country code did not match.
    • Fixed: the WooCommerce add_to_cart for an item restored with “Undo” now reports the product the cart shows, as the matching remove_from_cart does, for bundle and composite products.
    • Fixed: a Yoast SEO or Rank Math primary category that was deleted or removed from the post is skipped, so pagePrimaryCategory falls back to the next source instead of being left out.
    • Fixed: the user login and registration events could be lost when the first request after logging in was not a page, such as the browser fetching /favicon.ico after a login to wp-admin.
    • Fixed: a Mixcloud show embedded through WordPress reported a malformed URL (https://www.mixcloud.comhttps://…) and a different id than the same show embedded with Mixcloud’s own code.
    • Fixed: the Twitch tracker stopped polling only when the video paused or ended, so a player removed while playing kept its timer running for the rest of the page view.
    • Fixed: device data now names Chrome, Firefox and Edge on iOS, and asks the browser only for the detailed client hints the enabled device data options report.
    • Fixed: with the cache-safe data layer on, siteSearchFrom is cleaned and encoded exactly like the classic data layer, and is empty instead of missing on a search with no referring page, so both report the same value.
  3. GTM4WP 2.0.6

    • Fixed: visitors browsing in the in-app browser of an Android app such as Facebook or Instagram got no WooCommerce data layer, so their purchase and other e-commerce events were missing. Thanks to @sw33tr for the report (#477).
    • Fixed: on the classic cart page, re-adding a removed product with “Undo” now sends add_to_cart. WooCommerce restores it in the background and discarded the page part that carried the event.
    • Fixed: with “Clear ecommerce object before new event” on, the e-commerce events GTM4WP adds as the page loads (view_item, view_cart, begin_checkout, purchase, the cart “Undo” add_to_cart) and the Quick View view_item are now cleared before too, not only the events fired in the browser.
    • Fixed: the plugin conflict notice now calls Google Analytics for WooCommerce by its current name.
    • Fixed: WooCommerce Mini-Cart tracking (remove_from_cart from the Mini-Cart drawer) now loads only on pages that show the Mini-Cart block. Stores using the Cart or Checkout block no longer load the WordPress data scripts on every page, and stores with a classic cart now track removals from a Mini-Ca…
    • Fixed: a WooCommerce Product Bundles bundle reported stockstatus as instock in the e-commerce items even when one of its bundled products was out of stock and the bundle could not be bought; it now reports outofstock. Thanks to @KingWehsops for the report (#474).
    • Fixed: a gtm4wp_overwrite_consent_mode_flag filter callback returning the string denied set that consent signal to granted; the filter now also accepts granted and denied.
    • Fixed: a WooCommerce checkout total that is not a finite number no longer breaks the inline checkout script; gtm4wp_checkout_value is null then.
    • Fixed: hardened how the plugin’s REST endpoints answer requests made from other pages.
    • Changed: siteSearchTerm carries the search term as typed; the classic data layer used to HTML-encode it while the cache-safe one did not. A GTM trigger matching the encoded form needs the plain text now.
    • Changed: pageTitle carries the title as the visitor reads it: WordPress’s encoding of ampersands, quotes and dashes is decoded. A GTM trigger matching the encoded form needs the plain text now.
    • Changed: the Contact Form 7 tracker script is no longer loaded while Contact Form 7 is not installed.
    • Changed: for developers, gtm4wp_datalayer_push() returns false for a non-string $js_before/$js_after argument instead of printing Array into the page.
    • Fixed: thank-you pages that show the purchase are now kept out of page caches. The page set as “Custom order received page” is treated the same way WooCommerce treats its own order received page; a thank-you page built by a theme or page builder is excluded from page-cache plugins.
    • Fixed: on a password-protected post, the post meta, word count and reading time variables are left out of the data layer for visitors who have not entered the password.
    • Fixed: when the Contact Form 7 tracker’s settings do not reach the page (for example an optimisation plugin drops inline scripts), it no longer falls back to sending the submitted form values.
    • Fixed: a PHP error when woocommerce_thankyou fired with an id that is not an order, or on a product page whose product could not be loaded.
    • Updated: tested with WooCommerce 11.2.0.
  4. GTM4WP 2.0.5

    • Fixed: the data layer initialisation block no longer contains the word gtag. Since 2.0.3, a JavaScript delay plugin with gtag on its keyword list, such as Flying Scripts, delayed the whole block and the browser console showed dataLayer is not defined. The Google tag developer ID is still set.
    • Fixed: a page with no data layer variables to report no longer pushes an empty array into the data layer; dataLayer_content is then an empty object and is not pushed. Content that is pushed is always an object, never an array, which GTM would read as a command.
  5. GTM4WP 2.0.4

  6. GTM4WP 2.0.3

  7. GTM4WP 2.0.2

  8. GTM4WP 2.0.1

    • Bug fix releases of the 2.0 line. Their changes are listed in the full changelog: https://gtm4wp.com/changelog#v2-0-4
  9. GTM4WP 2.0.0

    • Major rewrite of the plugin. Please read the announcement post on gtm4wp.com before upgrading. This section is a summary; wordpress.org truncates a changelog after 5,000 words, so the complete list of 2.0.0 changes with every detail lives in the full changelog: https://gtm4wp.com/changelog
    • Changed: complete object-oriented rewrite. Every feature is a module that third-party plugins can extend. All public template functions, filter and action names, wp-config constants and the options storage key are unchanged, so existing integrations keep working.
    • Changed: minimum requirements raised to PHP 8.0 and WordPress 6.3.
    • Added: modern React-based settings screen with left pane navigation, tabbed option groups, option search, inline validation, a help link on every option, bookmarkable addresses and settings export and import.
    • Added: every Google Tag Manager container ID has its own environment parameters, custom domain and custom path; a production-only kill switch for staging copies; validation of the hard-coded wp-config constants with a warning that names the wrong one.
    • Changed: the tag restriction list is written under the documented gtm.allowlist / gtm.blocklist keys, the entity list is refreshed from Google’s documentation, and blocklist mode no longer blocks every tag.
    • Added: cache-safe data layer mode for sites behind a full page cache, with the visitor specific values fetched separately.
    • Changed: GA4 e-commerce tracking reworked for WooCommerce: reliable purchase tracking, custom order received page, order statuses that trigger the purchase event, list attribution across the funnel, block cart and checkout support, Store API data for the block trackers, and numeric-looking text val…
    • Added: an Axeptio consent management platform integration and a CookieYes consent bridge; the WebToffee v2.x integration is deprecated. Media events cover more embedded players, and a player’s script is requested only on pages that contain one of its embeds.
    • Removed: the weather and geo data features and the scroll tracking feature (use the built-in Scroll Depth trigger of Google Tag Manager instead). Browser, OS and device data is now collected in the browser with User-Agent Client Hints, which replaces the bundled WhichBrowser library.
    • Deprecated: the “YouTube video events” option (Google Tag Manager ships a native YouTube Video trigger) and the $gtp4wp_plugin_url, $gtp4wp_plugin_basename and $gtp4wp_script_path global variables, which will be removed in 2.1.
    • Older releases are listed in the full changelog: https://gtm4wp.com/changelog/1-x
  10. GTM4WP 1.22.5

  11. GTM4WP 1.22.4

20256 releases

  1. GTM4WP 1.22.3

  2. GTM4WP 1.22.2

  3. GTM4WP 1.22.1

  4. GTM4WP 1.22

  5. GTM4WP 1.21.1

  6. GTM4WP 1.21

20244 releases

  1. GTM4WP 1.20.3

  2. GTM4WP 1.20.2

  3. GTM4WP 1.20.1

  4. GTM4WP 1.20

20234 releases

  1. GTM4WP 1.19.1

  2. GTM4WP 1.19

  3. GTM4WP 1.18.1

  4. GTM4WP 1.18

20227 releases

  1. GTM4WP 1.16.2

  2. GTM4WP 1.16.1

  3. GTM4WP 1.16

  4. GTM4WP 1.15.2

  5. GTM4WP 1.15.1

  6. GTM4WP 1.15

  7. GTM4WP 1.14.2

20218 releases

  1. GTM4WP 1.14.1

  2. GTM4WP 1.14

  3. GTM4WP 1.13.1

  4. GTM4WP 1.13

  5. GTM4WP 1.12.3

  6. GTM4WP 1.12.2

  7. GTM4WP 1.12.1

  8. GTM4WP 1.12

20204 releases

  1. GTM4WP 1.11.6

  2. GTM4WP 1.11.5

  3. GTM4WP 1.11.4

  4. GTM4WP 1.11.3

20197 releases

  1. GTM4WP 1.11.2

  2. GTM4WP 1.11.1

  3. GTM4WP 1.11

  4. GTM4WP 1.10.1

  5. GTM4WP 1.10

  6. GTM4WP 1.9.2

  7. GTM4WP 1.9.1

20183 releases

  1. GTM4WP 1.9

  2. GTM4WP 1.8.1

  3. GTM4WP 1.8

20175 releases

  1. GTM4WP 1.7.2

  2. GTM4WP 1.7.1

  3. GTM4WP 1.7

  4. GTM4WP 1.6.1

  5. GTM4WP 1.6

20166 releases

  1. GTM4WP 1.5.1

  2. GTM4WP 1.5

  3. GTM4WP 1.4

  4. GTM4WP 1.3.2

  5. GTM4WP 1.3.1

  6. GTM4WP 1.3

20156 releases

  1. GTM4WP 1.2

  2. GTM4WP 1.1.1

  3. GTM4WP 1.1

  4. GTM4WP 1.0

  5. GTM4WP 0.9.1

  6. GTM4WP 0.9

20147 releases

  1. GTM4WP 0.8.2

  2. GTM4WP 0.8.1

  3. GTM4WP 0.8

  4. GTM4WP 0.7.1

  5. GTM4WP 0.7

  6. GTM4WP 0.6

  7. GTM4WP 0.5.1

20135 releases

  1. GTM4WP 0.5

  2. GTM4WP 0.4

  3. GTM4WP 0.3

  4. GTM4WP 0.2

  5. GTM4WP 0.1

Questions about GTM4WP’s releases

What is the latest version of GTM4WP?

2.1.1, released on Nov 5, 2026 (5 days ago). It’s tested up to WordPress 7.1.4 and needs PHP 8.0 or later.

How often is GTM4WP updated?

13 releases in the last year, about one every 29 days. Its first release on WordPress.org dates from September 2013.

Know when your rivals ship

Track your plugin and its rivals: TrackWP sees each new release in the nightly snapshot and alerts you, with what it did to their rank.

Start free

Release dates come from the day each version’s folder was made in GTM4WP’s WordPress.org SVN repository; the notes from its readme’s changelog, as its authors wrote it.