Loading tutorials…
Loading tutorials…
Most Woo owners install the Meta Pixel via the official plugin, see 'Connected,' and assume iOS shoppers are tracked. They are not. Without server-side Conversions API + event_id deduplication, you lose 30-50% of attribution. Here is the full setup.
Who this is forWooCommerce owners running Meta ads (Facebook + Instagram) with at least $500/mo spend. If your reported ROAS dropped significantly after iOS 14.5 and you have not implemented CAPI, this tutorial is the fix.
What you'll need
Step 1
Two valid paths: (a) Facebook for WooCommerce plugin — easier, handles CAPI automatically. (b) GTM — more flexible, requires data-layer setup. Pick one. Never both.
Option A — "Facebook for WooCommerce" plugin (by Meta). Installs the pixel, registers a catalog for dynamic ads, handles CAPI via Meta's backend, and pushes products to a Meta product feed. Best for owners who do not have an existing GTM container or who want the simplest path. Roughly 70% of Woo stores should pick this.
Option B — Google Tag Manager. Best for owners who already have GTM installed and use it for GA4, conversion tracking, and other pixels. More work to set up, but everything lives in one container. You will set up the Meta Pixel tag + a Conversions API Gateway (CAPIG) or use the Stape.io / Tagmate server-side container.
Critical: pick ONE. Running the Facebook for WooCommerce plugin AND a GTM-installed Meta Pixel will double-fire every event. Meta deduplicates only when event_ids match — across two sources they will not.
This tutorial walks Option A (plugin) as the default. The GTM path is covered briefly at the end.
Step 2
WordPress Admin → Plugins → Add New → search "Facebook for WooCommerce" (by Facebook). Install + activate. Then Marketing tab → Facebook → Get Started.
In WordPress Admin → Plugins → Add New, search "Facebook for WooCommerce." The official plugin is published by Facebook (now Meta). Verify the publisher before installing — there are clones.
Activate. A new "Facebook" entry appears under WooCommerce → Marketing.
Click "Get Started." The setup wizard prompts you to connect a Facebook Business account, select a Business Manager, choose or create a Pixel, and link a Catalog (for dynamic ads).
Approve the OAuth permissions. The plugin needs: pixel management, catalog management, page access, ads_management.
When prompted to enable "Advanced Matching," turn it ON. This hashes customer email/phone and sends them with events — recovers 5-15% of attribution that would otherwise be lost to ITP browsers.
When prompted for "Conversions API," turn it ON. The plugin handles the server-side event firing automatically. This is the single most important toggle on this screen.
Step 3
Install the Meta Pixel Helper Chrome extension. Visit your store and verify PageView, ViewContent, AddToCart, InitiateCheckout, and Purchase fire on the right pages.
Install the "Meta Pixel Helper" Chrome extension from the Chrome Web Store.
Open your store in Chrome. Click the extension icon on each page:
- Home page: should fire PageView only.
- Product page: PageView + ViewContent (with content_ids matching the product SKU).
- Cart page: PageView (some setups also fire AddToCart or InitiateCheckout here).
- Checkout page: PageView + InitiateCheckout (with value, currency, content_ids).
- Order received (Thank You) page: PageView + Purchase (with value, currency, content_ids).
If any event is missing OR an event fires twice on the same page, you have a configuration issue. The plugin auto-injects events at the correct WooCommerce hooks — duplicates usually come from a second pixel source.
The most common bug: PageView fires twice on the home page because the plugin pixel AND a theme-injected pixel both fire. Audit and remove one.
Step 4
In Meta Events Manager → your pixel → Test events. Run a real test purchase and confirm Purchase fires with BOTH "Browser" and "Server" data sources.
Open Meta Events Manager → select your pixel → Test Events tab.
Copy the test event code (looks like TEST12345). Enter it on your live site by appending ?fbclid=TEST12345 to any URL, or use Meta's test-mode pixel cookie via the extension.
In incognito, complete a real $1 test purchase (refund yourself after).
Within 60 seconds, the Purchase event should appear in Test Events. The "Event source" column should show TWO entries: one "Browser" and one "Server." Both with the same event_id.
If only "Browser" appears, CAPI is not firing. Re-check Step 2: Conversions API toggle in the plugin settings → ON.
If both fire but event_ids differ, deduplication will fail and you will double-count Purchases in Ads Manager. The plugin handles event_id sync automatically — if it is broken, the most common cause is a custom theme overriding the plugin's order-received page template.
Step 5
In Events Manager → your pixel → Settings → Advanced Matching = ON. Then Aggregated Event Measurement → prioritize your top 8 events.
Meta Events Manager → select your pixel → Settings → "Customer Information Parameters." Enable Advanced Matching for: email, phone, first_name, last_name, city, state, ZIP, country.
The Facebook for WooCommerce plugin auto-passes these from WooCommerce billing fields when a customer logs in or completes checkout. No code changes needed on your end — just toggle ON in Events Manager.
Then navigate to Aggregated Event Measurement → your domain → Manage Events.
Aggregated Event Measurement (AEM) is iOS 14.5's replacement for cross-app tracking. Meta lets you prioritize 8 events per domain for iOS attribution. Set them in this order: 1) Purchase, 2) Subscribe (if subs), 3) AddPaymentInfo, 4) InitiateCheckout, 5) AddToCart, 6) ViewContent, 7) Lead, 8) CompleteRegistration.
Save. Changes take 24-48 hours to propagate. After that, iOS attribution will be significantly more accurate for ad campaigns optimized toward Purchase.
Step 6
The plugin auto-creates a Meta Catalog from your WooCommerce products. Verify product sync, fix any disapprovals, and link the catalog to your ad account.
In WooCommerce → Marketing → Facebook → Catalog tab. Verify the catalog status shows "Connected" and product count matches your published WooCommerce products.
In Meta Business Manager → Commerce Manager → Catalogs → your catalog → Diagnostics. Anything in "Pending" or "Disapproved" needs fixing.
Common disapprovals on Woo product feeds: missing GTIN, image too small (<500x500px), missing brand attribute, product description too short.
Fix at the source in WooCommerce → Products → edit product. The plugin re-syncs every 30 minutes by default — speed up with WooCommerce → Marketing → Facebook → "Sync products now."
In Meta Ads Manager, your catalog is now available for Advantage+ Shopping campaigns and dynamic remarketing. Without a catalog, you cannot run dynamic product ads — the highest-ROAS Meta campaign type for ecommerce.
Step 7
If you chose GTM over the plugin, install Meta Pixel via GTM, configure data layer events, set up CAPI via Conversions API Gateway or a server-side GTM container.
Install GTM on WooCommerce via the "GTM4WP" plugin (free, recommended) or via a small mu-plugin that injects the GTM container code.
GTM4WP exposes WooCommerce events to the GTM data layer: viewContent, addToCart, beginCheckout, purchase, etc. Configure GTM4WP → Integration → Facebook Pixel = ON. This emits Facebook-compatible event names alongside GA4 events.
In GTM, create a Facebook Pixel base tag (Custom HTML or community template). Trigger on All Pages.
For each event (Purchase, AddToCart, ViewContent), create a tag firing on the corresponding data-layer event. Use the data-layer variables for value, currency, content_ids.
For CAPI: install the "Conversions API Gateway" (Meta-provided) on a $5/mo Cloud Run instance, OR use a server-side GTM container hosted on Stape.io ($20/mo). Both forward events to Meta server-side with event_id deduplication.
GTM path takes 6-10 hours vs the plugin path's 3 hours. Choose this only if you have specific needs not met by the plugin.
Common mistakes
Running plugin pixel AND GTM pixel simultaneously
What goes wrong: Every event fires twice. Meta deduplication only works when event_ids match — across two sources they won't. Purchase counts are 2x in Ads Manager, ROAS reports lie, bid strategies optimize toward inflated targets.
How to avoid: Pick one source. If you keep the plugin, delete the Meta Pixel tag in GTM. If you keep GTM, deactivate the pixel in the Facebook for WooCommerce plugin (settings → disable pixel).
Skipping Conversions API
What goes wrong: Without CAPI (server-side events), iOS 14.5+ and Safari users with ITP are mostly invisible to Meta. The pixel sees maybe 50-60% of conversions; CAPI recovers the missing 30-50%. Meta has no signal to optimize against, CPA climbs steadily.
How to avoid: In the plugin: WooCommerce → Marketing → Facebook → Settings → Conversions API = ON. Validate in Events Manager → Test Events that Purchase shows both Browser AND Server sources.
Theme pixel field still populated
What goes wrong: The theme injects a third pixel snippet that the plugin doesn't know about. You now have 2-3 sources firing per event. Same double-counting problem as #1.
How to avoid: WordPress Admin → Appearance → Customize → search "Facebook" or "Pixel" — clear any pixel ID field in theme settings before installing the plugin.
Advanced Matching off
What goes wrong: You miss 5-15% of attribution because the pixel can't hash and match shoppers across devices/sessions. Especially painful on iOS where cross-app signals are weak.
How to avoid: In Meta Events Manager → Settings → Customer Information Parameters → toggle ON for all 8 fields. The plugin auto-passes them from WooCommerce billing data.
Wrong event prioritization in AEM
What goes wrong: Aggregated Event Measurement only counts your top 8 events for iOS. If you put PageView at #1 and Purchase at #5, iOS attribution heavily undercounts Purchases. Bid strategies starve.
How to avoid: Events Manager → AEM → set Purchase as event #1, then revenue-driving events in descending order (AddPaymentInfo, InitiateCheckout, etc.). PageView should not be in the top 8.
Catalog disapprovals ignored
What goes wrong: Dynamic remarketing only shows products that are "Active" in the Meta Catalog. If 30% of your catalog is in Pending or Disapproved, you cannot remarket those products — losing a major revenue lever.
How to avoid: Commerce Manager → Catalog → Diagnostics. Fix at the source in WooCommerce (GTIN, images, brand attribute). Sync products. Repeat monthly.
Recap
Done — what's next
How to install GA4 on WooCommerce with enhanced ecommerce events
Read the next tutorial
Hand it off
Meta Pixel + CAPI on WooCommerce looks simple but has 4-5 places where a misconfig silently breaks attribution. A specialist will install pixel + CAPI + catalog + AEM and validate in one session — typically $200-400 one-time at $14-16/hr. Ongoing pixel monitoring runs $100-200/mo.
See specialist rates
If you do not already have GTM, use the plugin — it handles pixel + CAPI + catalog in one place with less work. If you have GTM and run pixels for 3+ ad platforms (Meta, TikTok, Pinterest, Snap), GTM consolidates everything. But never run both — pick one.
Meta Events Manager → your pixel → Test Events. Run a test purchase. Purchase event should appear with TWO rows: one Source='Browser,' one Source='Server,' both with the same event_id. If only Browser shows, CAPI is off or misconfigured.
When both Browser pixel AND server-side CAPI fire the same Purchase, Meta needs to know they are the same event — not two purchases. Deduplication uses the event_id field. If event_ids match, Meta counts once. If they don't match (common when running two pixel sources), Meta counts twice and your reported ROAS is 2x inflated.
Most common reasons: missing GTIN (Global Trade Item Number — the barcode), image smaller than 500x500px, missing brand attribute, product title under 30 characters, or description missing. Fix in WooCommerce → Products → edit product. The plugin re-syncs every 30 minutes; manual sync from WooCommerce → Marketing → Facebook → Sync products now.
Yes — significantly. App Tracking Transparency means most iOS users opt out of cross-app tracking. Without CAPI + Advanced Matching + AEM event prioritization, you lose 30-50% of iOS conversion visibility. The combination of all three recovers most (not all) of that signal.
Yes — Custom Audiences from pixel events still work. But the audience sizes are smaller than pre-iOS-14.5 because of ATT opt-outs. Pair pixel audiences with customer-list uploads (hashed email/phone from WooCommerce customers) for a larger remarketing pool.
WooCommerce
GA4 on WooCommerce looks simple until you check Realtime and see only PageView firing — no view_item, no purchase, no value. Enhanced ecommerce on Woo requires either GTM4WP with the right toggles or a paid plugin. Here is the full setup.
WooCommerce
Klaviyo on WooCommerce is the highest-ROAS email setup in ecommerce. But the default plugin install syncs orders only — not browse, cart, or product views. Without those, your abandoned cart and browse-abandonment flows fire on incomplete data. Here is the full integration.
WooCommerce
Customer says 'checkout did not work.' You test and it seems fine. The order is stuck in 'Pending payment' or never created at all. This is the diagnostic sequence Woo specialists run — payment, webhook, plugin conflict, theme override, Blocks vs Classic.
WooCommerce
DIY WooCommerce is a great idea — until your plugin count crosses 30, your checkout breaks intermittently, and PageSpeed sits at 35. This is the honest framework: when the cost of self-managing exceeds the cost of hiring, and how to tell which side you're on.
Meta Ads
The browser pixel alone loses 20-30% of conversions on iOS. CAPI sends events from your server to Meta, recovering most of it. Three install paths: Shopify-native, server-side GTM, and direct API. We cover all three.