Almost every week someone sends me the same message on WhatsApp. The ads were working. Same budget, same products, same creatives. Then sales dropped, the cost per purchase went up, and Ads Manager stopped matching the orders in Shopify.
Usually nothing is wrong with the product or the offer. Meta can see less than it used to, and the account was never set up for that. Most of it is fixable. You just have to fix it in the right order.
What actually changed
In 2021 Apple released iOS 14.5 with App Tracking Transparency. Every app now has to ask iPhone users if it can track them across other apps and websites. A large share of people tap "Ask App Not to Track".
When someone taps that inside Facebook or Instagram, Meta loses most of its ability to connect their ad click with what they do on your website. They still see your ad and might still buy, but the pixel can't always report that purchase back to the ad that caused it.
Later changes made it harder. Browsers block more third-party cookies, and some iPhone privacy features strip tracking parameters from links. Together, they mean the pixel alone now misses a real part of your sales.
Signal loss, in plain words
Meta's algorithm learns from conversions. Every purchase it sees teaches it what a buyer looks like. When it sees fewer purchases, three things happen:
- Your reported results drop, even if your real sales didn't drop as much.
- Learning takes longer, because each ad set gets fewer conversions to learn from.
- Delivery gets worse, because the algorithm is now guessing with less information.
So part of the drop was reporting, and part of it was real. Your job is to give Meta back as much clean signal as you can.
Your ads didn't suddenly get worse. Meta just started seeing less of what happens after the click.
Domain verification and event priority
Meta's first answer to iOS 14.5 was Aggregated Event Measurement, which processes web events from iOS users in a limited way, tied to your domain. To control how those events are counted, you need to own the domain inside Business Manager.
So step one is simple: verify your domain. In Business Settings, go to Brand Safety, then Domains, and add your store's domain. You can verify with a DNS TXT record, a meta tag or an HTML file.
For a while, Meta also made you rank up to eight conversion events per domain, with Purchase at the top. Newer versions of Events Manager removed most of that manual setup, but the idea still matters. Pick one event that means a real sale, usually Purchase, and optimize for it. Splitting campaigns across Add to Cart, Initiate Checkout and Purchase means none of them learns well.
Conversions API: send the data from your side
This is the fix that matters most. The pixel runs in the visitor's browser, so ad blockers, iOS settings and slow mobile connections can stop it. The Conversions API, or CAPI, sends the same events from your server straight to Meta. It doesn't depend on the browser.
Run both together. The pixel and CAPI send the same Purchase, and Meta removes the duplicate using an event ID. If the IDs don't match, Meta counts the sale twice and you end up scaling the wrong things.
On Shopify, the Facebook and Instagram app can set this up for you. In its settings, set customer data sharing to Maximum. On WooCommerce or a custom site, use a plugin you trust, a server-side Tag Manager container, or a developer who has done it before. Then check two things in Events Manager:
- Deduplication. Your Purchase event should show events from both the browser and the server, with the duplicates removed.
- Event Match Quality. This score shows how well Meta can match your events to real people. Send email and phone number with every purchase. For Pakistani numbers, include the country code, so 0301 becomes 92301.
Attribution windows: why the numbers never match
Ads Manager shows one number of purchases, Shopify shows another, and the COD sheet shows a third. Clients ask me which one is lying. Usually none of them. Ads Manager only credits a sale to an ad if it happened inside the attribution window. If someone clicked your ad nine days ago and bought today, Meta doesn't count it. If someone saw your ad yesterday without clicking and bought today, Meta does count it, even if they actually found you on Google.
7-day click, 1-day view
What most conversion campaigns use. Your Shopify orders and your COD sheet follow none of these rules, so the numbers will never match exactly.
Stop trying to make them match. Track one number you trust instead: total sales from your backend divided by total ad spend across every platform. If that number holds steady or improves while you change things in Meta, you're moving the right way. Use Ads Manager to compare campaigns against each other, not to count your money.
Broad targeting and creative as targeting
With less data, narrow interest stacks stopped working the way they used to. Women aged 25 to 34 who like three fashion pages is a small box for an algorithm that already has less to work with.
Most accounts I review now do better with broad targeting: country or city, age if it really matters, and very few interests. With Advantage+ audience, Meta treats the interests you add as suggestions anyway.
Going broad doesn't mean you stop targeting. The targeting moves into the creative. The ad itself decides who stops scrolling. A video that opens with "Lahore mein same day delivery" speaks to a different person than one that opens with the price. Your hook, your language, the people on screen and the offer all tell Meta who to show the ad to next.
- Make different creatives for different buyers, not small variations of one ad.
- Speak the way your customer speaks: Urdu, Roman Urdu or English, depending on who buys.
- Show the price in PKR, the delivery time and whether you offer COD. People want to know these before they click.
What to fix first
Don't change everything at once. Work through this in order, and give each step time to show up in the numbers.
- Verify your domain in Business Settings. It takes minutes and the rest builds on it.
- Check your pixel events. Use Test Events to confirm Purchase fires once per order, with the right value and PKR as the currency.
- Set up the Conversions API and confirm deduplication is working.
- Raise your Event Match Quality by sending email and phone number with every purchase.
- Pick one optimization event that means a real sale, and stop splitting budget across events.
- Agree on one number you trust, like backend sales divided by total ad spend.
- Simplify and go broad. Fewer campaigns, fewer ad sets, wider audiences.
- Put your effort into creative. New angles, new hooks, real customer language.
Steps one to four are tracking. Don't skip them. Every creative test you run on broken tracking gives you the wrong answer.
If you want to learn this properly, the course walks through it step by step. If you'd rather I look at your account with you, that's what the strategy call is for.