Diagnosing high spend with zero purchases

What Causes High Spend and Zero Purchases

7 min read • attribution
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.

Get Started Free