{"id":353781,"date":"2026-08-18T22:56:48","date_gmt":"2026-08-18T22:56:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/tracking-hippo-server-side-tracking\/"},"modified":"2026-08-18T22:56:37","modified_gmt":"2026-08-18T22:56:37","slug":"tracking-hippo-server-side-tracking","status":"publish","type":"plugin","link":"https:\/\/tw.wordpress.org\/plugins\/tracking-hippo-server-side-tracking\/","author":23549298,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"5.9","requires_php":"7.2","requires_plugins":null,"header_name":"Tracking Hippo Server-Side Tracking","header_author":"Tracking Hippo","header_description":"Connect your WordPress and WooCommerce site to your Tracking Hippo server-side GTM container. First-party container loading, Consent Mode v2, the full GA4 ecommerce event set (classic and block checkout) and server-to-server order tracking.","assets_banners_color":"faf9ff","last_updated":"2026-08-18 22:56:37","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/trackinghippo.io\/for-wordpress","header_author_uri":"https:\/\/trackinghippo.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":48,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"trackinghippo","date":"2026-08-18 22:56:37"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3653627,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3653627,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3653627,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3653627,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3653627,"resolution":"1","location":"assets","locale":"","width":2424,"height":2360},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3653627,"resolution":"2","location":"assets","locale":"","width":2424,"height":2360},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3653627,"resolution":"3","location":"assets","locale":"","width":2424,"height":2360},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3653627,"resolution":"4","location":"assets","locale":"","width":2424,"height":2360},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3653627,"resolution":"5","location":"assets","locale":"","width":2424,"height":2360}},"screenshots":{"1":"The Container tab \u2014 server container URL, web container ID, first-party loader and custom loader path, with the health panel showing live status for the container, Consent Mode, ecommerce and webhooks.","2":"Consent Mode v2 defaults for all seven signals, targeted at the EEA and UK, with <code>wait_for_update<\/code>, <code>ads_data_redaction<\/code> and <code>url_passthrough<\/code>.","3":"The base data layer \u2014 page, post, author, search and language context, plus logged-in customer details, SHA-256 hashing and the WordPress user ID.","4":"The complete GA4 ecommerce funnel for WooCommerce, with the <code>item_id<\/code> source, an item prefix and the brand taxonomy used for <code>item_brand<\/code>.","5":"Server-side webhooks \u2014 endpoint, the events to send, which order statuses count as a purchase, and exactly what the payload carries."}},"plugin_section":[],"plugin_tags":[193472,23294,23295,276371,286],"plugin_category":[45],"plugin_contributors":[276372],"plugin_business_model":[],"class_list":["post-353781","plugin","type-plugin","status-publish","hentry","plugin_tags-ga4","plugin_tags-google-tag-manager","plugin_tags-gtm","plugin_tags-server-side-tagging","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-trackinghippo","plugin_committers-trackinghippo"],"banners":{"banner":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/banner-772x250.png?rev=3653627","banner_2x":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/banner-1544x500.png?rev=3653627","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/icon-128x128.png?rev=3653627","icon_2x":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/icon-256x256.png?rev=3653627","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/screenshot-1.png?rev=3653627","caption":"The Container tab \u2014 server container URL, web container ID, first-party loader and custom loader path, with the health panel showing live status for the container, Consent Mode, ecommerce and webhooks."},{"src":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/screenshot-2.png?rev=3653627","caption":"Consent Mode v2 defaults for all seven signals, targeted at the EEA and UK, with <code>wait_for_update<\/code>, <code>ads_data_redaction<\/code> and <code>url_passthrough<\/code>."},{"src":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/screenshot-3.png?rev=3653627","caption":"The base data layer \u2014 page, post, author, search and language context, plus logged-in customer details, SHA-256 hashing and the WordPress user ID."},{"src":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/screenshot-4.png?rev=3653627","caption":"The complete GA4 ecommerce funnel for WooCommerce, with the <code>item_id<\/code> source, an item prefix and the brand taxonomy used for <code>item_brand<\/code>."},{"src":"https:\/\/ps.w.org\/tracking-hippo-server-side-tracking\/assets\/screenshot-5.png?rev=3653627","caption":"Server-side webhooks \u2014 endpoint, the events to send, which order statuses count as a purchase, and exactly what the payload carries."}],"raw_content":"<!--section=description-->\n<p>Tracking Hippo Server-Side Tracking links your WordPress site to a server-side Google Tag Manager (sGTM) container hosted on <a href=\"https:\/\/trackinghippo.io\">Tracking Hippo<\/a>. Server-side tagging moves tracking out of the visitor's browser and onto your own first-party server, which improves data quality, page performance and resilience against ad blockers and browser tracking restrictions.<\/p>\n\n<p><strong>Container<\/strong><\/p>\n\n<ul>\n<li>Injects the Google Tag Manager web snippet in <code>&lt;head&gt;<\/code>, after <code>&lt;body&gt;<\/code>, in the footer \u2014 or not at all, if you only want the data layer.<\/li>\n<li><strong>First-party loader<\/strong> \u2014 serves <code>gtm.js<\/code> from your own container domain, with an optional custom path, so ad blockers and tracking prevention no longer recognise it.<\/li>\n<li>GTM environments (<code>gtm_auth<\/code> \/ <code>gtm_preview<\/code>), a configurable data layer variable name, and an optional <code>&lt;noscript&gt;<\/code> fallback.<\/li>\n<li><strong>Cookie keeper<\/strong> \u2014 re-issues the GA cookies from the server so Safari's seven-day cap on script-set cookies stops truncating returning-visitor attribution.<\/li>\n<li>Exclude specific user roles, and stop tracking entirely outside production.<\/li>\n<li>A built-in health panel warns about a missing container ID, a container on a third-party domain, a duplicate GTM plugin, or WP-Cron being disabled \u2014 and a <strong>Test connection<\/strong> button checks your container is live.<\/li>\n<\/ul>\n\n<p><strong>Consent Mode v2<\/strong><\/p>\n\n<ul>\n<li>Publishes the <code>gtag('consent', 'default', \u2026)<\/code> command ahead of the container, covering all seven signals including <code>ad_user_data<\/code> and <code>ad_personalization<\/code>.<\/li>\n<li>Apply the defaults globally, to the EEA and UK, or to a custom region list.<\/li>\n<li><code>wait_for_update<\/code>, <code>ads_data_redaction<\/code> and <code>url_passthrough<\/code> are all configurable, and the plugin warns you when a consent plugin is already publishing its own defaults.<\/li>\n<\/ul>\n\n<p><strong>GA4 ecommerce for WooCommerce<\/strong><\/p>\n\n<p>The complete funnel: <code>view_item_list<\/code>, <code>select_item<\/code>, <code>view_item<\/code>, <code>add_to_cart<\/code>, <code>remove_from_cart<\/code>, <code>view_cart<\/code>, <code>begin_checkout<\/code>, <code>add_shipping_info<\/code>, <code>add_payment_info<\/code> and <code>purchase<\/code>, plus <code>login<\/code> and <code>sign_up<\/code>.<\/p>\n\n<ul>\n<li><strong>Works with the Cart and Checkout blocks.<\/strong> Page events use WooCommerce's conditional tags rather than template hooks, and cart changes are detected from the <code>wc\/store\/cart<\/code> data store \u2014 so the block checkout is covered as fully as the classic one.<\/li>\n<li>Rich items: <code>item_brand<\/code>, <code>item_variant<\/code>, <code>item_category<\/code> through <code>item_category5<\/code> from the real category hierarchy, <code>discount<\/code>, <code>index<\/code>, and <code>item_list_id<\/code> \/ <code>item_list_name<\/code>.<\/li>\n<li><strong>List attribution<\/strong> carries the listing a product was clicked from into the later <code>add_to_cart<\/code>, so GA4 can credit the right list.<\/li>\n<li>Choose whether <code>item_id<\/code> is the SKU or the product ID, add a prefix to match your product feed, and report revenue with or without tax.<\/li>\n<li><code>{ ecommerce: null }<\/code> is pushed before every ecommerce event, as GA4 requires.<\/li>\n<li><code>purchase<\/code> is deduplicated per order, carries <code>customer_type<\/code> (new or returning), and can include hashed customer data for Enhanced Conversions.<\/li>\n<\/ul>\n\n<p><strong>Server-side webhooks<\/strong><\/p>\n\n<ul>\n<li>Sends <code>purchase<\/code>, <code>refund<\/code> and <code>order_paid<\/code> from your server to your container, so conversions survive a browser that blocks every script.<\/li>\n<li>Delivery runs on a background cron tick, so checkout is never slowed down, and failures retry with exponential backoff.<\/li>\n<li>The payload carries the GA cookies, client ID and session ID captured during checkout, so the server event joins the same GA4 session.<\/li>\n<li>Optional shared-secret header, configurable timeout, and a log of the last ten deliveries.<\/li>\n<\/ul>\n\n<p>Works on a plain WordPress site and adds the WooCommerce events automatically when WooCommerce is active. Compatible with High-Performance Order Storage.<\/p>\n\n<p><strong>Links<\/strong><\/p>\n\n<ul>\n<li><a href=\"https:\/\/trackinghippo.io\">Tracking Hippo<\/a> \u2014 <a href=\"https:\/\/trackinghippo.io\/for-wordpress\">WordPress setup guide<\/a> \u2014 <a href=\"https:\/\/trackinghippo.io\/modules\">Modules<\/a> \u2014 <a href=\"https:\/\/trackinghippo.io\/pricing\">Pricing<\/a><\/li>\n<li><a href=\"https:\/\/trackinghippo.io\/faq\">FAQ<\/a> \u2014 <a href=\"https:\/\/trackinghippo.io\/contact\">Contact support<\/a> \u2014 <a href=\"https:\/\/status.trackinghippo.io\/\">Service status<\/a> \u2014 <a href=\"https:\/\/trackinghippo.io\/feedback\">Give feedback<\/a><\/li>\n<li><a href=\"https:\/\/trackinghippo.io\/privacy\">Privacy policy<\/a> \u2014 <a href=\"https:\/\/trackinghippo.io\/terms\">Terms of service<\/a> \u2014 <a href=\"https:\/\/trackinghippo.io\/data-processing-agreement\">Data processing agreement<\/a> \u2014 <a href=\"https:\/\/trackinghippo.io\/cookies\">Cookie policy<\/a><\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects your site to a server-side Google Tag Manager container. Nothing is transmitted until you enter a container URL in the settings.<\/p>\n\n<p><strong>Your GTM server container<\/strong> (the domain you configure, hosted by Tracking Hippo or elsewhere)<\/p>\n\n<ul>\n<li><em>Browser requests:<\/em> when the first-party loader is enabled, visitors' browsers download the container script from your container domain instead of googletagmanager.com. The request carries the visitor's IP address, user agent and any analytics cookies, exactly as the Google-hosted script would.<\/li>\n<li><em>Server requests:<\/em> when webhooks are enabled, your server sends order events to the endpoint you configure. Each delivery can contain the order total and line items, the customer's email, phone, name and billing address, plus the analytics identifier, IP address and user agent captured at checkout. Email, phone and name are SHA-256 hashed by default.<\/li>\n<li>Both are governed by Tracking Hippo's <a href=\"https:\/\/trackinghippo.io\/terms\">terms of service<\/a>, <a href=\"https:\/\/trackinghippo.io\/privacy\">privacy policy<\/a> and <a href=\"https:\/\/trackinghippo.io\/data-processing-agreement\">data processing agreement<\/a>. If you point the plugin at a container hosted elsewhere, that provider's terms apply instead.<\/li>\n<\/ul>\n\n<p><strong>Google Tag Manager<\/strong> (googletagmanager.com)<\/p>\n\n<ul>\n<li>Used only as a fallback: with no server container URL configured, the container script is loaded from Google, subject to Google's <a href=\"https:\/\/marketingplatform.google.com\/about\/analytics\/tag-manager\/use-policy\/\">terms<\/a> and <a href=\"https:\/\/policies.google.com\/privacy\">privacy policy<\/a>.<\/li>\n<\/ul>\n\n<p>The plugin also stores, on each order, the analytics identifier, IP address and user agent captured at checkout, so orders can still be attributed when they are delivered later. This data is removed with the order, and everything the plugin stores is deleted when it is uninstalled. Suggested privacy-policy wording is added to Tools \u2192 Privacy for you to review.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>tracking-hippo-server-side-tracking<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP via Plugins \u2192 Add New \u2192 Upload Plugin.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open <strong>Tracking Hippo<\/strong> in the admin menu.<\/li>\n<li>Enter your Tracking Hippo server container URL and your GTM web container ID (<code>GTM-XXXXXXX<\/code>), then press <strong>Test connection<\/strong>.<\/li>\n<li>Work through the Consent, Data Layer, Ecommerce and Webhooks tabs. Each tab saves independently.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20tracking%20hippo%20account%3F\"><h3>Do I need a Tracking Hippo account?<\/h3><\/dt>\n<dd><p>Yes. The plugin connects your site to a server-side GTM container hosted by Tracking Hippo. Sign up at https:\/\/trackinghippo.io.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20woocommerce%3F\"><h3>Does it work without WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. On a plain WordPress site it loads the container and pushes the page, user and account context. The ecommerce events appear automatically once WooCommerce is active.<\/p><\/dd>\n<dt id=\"does%20it%20support%20the%20woocommerce%20cart%20and%20checkout%20blocks%3F\"><h3>Does it support the WooCommerce Cart and Checkout blocks?<\/h3><\/dt>\n<dd><p>Yes. Cart and checkout page events are derived from the cart itself rather than from classic template hooks, and add\/remove events come from the block data store, so both the classic and the block front-end are covered.<\/p><\/dd>\n<dt id=\"will%20it%20conflict%20with%20gtm4wp%20or%20the%20stape%20plugin%3F\"><h3>Will it conflict with GTM4WP or the Stape plugin?<\/h3><\/dt>\n<dd><p>Only one plugin should inject the container, otherwise every event is counted twice. The health panel detects the conflict; set <strong>Container placement<\/strong> to \"data layer only\" here, or disable the container in the other plugin.<\/p><\/dd>\n<dt id=\"should%20i%20switch%20consent%20mode%20on%20if%20i%20already%20use%20a%20consent%20banner%3F\"><h3>Should I switch Consent Mode on if I already use a consent banner?<\/h3><\/dt>\n<dd><p>Only if the banner does not publish its own defaults. The defaults have to be sent exactly once, before the container loads. The plugin warns you when it detects a consent plugin.<\/p><\/dd>\n<dt id=\"my%20webhooks%20never%20arrive.\"><h3>My webhooks never arrive.<\/h3><\/dt>\n<dd><p>They are delivered on the WP-Cron tick. If <code>DISABLE_WP_CRON<\/code> is set, make sure a real system cron calls <code>wp-cron.php<\/code>; the health panel flags this.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<p>Initial release.<\/p>\n\n<ul>\n<li>First-party container loading: the GTM web snippet served from your own container domain, with an optional custom loader path, configurable placement, GTM environment support and a custom data layer variable name.<\/li>\n<li>Google Consent Mode v2 defaults for all seven signals, with global, EEA\/UK or custom region targeting, <code>wait_for_update<\/code>, <code>ads_data_redaction<\/code> and <code>url_passthrough<\/code>.<\/li>\n<li>The complete GA4 ecommerce funnel for WooCommerce: <code>view_item_list<\/code>, <code>select_item<\/code>, <code>view_item<\/code>, <code>add_to_cart<\/code>, <code>remove_from_cart<\/code>, <code>view_cart<\/code>, <code>begin_checkout<\/code>, <code>add_shipping_info<\/code>, <code>add_payment_info<\/code> and <code>purchase<\/code>, plus <code>login<\/code> and <code>sign_up<\/code>.<\/li>\n<li>Support for the WooCommerce Cart and Checkout blocks, with cart changes detected through the <code>wc\/store\/cart<\/code> data store.<\/li>\n<li>Rich ecommerce items: <code>item_brand<\/code>, <code>item_variant<\/code>, the full <code>item_category<\/code> hierarchy, <code>discount<\/code>, <code>index<\/code>, and list attribution carried through the funnel.<\/li>\n<li>Page, post, author, search and language context in the base data layer, plus <code>user_id<\/code> and hashed customer data for Enhanced Conversions.<\/li>\n<li>Server-side webhooks for <code>purchase<\/code>, <code>refund<\/code> and <code>order_paid<\/code>, delivered on a background cron tick with exponential-backoff retries, a shared-secret header and a delivery log.<\/li>\n<li>Cookie keeper to restore the full lifetime of first-party analytics cookies under Safari's tracking prevention.<\/li>\n<li>Role exclusion, a production-only kill switch, and a health panel that flags duplicate GTM plugins, third-party container domains and a disabled WP-Cron.<\/li>\n<li>Compatible with High-Performance Order Storage and the Cart\/Checkout blocks.<\/li>\n<\/ul>","raw_excerpt":"Server-side GTM for WordPress and WooCommerce: first-party loading, Consent Mode v2, full GA4 ecommerce and server-side order tracking.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/353781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=353781"}],"author":[{"embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/trackinghippo"}],"wp:attachment":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=353781"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=353781"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=353781"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=353781"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=353781"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=353781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}