{"id":327912,"date":"2026-06-24T10:32:51","date_gmt":"2026-06-24T10:32:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pixledger\/"},"modified":"2026-06-24T10:32:14","modified_gmt":"2026-06-24T10:32:14","slug":"pixledger","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/pixledger\/","author":23496649,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.6.4","stable_tag":"1.6.4","tested":"7.0","requires":"6.3","requires_php":"8.1","requires_plugins":null,"header_name":"PixLedger","header_author":"PixLedger","header_description":"Server-first tracking for WooCommerce with event intelligence. Full event log, debug console, and reconciliation insights.","assets_banners_color":"c3b6dd","last_updated":"2026-06-24 10:32:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/pixledger.com","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":35,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.6.4":{"tag":"1.6.4","author":"mentotex","date":"2026-06-24 10:32:14"}},"upgrade_notice":{"1.6.4":"<p>Compliance update: all plugin prefixes changed to pixledger_, database tables renamed to wp_pxlg_*. All events now fully functional \u2014 no locked features. Safe fresh install; not an in-place upgrade (no existing user data).<\/p>","1.6.3":"<p>Event retention is now fully unrestricted \u2014 configure any number of hours with no cap. Safe update for all users.<\/p>","1.6.2":"<p>Event retention is now configurable in Settings (up to 30 days). External services documentation added. Safe update for all users.<\/p>","1.6.1":"<p>Compliance release: WordPress.org Plugin Check fixes (output escaping, input sanitisation, query hardening). No functional changes \u2014 safe update for all users.<\/p>","1.6.0":"<p>Major update: fixes duplicate GTM\/GA4 events on add-to-cart, fixes tag detection format bug, and adds Event Configuration panel with per-event enable\/disable toggles. Update recommended for all users.<\/p>","1.2.0":"<p>Major update: universal WordPress events, Event Configuration panel, and 7 new WooCommerce events added. Update recommended for all users.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3584518,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3584518,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3584518,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3584518,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.6.4"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"<strong>Event Log<\/strong> \u2014 real-time log of every tracked event with status badges, provider, payload viewer, and filters","2":"<strong>Settings Page<\/strong> \u2014 configure Meta Pixel, GA4, GTM, Consent Mode, Event Configuration, and advanced options","3":"<strong>Event Configuration Panel<\/strong> \u2014 enable or disable individual events grouped by category","4":"<strong>Provider Detection<\/strong> \u2014 automatic detection of existing Meta Pixel, GA4, or GTM installations"}},"plugin_section":[],"plugin_tags":[193472,1005,207498,550,286],"plugin_category":[36,45],"plugin_contributors":[263797],"plugin_business_model":[],"class_list":["post-327912","plugin","type-plugin","status-publish","hentry","plugin_tags-ga4","plugin_tags-google-analytics","plugin_tags-meta-pixel","plugin_tags-tracking","plugin_tags-woocommerce","plugin_category-analytics","plugin_category-ecommerce","plugin_contributors-mentotex","plugin_committers-mentotex"],"banners":{"banner":"https:\/\/ps.w.org\/pixledger\/assets\/banner-772x250.png?rev=3584518","banner_2x":"https:\/\/ps.w.org\/pixledger\/assets\/banner-1544x500.png?rev=3584518","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/pixledger\/assets\/icon-128x128.png?rev=3584518","icon_2x":"https:\/\/ps.w.org\/pixledger\/assets\/icon-256x256.png?rev=3584518","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>PixLedger fires your Meta Pixel, GA4, and GTM events AND logs every single event locally \u2014 so you always know what was tracked, what failed, what was blocked by consent, and why.<\/p>\n\n<p><strong>The Event Intelligence Layer<\/strong><\/p>\n\n<p>Every event that fires through PixLedger is recorded in your own database with a full audit trail: which provider received it, whether it was delivered successfully, whether it was blocked by consent, and the complete payload that was sent.<\/p>\n\n<h4>What PixLedger Tracks<\/h4>\n\n<p><strong>WooCommerce Events<\/strong>\n* ViewContent \u2014 product page visits\n* AddToCart \u2014 cart additions with product data\n* RemoveFromCart \u2014 cart removals\n* CartView \u2014 cart page visits\n* InitiateCheckout \u2014 checkout page visits\n* AddPaymentInfo \u2014 payment details entered\n* AddShippingInfo \u2014 shipping details entered\n* CouponApplied \u2014 discount codes applied\n* Purchase \u2014 completed orders with full order data\n* OrderRefunded \u2014 refunds issued\n* ProductReview \u2014 WooCommerce product reviews submitted<\/p>\n\n<p><strong>Universal WordPress Events (works on any WordPress site)<\/strong>\n* PageView \u2014 every frontend page load with page context\n* NotFound404 \u2014 404 errors with requested URL\n* OutboundLinkClick \u2014 clicks on external links\n* PhoneClick \u2014 clicks on tel: links\n* EmailClick \u2014 clicks on mailto: links\n* DownloadClick \u2014 clicks on downloadable files (PDF, ZIP, DOC, etc.)\n* FormSubmit \u2014 any form submission\n* UserLogin \u2014 user login events\n* UserRegister \u2014 new user registrations\n* CommentPosted \u2014 comment submissions\n* SearchPerformed \u2014 site search queries\n* SearchEmpty \u2014 searches with zero results<\/p>\n\n<p><strong>Custom Events<\/strong>\n* Declarative: add <code>data-pxl-event=\"EventName\"<\/code> to any HTML element \u2014 no code needed\n* Programmatic: <code>pxl('track', 'EventName', { properties })<\/code> for developers<\/p>\n\n<h4>Supported Providers<\/h4>\n\n<ul>\n<li><strong>Meta Pixel<\/strong> \u2014 browser-side pixel events with advanced matching (hashed email)<\/li>\n<li><strong>Google Analytics 4<\/strong> \u2014 GA4 ecommerce events with full items array<\/li>\n<li><strong>Google Tag Manager<\/strong> \u2014 dataLayer pushes in GA4 Enhanced Ecommerce schema<\/li>\n<\/ul>\n\n<h4>Key Features<\/h4>\n\n<p><strong>Event Log<\/strong>\nA real-time, searchable log of every event that fires on your site. See exactly what was tracked, by which provider, with what payload. Filter by provider, event name, status, or date. Paginated with bulk delete and auto-refresh.<\/p>\n\n<p><strong>Event Configuration Panel<\/strong>\nChoose exactly which events PixLedger tracks. Enable or disable any event individually. Defaults are sensible out of the box \u2014 turn off what you don't need, enable what you do.<\/p>\n\n<p><strong>Consent Mode v2<\/strong>\nBuilt-in Consent Mode v2 support. Events are blocked at the pipeline level when consent is denied \u2014 not as an afterthought. The Event Log shows blocked events with the specific consent category that denied them.<\/p>\n\n<p><strong>Tag Detection<\/strong>\nPixLedger detects if Meta Pixel, GA4, or GTM are already loaded by another plugin or your theme. It skips its own injection automatically to prevent duplicate events. Detection notices are shown in Settings.<\/p>\n\n<p><strong>Visitor ID Tracking<\/strong>\nEvery event is tagged with an anonymous visitor ID (90-day cookie) so you can trace a visitor's journey across sessions. Visible in the Event Log \u2014 clickable journey view available in Pro.<\/p>\n\n<p><strong>Attribution Capture<\/strong>\nUTM parameters, click IDs (fbclid, gclid, ttclid, msclkid), landing page, and referrer are captured on every page load and saved to the order on purchase.<\/p>\n\n<p><strong>Rate Limiting<\/strong>\nConfigurable rate limiting prevents spam bots from flooding your event log. Default: 5 same-event repetitions per visitor per minute. Adjustable in Settings.<\/p>\n\n<h4>Works on Any WordPress Site<\/h4>\n\n<p>PixLedger works with or without WooCommerce. Universal events (PageView, clicks, forms, search, user account events) fire on any WordPress site. WooCommerce ecommerce events load automatically when WooCommerce is detected.<\/p>\n\n<h4>Privacy &amp; GDPR<\/h4>\n\n<ul>\n<li>Customer emails are SHA-256 hashed before storage \u2014 never stored in plain text<\/li>\n<li>Visitor IDs are anonymous \u2014 no personally identifiable information<\/li>\n<li>Form field values are never captured \u2014 only form metadata<\/li>\n<li>Event log retention is fully configurable (minimum 1 hour, default 7 days, no upper limit)<\/li>\n<li>Full data removal on plugin deletion via uninstall.php<\/li>\n<\/ul>\n\n<h4>PixLedger Pro<\/h4>\n\n<p>PixLedger Pro adds server-side tracking, advanced analytics, and journey intelligence:<\/p>\n\n<ul>\n<li><strong>Meta Conversions API (CAPI)<\/strong> \u2014 server-side events that bypass ad blockers<\/li>\n<li><strong>GA4 Measurement Protocol<\/strong> \u2014 server-side GA4 events<\/li>\n<li><strong>Google Ads Enhanced Conversions<\/strong> \u2014 server-side conversion API<\/li>\n<li><strong>Reconciliation Dashboard<\/strong> \u2014 compare platform-reported conversions vs actual WooCommerce data<\/li>\n<li><strong>Attribution Dashboard<\/strong> \u2014 first-touch, last-touch, and multi-touch attribution reports<\/li>\n<li><strong>Visitor Journey Intelligence<\/strong> \u2014 click any visitor ID to see their complete event timeline<\/li>\n<li><strong>Product Journey View<\/strong> \u2014 see the last N journeys that led to buying a specific product<\/li>\n<li><strong>Advanced Event Log<\/strong> \u2014 extended date range, CSV\/JSON export<\/li>\n<li><strong>Additional platforms<\/strong> \u2014 TikTok, Pinterest, Microsoft Bing, and more<\/li>\n<\/ul>\n\n<p>Learn more at <a href=\"https:\/\/pixledger.com\">pixledger.com<\/a>.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>PixLedger connects to the following third-party services to deliver tracking events to advertising and analytics platforms. These connections only occur when the respective provider is enabled and configured in Settings.<\/p>\n\n<h4>Meta Pixel<\/h4>\n\n<p>PixLedger loads the Meta Pixel script (<code>fbevents.js<\/code>) from <code>connect.facebook.net<\/code> and sends ecommerce and page events to Meta on every relevant page load. This occurs only when Meta Pixel is enabled and a Pixel ID is configured. Data sent includes event names, page URLs, and hashed customer email (for advanced matching). No data is sent if Meta Pixel is disabled in Settings.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/www.facebook.com\/privacy\/policy\/\">Meta Privacy Policy<\/a><\/li>\n<li><a href=\"https:\/\/www.facebook.com\/legal\/terms\">Meta Terms of Service<\/a><\/li>\n<\/ul>\n\n<h4>Google Analytics 4<\/h4>\n\n<p>PixLedger loads the GA4 script (<code>gtag.js<\/code>) from <code>googletagmanager.com<\/code> and sends ecommerce and page events to Google Analytics on every relevant page load. This occurs only when GA4 is enabled and a Measurement ID is configured. Data sent includes event names, page URLs, and ecommerce data (product names, prices, order values). No data is sent if GA4 is disabled in Settings.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/li>\n<li><a href=\"https:\/\/policies.google.com\/terms\">Google Terms of Service<\/a><\/li>\n<\/ul>\n\n<h4>Google Tag Manager<\/h4>\n\n<p>PixLedger loads the GTM container script (<code>gtm.js<\/code>) from <code>googletagmanager.com<\/code> and pushes events to the <code>window.dataLayer<\/code> object. This occurs only when GTM is enabled and a Container ID is configured. The data pushed includes event names and ecommerce data in GA4 Enhanced Ecommerce schema. No script is loaded if GTM is disabled in Settings, or if GTM is already loaded by another plugin or your theme.<\/p>\n\n<ul>\n<li><a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a><\/li>\n<li><a href=\"https:\/\/policies.google.com\/terms\">Google Terms of Service<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<h4>Minimum Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.3 or higher<\/li>\n<li>PHP 8.1 or higher<\/li>\n<li>WooCommerce 7.0 or higher (optional \u2014 plugin works on any WordPress site)<\/li>\n<\/ul>\n\n<h4>Automatic Installation<\/h4>\n\n<ol>\n<li>Go to <strong>Plugins \u2192 Add New<\/strong> in your WordPress admin<\/li>\n<li>Search for <strong>PixLedger<\/strong><\/li>\n<li>Click <strong>Install Now<\/strong> and 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>Go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong><\/li>\n<li>Upload the zip file and click <strong>Install Now<\/strong><\/li>\n<li>Click <strong>Activate Plugin<\/strong><\/li>\n<\/ol>\n\n<h4>After Activation<\/h4>\n\n<ol>\n<li>Go to <strong>PixLedger \u2192 Settings<\/strong><\/li>\n<li>Enter your Meta Pixel ID, GA4 Measurement ID, and\/or GTM Container ID<\/li>\n<li>Enable the providers you want to use<\/li>\n<li>Configure the Event Configuration panel to choose which events to track<\/li>\n<li>Visit your store and check <strong>PixLedger \u2192 Event Log<\/strong> to confirm events are firing<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20woocommerce%3F\"><h3>Do I need WooCommerce?<\/h3><\/dt>\n<dd><p>No. PixLedger works on any WordPress site. WooCommerce ecommerce events (ViewContent, AddToCart, Purchase, etc.) only load when WooCommerce is active. Universal events (PageView, clicks, forms, search) work on any WordPress site.<\/p><\/dd>\n<dt id=\"will%20pixledger%20conflict%20with%20my%20existing%20meta%20pixel%20or%20ga4%20setup%3F\"><h3>Will PixLedger conflict with my existing Meta Pixel or GA4 setup?<\/h3><\/dt>\n<dd><p>No. PixLedger detects if Meta Pixel, GA4, or GTM are already loaded by another plugin or your theme. It automatically skips its own script injection to prevent duplicate events. You'll see a notice in Settings explaining what was detected.<\/p><\/dd>\n<dt id=\"why%20are%20some%20events%20showing%20as%20%22blocked%22%20in%20the%20event%20log%3F\"><h3>Why are some events showing as \"Blocked\" in the Event Log?<\/h3><\/dt>\n<dd><p>Blocked events are events that were prevented from reaching the provider because the visitor denied consent. This is Consent Mode v2 working correctly. The status badge shows the specific consent category that was denied. To test the plugin without consent blocking, go to Settings and uncheck \"Enable Consent Mode\".<\/p><\/dd>\n<dt id=\"what%20does%20the%20visitor%20id%20look%20like%20and%20where%20is%20it%20stored%3F\"><h3>What does the visitor ID look like and where is it stored?<\/h3><\/dt>\n<dd><p>The visitor ID is an anonymous string like <code>pxl_a3f8c2d1b2e4f6a8<\/code> stored in a 90-day cookie and in the <code>visitor_id<\/code> column of the <code>wp_pxl_events<\/code> database table. It contains no personally identifiable information.<\/p><\/dd>\n<dt id=\"are%20customer%20emails%20stored%20in%20plain%20text%3F\"><h3>Are customer emails stored in plain text?<\/h3><\/dt>\n<dd><p>No. Customer emails are SHA-256 hashed before being stored. The hash is used for Meta Pixel advanced matching and GA4 enhanced conversions \u2014 both platforms accept hashed emails for customer matching.<\/p><\/dd>\n<dt id=\"how%20long%20are%20events%20kept%20in%20the%20database%3F\"><h3>How long are events kept in the database?<\/h3><\/dt>\n<dd><p>By default, PixLedger keeps events for 7 days (168 hours). You can change this in <strong>Settings \u2192 Advanced \u2192 Event retention<\/strong> \u2014 set any number of hours with no upper limit. A WP-Cron job runs hourly and automatically purges older records.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20specific%20events%20i%20don%27t%20need%3F\"><h3>Can I disable specific events I don't need?<\/h3><\/dt>\n<dd><p>Yes. The Event Configuration panel in Settings lets you enable or disable any event individually. Disabling an event means it is never dispatched \u2014 no log row, no provider call, no database write.<\/p><\/dd>\n<dt id=\"does%20pixledger%20slow%20down%20my%20site%3F\"><h3>Does PixLedger slow down my site?<\/h3><\/dt>\n<dd><p>No, when configured correctly. The frontend tracker script loads in the footer with <code>defer<\/code>, uses passive event listeners, throttles high-frequency events, and batches AJAX requests every 5 seconds (never one request per event). The performance impact is negligible.<\/p><\/dd>\n<dt id=\"where%20is%20the%20data%20stored%3F\"><h3>Where is the data stored?<\/h3><\/dt>\n<dd><p>All event data is stored in your own WordPress database in two tables: <code>wp_pxl_events<\/code> (all tracked events) and <code>wp_pxl_attribution<\/code> (UTM and click ID data per order). Your data never leaves your server \u2014 PixLedger does not have access to it.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data if I delete the plugin?<\/h3><\/dt>\n<dd><p>All plugin data is removed on deletion \u2014 both database tables (<code>wp_pxl_events<\/code> and <code>wp_pxl_attribution<\/code>), all plugin options, and all scheduled cron jobs. This is handled by <code>uninstall.php<\/code>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20test%20that%20meta%20pixel%20is%20working%3F\"><h3>How do I test that Meta Pixel is working?<\/h3><\/dt>\n<dd><ol>\n<li>Enter your Pixel ID in Settings and enable Meta Pixel<\/li>\n<li>Disable Consent Mode in Settings (for testing only)<\/li>\n<li>Visit your store as a logged-out visitor<\/li>\n<li>Open Meta Events Manager \u2192 Test Events tool<\/li>\n<li>Enter your store URL and browse \u2014 events should appear in real time<\/li>\n<\/ol><\/dd>\n<dt id=\"how%20do%20i%20test%20that%20ga4%20is%20working%3F\"><h3>How do I test that GA4 is working?<\/h3><\/dt>\n<dd><ol>\n<li>Enter your Measurement ID (G-XXXXXXXXXX) in Settings and enable GA4<\/li>\n<li>Open Google Analytics \u2192 Admin \u2192 DebugView<\/li>\n<li>Install the Google Analytics Debugger Chrome extension and enable it<\/li>\n<li>Browse your store \u2014 events appear in DebugView within 30 seconds<\/li>\n<\/ol><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Changed: All plugin prefixes renamed from pxl_\/PXL_ (3 chars) to pixledger_\/PIXLEDGER_ (9 chars) to comply with WordPress.org prefix requirements<\/li>\n<li>Changed: Database tables renamed from wp_pxl_events\/wp_pxl_attribution to wp_pxlg_events\/wp_pxlg_attribution<\/li>\n<li>Changed: All hooks, options, AJAX actions, nonces, cookies, script handles, and JS globals now use pixledger_ prefix<\/li>\n<li>Changed: Removed is_pro event locking \u2014 all events in the registry (PageScrolled, TimeOnPage, FormAbandoned, UserLogout, VideoStart, VideoComplete) are now fully functional in Lite<\/li>\n<li>Changed: Removed disabled attribute and Pro badges from Event Configuration toggles \u2014 all events are now freely configurable<\/li>\n<li>Changed: Removed locked Visitor ID and Order ID UI from Event Log<\/li>\n<li>Added: PixLedger Pro informational submenu page \u2014 lists Pro features with link to pixledger.com (no functional code, no license checks)<\/li>\n<li>Note: No tracking behavior changes \u2014 this release is a compliance and housekeeping update<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Changed: Event retention is now fully unrestricted \u2014 no upper cap, configurable to any number of hours (default 168h \/ 7 days)<\/li>\n<li>Changed: Event Log display is no longer capped to a fixed window \u2014 shows events within the configured retention period<\/li>\n<li>Changed: Expanded inline sanitize_callback for event toggle settings to explicit static function block<\/li>\n<li>Removed: All references to Pro-only retention cap from code, comments, and documentation<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Added: External Services section in readme \u2014 documents Meta Pixel, GA4, and GTM connections with links to terms and privacy policies per WordPress.org guidelines<\/li>\n<li>Changed: Event retention is now configurable in Settings \u2192 Advanced (1\u2013720 hours \/ up to 30 days, default 7 days)<\/li>\n<li>Changed: Removed comparative marketing claims from plugin description per WordPress.org guidelines<\/li>\n<li>Note: PixLedger Pro retains unlimited retention (no upper cap, 0 = never delete)<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Fixed: All output now escaped per WordPress.org coding standards \u2014 inline provider queue JSON is emitted via wp_json_encode()<\/li>\n<li>Fixed: All user input ($_POST, $_COOKIE) sanitised and unslashed inline at the point of use<\/li>\n<li>Fixed: Database queries hardened \u2014 table names composed only from $wpdb-&gt;prefix, all parameters passed through $wpdb-&gt;prepare() with placeholders<\/li>\n<li>Changed: Removed deprecated load_plugin_textdomain() call \u2014 WordPress.org loads translations automatically since WordPress 4.6<\/li>\n<li>Changed: Prefixed all global variables in uninstall.php (pxl_ prefix)<\/li>\n<li>Changed: Trimmed readme tags to 5 per WordPress.org guidelines<\/li>\n<li>Added: phpcs.xml configuration declaring the pxl_ hook\/function prefix<\/li>\n<li>Note: No functional changes \u2014 this release contains only WordPress.org Plugin Check compliance fixes<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Fixed: Duplicate GTM\/GA4 events on add-to-cart and remove-from-cart \u2014 JS jQuery listener now checks PHP PendingEventStore queue before firing, preventing double dataLayer pushes after classic WooCommerce redirect<\/li>\n<li>Fixed: GTM dataLayer ecommerce key incorrectly set to [] (empty array) for non-ecommerce events (PageView, UserLogin, etc.) \u2014 ecommerce key is now omitted entirely when there is no ecommerce data<\/li>\n<li>Fixed: pxlConfig.detection returning empty arrays [] instead of {present, source} objects \u2014 TagDetector::detect_all() now returns proper object-shaped arrays so JS conflict detection works correctly and prevents double GTM\/GA4 injection<\/li>\n<li><p>Added: TagDetector::get_detected_names() method for Settings page to retrieve plugin display names per tag type<\/p><\/li>\n<li><p>Added: EventRegistry \u2014 central catalogue of all trackable events with per-event enable\/disable toggles<\/p><\/li>\n<li>Added: Event Configuration panel in Settings \u2014 enable or disable any event individually, grouped by category<\/li>\n<li>Added: WPCoreTracker \u2014 universal WordPress events (PageView, NotFound404, UserLogin, UserRegister, CommentPosted, SearchPerformed, SearchEmpty)<\/li>\n<li>Added: TrackEndpoint \u2014 AJAX endpoint for client-side events (OutboundLinkClick, PhoneClick, EmailClick, DownloadClick, FormSubmit)<\/li>\n<li>Added: Universal JS event listeners in tracker.js with event buffering and Beacon API flush on page unload<\/li>\n<li>Added: enabledEvents map passed to tracker.js so JS events are gated client-side before leaving the browser<\/li>\n<li>Added: RemoveFromCart, CartView, AddPaymentInfo, AddShippingInfo, CouponApplied, OrderRefunded, ProductReview WooCommerce events<\/li>\n<li>Changed: \"Debug Console\" renamed to \"Event Log\" in all user-facing strings<\/li>\n<li>Fixed: EventDispatcher now logs events with status 'no_provider' when no providers are configured, so Event Log always reflects what fired<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added: Provider queue system for GA4, Meta Pixel, and GTM \u2014 all three providers now use a filter-based queue (pxl_ga4_queued_events, pxl_meta_queued_events, pxl_gtm_queued_events) that dispatches through the full EventDispatcher pipeline on the next page load<\/li>\n<li>Added: PendingEventStore \u2014 cookie-based serialized EventDTO queue for WooCommerce redirect events (AddToCart, RemoveFromCart, CouponApplied) that fire during POST \u2192 302 redirects where wp_footer never renders<\/li>\n<li>Added: ProductDataEndpoint \u2014 AJAX endpoint for fetching product data (price, name, currency) to support immediate event firing on AJAX cart operations (shop\/category pages)<\/li>\n<li>Added: AJAX cart event listeners in tracker.js \u2014 added_to_cart and removed_from_cart jQuery events fire GA4\/Meta\/GTM events immediately for AJAX add-to-cart without page reload<\/li>\n<li>Fixed: WooCommerce redirect events (AddToCart, RemoveFromCart) not reaching GA4, Meta Pixel, or GTM providers due to POST \u2192 302 redirect preventing wp_footer from rendering<\/li>\n<li>Changed: Assets.php now outputs all three provider queues in a single wp_footer script tag at priority 1<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added: GTM provider \u2014 push events to window.dataLayer in GA4 Enhanced Ecommerce schema with full items array<\/li>\n<li>Added: Tag detection \u2014 runtime checks for existing Meta Pixel (window.fbq), GA4 (window.gtag), and GTM (window.google_tag_manager); also detects common plugins (GTM4WP, Site Kit); skips injection to prevent duplicates<\/li>\n<li>Added: Detection notices in Settings \u2014 admin notices explain what was detected and which plugin is responsible<\/li>\n<li>Fixed: woocommerce_cart_item_removed hook passes WC_Cart object as second parameter \u2014 removed item now correctly read from $cart-&gt;removed_cart_contents[$cart_item_key]<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added: Visitor ID system \u2014 anonymous 90-day cookie (pxl_visitor_id), visitor_id column in wp_pxl_events, get_or_create_visitor_id() in SessionService; attached to every EventDTO<\/li>\n<li>Added: Object context on every event \u2014 object_type, object_id, object_title fields on EventDTO; product\/page name shown as subtitle under event name in Event Log<\/li>\n<li>Added: Reason text for blocked\/failed events \u2014 EventBlockedByConsentException carries the specific consent category denied; EventDispatcher saves reason to response_data; shown as tooltip on status badge<\/li>\n<li>Added: Event Log pagination \u2014 50 events per page, WordPress-style navigation, AJAX refresh respects current page<\/li>\n<li>Added: Filtering system \u2014 filter by provider, event name, status, delivery method, date range; combinable filters; instant AJAX application; Failures only quick-filter; active filter tags displayed<\/li>\n<li>Added: Bulk delete \u2014 row-level checkboxes with bulk action dropdown (WordPress standard pattern)<\/li>\n<li>Added: Clear all logs button with confirmation dialog<\/li>\n<li>Added: Visitor ID and Order ID columns in Event Log \u2014 visible but locked (Pro upsell teaser)<\/li>\n<li>Changed: Event retention increased from 48 hours to 7 days<\/li>\n<li>Changed: Rate limit now configurable in Settings (default 5 per minute, range 1\u2013100)<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added: EventRegistry \u2014 central catalogue of all trackable events with per-event enable\/disable toggles saved to wp_options<\/li>\n<li>Added: EventDefinition DTO \u2014 immutable value object describing each event (name, category, label, description, default_enabled, is_pro)<\/li>\n<li>Added: Event Configuration panel in Settings \u2014 grouped toggles by category; Lite events active; Pro events visible but locked with Pro badge<\/li>\n<li>Added: WPCoreTracker \u2014 universal WordPress event tracking via PHP hooks (PageView, NotFound404, UserLogin, UserRegister, CommentPosted, SearchPerformed, SearchEmpty)<\/li>\n<li>Added: TrackEndpoint \u2014 AJAX endpoint (wp_ajax_pxl_track_batch) for client-side events with nonce verification, batch size cap, rate limiting, and input sanitisation<\/li>\n<li>Added: Universal JS event listeners in tracker.js \u2014 OutboundLinkClick, PhoneClick, EmailClick, DownloadClick, FormSubmit with event buffering and Beacon API flush on page unload<\/li>\n<li>Added: enabledEvents map passed to tracker.js so JS events are gated client-side before leaving the browser<\/li>\n<li>Added: RemoveFromCart, CartView, AddPaymentInfo, AddShippingInfo, CouponApplied, OrderRefunded, ProductReview WooCommerce events<\/li>\n<li>Added: no_provider status \u2014 EventDispatcher logs events with status 'no_provider' when no providers are configured<\/li>\n<li>Changed: Debug Console renamed to Event Log in all user-facing strings<\/li>\n<li>Changed: EventDispatcher now consults EventRegistry before dispatching \u2014 disabled events silently skipped<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed: Fatal error on boot \u2014 removed invalid $session-&gt;register() call (SessionService has no register method)<\/li>\n<li>Fixed: Events not appearing in Event Log when no provider is configured \u2014 dispatcher now logs 'no_provider' status<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added: GTM provider \u2014 push events to window.dataLayer in GA4 Enhanced Ecommerce schema<\/li>\n<li>Added: Tag detection \u2014 auto-detects existing Meta Pixel, GA4, and GTM installations, skips injection to prevent duplicates, shows admin notices in Settings<\/li>\n<li>Added: Visitor ID system \u2014 anonymous 90-day cookie, visitor_id column in wp_pxl_events<\/li>\n<li>Added: Object context on every event \u2014 object_type, object_id, object_title carried on every EventDTO<\/li>\n<li>Added: Reason text for blocked\/failed events \u2014 shown as tooltip on status badge in Event Log<\/li>\n<li>Added: Pagination in Event Log \u2014 50 events per page, AJAX refresh respects current page<\/li>\n<li>Added: Filtering system \u2014 filter by provider, event name, status, delivery method, date range<\/li>\n<li>Added: Bulk delete \u2014 row-level checkboxes with bulk action dropdown<\/li>\n<li>Added: Clear all logs button with confirmation dialog<\/li>\n<li>Added: Visitor ID and Order ID columns in Event Log (visible, locked for Pro)<\/li>\n<li>Changed: Lite retention increased from 48 hours to 7 days<\/li>\n<li>Changed: Rate limit now configurable in Settings (default 5 per minute, range 1\u2013100)<\/li>\n<li>Fixed: Conditional WooCommerce loading \u2014 plugin now boots on any WordPress site, WooCommerce is an optional module<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Meta Pixel browser-side events (PageView, ViewContent, AddToCart, InitiateCheckout, Purchase)<\/li>\n<li>GA4 browser-side events with full ecommerce items array<\/li>\n<li>WooCommerce event tracking via PHP hooks<\/li>\n<li>Event Log with real-time AJAX auto-refresh and status badges<\/li>\n<li>Consent Mode v2 support with per-category defaults<\/li>\n<li>Attribution capture (UTM parameters, fbclid, gclid, ttclid, msclkid)<\/li>\n<li>Rate limiting to prevent spam bot flooding<\/li>\n<li>7-day event retention with automated WP-Cron cleanup<\/li>\n<li>Full data removal on plugin deletion<\/li>\n<\/ul>","raw_excerpt":"Server-first tracking for WooCommerce with full event intelligence. Fire Meta Pixel, GA4, and GTM events \u2014 and actually know if they worked.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/327912","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=327912"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mentotex"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=327912"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=327912"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=327912"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=327912"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=327912"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=327912"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}