meta-ads-integration
Meta Ads Integration
Overview
Meta (Facebook/Instagram) is the dominant paid social channel for ecommerce, but reliable attribution requires pairing the browser-based Meta Pixel with server-side Conversions API (CAPI). Post-iOS 14, browser signals alone under-report 30–60% of conversions; CAPI restores signal fidelity by sending purchase events directly from your server. For Shopify, WooCommerce, and BigCommerce, official integrations handle both Pixel and CAPI automatically — no custom code required. Custom code only belongs in the Custom/Headless section.
When to Use This Skill
- When setting up Meta advertising for a new ecommerce store
- When conversion data in Ads Manager looks under-reported after iOS 14 rollout
- When launching Dynamic Product Ads (DPA) and needing catalog feed sync
- When ROAS is declining and you need to restore the signal quality Meta's algorithm relies on
- When adding retargeting audiences based on product viewers and add-to-cart events
Core Instructions
Step 1: Choose your integration approach
| Platform | Recommended Method | CAPI Support | Catalog Sync |
|---|---|---|---|
| Shopify | Native Meta Sales Channel | Yes (built-in) | Yes (automatic) |
| WooCommerce | Facebook for WooCommerce plugin | Yes (built-in) | Yes (automatic) |
| BigCommerce | Meta channel in Channel Manager | Yes (built-in) | Yes (automatic) |
| Custom / Headless | Meta Pixel + facebook-nodejs-business-sdk | Manual CAPI implementation | Manual feed generation |
All three major platforms have official Meta integrations that install both the Pixel and CAPI in a single setup — use these rather than manually pasting Pixel code.
Step 2: Connect your platform to Meta
Shopify
- Go to Shopify Admin → Sales Channels → + → Facebook & Instagram
- Install the Facebook & Instagram sales channel
- Connect your Meta Business Manager account and select your Facebook Page and Ad Account
- Under Data Sharing, select Maximum — this enables server-side CAPI in addition to the browser Pixel
- Shopify automatically:
- Installs the Meta Pixel on all pages
- Fires ViewContent, AddToCart, InitiateCheckout, and Purchase events
- Sends the same events via CAPI from Shopify's servers (deduplication handled automatically)
- Syncs your product catalog to Meta Commerce Manager for Dynamic Product Ads
- Go to Facebook & Instagram → Overview to verify pixel connection status
- In Meta Events Manager → Data Sources → [Your Pixel]: check Event Match Quality (EMQ) score — aim for 7+/10
WooCommerce
- Install Facebook for WooCommerce (free, official Meta plugin) from the WordPress plugin directory
- Go to WooCommerce → Facebook → Get Started and connect your Meta Business Manager account
- Under Facebook Connection → Data Sharing Level: select Maximum
- The plugin installs the Meta Pixel across all pages and fires standard events automatically
- CAPI is enabled automatically under the Maximum data sharing setting
- Go to WooCommerce → Facebook → Product Sync to trigger an initial product catalog sync to Meta Commerce Manager
- Verify catalog sync status in Meta Commerce Manager → Catalog → Data Sources
BigCommerce
- Go to BigCommerce Admin → Channel Manager → Add a Channel
- Select Facebook & Instagram
- Connect your Meta Business Manager account
- Enable Enhanced Conversions (CAPI) during setup
- BigCommerce syncs your product catalog automatically and registers it in Meta Commerce Manager for Dynamic Product Ads
- Check product sync status in Channel Manager → Facebook & Instagram → Products
Custom / Headless
For headless stores, you must install both the browser Pixel and server-side CAPI manually.
Browser-side Pixel (add to <head> on every page):
// Replace YOUR_PIXEL_ID with your Pixel ID from Meta Events Manager
fbq('init', 'YOUR_PIXEL_ID');
fbq('track', 'PageView');
// Product page
fbq('track', 'ViewContent', {
content_ids: [product.sku],
content_type: 'product',
value: product.price,
currency: 'USD',
});
// Purchase — pass eventID for deduplication with CAPI
const purchaseEventId = `purchase-${orderId}`;
fbq('track', 'Purchase', {
content_ids: order.lineItems.map(i => i.sku),
value: order.subtotal,
currency: order.currencyCode,
order_id: order.id,
}, { eventID: purchaseEventId });
Server-side CAPI (send from your order webhook):
import { FacebookAdsApi, ServerEvent, UserData, CustomData, EventRequest } from 'facebook-nodejs-business-sdk';
FacebookAdsApi.init(process.env.META_CAPI_ACCESS_TOKEN!);
async function trackPurchaseCapi(order: Order, req: Request) {
const eventId = `purchase-${order.id}`; // MUST match the eventID passed to fbq()
const userData = new UserData()
.setEmail(order.customerEmail) // SDK hashes PII automatically (SHA-256)
.setPhone(order.customerPhone)
.setFirstName(order.customerFirstName)
.setLastName(order.customerLastName)
.setZip(order.shippingAddress?.zip)
.setCountry(order.shippingAddress?.countryCode)
.setClientIpAddress(req.ip)
.setClientUserAgent(req.headers['user-agent'] as string)
.setFbp(req.cookies['_fbp']) // _fbp cookie = browser identity signal
.setFbc(req.cookies['_fbc']); // _fbc cookie = click identity signal
const customData = new CustomData()
.setValue(order.subtotal)
.setCurrency(order.currencyCode)
.setContentIds(order.lineItems.map(i => i.sku))
.setContentType('product')
.setNumItems(order.lineItems.length)
.setOrderId(order.id);
const event = new ServerEvent()
.setEventName('Purchase')
.setEventId(eventId)
.setEventTime(Math.floor(Date.now() / 1000))
.setUserData(userData)
.setCustomData(customData)
.setActionSource('website');
await new EventRequest(process.env.META_CAPI_ACCESS_TOKEN!, process.env.META_PIXEL_ID!)
.setEvents([event])
.execute();
}
Product Catalog Feed for Dynamic Product Ads: Generate a CSV feed and serve it at a stable URL. Register it in Meta Commerce Manager → Catalog → Data Sources → Add Data Feed.
// Generate CSV with required columns: id, title, description, availability, condition, price, link, image_link, brand
// Schedule regeneration every 4 hours — serve at a stable /feeds/meta-catalog.csv endpoint
Step 3: Campaign structure for ecommerce
Build a three-tier campaign structure in Meta Ads Manager:
Campaign 1: Prospecting
- Objective: Sales → Purchases
- Budget: 60% of total Meta budget
- Audience: Broad (US 18–65, no interest targeting) — use Advantage+ targeting
- Ads: 3–5 creatives (static image, video, carousel, UGC)
- Use Advantage+ Shopping Campaigns (ASC) — Meta's automated format consistently outperforms manual campaign structures for ecommerce
Campaign 2: Retargeting
- Budget: 30% of total Meta budget
- Ad Set 1: Viewed product but did not add to cart (last 7 days)
- Audience: Website custom audience → ViewContent event, last 7 days
- Ads: Dynamic Product Ads (DPA) carousel showing viewed products
- Ad Set 2: Added to cart but did not purchase (last 3 days)
- Audience: Website custom audience → AddToCart, last 3 days; exclude Purchases last 3 days
- Ads: DPA + urgency messaging
Campaign 3: Retention / LTV
- Budget: 10% of total Meta budget
- Ad Set: Customer list audience (upload from Shopify → Customers export)
- Exclude customers who purchased in the last 30 days
- Ads: New arrivals, cross-sell products
- Ad Set: 1% Lookalike of top purchasers (great for prospecting)
Step 4: Set up Dynamic Product Ads
For Shopify and WooCommerce, the official integrations auto-sync the product catalog. Verify setup:
- Go to Meta Commerce Manager → Catalogs → [Your Catalog]
- Check Data Sources — confirm your platform's feed is syncing and last updated within 24 hours
- Check Items — verify products show correct prices, availability, and images
- In Ads Manager → Create Ad Set: select your catalog under Catalog Sales campaign objective
- Choose Dynamic formats and creatives — Meta automatically selects the best ad format per user
Step 5: Verify Event Match Quality
In Meta Events Manager → Data Sources → [Your Pixel] → Overview:
| Signal | How to Improve |
|---|---|
| EMQ below 6 | Send more user data (email, phone, fbp/fbc cookies) |
| CAPI not firing | Check platform integration is set to Maximum data sharing |
| Duplicate conversions | Verify deduplication — eventID must match between Pixel and CAPI |
| ViewContent not firing | Check the platform integration is active and pixel is on product pages |
Best Practices
- Use Advantage+ Shopping Campaigns (ASC) for prospecting — Meta's automated campaign type consistently outperforms manual structure for ecommerce; start here, not manual campaigns
- Set data sharing to Maximum on Shopify/WooCommerce — this single setting enables CAPI and is worth significantly more accurate attribution than the default
- Pass
_fbpand_fbccookies in CAPI — these are the strongest identity signals for iOS 14+ attribution; include them in every CAPI event - Use
order_idas the deduplication key — prevents duplicate conversion counting when both Pixel and CAPI fire for the same purchase - Exclude recent purchasers from prospecting — add a 30-day purchaser exclusion to cold campaigns to protect budget
- Refresh creative every 4–6 weeks — Meta campaigns show creative fatigue quickly; rotate 3–5 variations per ad set
Common Pitfalls
| Problem | Solution |
|---|---|
| Duplicate purchase conversions in Ads Manager | Ensure eventID is identical in both Pixel and CAPI calls for the same event; Shopify's native integration handles this automatically |
| Conversions under-reported after iOS 14 | Set data sharing to Maximum in the Shopify Facebook channel settings or enable CAPI in WooCommerce Facebook plugin |
| Dynamic Product Ads show wrong price | Shopify/WooCommerce catalog syncs happen up to every 24 hours; for time-sensitive price changes, trigger a manual sync |
| Low EMQ score despite native integration | Go to Meta Events Manager → check that both browser and server events are showing; verify the integration is fully authorized |
| iOS 14+ campaign reach is low | Go to Meta Business Manager → Brand Safety → Domains → Verify your domain; enable Aggregated Event Measurement |
| Ad account disabled | Never send raw (unhashed) PII through the API; use the official SDK which hashes all data automatically |
Related Skills
- @google-ads-ecommerce
- @tiktok-ads-integration
- @google-shopping-feed
- @email-marketing-automation
- @marketing-attribution-dashboard