One of our TrueMetriks clients just had one of his best months ever ($40K to $50K in pure profit), and the very next month it totally flopped.
CPMs spiked, cost per purchase went through the roof and he had no idea why.
So he did what every other media buyer does. He tried fixing the ads, fixing the sales page, this trick, that trick, and spent days and money testing to bring the numbers back.
None of it moved the needle.
Sent, accepted and kept are 3 different numbers
When he told me about it, I checked his Platform Health inside TrueMetriks, and it showed the one number that decides what Meta actually does with your purchases.
Platform Health shows 3 numbers for every event: how many were sent to Meta, how many Meta accepted, and how many Meta kept.
Sent means the event left your website or your server on its way to Meta. Accepted means Meta received it and didn't reject it.
And kept means Meta actually counts it, measures it and optimizes your ads on it.
The pattern I see across accounts is advertisers opening Events Manager, seeing their purchases coming in and being received, and taking that as proof their tracking works.
That's the check he would have done too, and it would have passed.
Here's his screenshot. Look at the Purchase row.
43 purchases sent in the last 7 days. 43 accepted by Meta. 0 failed.
Meta kept 15.
That's a 62.5% gap, on the most important event for conversion optimization.
And the 0 failed part matters too. Nothing errored and nothing looked broken anywhere, which is exactly why nobody caught it.
It wasn't only purchases either. PageView: 2,128 sent, 2,128 accepted, only 1,023 kept. InitiateCheckout: 64 sent, 64 accepted, only 29 kept.
So the whole funnel was leaking on the way into Meta's database.
(Meta's count can lag by up to a day, so Platform Health only compares events older than 24 hours, which means this isn't just a delay that catches up later.)
Why his cost per purchase looked almost 3 times worse than it was
Accepted only means Meta received the purchase, and kept is the only number Meta uses, so for that week Meta was working with 15 of his 43 purchases.
So the other 28 purchases happened, the money came in, and Meta acted like they didn't, which did 2 things to his account that made every fix he tried look like it failed.
The first one is the optimizing. Meta finds you more buyers by learning from the buyers you send back to it, who they are and which ad they came from.
With 15 purchases instead of 43, it was finding buyers from about a third of the information it should have had, so his costs went up for real.
The second one is the reporting. Ads Manager counted his cost per purchase, and the rest of his numbers, against those 15, not the real 43.
43 divided by 15 is about 2.9, so his cost per purchase showed up almost 3 times higher than it really was.
To put that in dollars (these are example numbers, not his): if you spend $4,300 and get 43 sales, you paid $100 per purchase.
If Meta keeps 15 of them, Ads Manager shows your cost per purchase about $287.
Now think about testing on top of that.
You launch a new ad, Ads Manager says it's costing you $287 a purchase, so you turn it off and try another one, and a winning ad can easily look like a loser and get killed.
And that's why changing the copy and the sales page did nothing for him.
Which means he literally wasted days testing different ads and landing pages, and wasted money doing it, while this whole time the problem was his data not getting back to Meta.
His ads were totally fine, they were just being judged on 15 purchases instead of 43.
Meta restricted his account and he missed it
So why was Meta accepting all 43 purchases and keeping only 15? It matters even if you're not in his niche, because the same kind of gap can sit on your account for weeks without a single error.
He's in health and wellness, which is one of the categories Meta restricts, and at some point Meta restricted his account.
Meta probably sent him an email about it. Or maybe they didn't. Either way, he missed it and had no idea his account was restricted.
So standard purchase events were being sent to Meta, Meta was accepting every single one, and then it was throwing most of them away.
Once we discovered the gap in events sent vs kept, he went into his account settings, the restriction was right there. He just hadn't seen it.
Meta keeping fewer events than it accepts can happen for other reasons too, but that's another post.
Now that we know Meta restricted his account, he created custom conversions, and now those get sent to Meta.
If Meta restricts your account, custom conversions are how you get your purchases back in front of Meta so you can keep running ads profitably.
Get your data right before you touch a single ad
Now the part that matters if your account is running fine today, because the next time your numbers drop out of nowhere, what you check first decides whether you lose a day or a month.
He was optimizing everything, the ads, the sales page, but the data underneath all of it was wrong.
You need strong data, and you need it ready to go, if you don't have that, then optimizing means nothing.
Every lever you pull, whether that's the creative, the sales page, the offer or the budget, depends on Meta learning from the buyers you send back to it.
You can have the best copy in the world and the best sales page in the world, and it won't help you optimize an offer where the data is bad or isn't reaching Facebook.
The reflex when performance drops is to make new creative, because that's the part you can see and change today. I'd flip the order and look at the data first.
And look at all 3 numbers, not just sent and accepted, because accepted looking healthy is exactly what hid this for him.
A big gap between accepted and kept is your signal to stop and find out why.
When performance drops out of nowhere, check sent, accepted and kept before you change a single ad.
Anyways, the only reason we caught this is because Platform Health in TrueMetriks looks at the third number, the one Meta kept, and not just whether the event was sent and accepted.