Skip to content
Academy
Marketing Academy · Field Work●Paid Ads
CoreAudit· 45 minutes

The Deduplication Audit: Catching a Double-Counted Conversion Before It Skews Your CPA

Airbnb

Objective: Given a set of paired browser-Pixel and server-CAPI event logs for the same purchases, identify which events are missing a matching event_id (and will double-count) versus which are correctly deduplicated, and quantify the CPA distortion caused by the gap.

You're auditing tracking health for a mid-market DTC brand's Meta ad account after a developer rolled out server-side CAPI last month, and CPA has mysteriously dropped 35% in the dashboard with no change in spend or targeting.

Pair every Pixel event against its CAPI counterpart by order ID, check for matching event_id, and calculate the real (deduplicated) purchase count versus the dashboard's reported count.

Before you start

What you'll need

Free path (everything below is enough to finish)

FreeJoin and compare Pixel vs CAPI event logs by order ID

Free, handles VLOOKUP-based pairing without a paid analytics tool

The process

2 steps

Step 01 of 02

Diagnosing double-counted conversions from a missing event_id

The lesson's Meta CAPI section explains that running Pixel and CAPI in parallel requires an identical event_id on both payloads for the same event, or Meta counts it twice, artificially lowering apparent CPA and causing Smart Bidding to over-spend chasing a target that isn't real.

Of 15 purchase events logged this week, 15 fired from the Pixel and 15 fired from CAPI. Pairing them by order ID, 4 pairs share no matching event_id. What does the dashboard report versus what actually happened?

Google Sheets— Import pixel-events.csv and capi-events.csv, join on order_id, compare event_id columns.

Procedure

  1. Import both event logs and match rows on order_id using VLOOKUP or a join
  2. Compare the event_id value on each matched pair
  3. Flag pairs where event_id differs or is blank on one side, these count as 2 conversions instead of 1
  4. Recalculate true purchase count and the resulting real CPA
Sample output
order #4471: pixel event_id 'evt_a1'  | capi event_id 'evt_a1'   MATCHED, counts once
order #4472: pixel event_id 'evt_b2'  | capi event_id (blank)    NOT MATCHED, counts twice
order #4473: pixel event_id 'evt_c3'  | capi event_id 'evt_c9'   MISMATCHED, counts twice
...
Dashboard-reported purchases: 19   Actual deduplicated purchases: 15   Inflation: +26.7%

Healthy

Deduplicated purchase count matches order volume exactly; dashboard CPA and real CPA are the same number.

Unhealthy

Dashboard shows 19 purchases against 15 real orders because 4 CAPI events fired without the Pixel's event_id, so Meta's bid strategy is optimizing toward a CPA that's 27% too optimistic.

What this means

A missing or mismatched event_id isn't a tracking inconvenience, it directly corrupts the number Smart Bidding optimizes against, which means the algorithm will keep spending as if it's hitting a target CPA it's actually missing.

So what do I do about it?

SymptomActionEffort
CPA drops sharply right after a CAPI rollout with no other changeAudit event_id pairing before trusting the new lower CPA, don't just celebrate it30 min
DeveloperNeeds a developer/engineer to ship the fix.

Step 02 of 02

Reading Enhanced Conversions match-rate impact on Smart Bidding

The lesson cites Workshop Digital's case studies: 4 of 5 client accounts saw a lift in tracked conversion volume after enabling Enhanced Conversions, averaging 6-10% recovery, because hashed first-party data gives Google a second matching attempt when cookies fail.

After enabling Enhanced Conversions, weekly tracked conversions rose from 210 to 226 with no change in spend or creative. Is this a real recovery signal or noise?

Google Sheets— Compare a 4-week pre-launch average against a 4-week post-launch average for tracked conversions, holding spend constant.

Procedure

  1. Pull weekly tracked conversions for the 4 weeks before and after enabling Enhanced Conversions
  2. Confirm spend and campaign structure didn't change in the same window
  3. Calculate percent lift: (post-avg minus pre-avg) / pre-avg
  4. Compare the lift against the lesson's 6-10% benchmark range
Sample output
Pre-launch 4-week avg: 210 conversions/week
Post-launch 4-week avg: 226 conversions/week
Lift: +7.6%, within the 6-10% typical recovery range cited in the case studies

Healthy

A 6-10% lift with stable spend, consistent with previously-unmatched cookieless conversions now being recovered via hashed data.

Unhealthy

Treating any conversion increase as proof of a random creative or targeting change when spend and creative were both held constant.

What this means

A lift in this specific range, with everything else held constant, is the expected signature of Enhanced Conversions recovering matches Google previously missed, not a coincidence worth re-attributing to something else.

So what do I do about it?

SymptomActionEffort
Conversions rise right after enabling Enhanced ConversionsCheck the lift against the 6-10% benchmark before crediting an unrelated campaign change5 min
YouYou can do this yourself, no engineering access required.

Final deliverable

A deduplication audit spreadsheet showing true purchase count vs. dashboard-reported count, plus an Enhanced Conversions lift calculation with a verdict on whether it matches the expected benchmark range.

See a reference example
Sample output
Duolingo Plus, Meta Ads tracking audit (excerpt)

DEDUPLICATION CHECK
  Dashboard purchases (7 days): 142
  Deduplicated purchases: 131
  Inflation: +8.4%, 11 events missing matched event_id

ENHANCED CONVERSIONS LIFT
  Pre-launch avg: 580/week   Post-launch avg: 621/week
  Lift: +7.1%, within expected 6-10% recovery range

Success criteria

You're done when you can:

  • Correctly identifies every mismatched/missing event_id pair
  • Calculates a real deduplicated CPA distinct from the dashboard number
  • Correctly judges whether the Enhanced Conversions lift falls inside the benchmark range