Skip to content
← ALL WRITING

2026-04-02 / 2 MIN READ

Why your Meta CAPI is probably broken

The six most common misconfigurations I find when auditing server-side tracking for DTC brands. Plus the fixes.

$ tail -f /var/log/capi.events
00:20:44.01[browser] ViewContent event_id=vc_a8f2 MATCHED
00:20:45.01[server] ViewContent event_id=vc_a8f2 DEDUPED
00:20:46.01[browser] AddToCart event_id=ac_3b91 MATCHED
00:20:47.01[server] AddToCart event_id=ac_3b91 DEDUPED
00:20:48.01[browser] Purchase event_id=pu_72ad MATCHED
00:20:49.01[server] Purchase event_id=pu_72ad DEDUPED
00:20:50.01[browser] ViewContent event_id=vc_5d10 MATCHED
00:20:51.01[server] ViewContent event_id=vc_5d10 DEDUPED
// pink = deduped (counted once) / white = matched (deduplication confirmed)

The six

Every audit I run starts with these six checks. Most DTC brands fail four or five.

1. Hashed email missing on non-purchase events

Shopify's native CAPI integration passes email only on the Purchase event. You need em (hashed email) on ViewContent and AddToCart too. Missing this drops match quality by 1 to 1.5 points on every upper-funnel event.

2. event_id not matching between pixel and CAPI

The deduplication key has to be identical on both sides. Most brands forget this and end up double-counting half their events and under-counting the other half. Both are bad.

3. No external_id passed

This is the single highest-leverage fix. Pass a hashed Shopify customer ID as external_id on every authenticated event. I've seen this alone move match quality from 3.8 to 6.2.

From 1000+ DTC audits

4. Event names inconsistent across sources

Shopify sends Purchase. Your custom GTM events send purchase. Meta treats these as different events. Standardize on the capitalized version.

5. Event source URL missing

Server-side events need event_source_url set to the page URL where the event occurred, not your server endpoint. Missing this kills the attribution window.

6. Duplicate events fired from GTM web + CAPI

The fix

All six are covered in the CAPI Playbook ($129, preorder open). It's the exact workflow I ship for DTC brands, with the Claude Code prompts and the GTM container export.

Or if you want me to audit it for you directly, the retainer bridge has a few slots open. Retainer engagements sunset 2026-12-31. After that, it's product ladder only.

// related

DTC Stack Audit

If this resonated, the audit covers your tracking layer end-to-end. Server-side CAPI, dedup logic, and attribution gaps - all mapped to your stack.

>See what is covered