If you're running Meta ads and watching your ROAS in the Events Manager, there's a good chance the number you're looking at is incomplete — and the algorithm is bidding against data that's missing 30–50% of your actual conversions.
This isn't a Meta glitch. It's a structural problem with browser-based tracking. And it affects every business running a Meta Pixel without server-side backup.
What's Actually Breaking Your Data
Your Meta Pixel fires from the user's browser. That means it depends on the browser cooperating. Three things have made that cooperation increasingly unreliable:
Safari ITP (Intelligent Tracking Prevention) — Apple's privacy feature limits how long cookies can persist on Safari browsers. The first-party cookie your Pixel sets gets capped at 7 days. If someone sees your ad, leaves, and converts 8 days later, that conversion is lost to your Pixel entirely.
iOS 14+ ATT prompt — When users decline tracking on iOS, Meta loses the ability to tie that user's actions to your ad. On most e-commerce sites, 60–70% of iOS users opt out.
Ad blockers and privacy browsers — uBlock Origin, Brave, Firefox with Enhanced Tracking Protection — all block third-party pixels. Market share for these has crossed 30% among tech-savvy users.
For a typical e-commerce site selling to an Indian urban audience, browser-only tracking captures roughly 50–65% of actual conversions. The other 35–50% just disappears from your dashboard — and from Meta's optimisation signal.
What Meta's Algorithm Sees vs Reality
When Meta's algorithm only sees 54% of your conversions, it's optimising for the wrong signal. It will find users who "convert" — but those users are the ones whose browsers happen to let the Pixel fire. That's a biased audience, not your best audience.
We were spending ₹2 lakhs a month on Meta ads and barely seeing consistent returns. Q4GIS set up server-side tracking and within three months our ROAS went from 1.4× to 3.1×. The algorithm finally had what it needed.
What Meta CAPI Actually Does
Meta Conversions API (CAPI) sends conversion events from your server — not the user's browser. Your server receives the purchase confirmation, then fires an event directly to Meta's servers over HTTPS. The browser's state is irrelevant.
A properly configured CAPI setup includes:
- Server-side event sending for all key conversion events (Purchase, Lead, AddToCart, etc.)
- Deduplication logic so events don't double-count when both Pixel and CAPI fire
- Customer data hashing — email, phone, name — sent with each event to improve match rates
- Event ID matching between browser and server events to ensure deduplication works correctly
A Simple CAPI Implementation (Node.js)
Here's the core of what a server-side purchase event looks like using Meta's Business SDK:
const { ServerEvent, EventRequest, UserData, CustomData } = require('facebook-nodejs-business-sdk');
const crypto = require('crypto');
function hashData(value) {
return crypto.createHash('sha256').update(value.toLowerCase().trim()).digest('hex');
}
const userData = (new UserData())
.setEmails([hashData(customerEmail)])
.setPhones([hashData(customerPhone)])
.setClientIpAddress(req.ip)
.setClientUserAgent(req.headers['user-agent'])
.setFbp(req.cookies._fbp)
.setFbc(req.cookies._fbc);
const customData = (new CustomData())
.setCurrency('INR')
.setValue(orderTotal);
const serverEvent = (new ServerEvent())
.setEventName('Purchase')
.setEventTime(Math.floor(Date.now() / 1000))
.setUserData(userData)
.setCustomData(customData)
.setEventSourceUrl(req.headers.referer)
.setEventId(orderId); // must match Pixel event_id for deduplication
const eventsData = [serverEvent];
const eventRequest = (new EventRequest(accessToken, pixelId))
.setEvents(eventsData)
.setTestEventCode(testCode); // remove in production
eventRequest.execute();
The Three Mistakes That Kill CAPI Match Rates
A bad CAPI setup can actually be worse than no CAPI. Here's what we see most often:
1. Not hashing customer data — Meta requires SHA-256 hashing for all PII. Sending unhashed data doesn't improve match rates; it gets rejected or flagged.
2. Missing deduplication — Without proper event_id matching, both your Pixel and CAPI fire for the same conversion, and Meta counts it twice. Your reported conversions double, your ROAS looks great, and your actual performance stays the same.
3. Sending only Purchase events — CAPI works best when you send the full funnel: ViewContent, AddToCart, InitiateCheckout, and Purchase. The algorithm needs the complete signal to optimise effectively.
What to Expect After Implementation
Match rate improvement is usually visible within 24–48 hours in Meta's Events Manager. The algorithm relearning takes longer — typically 2–4 weeks as the optimisation model adjusts to the richer signal.
In our experience across client campaigns, the typical trajectory is:
- Week 1–2: ROAS may dip slightly as the algorithm resets
- Week 3–4: Conversions start increasing, cost-per-result drops
- Month 2–3: Full optimisation benefit realised, 1.5–2.5× ROAS improvement typical
Q4GIS handles CAPI setup end-to-end — including deduplication logic, GTM server container, and GA4 enhanced conversions. Most implementations take 3–5 business days.
Talk to our team