Redirect payment gateways lose purchases
Gateways that send the customer to an external payment page rely on them coming back to the order-received page. Many don't, so the browser purchase tag never fires even though the order is paid.
This is for WooCommerce store owners whose ad platforms report fewer sales than WooCommerce does, or the same sale twice. WordPress gives you a lot of freedom, which also means plugins, caching and off-site payment gateways can each break tracking in their own way. I build a clean dataLayer, a GTM setup that reads it, and a server-side feed so purchases still count when the browser doesn't cooperate.
Proper WooCommerce conversion tracking means a plugin-generated ecommerce dataLayer read by Google Tag Manager, a purchase event on the order-received page that fires only once, a server-side purchase sent from WooCommerce order data for off-site payment gateways, and caching rules that leave cart, checkout and tag scripts alone.
The events I set up on WooCommerce, and where each one is sent.
Gateways that send the customer to an external payment page rely on them coming back to the order-received page. Many don't, so the browser purchase tag never fires even though the order is paid.
Page caching, 'delay JavaScript' and file-combining features can stop GTM loading until a click, or serve a cached page with someone else's cart values in the dataLayer.
It's common to find the official Meta plugin, Google for WooCommerce, Site Kit and a GTM plugin all installed at once. Each may send its own purchase, so platforms double-count.
Newer WooCommerce stores use the block-based Cart and Checkout. Tracking plugins or custom code written for the older shortcode checkout can miss checkout steps or fire them at the wrong time.
If the order-received page is reloaded or reopened from an email link, a naive purchase tag sends the order again unless it's guarded by the order ID.
| Event | When it fires | Sent to |
|---|---|---|
view_item_list | Shop, category or search results page loads | GA4 |
view_item / ViewContent | Single product page loads | GA4, Meta Pixel + CAPI, TikTok |
add_to_cart / AddToCart | Add to cart clicked, including AJAX adds on archive pages | GA4, Meta Pixel + CAPI, TikTok |
begin_checkout / InitiateCheckout | Checkout page loads | GA4, Meta Pixel + CAPI, TikTok |
add_payment_info | Payment method selected before placing the order | GA4 |
purchase / Purchase | Order-received page (first load only) | GA4, Google Ads, Meta Pixel, TikTok |
purchase (server) | Order status changes to processing or completed, sent from WooCommerce to sGTM | Meta CAPI, GA4, TikTok Events API |
I check which plugins and snippets send data, how your caching is set up and which payment gateways redirect off-site, then compare recent platform conversions with WooCommerce orders.
Duplicate trackers are removed or switched off, and the dataLayer plugin is configured, so there is one clear source for each event.
I set up GTM tags for GA4, Google Ads, Meta and TikTok, then add the server container and order-based purchase feed with shared event IDs.
I place test orders through each payment method, including ones that redirect, with caching active, and confirm each order is counted once.
I watch the numbers against WooCommerce for two weeks, then hand over a written event map and a short walkthrough.
WooCommerce doesn't output a GA4-ready dataLayer by itself. A plugin like GTM4WP or Stape's WordPress plugin adds one, with product IDs, prices, quantities and order totals in a consistent format. GTM then reads that data instead of scraping it from the page, which is far less fragile when your theme changes.
The settings matter. I check that product IDs match your Merchant Center feed (SKU vs post ID), that tax and shipping are handled the way you want revenue reported, and that the purchase event is protected from firing twice on the same order.
With an on-site card form, the customer usually lands on the order-received page and the purchase tag fires. With a redirect gateway, they pay on another site and may close the tab before coming back. Your WooCommerce order is marked paid, but GA4 and Meta never hear about it.
The fix is to send the purchase from the server when WooCommerce updates the order, not only from the browser. The Stape plugin can send order webhooks to a server GTM container, which then forwards the purchase to Meta CAPI and other platforms with the same event ID the browser would use, so a customer who does return isn't counted twice.
Meta's and Google's official WooCommerce plugins are quick to install and handle catalogue sync well. For conversion tracking they give you less control and are a common source of duplicate events when GTM is also set up. I usually keep them for catalogue and feed features and turn off their purchase tracking, or keep them and skip the matching GTM tags. The rule is one sender per event per platform.
A WooCommerce tea brand now sends server-side Meta purchase events with revenue, tracks custom micro events in GA4 and retargets shoppers by behavior.
Read case studyA hybrid client + server tracking rebuild for a premium tea brand, using a Stape server container and custom domain so Google Ads receives verified revenue.
Read case studyI usually use GTM4WP or Stape's WordPress plugin to generate the ecommerce dataLayer, with all tags managed in Google Tag Manager. That keeps tracking logic in one place and makes server-side tracking easy to add. The right choice depends on whether you also want Stape's server-side features.
The usual causes are redirect payment gateways where the customer doesn't return, caching or JavaScript-delay settings stopping tags, consent blocking, and ad blockers. A server-side purchase sent from WooCommerce order data covers most of the gateway and blocker losses.
It can. Cart and checkout pages should not be cached, and GTM should be excluded from features that delay or combine JavaScript. I test with your actual caching setup switched on rather than turning it off during testing.
Yes, Meta's plugin can send server events. If you also run GTM with Meta tags, turn one of them off for each event, or you'll get duplicates. For more control or other platforms, server GTM is the better long-term option.
Yes, but some older plugins and custom code were written for the shortcode checkout and miss events on the block version. I check which checkout you're running and test each step before launch.

A practical guide to Meta CAPI on Shopify and WooCommerce: native integrations, server-side GTM, Conversions API Gateway and how to test it all.
What server-side tracking really is, how server-side GTM works, what it fixes and what it does not, and a checklist to decide if your business needs it.
The step-by-step checklist I use to set up GA4 ecommerce tracking: events, data layer, GTM tags and testing, so product and revenue reports are accurate.
Get a free audit of your tracking and ad account. Usually replies within 1–2 hours.