The TikTok, Microsoft Ads, Pinterest, Snapchat, Reddit and OpenAI browser pixels are now part of the free plugin, together with Microsoft Ads Consent Mode. The Conversions API and Events API connections, Advanced Matching, Enhanced Match and Enhanced Conversions for these platforms stay in the Pro version
The new pmw_order_shipping_profit filter adds the shipping economics of an order to the profit margin. The calculation leaves shipping out on both sides, because WooCommerce records what the customer was charged but never what the carrier charged the shop, so shops had to rebuild the whole margin to account for it
With the Marketing value logic set to Profit margin, an alert now names how many recent orders contain a product the plugin knows no cost for, and the new Profit_Margin::order_has_complete_cogs helper answers that for a single order. Such products count with a cost of zero, so their whole revenue is reported as profit
Pmw.trackCustomGoogleAdsConversion sends a conversion to a conversion action of your own, applying the same marketing consent gate and the same wait for the Google tag as the plugin's own Google Ads conversions. A hand-written gtag call sent nothing at all on shops that defer or delay JavaScript
The Abilities API now offers every setting the admin interface offers. Ten were missing, among them the lifetime value calculation, the logger and the server-side tracking toggles, so an AI agent was blind to a part of the plugin a shop owner could see
Added Klaviyo as a new tracking pixel (Pro, beta). With the Klaviyo plugin installed, the Pixel Manager takes over its onsite tracking, gated on marketing consent and with a Started Checkout that works on custom checkouts, and adds the cart, collection, search and checkout step events the plugin never sends, while the plugin keeps handling orders, catalog and profile sync, forms and list consent. Every event lands on the shop's existing Klaviyo metrics. Without the plugin, the Events API…
Melhoria
X (Twitter) now counts as a popular pixel on the Tracking Pixels tab, so it shows under the Popular filter and in the popular group of the pixel list
An opportunity card for a Pro feature now says so on installs that cannot use it and carries the upgrade button, and the Payment Gateway Tracking Accuracy alert names server-side tracking and Automatic Conversion Recovery as the fix for the untracked orders it lists. Both only linked to the documentation before
The Consent Management Platforms card no longer reads "None detected on this site" when it finds no cookie banner plugin. It now says that only platforms installed as a WordPress plugin can be listed there, that a platform loaded as a script works on the shop all the same, and how to confirm that in the browser console
With "Always send server-side events" enabled, the Payment Gateway Tracking Accuracy report stops offering that setting as the fix for orders excluded because the visitor denied all consent categories. It now says those conversions were still sent server-side and only stay out of the report because the report measures the browser, and the order records that too
When the accuracy trend compares two periods, it now names how much of the change comes from orders that left the report because the visitor denied all consent categories, and what the change is with those orders counted as untracked in both periods. A shift in that population moves the average accuracy on its own, without a single additional purchase being measured
A script that takes over the plugin's pmw object now reports itself through the new pmw:warning:global-replaced event and a running count on pmw.globalGuard, not only as a console warning. The shop that reported this could confirm that the errors had stopped but not how often the race still happened, because its analytics tool records errors and not warnings
The extra order data output on order pages is no longer marked as a Pro setting. The plugin allowed it on the free version everywhere except the settings interface, which locked the toggle
The Pinterest events now carry the product brand and category, on the browser pixel and on the Conversions API. Pinterest lists both among the parameters it wants on a checkout and reads their absence as a coverage gap, which holds its automated bidding back
The direct integrations for Borlabs Cookie and Real Cookie Banner have been removed. Direct support for both was deprecated in 1.41.1, and both still reach the plugin through Google Consent Mode update calls, which the plugin reads like any other consent signal
The HTTP request logging setting is no longer marked as a Pro setting. It sits in the otherwise free logger group, and the plugin allowed it on the free version everywhere except the settings interface
The Click ID Capture Quality section of the debug report now breaks the scanned orders down by what created them, and names how many of the orders that fired no browser pixel were never storefront orders to begin with. Orders written by an integration, placed in the admin or renewed on a subscription have no browser behind them, so counting them made a healthy shop look like its browser tracking had failed (Pro)
Updated the translation template (.pot file)
Correção
Under WooCommerce's built-in Cost of Goods Sold, a variation that inherits or adds to its parent's cost is priced with that cost at last. The plugin read a meta field that only exists on order line items, so those variations counted with a cost of zero and their whole revenue was reported as profit
Pricing an order no longer writes a WooCommerce "doing it wrong" notice into the log for every line item on shops with the built-in Cost of Goods Sold enabled. The cost was read with the generic meta accessor, which WooCommerce answers from the same getter anyway and warns about on the way
The lifetime value calculation on orders now asks for an active Pro license everywhere. Its settings field, the route that schedules a recalculation and the calculation itself did not, so it was reachable on the free version and a Pro shop whose license had lapsed kept recalculating its whole order history
The trial card on the dashboard no longer claims that no credit card is required. The 14-day trial does ask for a card at checkout, so the card now says so and that cancelling before the trial ends costs nothing
A consent tool in auto-blocking mode, such as Cookiebot, could run the plugin's configuration line again after the tracking library had started, which replaced the library's object and silently stopped add-to-cart, product click and checkout tracking. The configuration now merges into that object, and the library restores it if another script replaces it
A tracking library that stops starting up part way through now reports it in the console, and through the new pmw:error:init-aborted event, instead of leaving the shop partially tracked without a word. The listener files no longer depend on the load order for the functions they use while they register
On shops that run CookieYes, the visitor is no longer treated as having answered the cookie banner before they have. CookieYes writes its consent cookie, and fires its consent update event, on the first page view already, in shapes that carry a consent value but no answer, and reading any of those as a choice skipped the region check, so visitors outside the configured Explicit Consent Regions stayed blocked
The Cookiebot and OneTrust consent readers now deny a category their cookie does not name instead of granting it. A OneTrust cookie that carries no consent groups, which OneTrust also writes for its own bookkeeping, is ignored rather than raising an error, and one written before the visitor answered the banner no longer counts as a decision
On shops that run OneTrust or CookiePro with its standard cookie categories, the visitor's choice is read at last. The Pixel Manager only understood the plain group numbers, not the C0001 to C0004 ids OneTrust ships by default, so neither the consent cookie nor the consent change event told it anything
A gtag('consent', 'update') issued by a cookie banner itself is no longer stored as the Pixel Manager's own decision. That record has no expiry and outlived the banner that made it, so a decline kept declining after the banner had forgotten it. Such an update can also no longer deny the necessary category
On shops that run Complianz, Complianz' own Google Consent Mode is switched off while the Pixel Manager's is active, the same as for Cookiebot. Two consent default blocks on one page compete and the last one wins, so the pixels could run against a default consent state the Pixel Manager never set
Requests for the Google Tag Gateway service worker that arrive after the measurement path was changed or removed are now answered with a 410 before WordPress runs its query and renders a 404 page. Browsers send one per visit until the old worker is gone, and on a busy shop each one held a PHP worker for seconds
One shopper action that the theme, a funnel builder or WooCommerce itself reports twice is now counted once. Each pass carried its own event ID, so a single product view or add to cart reached Pinterest, Meta and GA4 several times, on the browser pixel and on the server-side API alike
A Pro setting submitted through the Abilities API on a site without an active Pro license is now refused instead of saved. It was stored with a note that it would not take effect, which left a configuration the plugin could not act on, while the REST API refused the very same value
The remove from cart event fires again on the cart and the mini cart. A cart synced from the server replaced the cart item key map that the remove button is resolved through with a different structure, so the event failed with "Wasn't able to retrieve a productId", and an item the map does not list now falls back to the product ID on the remove button itself
The filters that carry an order now always receive the WooCommerce order on the server-side purchase path too. Since 1.65.0 that path handed them the plugin's internal order object, which fatally ended the checkout request for a filter that type-hints WC_Order, and silently did nothing for one that checks instanceof WC_Order, which our own documentation recommends (Pro)
A subscription renewal is recognised as one again on the server-side purchase path, so the renewal opt-outs take effect there. Since 1.65.0 that path handed WooCommerce Subscriptions the plugin's internal order object, which it cannot resolve, so shops that had switched renewal tracking off still saw every renewal reported to Meta as a purchase (Pro)
The subscription renewal opt-outs now hold for Google Analytics 4, refunds included. pmw_google_analytics_subscription_renewal_tracking and the global pmw_subscription_renewal_tracking only gated the dedicated renewal handler, while the renewal reached Google Analytics through the regular purchase path all the same, so switching them off changed nothing (Pro)
Pmw_subscription_renewal_tracking now switches subscription renewal tracking off for every platform, as documented. Only Meta and Google Analytics read it, so renewals kept going to Google Ads, TikTok, Pinterest, Snapchat, Reddit, OpenAI, Nextdoor, Microsoft Advertising and Mixpanel, and a manually paid renewal still fired the browser pixels (Pro)
Deposit and instalment orders are no longer reported as sales of their own by the server-side purchase events. The same internal order object stopped the split-payment classification from recognising them since 1.65.0, so every instalment counted as an order on top of the sale already reported from the parent (Pro)
The customer identifier sent to Meta, Pinterest, Snapchat, Microsoft Advertising and Nextdoor now comes from the order's customer, not from whoever made the request, which is nobody on a payment webhook or a scheduled run, so those orders shared one identifier. Pinterest also accepts the hashed email address for a guest (Pro)
The pmw_send_all_s2s_requests_blocking filter takes effect again. Since 1.42.6 the HTTP request class read the logger setting directly, so there was no way to make the server-side requests wait for the platform responses while debugging without switching the HTTP request logger on (Pro)
Triple Whale was told about the same Contact twice on every purchase. The pixel reports a known customer when it loads and the login event reports the same identity again, and the two now share one guard, so the identity goes out once per session (Pro)
A guest checkout no longer reports a login on the order confirmation page. That page carries the order's customer so the purchase keeps the buyer's identifiers, and the login event read that as the visitor being signed in, so Google Ads, Google Analytics, Meta, Snapchat, TikTok and Triple Whale were told about a login that never happened (Pro)
Versão 1.67.0
4 novidades10 melhorias17 correções
Novidade
The new pmw_fire_parent_view_item_on_variable_products filter fires a view_item with the parent product when a variable product page loads. With variations reported separately, no view_item went out at all until the shopper picked a variation, and WooCommerce preselects none by default, so those page views were unreported
The new pmw_facebook_auto_config filter switches Meta's automatic configuration off per pixel, which stops Meta's automatic event detection, its microdata scraping and its SmartSetup instrumentation. The snippet our troubleshooting page documented for this defined a placeholder fbq and stopped the Meta pixel from loading at all
OpenAI Advanced Matching now sends the hashed phone number, first and last name plus the billing region and postal code, on the browser pixel and on the Conversions API. Server-side events also carry the browser reference from the SDK's obref cookie, so a purchase reported from the server is matched to the browser that clicked the ad (Pro)
The OpenAI pixel and Conversions API report a new customer account as registration_completed, and the Conversions API now sends each order line with its unit price, parent product and chosen variation attributes (Pro)
Melhoria
The Meta Event Setup Tool warning and the debug report now name every rule and value extractor by its ID and by the URL it is scoped to. Meta sometimes keeps delivering rules after they were deleted in the Events Manager, and only Meta support can remove those, for which they need those IDs
The debug report now has a Google Tag Gateway section that counts gateway requests which ended in a WordPress 404 that day, and names the last one. Nothing in the plugin could show that gateway traffic was being dropped, which is what made the resulting server load so hard to trace
The Pinterest events now use Pinterest's own standard event names throughout. Product views move from PageVisit to ViewContent, and starting a checkout is reported as InitiateCheckout instead of Checkout. Expect reported Pinterest Checkout conversions to drop, because checkout starts were previously counted as completed orders
The Freemius section of the debug report now states whether the in-dashboard account page exists, why it does not, and which link the plugin hands out in its place. None of that was visible anywhere, so a shop reporting a dead account link could not be diagnosed from a debug report
The Click ID Capture Quality section of the debug report now counts only the orders created after click ID capture became active on this shop, and states that date. It scanned the newest 250 orders regardless of age, so a shop that had just updated read 0% captured, which is indistinguishable from broken capture (Pro)
The Meta Conversions API now writes one log entry per purchase and per subscription event, naming the event ID and how many pixels it was sent to. Shops that send directly rather than through the Server-Side Proxy had no way to confirm a server-side send from the log at all (Pro)
Updated the bundled third-party libraries to their current releases
The Triple Whale pixel now sends Triple Whale's full checkout funnel (Contact, contactSubmitted, addressSubmitted, shippingSubmitted, paymentSubmitted, Purchase) plus NewSubscription for orders that start a WooCommerce Subscription, and switches the tracking of Triple Whale's own plugin off while it is active, so nothing is reported twice (Pro)
Confirmed compatibility with WordPress 7.1 and WooCommerce 11.1.0
Updated the translation template (.pot file)
Correção
Purchase tracking no longer ends in a fatal error when WooCommerce cannot resolve the order behind an order line item. That broke the checkout response after the payment had already been captured, so those customers read it as a failed payment and ordered again, which charged them twice
On LiteSpeed Cache the Pixel Manager excludes itself from "Load JS Deferred: Delayed", which held every script back until the visitor clicked or scrolled and lost purchases on the order confirmation page. It also keeps its ?ver cache buster when "Remove Query Strings" is on, so browsers stop replaying a pre-update script that requests chunk files no longer shipped
The automatic cache purge after a Pixel Manager update now clears NitroPack, Kinsta and Proxy Cache Purge, which failed silently and left those shops serving the previous release's tracking library, so it disabled itself and tracked nothing. A cache that cannot be cleared now raises an admin notice, and a stale library names itself in the console
Pmw.trackCustomFacebookEvent now honors the visitor's current marketing consent, the same gate every other Meta event passes. It only checked whether the pixel had loaded at some point, so a custom event fired from a shop's own snippet still reached Meta after the visitor withdrew consent in the cookie banner
A jQuery snippet that fires a Pixel Manager event from a pmwLoad handler no longer sends the page into an endless loop that freezes the browser and floods the server with requests, which our own documented parent view_item snippet did. Legacy jQuery handlers on the lifecycle events also ran twice per page load and now run once
The deprecated wpmLoad event again reaches listeners that register after the tracking library has loaded. Printing the deprecation warning also switched off the compatibility dispatch, so a snippet registering from _pmwq or from any late-loading script was warned that the event is deprecated and then never called, while identical code running earlier still worked
Requests to the Google Tag Gateway service worker, which Google's tag registers under the measurement path, are answered by the gateway instead of falling through to a full WordPress 404 page. Every visitor triggered one, which flooded 404 logs and put shops with regular traffic under load they had no way to explain
The Google Tag Gateway proxy no longer writes several log lines per tracking request at the info level, which grew a normal shop's daily log to several megabytes and buried the entries the logger was turned on to find. That detail is now logged at the debug level; warnings and errors are unchanged
The Triple Whale Orders API key and its opportunity card are gone. Triple Whale documents that API for Custom Sales Platform shops only, while a WooCommerce store delivers its orders over the REST connection made in Triple Whale onboarding, so the key only ever sent those orders a second time. The pmw_triple_whale_platform filter remains for a shop registered as a Custom Sales Platform (Pro)
A server-side destination that fails while sending a purchase is now logged and skipped instead of aborting the whole batch at the end of the checkout request, where its error landed in the checkout response the payment gateway had already succeeded in (Pro)
The OpenAI Conversions API now sends the customer identifiers in the list form OpenAI's API defines (emails_sha256, countries and so on), instead of the browser pixel's undocumented singular field names, which could drop matching data. Withdrawing marketing consent in the cookie banner now also stops the OpenAI SDK from sending events (Pro)
The phone number sent to Meta is now normalized to the international format before it is hashed, on the browser pixel and on the Conversions API. It was hashed as the customer typed it, so a number with spaces or without a country code never matched a Meta profile, which in most shops is the majority (Pro)
The Pinterest and Snapchat checkout start events sent server-side carried no cart value, currency or products, because they read the cart from the wrong source. On Pinterest this also dragged the Order Value coverage down and blocked ROAS bidding (Pro)
The Pinterest purchase sent through the browser and the one sent through the Conversions API now share an event ID, so Pinterest stops counting a single order twice. The Pinterest click ID (_epik) is now attached to server-side events, which it never was (Pro)
Server-side purchase events now wait until the payment request has finished before they read the order, so a PayPal transaction fee that WooCommerce PayPal Payments stores only after marking the order paid is deducted under the order subtotal value logic. The browser event already deducted it, so the two channels disagreed by exactly the fee (Pro)
The "Account & billing" link now opens the Freemius customer portal when the in-dashboard account page is missing, rather than our pricing page. A Pro shop whose license activation never completed, one that cannot reach Freemius for instance, lost its only route to its license, its invoices and the beta releases opt-in (Pro)
The Google Ads conversion adjustments feed now accepts the username and password set through the pmw_google_ads_conversion_adjustments_credentials filter. WordPress read the same Basic Auth header as an Application Password login and answered 401 first, so Google Ads reported invalid credentials for every protected feed (Pro)
Versão 1.66.0
6 novidades5 melhorias15 correções1 reforço de segurança
Novidade
The debug report now states whether Meta's own Conversions API Gateway is connected to the pixel, and which events it mirrors. The Gateway copies every browser event into the server channel from Meta's side, so it explains a server event count of roughly twice the browser one while being invisible in the WordPress plugin list
Added the Microsoft Advertising Conversions API (Pro): with a token set, all Microsoft Ads events are also sent server-side, including purchases from WooCommerce order hooks. The UET tag and the server events share one event ID so Microsoft deduplicates them, the click ID (msclkid) is attached, and SweetCode Cloud routes them when connected
Added an experimental server-side Google Ads purchase conversion upload through Google's Data Manager API. It activates automatically when the shop connects its Google account through the setup assistant, uploads into the same conversion action the browser tag fires, and Google deduplicates by transaction ID, so it only adds conversions the tag missed (Pro)
The server-side Google Analytics refund events can now be modified or blocked through the same payload filters as the purchase event, and the new pmw_google_analytics_refund_tracking filter switches them off altogether, for shops that would rather keep their attribution reports free of the sessionless refund rows than have Google Analytics net the refunds out (Pro)
The Opportunities tab now flags six more setups a shop is missing: the Pinterest API for Conversions, the Nextdoor Conversion API, Nextdoor and Criteo Advanced Matching, the Triple Whale Orders API, and the Google Analytics 4 Measurement Protocol (Pro)
The Opportunities tab now flags a Meta pixel that has both the Conversions API Gateway and the Pixel Manager's Conversions API connected to it. Only one of the two is needed, and the Gateway is the one to drop, because it can only mirror events the browser already sent (Pro)
Melhoria
Removed the one-time notice that announced the Nova interface on installs that predate it. Nova has been the default since 1.62.0, and the Support tab still offers the switch back to the Classic interface
TikTok for WooCommerce no longer tracks alongside the Pixel Manager when the TikTok pixel is configured here. The plugin offers no setting or filter for it, so its event senders are unhooked, which stops its browser pixel and its Events API events while leaving the catalog sync, the order sync and its settings screen untouched
Refund events sent through SweetCode Cloud reach only the destinations whose API has a refund event, which today is Google Analytics alone. Meta has none, so this is now stated in the code rather than left implicit, which is what made it look like an oversight (Pro)
Confirmed compatibility with WordPress 7.1 and WooCommerce 11.0.1
Updated the translation template (.pot file)
Correção
Configurable Composite Products are reported with the price the shopper configured instead of the cheapest possible configuration, so add_to_cart no longer under-reports every upgraded option. The quantity of composites and bundles is now read from the container's own quantity input rather than from the first component's
The Meta AddPaymentInfo event now reports the cart's contents, value and currency, on the browser pixel and on the Conversions API; it was sent with no commerce data at all, which is what makes Meta ask for valid price and currency data for the event
In explicit consent mode on shops that run Complianz, the pixels are no longer treated as approved before the visitor has answered the cookie banner. Complianz relays each consent category separately through the WP Consent API, and a category missing from such a relay, or a missing consent cookie, was read as consent
Google for WooCommerce and Google Analytics for WooCommerce are switched off again when the Pixel Manager tracks Google Ads or Google Analytics. Both plugins decide whether to track earlier than our compatibility filters were registered, so shops running either one alongside the Pixel Manager sent every event twice for logged out visitors
Events that other plugins or custom code report to the Pixel Manager, an add_to_cart from a custom button for example, are no longer lost when they arrive while the plugin is still loading; they are held and processed as soon as it is ready. A shipping method reported by both the plugin and a snippet is now counted once
The checkout page of shops whose checkout builder also makes WooCommerce report it as the cart page, CheckoutWC in Distraction Free Portal mode for example, is recognized as the checkout again, so begin_checkout and the other checkout page events fire there. The ambiguity is now resolved the way WooCommerce core resolves it
Visits from bots and automated browsers are now suppressed from the very first event, instead of only from the first server-side send onwards; the events before that were tracked as regular traffic, and with server-side tracking switched off the whole visit was
A purchase whose delivery through SweetCode Cloud takes longer than the plugin waits for a reply is no longer sent a second time directly to every platform. The plugin now asks SweetCode Cloud what it already dispatched before it falls back, so the platforms stop receiving twice as many server-side purchases as browser ones (Pro)
An order refunded in more than one step no longer reverses more revenue in Google Analytics than was refunded; the event reporting the refund that completes the order carried the whole order total on top of the partial refunds already reported, so an order of 100 refunded in two halves was reversed by 150 (Pro)
Refund events are no longer reported for orders whose server-side purchase event was never sent, which is the case for split payment instalment orders and for orders excluded through the pmw_skip_s2s_purchase_event filter; Google Analytics was asked to reverse revenue it had never recorded (Pro)
The Nextdoor click ID (ndclid) captured from the landing page URL now reaches the server, so the Conversion API can attribute a conversion when the Nextdoor pixel never wrote its own cookie; the value was dropped by the identifier allow list before it was ever stored (Pro)
The TikTok AddPaymentInfo event now reports the cart's contents, value and currency, which it was previously sent without (Pro)
The Snapchat Conversions API now sends the _scid cookie as sc_cookie1 and the ScCid click ID as sc_click_id, rather than letting the cookie overwrite the click ID. The click ID also survives validation and is captured from the landing URL server-side, where it was sought under a name Snap never sends (Pro)
The Snapchat browser purchase now sends the same deduplication ID as the server-side purchase event, so a purchase that reaches Snapchat through both channels is counted once (Pro)
Snapchat Advanced Matching sends the hashed phone number and the postcode again; both were read from data layer keys that do not exist (Pro)
Segurança
The Meta, Pinterest and Snapchat Conversions API events sent while a visitor browses carry the visitor's user agent again. The public server-side endpoint removed the browser's copy as a security measure and nothing put the request's own back, which is why Meta reported an IP address without a user agent, a combination it cannot match on (Pro)
Versão 1.65.1
2 melhorias3 correções
Melhoria
The purchase event of an order that contains a product WooCommerce can no longer resolve, which deleting a product after the order was placed leaves behind, now reports the products that do still exist instead of none at all, and names the skipped line in the debug log; the line items of every pixel are built as defensively
Updated the bundled third-party libraries to their current releases
Correção
The license upgrade page shows every license tier again when it is opened in a background tab, which is what a middle click or a cmd/ctrl click produces; the licensing SDK measures the window width once while the page loads, and browsers report zero for a tab that has never been in the foreground
The browser-side TikTok Purchase and OpenAI order_created events are sent again, after being broken since 1.59.0 for TikTok and since 1.60.0 for OpenAI; both adapters read the product ID out of the order line items, which carry none, so assembling the payload raised an error, while the server-side APIs were never affected (Pro)
A VWO conversion event no longer leaves an unhandled promise rejection in the browser console when the VWO script does not load, which is what a consent tool or an ad blocker holding it back produces, and the reason for the failure is now named instead of being reported as an undefined error (Pro)
Versão 1.65.0
4 novidades11 melhorias24 correções
Novidade
Deposit and partial-payment plugins are now tracked correctly: each sale reports one purchase conversion, for the full amount, when the deposit is paid, and the instalment orders no longer produce additional conversions; supported are Deposits & Partial Payments for WooCommerce (Acowebs) and WooCommerce Deposits (Webtomizer), and the pmw_split_payment_order_role filter classifies orders of other deposit plugins
The Meta Conversions API can send the Facebook Login ID (fb_login_id) of customers who signed in with Facebook, raising the event match quality score; it is read out of the social login plugin the shop runs, and Meta can only match it when that plugin's Facebook app sits in the same Business Manager as the pixel (Pro)
Added Mixpanel as a new tracking pixel (Pro, beta), sending the full shopping funnel and, with the Ingestion API, purchases and refunds server-side; a data residency setting routes the events to the US, EU or India host, because Mixpanel silently drops events that reach the wrong region (Pro)
Site snippets and third party integrations can now use the jQuery-free event API pmw.bus to listen to the Pixel Manager's events and to dispatch tracking events; every documented jQuery snippet keeps working through a permanent compatibility bridge, and a purchase listener registered after the purchase event has already fired still receives the order
Melhoria
The tracking library has been restructured for the upcoming multi-platform support: the core now runs without jQuery and all WooCommerce specific code lives in a dedicated platform layer, none of which changes what the pixels send; a new snapshot test suite pins the payloads of every pixel and fails the build on any unintended change
On shops that run without pretty permalinks, WooCommerce no longer loads the session, the cart and the customer object for the Pixel Manager's own REST requests; WooCommerce only recognizes the /wp-json/ form of a REST route, so on those shops every tracking call booted the whole WooCommerce frontend stack and could write an outdated cart back into the session
The cart item data that travels inside the WooCommerce cart fragments is no longer output for user roles that are excluded from tracking, which is the gate the front-end script bundle already followed
The Cart and Checkout blocks are now also tracked at DOM level, alongside the WooCommerce Blocks JavaScript hooks; WooCommerce is migrating its blocks to the Interactivity API, which dispatches no such hooks, so the shipping method, payment method and place order steps keep being reported once that migration reaches them
The Google tag gateway opportunity is now offered to every shop that has a Google tag configured and no measurement path set yet; it used to be shown only on shops detectable behind Cloudflare, which left out every shop on another CDN, while shops without a single Google tag were shown the card anyway
The Google tag gateway log now names the request whose path was rejected; the log line meant to report the original path printed the result of the rejection instead, which is always the same empty value
The purchase confirmation page now resolves the order key from the URL only once per request, and not at all on a standard WooCommerce confirmation URL; the page check, the order loading and the user ID lookup each ran WooCommerce's order key search, which on the legacy order storage is a full scan of the post meta table
The server-side tracking identifiers and the transient session identifiers (referrer, click IDs, consent state) are now only written to the WooCommerce session when they actually changed; any session write marks the whole session dirty, so WooCommerce re-serialized all of it, cart included, on cart and checkout page loads for nothing (Pro)
Updated the bundled third-party libraries to their current releases
Confirmed compatibility with WordPress 7.0 and WooCommerce 11.0.1
Updated the translation template (.pot file)
Correção
With the marketing value logic set to the order subtotal, the conversion value is now correct for orders that carry fee or refund lines: WooCommerce fee lines (gift wrap, cash on delivery, deposit surcharges) are no longer deducted, because the subtotal never contained them, and refunds are deducted by their product share only
With the marketing value set to the profit margin, a refund entered as a plain amount instead of per line item is now deducted from the margin; the calculation reversed refunds through the refunded quantity, which such a refund does not record, so the value did not move at all, most visibly in the Google Ads conversion adjustments feed
The Google Ads conversion adjustments feed no longer applies a refund twice; the corrected value of a partially refunded order already accounts for the refund, but the feed scaled it down by the refunded share again, so a half refunded order was restated at a quarter of its value
The conversion value reported to the ad platforms can no longer be negative; a deposit or instalment order that carries its payment as a fee line and holds no products, and orders whose refunds exceeded the subtotal, used to report a negative value, which the platforms reject or misinterpret
Turning the order duplication prevention off, or adding &nodedupe to a confirmation URL for testing, no longer overrides the deliberate tracking suppressions; it now waives the "this order has already been tracked" check and nothing else, so the pmw_conversion_prevention filter, failed, cancelled and refunded orders, and excluded user roles are respected again
The cart item script that travels inside the WooCommerce cart fragments now creates the data layer it writes into, so cart updates no longer raise a JavaScript error when a consent tool blocks the data layer script or an HTML optimizer strips it; it is also no longer output twice per mini cart item on themes such as Flatsome
Product level events triggered by a third party integration or a site snippet now always carry the shop currency; those events may be triggered with a raw pmwDataLayer.products entry, which holds no currency, and Meta, TikTok, Snapchat, Pinterest, Reddit, Taboola and AdRoll then sent an amount without one, which Meta rejects outright
Site snippets and third party integrations that read the consent state inside the command queue (window._pmwq) now work as documented; the queue ran before the consent module had loaded, so pmw.consent did not exist yet and every line after the consent check was skipped, which usually meant the integration's own event listener was never registered
The add_shipping_info event now also fires on checkouts that select the shipping method for the customer instead of waiting for a click, CheckoutWC among them, and on shipping packages that offer a single rate; the trigger was bound to the standard checkout form and to a genuine click, so the shipping stage was missing from the funnel
On shops that run the FAZ Cookie Manager, the Pixel Manager's scripts are now whitelisted on every distribution of the plugin; the whitelist only carried the folder name of the woocommerce.com version, so on the wordpress.org and the Pro version the cookie banner's script blocker kept the tracking scripts from loading
On shops that run Cookie Script, the pixels are no longer treated as approved before the visitor has answered the cookie banner; Cookie Script writes its consent cookie already on the first page view, holding no decision yet, and the mere presence of that cookie was read as full consent, so in explicit consent mode every pixel fired beforehand
Consent categories that are not passed to pmw.consent.categories.set now keep their current value instead of being reset, which the documented consent API and the CMP integrations were never affected by because they always pass all categories
The order key that StoreApps Custom Thank You Page puts into the confirmation URL is now also used to load the order, not only to recognize the page as a purchase confirmation; on a URL that carries only that parameter the page was recognized but no purchase was reported
Products shown by the Product Collection block are now tracked, and stay tracked when the block re-renders; the block renders without the classic WooCommerce loop hooks, so collections that do not inherit a shop, search or taxonomy query reported no view_item_list and no select_item at all, and its client-side pagination and filters left the products loaded that way untracked
Add to cart is now reported for the block add to cart paths that announce a cart change without naming it; the Interactivity API cart store behind the blockified add to cart button and the Add to Cart with Options block names neither product nor quantity, so the Pixel Manager reconciles the two carts and reports the difference
A conflicting copy of the Freemius SDK shipped by another plugin or theme can no longer take the shop down with a critical error; the SDK decides which copy is in charge and can return without providing the function the Pixel Manager calls, so the Pixel Manager now stays inactive and points the administrator at the conflict
The "Upgrade to Pro", free trial and account links now lead to a working page on shops without the licensing SDK's pricing page; the SDK only registers those pages once the shop is connected or a license is active, so before that and after a license expired they produced a "you are not allowed to access this page" error
The Google tag gateway serves the Google tag to returning visitors again; it read Google's "not modified" answer to a cache revalidation as a failure and replied with an error page instead of the script, so from the second visit onwards no Google tag loaded and Google Analytics reported those sessions under "(not set)"
The server-side Google Analytics 4 purchase now reports the visitor's current session instead of a long expired one; the session identifier was read once per WooCommerce session and kept for its whole lifetime, which is up to two days, while Google Analytics starts a new session after thirty minutes, so returning customers' orders landed under "(not set)" (Pro)
Conversions that the Automatic Conversion Recovery recovers now carry the Google Ads enhanced conversion data (the hashed email address, name, phone number and address); it was only attached on the purchase confirmation page, and a recovered conversion is by definition one that never reached that page, which Google Ads reports as "missing user fields" (Pro)
The Automatic Conversion Recovery now also arms on the block based checkout; its recovery cookie was only written on the classic checkout, because WooCommerce's Store API does not fire the classic order creation hook, so shops using the checkout block and every express checkout never recovered a single conversion (Pro)
Orders that did not come from a Google Ads click no longer have an empty click ID written to them; the check that skips those orders tested for null while the lookup returned an empty string, so most orders received an empty order meta entry and cost a full order save on the confirmation page (Pro)
TikTok category page views now carry the products of the listing; the ViewContent event declared a product group without naming one, which makes TikTok flag the pixel with a critical "Content ID is missing" diagnostic, so the products on the page are now attached with their content IDs, capped at 50 and without a conversion value (Pro)
The "Always send server-side events" setting no longer reports itself as only partially active, and no longer asks for Facebook CAPI, on shops that track with Google alone; the status asked the pixel registry, which does not list GA4's Measurement Protocol even though that setting governs it, so those shops were told it would do nothing (Pro)
Added the pmw_facebook_pixel_identifiers filter for tracking multiple Facebook (Meta) pixels at the same time; every browser event is sent to all configured pixels
Added a check that detects active Meta Event Setup Tool rules on the Facebook pixel and warns in the opportunities and the debug info, because those point-and-click rules fire additional events without deduplication and mostly without values, which inflates event counts and corrupts purchase values in Meta
Added an "Ask Pixie" chat icon next to most settings, from the pixel IDs and API tokens to the consent and order configuration options, that opens the AI assistant with a ready-to-send question about that setting
Added Criteo as a new tracking pixel (Pro, beta), loading the Criteo OneTag and sending the full shopping journey for retargeting and audience building, from homepage and listing views through add to cart and basket views to purchases with order ID and product details; an optional advanced matching setting sends the hashed email of customers
Added Nextdoor as a new tracking pixel (Pro, beta), loading the Nextdoor Universal Pixel and sending the conversion events Nextdoor uses for attribution and campaign optimization, from page and product views through add to cart, checkout and searches to purchases with order value and product details; an optional advanced matching setting sends the hashed email of customers
Added the Nextdoor Conversion API (Pro, beta): with a Conversion API token set, all Nextdoor events are also sent server-side, with shared event IDs so Nextdoor deduplicates them against the browser pixel; the Nextdoor click ID (ndclid) is captured for attribution, and the events are routed through the server-side proxy when SweetCode Cloud is connected
Additional Facebook pixels added through the pmw_facebook_pixel_identifiers filter can carry their own Conversion API token, so server-side events, including purchases and subscription lifecycle events, are sent to every pixel, both when sending directly and through the server-side proxy (Pro)
The OpenAI (ChatGPT) Conversions API now includes the ChatGPT click reference (the oppref URL parameter): it is captured on the landing page, preserved through checkout, and attached to all Conversions API events, so OpenAI can attribute conversions to the originating ChatGPT interaction (Pro)
Added Hyros as a new tracking pixel (Pro, beta) in the Attribution category, loading the Hyros Universal Script consent-aware and cache-safe on every page, so it no longer has to be pasted into the theme header; enter the product hash or paste the whole snippet, and the funnel milestones are added to the visitor journey as Hyros action tags
Melhoria
The Facebook (Meta) pixel now detects when another script on the site has defined window.fbq before the Pixel Manager loaded it and logs a clear warning in the browser console, because such a script prevents Meta's standard bootstrap from loading fbevents.js and the browser pixel silently stops tracking
The Pixel Manager now detects when Meta restricts events for a Facebook (Meta) pixel because of its business category (health and wellness, for example) and reports the restricted event names in the browser console and the debug info; Meta silently drops those events both in the browser and on the Conversion API, which looks like a tracking failure
API tokens are now masked in the log; with request logging enabled, credentials that travel in the request URL (Meta and Snapchat access tokens, the GA4 Measurement Protocol API secret) or in an authorization header used to end up in clear text in the WooCommerce log, which is a file that gets shared with support
The "PMW pixels not fired" counter above the WooCommerce order list no longer loads every matching order into memory just to count it; the number now comes from a counting query and is cached for a few minutes, which noticeably speeds up the order list on shops with many orders
The order value calculation no longer looks up the brand and the categories of the same product more than once per request, which reduces the number of database queries on shop, category, cart, and order pages, most visibly on pages that list many products
The notification count next to the Pixel Manager entry in the WooCommerce menu is now cached instead of being recalculated on every single admin page load; calculating it meant loading all opportunity checks, one of which aggregates the tracking accuracy statistics
The notification script and stylesheet are now only loaded on the admin pages that can actually display a Pixel Manager notification (the WordPress dashboard and the Pixel Manager settings), instead of on every admin page
The tracking accuracy database maintenance (creating the table after an update and scheduling the one-time backfill) no longer runs on storefront and checkout requests; until the backfill had finished, every page view asked the Action Scheduler whether it was already queued, which is a database query on the critical path
The tracking accuracy statistics no longer re-check whether their database table exists on every read and write within the same request, which removes several redundant queries from the purchase path
The product identifier setting now refers to the "Google for WooCommerce" plugin under its current name instead of "Google Listings & Ads", with the former name kept as a hint; the plugin was renamed a while ago, and the old name made it hard to tell which of the two plugins the gla_ option belongs to
Orders are now saved only once during checkout instead of once per active server-side integration; with the Meta Conversion API, the GA4 Measurement Protocol and the TikTok Events API enabled, storing the tracking identifiers triggered a separate full order write for each of them, which slowed down the checkout on busy shops (Pro)
The lifetime value recalculation control now shows what will actually happen: the first click schedules the run for 2:00 AM so it stays out of your busiest hours, and while it is scheduled you can start it immediately instead or stop it again; the button previously said it would recalculate right away (Pro)
Correção
Corrected broken or outdated documentation links in the settings (SweetCode Cloud, LinkedIn, Reddit, LTV recalculation) and added the missing documentation link to the "Disable tracking for user roles" setting
The add to cart event for WooCommerce Product Bundles now reports the value of the bundle as configured by the shopper, instead of the static minimum bundle price, which is 0 for bundles where all items are optional or for bundled subscriptions without an up-front fee
The add to cart event for WooCommerce Product Bundles now reads the quantity from the bundle's own quantity field; before, it could pick up the quantity of the first bundled item
The customer lifetime value is now resolved per email address; when more than one email address was looked up during the same request, every address after the first one received the order history of the first one, which reported the wrong lifetime value
The OpenAI (ChatGPT) settings (pixel ID, advanced matching, and the Conversions API token) are now part of the Abilities API settings catalog; before, AI agents could not discover or configure the OpenAI pixel (Pro)
Removing the GA4 Measurement Protocol API secret and adding it back no longer sends the purchases paid in the meantime a second time; while the secret is empty the purchase is sent from the browser, which is now recorded on the order so the Measurement Protocol skips it when that order later moves to another paid status (Pro)
Removed the "Automatic LTV recalculation" setting, which had no effect; the background detection it described was switched off some time ago because it caused serious performance problems on large shops, while a refund or a cancellation still updates a customer's lifetime value automatically (Pro)
Added GroundTruth as a new tracking pixel (Pro, beta), loading the GroundTruth Web Engagement Pixel for omnichannel ad attribution across mobile, desktop, CTV, and audio, and sending add to cart and purchase events with order values; just enter the GTID provided by your GroundTruth representative
Added Triple Whale as a new tracking pixel (Pro, beta) under a new Attribution category; a single toggle loads the Triple Pixel for visitor journey tracking, no pixel ID needed, and an optional Orders API key syncs order records including refunds server-side for shops registered in Triple Whale as a Custom Sales Platform
Added an Attribution pixel category, which appears as its own group in the settings and follows the statistics consent category for consent management
Melhoria
Internal improvements to the tracking pixel framework