{"id":314218,"date":"2026-05-31T20:07:48","date_gmt":"2026-05-31T20:07:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/datalayer-tracker\/"},"modified":"2026-05-31T20:07:18","modified_gmt":"2026-05-31T20:07:18","slug":"brandmeetscode-datalayer-tracker","status":"publish","type":"plugin","link":"https:\/\/rhg.wordpress.org\/plugins\/brandmeetscode-datalayer-tracker\/","author":12580753,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.7","stable_tag":"1.2.7","tested":"7.0","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"BrandMeetsCode DataLayer Tracker","header_author":"Brand Meets Code","header_description":"Consent-aware dataLayer for GTM \u2014 engagement, forms, WooCommerce browser events, sessions, and debug overlay. Pro add-on adds pixels, server-side, and GTM export.","assets_banners_color":"d3d3d3","last_updated":"2026-05-31 20:07:18","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/datalayer-tracker.com\/knowledge-base\/","header_author_uri":"https:\/\/brandmeetscode.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":33,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.7":{"tag":"1.2.7","author":"Whittfield","date":"2026-05-31 20:07:18"}},"upgrade_notice":{"1.2.2":"<p>Documents free vs Pro split, optional <code>wp-config.php<\/code> URL overrides, and root build scripts. See changelog for full URLs.<\/p>","1.2.1":"<p>Major update with multi-pixel support, cart abandonment tracking, and performance improvements. Recommended for installs using the full Pro feature set.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3556893,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3556893,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3556830,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3555925,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3556927,"resolution":"1","location":"assets","locale":"","width":1280,"height":720},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3556927,"resolution":"2","location":"assets","locale":"","width":1280,"height":720},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3556927,"resolution":"3","location":"assets","locale":"","width":1280,"height":720},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3556927,"resolution":"4","location":"assets","locale":"","width":1280,"height":720},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3555925,"resolution":"5","location":"assets","locale":"","width":1280,"height":720},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3555925,"resolution":"6","location":"assets","locale":"","width":1280,"height":720}},"screenshots":{"1":"<strong>Live debug overlay (admin-only)<\/strong> \u2014 Real-time <code>dataLayer<\/code> event stream on your site: filter by type, pin events, expand JSON payloads, and verify tracking before GTM Preview. Visible only to logged-in users at or above the role you set in Settings (default: Administrator). <a href=\"https:\/\/datalayer-tracker.com\/debug-overlay-demo\">Try the interactive demo<\/a>.","2":"<strong>Debug options<\/strong> \u2014 Enable the overlay, console logging, blocked-event visibility, and event filters so your team can QA on real traffic without exposing tools to visitors.","3":"<strong>Setup wizard<\/strong> \u2014 Guided first run: GA4\/GTM IDs, consent behavior, engagement toggles, and optional WooCommerce\u2014production measurement configured in one flow, not guessed.","4":"<strong>Engagement signals<\/strong> \u2014 Scroll depth (single <code>scroll_depth<\/code> or per-milestone modes), active time, scroll back up, tab visibility, hover intent, and related milestones pushed to <code>dataLayer<\/code>.","5":"<strong>Interaction tracking<\/strong> \u2014 Clicks, forms, and media mapped to consistent events (<code>form_view<\/code>, <code>form_submit<\/code>, default clicks, video progress, and more) with less one-off GTM wiring.","6":"<strong>Consent-aware loading<\/strong> \u2014 CMP preference, delay-until-consent, TCF option, and fallbacks so tags respect your privacy setup; optional overlay display of blocked events for debugging."}},"plugin_section":[],"plugin_tags":[232,20011,23294,550,286],"plugin_category":[36,45],"plugin_contributors":[265249],"plugin_business_model":[],"class_list":["post-314218","plugin","type-plugin","status-publish","hentry","plugin_tags-analytics","plugin_tags-consent","plugin_tags-google-tag-manager","plugin_tags-tracking","plugin_tags-woocommerce","plugin_category-analytics","plugin_category-ecommerce","plugin_contributors-whittfield","plugin_committers-whittfield"],"banners":{"banner":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/banner-772x250.png?rev=3555925","banner_2x":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/banner-1544x500.png?rev=3556830","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/icon-128x128.png?rev=3556893","icon_2x":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/icon-256x256.png?rev=3556893","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/screenshot-1.png?rev=3556927","caption":"<strong>Live debug overlay (admin-only)<\/strong> \u2014 Real-time <code>dataLayer<\/code> event stream on your site: filter by type, pin events, expand JSON payloads, and verify tracking before GTM Preview. Visible only to logged-in users at or above the role you set in Settings (default: Administrator). <a href=\"https:\/\/datalayer-tracker.com\/debug-overlay-demo\">Try the interactive demo<\/a>."},{"src":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/screenshot-2.png?rev=3556927","caption":"<strong>Debug options<\/strong> \u2014 Enable the overlay, console logging, blocked-event visibility, and event filters so your team can QA on real traffic without exposing tools to visitors."},{"src":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/screenshot-3.png?rev=3556927","caption":"<strong>Setup wizard<\/strong> \u2014 Guided first run: GA4\/GTM IDs, consent behavior, engagement toggles, and optional WooCommerce\u2014production measurement configured in one flow, not guessed."},{"src":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/screenshot-4.png?rev=3556927","caption":"<strong>Engagement signals<\/strong> \u2014 Scroll depth (single <code>scroll_depth<\/code> or per-milestone modes), active time, scroll back up, tab visibility, hover intent, and related milestones pushed to <code>dataLayer<\/code>."},{"src":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/screenshot-5.png?rev=3555925","caption":"<strong>Interaction tracking<\/strong> \u2014 Clicks, forms, and media mapped to consistent events (<code>form_view<\/code>, <code>form_submit<\/code>, default clicks, video progress, and more) with less one-off GTM wiring."},{"src":"https:\/\/ps.w.org\/brandmeetscode-datalayer-tracker\/assets\/screenshot-6.png?rev=3555925","caption":"<strong>Consent-aware loading<\/strong> \u2014 CMP preference, delay-until-consent, TCF option, and fallbacks so tags respect your privacy setup; optional overlay display of blocked events for debugging."}],"raw_content":"<!--section=description-->\n<p>This plugin helps you send <strong>structured data<\/strong> to <code>window.dataLayer<\/code> so Google Tag Manager or your own tags can consume consistent events and page context.<\/p>\n\n<p>Listed as <strong>BrandMeetsCode DataLayer Tracker<\/strong>; commonly referred to as <strong>DataLayer Tracker<\/strong>.<\/p>\n\n<p><strong>WordPress.org compliance:<\/strong> This repository build is <strong>fully functional<\/strong> with <strong>no license checks<\/strong>, <strong>no trial period<\/strong>, <strong>no usage quotas<\/strong>, and <strong>no disabled settings<\/strong> in wp-admin. Every option in Settings works without payment. Marketing screens may link to an optional <strong>DataLayer Tracker Pro<\/strong> add-on (a <strong>separate plugin<\/strong> sold and hosted outside WordPress.org); that is not trialware.<\/p>\n\n<h4>Included in this WordPress.org build<\/h4>\n\n<ul>\n<li><strong>Page &amp; content context<\/strong> \u2014 page type, IDs, title, URL, slug\/path, categories\/tags, referrer, <strong>UTM parameters<\/strong><\/li>\n<li><strong>Visitor &amp; device hints<\/strong> \u2014 resolution, timezone offset, browser language; optional cookie exposure rules<\/li>\n<li><strong>Logged-in user context<\/strong> \u2014 role-style flags and optional <strong>hashed user id<\/strong> (modes you configure)<\/li>\n<li><strong>Engagement<\/strong> \u2014 scroll depth (modes), scroll back up, focus\/blur, time on page, <strong>active time<\/strong>, <strong>hover intent<\/strong>, <strong>video progress<\/strong>, default clicks; optional deeper click\/field\/section options where listed in Settings<\/li>\n<li><strong>Forms<\/strong> \u2014 <code>form_view<\/code>, <code>form_field_start<\/code>, <code>form_submit<\/code>, <code>form_error<\/code>, <code>form_abandon<\/code>; optional form-vendor shortcut mode<\/li>\n<li><strong>WooCommerce (when enabled)<\/strong> \u2014 browser <strong>GA4-style ecommerce<\/strong> events (view_item, add_to_cart, purchase, etc.) when WooCommerce is active<\/li>\n<li><strong>Google Tag Manager<\/strong> \u2014 optional container <strong>snippet<\/strong> output from settings (you configure tags inside GTM)<\/li>\n<li><strong>Consent-aware loading<\/strong> \u2014 delay until consent, CMP preference, TCF option, fallbacks<\/li>\n<li><strong>Page URL filtering<\/strong> \u2014 regex exclude list<\/li>\n<li><strong>Sessions<\/strong> \u2014 client-side session timeout\/heartbeat options<\/li>\n<li><strong>Debugging<\/strong> \u2014 console logging levels and admin <strong>debug overlay<\/strong> (core panels)<\/li>\n<li><strong>Developer-friendly<\/strong> \u2014 hooks\/filters; push custom <code>window.dataLayer<\/code> events from theme or other plugins<\/li>\n<\/ul>\n\n<h4>Not included in this build (available only in the separate Pro add-on)<\/h4>\n\n<p>Advertising <strong>pixels<\/strong> (Meta, TikTok, Google Ads, etc.), <strong>Meta Conversions API<\/strong>, <strong>GA4 Measurement Protocol<\/strong>, <strong>GTM container JSON export<\/strong>, <strong>content-intelligence<\/strong> module, <strong>preset library<\/strong> admin, and related server-side code are <strong>not shipped<\/strong> in this zip. The Pro add-on is a <strong>separate companion plugin<\/strong> \u2014 purchase and download it from <a href=\"https:\/\/datalayer-tracker.com\/pricing\">datalayer-tracker.com<\/a> and install it <strong>alongside<\/strong> this free plugin when you need pixels, server-side tracking, or GTM container export. No features in this free build are locked, hidden, or time-limited.<\/p>\n\n<h4>Consent Management<\/h4>\n\n<p>Auto-detection and integration patterns vary by CMP; you remain responsible for correct legal configuration on your site.<\/p>\n\n<h4>Google Tag Manager<\/h4>\n\n<p>Optional <strong>snippet<\/strong> + consistent <strong>dataLayer<\/strong> pushes. Full <strong>container JSON export<\/strong> is part of the separate Pro add-on only.<\/p>\n\n<h3>External Services<\/h3>\n\n<h4>Google Tag Manager (optional \u2014 only when you configure a container ID)<\/h4>\n\n<p>This plugin includes an optional feature to inject the Google Tag Manager container snippet on your site's front end. This feature is <strong>disabled by default<\/strong> and only activates when you enter a GTM Container ID in the plugin settings and enable the snippet toggle.<\/p>\n\n<p><strong>What it does:<\/strong> When enabled, the plugin outputs the standard GTM <code>&lt;script&gt;<\/code> and <code>&lt;noscript&gt;<\/code> tags that load <code>https:\/\/www.googletagmanager.com\/gtm.js<\/code>. This causes the visitor's browser to contact Google's servers to load the GTM container.<\/p>\n\n<p><strong>What data is sent:<\/strong> When GTM loads, Google receives the visitor's IP address, browser, and the URL being viewed \u2014 the same data sent by any website that loads GTM. No additional data is sent by this plugin beyond the standard GTM request. The plugin itself populates <code>window.dataLayer<\/code> in the browser; it is your GTM configuration that determines what analytics data leaves the site.<\/p>\n\n<p><strong>When it is sent:<\/strong> Only on front-end page loads when the visitor's browser downloads the GTM script. If the consent-delay feature is enabled, the snippet is withheld until the visitor grants consent via your CMP.<\/p>\n\n<p><strong>Service provider:<\/strong> Google LLC<\/p>\n\n<ul>\n<li><strong>Terms of Service:<\/strong> <a href=\"https:\/\/policies.google.com\/terms\">Google Terms of Service<\/a><\/li>\n<li><strong>Privacy Policy:<\/strong> <a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/li>\n<li><strong>GTM documentation:<\/strong> <a href=\"https:\/\/marketingplatform.google.com\/about\/tag-manager\/\">Google Tag Manager<\/a><\/li>\n<\/ul>\n\n<h4>WordPress Admin AJAX<\/h4>\n\n<p>All plugin settings saves, the setup wizard, and admin actions use WordPress's built-in <code>admin-ajax.php<\/code> endpoint. All requests go to your own WordPress installation. No data is sent to external servers by these requests.<\/p>\n\n<p><strong>Important:<\/strong> You are responsible for ensuring that any third-party analytics services (GTM, GA4, etc.) you configure on your site comply with applicable data-protection laws (GDPR, CCPA, etc.) and that visitors are properly informed. This plugin provides consent-delay and CMP-detection functionality to help withhold scripts until consent is obtained, but legal compliance remains your responsibility.<\/p>\n\n<h3>Privacy Policy<\/h3>\n\n<p>BrandMeetsCode DataLayer Tracker may expose, depending entirely on which options you enable:<\/p>\n\n<ul>\n<li>Page URL, titles, and taxonomy-style context<\/li>\n<li>Logged-in user fields you choose to surface, including optional <strong>hashed<\/strong> identifiers<\/li>\n<li>Engagement signals (scroll depth, timing, generic form interactions)<\/li>\n<li>WooCommerce-related item data when ecommerce tracking is enabled<\/li>\n<li>Structured event data pushed to <code>window.dataLayer<\/code> for use by analytics tools you configure<\/li>\n<\/ul>\n\n<p>This plugin does not send data to any external server on your behalf. You are responsible for consent, disclosure, and lawful basis for any analytics tools you add to your site. The plugin does not replace legal or DPO review.<\/p>\n\n<p>Data is exposed to the browser <code>dataLayer<\/code>; downstream tags decide what leaves the site.<\/p>\n\n<h3>Support<\/h3>\n\n<h4>Documentation<\/h4>\n\n<ul>\n<li>Full Documentation: <a href=\"https:\/\/datalayer-tracker.com\/knowledge-base\">https:\/\/datalayer-tracker.com\/knowledge-base<\/a><\/li>\n<li>Video Tutorials: <a href=\"https:\/\/youtube.com\/@whittfieldholmes\">YouTube Channel<\/a><\/li>\n<\/ul>\n\n<h4>Community Support<\/h4>\n\n<ul>\n<li>Support Forum: <a href=\"https:\/\/wordpress.org\/support\/plugin\/brandmeetscode-datalayer-tracker\">WordPress.org<\/a><\/li>\n<\/ul>\n\n<h4>Pro customer support<\/h4>\n\n<ul>\n<li>Email: support@datalayer-tracker.com<\/li>\n<li>Documentation: <a href=\"https:\/\/datalayer-tracker.com\/knowledge-base\">https:\/\/datalayer-tracker.com\/knowledge-base<\/a><\/li>\n<\/ul>\n\n<h3>Developer Hooks<\/h3>\n\n<h4>Pro storefront URLs<\/h4>\n\n<p>URLs for <strong>View plans<\/strong>, <strong>Customer downloads<\/strong>, and outbound marketing can be centralized\u2014no need to fork PHP for a domain change:<\/p>\n\n<ul>\n<li><p>Constants (define early in <strong><code>wp-config.php<\/code><\/strong>):<\/p>\n\n<p>define( 'BRANDATR_PRO_SALES_URL', 'https:\/\/yoursite.com\/pricing' );\ndefine( 'BRANDATR_PRO_CUSTOMER_ACCOUNT_URL', 'https:\/\/yoursite.com\/freemius-portal\/' );\ndefine( 'BRANDATR_PRO_CUSTOMER_DOWNLOAD_URL', 'https:\/\/yoursite.com\/freemius-portal\/' );<\/p><\/li>\n<li><p>Helpers: <strong><code>brandatr_get_pro_sales_url()<\/code><\/strong>, <strong><code>brandatr_get_pro_customer_account_url()<\/code><\/strong>, <strong><code>brandatr_get_pro_customer_download_url()<\/code><\/strong><\/p><\/li>\n<li><p>Filters <strong><code>brandatr_pro_sales_url<\/code><\/strong>, <strong><code>brandatr_pro_customer_account_url<\/code><\/strong>, <strong><code>brandatr_pro_customer_download_url<\/code><\/strong> \u2014 final mutators WordPress-aware code calls.<\/p><\/li>\n<li><p>In the <strong>WordPress.org<\/strong> build, <strong><code>brandatr_all_features_enabled()<\/code><\/strong> always returns <code>true<\/code> (no license gate). The separate <strong>Pro<\/strong> add-on (not hosted on WordPress.org) uses its own Freemius licensing.<\/p><\/li>\n<\/ul>\n\n<h4>Filters (examples)<\/h4>\n\n<pre><code>add_filter(\n    'brandatr_pro_sales_url',\n    static fn () =&gt; 'https:\/\/example.com\/buy\/'\n);\nadd_filter(\n    'brandatr_pro_customer_download_url',\n    static fn () =&gt; 'https:\/\/example.com\/dl\/'\n);\nadd_filter(\n    'brandatr_pro_customer_account_url',\n    static fn () =&gt; 'https:\/\/example.com\/account\/'\n);\n\nadd_filter(\n    'brandatr_before_push',\n    static function ( $event ) {\n        $event['custom_field'] = 'value';\n\n        return $event;\n    }\n);\n\nadd_filter(\n    'brandatr_should_track_event',\n    static function ( $should_track, $event_name ) {\n        if ( 'unwanted_event' === $event_name ) {\n            return false;\n        }\n\n        return $should_track;\n    },\n    10,\n    2\n);\n<\/code><\/pre>\n\n<h4>Actions<\/h4>\n\n<pre><code>\/\/ Run code after consent granted\nadd_action('brandatr_consent_granted', function($consent_types) {\n    \/\/ Your code here\n});\n\n\/\/ Run code after dataLayer push\nadd_action('brandatr_after_push', function($event) {\n    \/\/ Your code here\n});\n<\/code><\/pre>\n\n<h4>JavaScript API<\/h4>\n\n<pre><code>\/\/ Push custom event\nwindow.dataLayer.push({\n    event: 'custom_event',\n    custom_param: 'value'\n});\n\n\/\/ Get session context\nconst context = window.ADTSession?.getContext();\n\n\/\/ Check consent\nconst hasConsent = window.hasConsent('analytics');&lt;h3&gt;Credits&lt;\/h3&gt;\n<\/code><\/pre>\n\n<p>Developed by <a href=\"https:\/\/brandmeetscode.com\">Brand Meets Code<\/a><\/p>\n\n<p>Special thanks to the WordPress community, beta testers, and all users who provide feedback and feature requests.<\/p>\n\n<!--section=installation-->\n<h4>Automatic Installation<\/h4>\n\n<ol>\n<li>Log into your WordPress admin dashboard<\/li>\n<li>Navigate to <strong>Plugins &gt; Add New<\/strong><\/li>\n<li>Search for \"DataLayer Tracker\"<\/li>\n<li>Click <strong>Install Now<\/strong> then <strong>Activate<\/strong><\/li>\n<\/ol>\n\n<h4>Manual Installation<\/h4>\n\n<ol>\n<li>Download the plugin ZIP file<\/li>\n<li>Navigate to <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong><\/li>\n<li>Choose the ZIP file and click <strong>Install Now<\/strong><\/li>\n<li>Click <strong>Activate Plugin<\/strong><\/li>\n<\/ol>\n\n<h4>Building the free (.org) ZIP from source (maintainers)<\/h4>\n\n<p>Canonical <strong>free<\/strong> source lives in <strong><code>brandmeetscode-datalayer-tracker\/<\/code><\/strong> at the repository root. From the <strong>repository root<\/strong>, run <strong><code>.\/build-free-zip.sh<\/code><\/strong> to create <strong><code>brandmeetscode-datalayer-tracker-wporg-&lt;version&gt;.zip<\/code><\/strong> (same folder name inside the ZIP). Pass a path as the first argument to set the output file; <strong>parent directories are created<\/strong> if missing (e.g. <code>..\/dist\/<\/code>). Before uploading to WordPress.org, run <strong><code>.\/scripts\/wporg-pre-submit-audit.sh<\/code><\/strong> to build and scan the ZIP for common Plugin Review issues.<\/p>\n\n<p><strong>WordPress.org slug reservation:<\/strong> After updating code, reply to the Plugin Review email and request slug <strong><code>brandmeetscode-datalayer-tracker<\/code><\/strong>. A temporary Text Domain warning until WordPress updates their side is expected.<\/p>\n\n<h4>Building the Pro add-on ZIP from source (maintainers)<\/h4>\n\n<p>Canonical <strong>Pro<\/strong> source lives in <strong><code>datalayer-tracker-pro\/<\/code><\/strong> beside the free tree. Run <strong><code>composer install<\/code><\/strong> inside <strong><code>datalayer-tracker-pro\/<\/code><\/strong> so <strong><code>vendor\/freemius\/<\/code><\/strong> exists, set your Freemius <strong>product id<\/strong> and <strong>public key<\/strong> in <strong><code>includes\/freemius-config.php<\/code><\/strong>, then from the <strong>repository root<\/strong> run <strong><code>.\/build-pro-zip.sh<\/code><\/strong> to emit <strong><code>datalayer-tracker-pro-&lt;version&gt;.zip<\/code><\/strong>. That ZIP is the paid companion only; sites still need the <strong>core<\/strong> plugin active. The <strong>WordPress.org<\/strong> build uses <strong><code>brandatr_all_features_enabled()<\/code><\/strong> (always <code>true<\/code>); licensing lives only in the Pro add-on.<\/p>\n\n<h4>Quick Setup<\/h4>\n\n<ol>\n<li>Go to <strong>DataLayer Tracker<\/strong> in the WordPress admin menu<\/li>\n<li>Enable the dataLayer options you need (page context, engagement, consent, etc.)<\/li>\n<li>Optionally add your <strong>Google Tag Manager<\/strong> container ID and enable snippet output<\/li>\n<li>Use <strong>Regex exclude<\/strong> under Advanced Options if certain URLs must not emit tracking-related events<\/li>\n<li>Turn on <strong>Debug mode<\/strong> \/ <strong>Debug overlay<\/strong> while verifying events in the browser or GTM Preview<\/li>\n<li>(Optional) Purchase <strong>DataLayer Tracker Pro<\/strong>, upload it under Plugins \u2192 Upload, activate it alongside this plugin \u2014 <strong>Get Pro add-on<\/strong> in the menu explains status<\/li>\n<\/ol>\n\n<p>Optional <strong>Settings import\/export<\/strong> remains available via the UI where provided for backing up JSON configuration.<\/p>\n\n<h4>Why use this plugin?<\/h4>\n\n<ul>\n<li>Sensible defaults for <code>dataLayer<\/code> structure on WordPress<\/li>\n<li>Consent-aware behavior without replacing your CMP<\/li>\n<li>Clear split: <strong>everything in this zip works without payment<\/strong> within the documented free scope; <strong>Pro<\/strong> adds the advanced modules listed above<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20google%20tag%20manager%3F\"><h3>Do I need Google Tag Manager?<\/h3><\/dt>\n<dd><p>No! While ADT integrates seamlessly with GTM, it pushes events to the dataLayer which can be used independently or with any analytics platform.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20woocommerce%3F\"><h3>Does this work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes, when WooCommerce is active you can enable <strong>WooCommerce ecommerce tracking<\/strong> in Settings for GA4-style browser events. Additional enrichment and server-side paths may exist in the separate <strong>Pro<\/strong> add-on only.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>Impact depends on enabled features and theme; scripts are scoped to frontend behavior typical of analytics tooling.<\/p><\/dd>\n<dt id=\"is%20this%20gdpr%20compliant%3F\"><h3>Is this GDPR compliant?<\/h3><\/dt>\n<dd><p>The plugin ships consent delay and CMP-related options. Compliance depends on your legal stance, CMP, and downstream tags\u2014you remain responsible.<\/p><\/dd>\n<dt id=\"can%20i%20track%20custom%20events%3F\"><h3>Can I track custom events?<\/h3><\/dt>\n<dd><p>Yes\u2014as with any dataLayer deployment you may <code>window.dataLayer.push({ ... })<\/code> from themes or scripts.<\/p>\n\n<p>You can also configure <strong>stored custom events (JSON)<\/strong> in Settings when that field is present in your build.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20page%20builders%3F\"><h3>Does this work with page builders?<\/h3><\/dt>\n<dd><p>Typically yes when frontend output and script loading behave like a normal theme.<\/p><\/dd>\n<dt id=\"what%27s%20the%20difference%20between%20free%20and%20pro%3F\"><h3>What's the difference between Free and Pro?<\/h3><\/dt>\n<dd><p>The <strong>repository package<\/strong> ships a <strong>standalone<\/strong> tracker: baseline dataLayer, consent controls, snippet-based GTM container output, baseline engagement\/forms, regex URL exclude, debugging\u2014usable <strong>without<\/strong> paying or expiring code paths.<\/p>\n\n<p>The <strong>optional Pro companion plugin<\/strong> adds modules omitted from this build (pixels, server-side, GTM JSON export, content intelligence, presets). Purchase and download it from <a href=\"https:\/\/datalayer-tracker.com\/pricing\">datalayer-tracker.com<\/a> and install it <strong>alongside<\/strong> this free plugin when you need those features. No features in this free build are locked, hidden, or time-limited.<\/p>\n\n<p>Admin <strong>Get Pro add-on \/ Customer area \/ Pro status<\/strong> links use <strong><code>brandatr_get_pro_sales_url()<\/code><\/strong>, <strong><code>brandatr_get_pro_customer_account_url()<\/code><\/strong>, <strong><code>brandatr_get_pro_customer_download_url()<\/code><\/strong> (<code>ADT_PRO_*<\/code> constants or hooks\u2014see Developer Hooks).<\/p><\/dd>\n<dt id=\"how%20do%20i%20debug%20tracking%20issues%3F\"><h3>How do I debug tracking issues?<\/h3><\/dt>\n<dd><p>Enable Debug Mode, use the overlay (role-gated), console logs, inspect <code>window.dataLayer<\/code>, use GTM Preview when applicable.<\/p><\/dd>\n<dt id=\"does%20this%20track%20personal%20data%3F\"><h3>Does this track personal data?<\/h3><\/dt>\n<dd><p>Depends on enabled options (e.g. hashed user id, ecommerce). Respect consent obligations and disclose in your privacy policy.<\/p><\/dd>\n<dt id=\"can%20i%20exclude%20certain%20pages%20from%20tracking%3F\"><h3>Can I exclude certain pages from tracking?<\/h3><\/dt>\n<dd><p>Yes. Use <strong>Regex exclude<\/strong> under Advanced Options (included in <code>.org<\/code>).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.7 - 2026-05-26<\/h4>\n\n<ul>\n<li>Prefix: rename all plugin symbols from <code>adt_<\/code>\/<code>ADT_<\/code> to <code>brandatr_<\/code>\/<code>BRANDATR_<\/code> (4+ character prefix per WordPress.org guidelines)<\/li>\n<li>Security: localize admin-ajax URL via <code>admin_url()<\/code> \u2014 remove hardcoded <code>\/wp-admin\/admin-ajax.php<\/code> fallbacks in JS<\/li>\n<li>Security: escape JSON-LD inline script with default <code>wp_json_encode()<\/code> flags (no JSON_UNESCAPED_SLASHES)<\/li>\n<li>Security: move CMP status panel to enqueued JS with safe DOM APIs (<code>textContent<\/code>\/<code>createElement<\/code>) instead of <code>innerHTML<\/code> with runtime strings<\/li>\n<li>Migration: copy legacy <code>adt_*<\/code> options, transients, and user meta to <code>brandatr_*<\/code> on upgrade<\/li>\n<\/ul>\n\n<h4>1.2.6 - 2026-05-26<\/h4>\n\n<ul>\n<li>Security: session IDs use <code>random_bytes()<\/code> only \u2014 no WordPress auth salt material<\/li>\n<li>Privacy: remove GA4 Measurement Protocol refund calls from wp-admin (no third-party tracking from admin)<\/li>\n<li>Plugin Check: pair inline script output buffers via <code>brandatr_capture_inline_script()<\/code>; remove stray global <code>ob_start()<\/code><\/li>\n<li>Security: sanitize AJAX nonces with <code>sanitize_text_field()<\/code> before verification; sanitize array setting values on save; remove <code>nonce_hint<\/code> from error responses<\/li>\n<li>Naming: remove deprecated unprefixed PHP wrappers (<code>user_is_premium<\/code>, <code>has_consent<\/code>, <code>enqueue_brandatr_assets<\/code>, <code>render_brandatr_*<\/code>)<\/li>\n<li>Cleanup: remove dead setup-wizard GA4\/Meta connection-test JavaScript (handlers were not shipped in this build)<\/li>\n<\/ul>\n\n<h4>1.2.5 - 2026-05-18<\/h4>\n\n<ul>\n<li>WordPress.org naming: distinctive listing <strong>BrandMeetsCode DataLayer Tracker<\/strong>; slug and text domain <strong>brandmeetscode-datalayer-tracker<\/strong>; wp-admin UI remains <strong>DataLayer Tracker<\/strong><\/li>\n<li>WordPress.org compliance: remove server-side connection-test AJAX handlers (GA4 MP, Meta CAPI) from setup wizard \u2014 these features are not included in this build<\/li>\n<li>Update External Services documentation to accurately reflect only services this build actually contacts<\/li>\n<li>Remove all remaining inline <code>&lt;script&gt;<\/code>\/<code>&lt;style&gt;<\/code> tags; all JS\/CSS now enqueued via wp_enqueue\/wp_add_inline_script<\/li>\n<li>Fix: session_start() restricted to WooCommerce order-received pages only (not all pages)<\/li>\n<li>Clean up wizard settings field map to remove fields for removed features<\/li>\n<li>Docs: WooCommerce browser events, field-level form tracking, and form-vendor shortcuts are included in the free build (enable in Settings); Pro listing corrected on welcome and pricing pages<\/li>\n<li>Plugin Check: escape tab SVG output with <code>wp_kses()<\/code>; <strong>Tested up to<\/strong> 7.0<\/li>\n<li>Security: nonce + <code>manage_options<\/code> on all privileged admin\/AJAX mutations; removed unauthenticated welcome dismiss GET shortcut<\/li>\n<li>Plugin Check: centralize admin GET action nonce checks in <code>brandatr_verify_admin_get_action()<\/code><\/li>\n<li>Naming: prefix public PHP helpers (<code>brandatr_has_consent<\/code>, <code>brandatr_user_is_premium<\/code>, <code>brandatr_enqueue_assets<\/code>, <code>brandatr_render_field_callback<\/code>); deprecated aliases retained<\/li>\n<\/ul>\n\n<h4>1.2.4 - 2026-05-18<\/h4>\n\n<ul>\n<li>Fix consent blocking: cast consent-related settings to strings to match JS strict comparisons<\/li>\n<li>Fix: replace broken adt-ip-exclusion-check.js enqueue with inline script injection<\/li>\n<li>Remove broken external logo from debug overlay; overlay title uses DataLayer Tracker<\/li>\n<li>Fix SyntaxError in adt-consent-universal.js and adt-cmp-debug.js (stray  tags)<\/li>\n<li>Fix 502 Bad Gateway: guard brandatr_register_settings() from running on AJAX requests<\/li>\n<\/ul>\n\n<h4>1.2.3 - 2026-05-18<\/h4>\n\n<ul>\n<li>WordPress.org compliance: remove Pixels, Server-Side Tracking, GTM Exporter, and Content Intelligence modules<\/li>\n<li>Fix fatal error: add missing <code>brandatr_detect_cmp_server_side()<\/code> function used by consent status panel<\/li>\n<li>Rename plugin to BrandMeetsCode DataLayer Tracker; update contributors list and support links<\/li>\n<\/ul>\n\n<h4>1.2.2 - 2026-05-15<\/h4>\n\n<ul>\n<li>Remove Freemius trial\/checkout from <code>.org<\/code>-bound <strong>core<\/strong> build; paid checkout + licensing live in the optional <strong>DataLayer Tracker Pro<\/strong> companion (Freemius SDK + <code>brandatr_user_is_premium<\/code>); <strong><code>DATALAYER_TRACKER_PRO_ACTIVE<\/code><\/strong> only marks the companion as loaded<\/li>\n<li>Add <strong>Customer area<\/strong> wp-admin screen (<code>brandatr-settings-account<\/code>) linking <strong>datalayer-tracker.com<\/strong> pricing, <strong>customer portal<\/strong> (<code>\/account<\/code> \u2192 Freemius), downloads, docs<\/li>\n<li>Add <code>brandatr_get_pro_sales_url()<\/code>, <code>brandatr_get_pro_customer_download_url()<\/code>, <strong><code>brandatr_get_pro_customer_account_url()<\/code><\/strong> with <strong><code>BRANDATR_PRO_SALES_URL<\/code><\/strong>, <strong><code>BRANDATR_PRO_CUSTOMER_DOWNLOAD_URL<\/code><\/strong>, <strong><code>BRANDATR_PRO_CUSTOMER_ACCOUNT_URL<\/code><\/strong>, filters <code>brandatr_pro_sales_url<\/code>, <code>brandatr_pro_customer_download_url<\/code>, <strong><code>brandatr_pro_customer_account_url<\/code><\/strong><\/li>\n<li>Let free installs open all ADT wp-admin tabs (welcome wall removed)<\/li>\n<li>Refresh <strong>readme<\/strong> so WordPress.org <strong>Description\/FAI<\/strong> reflects free vs <strong>Pro<\/strong><\/li>\n<\/ul>\n\n<h4>1.2.1 - 2025-01-15<\/h4>\n\n<p><strong>New Features:<\/strong>\n* Multi-pixel tracking with 6 platform support (Premium)\n* Dual pixel mode - GTM + Direct SDK (Premium)\n* Cart abandonment tracking with 3 detection methods\n* Session-aware ecommerce tracking\n* Form vendor auto-detection for 20+ platforms\n* Field-level form tracking (Premium)\n* Video progress tracking (YouTube\/Vimeo)\n* Event simulator in debug overlay\n* SDK status monitoring\n* Export history tracking<\/p>\n\n<p><strong>Improvements:<\/strong>\n* Performance: 40% faster event processing\n* Consent: Better CMP detection with 5-second timeout\n* GTM Export: Category-grouped containers\n* Debug Overlay: Event filtering and search\n* Settings: Import\/Export configuration as JSON<\/p>\n\n<p><strong>Bug Fixes:<\/strong>\n* Fixed checkbox save issue in settings\n* Fixed AJAX cart tracking timing\n* Fixed consent queue not flushing properly\n* Fixed duplicate scroll events\n* Fixed builder iframe detection<\/p>\n\n<h4>1.1.0 - 2024-12-01<\/h4>\n\n<ul>\n<li>Initial public release<\/li>\n<li>Core engagement tracking<\/li>\n<li>Basic ecommerce support<\/li>\n<li>Form tracking<\/li>\n<li>GTM export functionality<\/li>\n<li>Debug overlay<\/li>\n<li>Consent management<\/li>\n<\/ul>","raw_excerpt":"GTM-ready dataLayer: consent-aware events, engagement, admin debug overlay, optional WooCommerce. Fully free\u2014no license keys or locked settings.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/314218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=314218"}],"author":[{"embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/whittfield"}],"wp:attachment":[{"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=314218"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=314218"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=314218"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=314218"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=314218"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/rhg.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=314218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}