Admaxxer is a DTC analytics platform with built-in Meta + Google ad ops. When your ad account shows $3,200 spent today with zero reported purchases, you have a measurement problem, not necessarily an ads problem. The short answer: walk the purchase event from checkout → pixel → CAPI → platform, and the break is almost always at one of nine predictable points.
## TL;DR
- Pixel not firing on `/thank-you` is the #1 cause — check Meta Pixel Helper live
- CAPI misconfiguration means server events never reach Meta's API
- Wrong event name (Purchase vs purchase vs CompletedCheckout) bricks attribution
- Shipping zone or payment method blocking checkout is an ops problem dressed as a measurement problem
- Audience mis-targeting (wrong country, lookalike age skew) produces traffic that doesn't convert
## The nine most common causes
The diagnostic universe for "spend fires, purchase doesn't" is almost always one of these:
1. **Pixel not firing on the thank-you page.** App theme updates can silently remove the pixel snippet
2. **CAPI stopped working** (access token revoked, webhook paused, rate-limited)
3. **Event name mismatch** (`Purchase` vs `purchase` vs `complete-order` — Meta treats these as different events)
4. **Content Security Policy (CSP)** blocks the pixel domain after a security update
5. **Shopify Checkout Extensibility rollout** broke the legacy checkout.liquid pixel injection
6. **Klaviyo firing Purchase but Shopify not firing CAPI** (or vice versa) — Meta sees 50% of events
7. **Shipping zone or payment method blocking checkout** — clicks and ATCs fine, checkout fails silently
8. **Audience mis-targeting** — wrong country, wrong age band, wrong language
9. **Ads approved but landing page returning 500** — Meta doesn't block impressions when the destination is broken
Most accounts with this problem have cause #1, #3, or #5. Use the diagnostic steps below to walk through them in order.
## Diagnostic steps
### Step 1: Run Meta Pixel Helper on your own thank-you page
Open Chrome with the Meta Pixel Helper extension, complete a real test order (use a 100% discount code), and watch for the Purchase event on the order confirmation page. If nothing fires, your pixel is broken or missing from the thank-you template. Fix before anything else. In Admaxxer, open **Connections → Meta → Pixel health** which runs this check every 6 hours automatically.
### Step 2: Verify CAPI is receiving events
Go to Meta Events Manager → Data Sources → your pixel → Overview. Look at the last 7 days of server events. If server events are zero but browser events are firing, CAPI is disconnected. If both are zero, the pixel itself is broken upstream.
### Step 3: Check the event name exactly
Meta treats `Purchase`, `purchase`, and `CompletedCheckout` as distinct events. The ads are optimised for `Purchase` (capital P). If your CAPI sends `purchase` (lowercase), the events arrive but don't map to your conversion objective. Fix in your server code or Shopify app config.
### Step 4: Inspect the checkout flow for silent failure
Use Shopify Admin → Orders → Abandoned checkouts. If ATC is firing (visible in Meta as AddToCart) but no Abandoned Checkout records exist in Shopify, the shopper never reached checkout. Could be a JavaScript error, a product variant out of stock, or a shipping zone rejection.
### Step 5: Check audience targeting
Open Meta Ads Manager → Ad Set → Audience. Verify:
- Country/region matches where you ship
- Age band matches your actual buyer demographic (a supplement brand targeting 18–65 will waste spend on 18–24 who don't convert)
- Language (English-only ads shown to Spanish speakers will get clicks, not purchases)
### Step 6: Look at landing page return code
Use a synthetic monitor or the Admaxxer [pixel health check](/docs/pixel) which tests that the landing page returns 200 and that the pixel loads. If the landing page is 5xx or 4xx for even 10% of hits, your conversion rate plummets while spend is unaffected.
### Step 7: Check if ads are showing in the right placement
Advantage+ Placements can run your conversion ads in Stories, Reels, Audience Network — placements that can have 5× lower conversion rates than Feed. Pin to Feed + Instagram Feed for high-CPA campaigns until you have data to expand.
### Step 8: Review shipping & checkout costs
If you added a $25 shipping fee last week and forgot to update ad copy promising free shipping, your ATC-to-Purchase rate cratered without any "break" that appears in analytics.
### Step 9: Check account-level issues
Stripe payment disputes can pause your payment method. Shopify Payments holds can pause new orders. Neither shows up in Meta — only in Shopify admin. The Admaxxer [connection health panel](/docs/connections) surfaces Stripe and Shopify status so you catch these fast.
## Klaviyo vs Shopify source of truth
A common trap: Klaviyo's Shopify integration fires Purchase events for email-attributed orders via pixel, and Shopify's native Meta integration also fires Purchase events via CAPI. If these don't share `event_id`, Meta double-counts on some orders and misses others depending on firing order and ad-blocker presence. Solution: disable Klaviyo's Meta pixel integration, rely on Shopify → CAPI only, and attribute email via Klaviyo's own Shopify connection. See [Platform vs pixel conversions](/guides/platform-vs-pixel-conversions) for the full architecture.
## Common mistakes
Three errors that cost hours before teams find them:
1. **Assuming Meta's "no purchase" number is real.** Sometimes the purchase is happening — it's just being attributed to a different ad set because of the 7-day window. Check Meta's account-level total before declaring zero.
2. **Adding CAPI without disabling browser pixel.** If you roll out CAPI and forget to keep `event_id` synced, you go from under-reporting to double-reporting and still think "zero purchases" because one ad set looks broken.
3. **Trusting the "Events Received" count as proof.** Events Received ≠ Events Matched. A pixel can fire 1000 times but match 0 conversions if the event_name is wrong or the user_data hashing is off.
For ongoing monitoring, the Admaxxer [Claude agent](/docs/ai-agent) pings you via the `query_metrics` tool whenever spend-to-purchase ratio drifts more than 3× baseline.
## FAQs
**What if the pixel fires but CAPI doesn't?**
That's fine for basic attribution but costs you 15–30% of iOS conversions. CAPI is how you recover post-ATT purchases. Every DTC account should have both.
**How fast should Meta show purchases after they happen?**
Within 15 minutes in the Events Manager; within 1–3 hours in Ads Manager reports. If 24 hours pass with no purchases showing, something is broken.
**Does this apply to Google Ads too?**
Yes — the analog is Google Enhanced Conversions (server-side) plus the gtag conversion event. Same diagnostic path. See the [Google Ads service docs](/docs/google-ads-service).
**Can the Claude agent diagnose this for me?**
Yes — ask the agent "why is my Meta account showing zero purchases today?" and it will pull CAPI health, pixel fire rate, and recent event names in a single tool call.
Frequently Asked Questions
What if the pixel fires but CAPI doesn't?
That's fine for basic attribution but costs you 15–30% of iOS conversions. CAPI is how you recover post-ATT purchases. Every DTC account should have both.
How fast should Meta show purchases after they happen?
Within 15 minutes in the Events Manager; within 1–3 hours in Ads Manager reports. If 24 hours pass with no purchases showing, something is broken.
Does this apply to Google Ads too?
Yes — the analog is Google Enhanced Conversions (server-side) plus the gtag conversion event. Same diagnostic path.
Can the Claude agent diagnose this for me?
Yes — ask the agent why is my Meta account showing zero purchases today? and it will pull CAPI health, pixel fire rate, and recent event names in a single tool call.
What's the most common single cause?
Pixel missing from the thank-you page after a Shopify theme update. Check it first.
Put This Knowledge Into Action
Bring Meta and Google ads into one self-hosted workspace.