Library / Wire / Meta CAPI and the CRM must not be two truths about the same sale

WireHow to wire it

Meta CAPI and the CRM must not be two truths about the same saleIf Ads Manager 'purchases' and GoHighLevel Wons disagree, you will scale the wrong thing.

CAPI (and the pixel) report events to Meta. GHL reports opportunities. When they disagree, media teams optimize for a pixel and operators optimize for a board — two companies. Wire identity, which events you send, dedupe event_id, and a weekly match between Meta results and GHL Wons or qualified leads. This is not Events Manager click-path.

00

The short version

Intern through CEO

CAPI (and the pixel) report events to Meta. GHL reports opportunities. When they disagree, media teams optimize for a pixel and operators optimize for a board — two companies. Wire identity, which events you send, dedupe event_id, and a weekly match between Meta results and GHL Wons or qualified leads. This is not Events Manager click-path.

  1. 01

    Thank-you page views as Purchase is how you scale junk. The event should fire when money or a true qualified lead happened — the same definition as GHL.

  2. 02

    Double firing pixel + CAPI without event_id is inflated results. You will think ads work. The board will not.

  3. 03

    Send the identifiers you actually have. Empty CAPI with a pretty Events Manager score is still a lie if GHL never got the person.

  4. 04

    Lead ads already have a Meta object. Do not also fire a duplicate Lead from a thank-you if the Instant Form was the conversion.

  5. 05

    Value must be currency-true. Fake $1 purchases to 'help the algorithm' poison both Meta and your own reporting.

Who

Same system. Three jobs.

Read your row

Intern

What you actually do

Events Manager vs GHL. event_id test. Count match. You are not launching creative. You are aligning truths.

Operator

What you protect

CAPI is a writer to Meta. GHL is the operating truth. Same definitions. Own the gap. Kill thank-you purchases for freebies.

CEO

What you refuse to fund

If Ads Manager and the pipeline disagree, you will scale the lie. Weekly match is the number. Until it exists, ROAS is not a decision tool.

Wire

How to connect it

Objects, then edges

Meta Pixel, CAPI, event_id, email/phone hashing, GHL contact, Won or qualified event, browser vs server duplicate, value, currency, test events.

  1. 01

    Browser event and CAPI event share event_id so Meta dedupes — not two purchases

  2. 02

    Email/phone from the form/checkout match what GHL has, so match quality is not a mystery

  3. 03

    Lead vs Purchase events correspond to GHL stages you would defend, not to thank-you page views

  4. 04

    Weekly: Meta Purchase/Lead count vs GHL Wons/qualified — named gap, not a shrug

Steps

Do this in order

Why, then done when
  1. 01

    Define the Meta event as a GHL job

    Purchase = Won/paid. Lead = form write-in you would call a lead (not a magnet if you do not want Meta optimizing for magnets). Write it.

    Why: If Meta optimizes for magnets and you sell calls, you will get cheap magnets.

    Done when: One sentence: event X means GHL stage Y.

  2. 02

    Implement deduped CAPI

    event_id on browser and server. Test in Events Manager: duplicates collapsing. GHL or the site generates the id and both sides send it.

    Why: Without dedupe you will 'improve' ROAS that is double-counted.

    Done when: A test convert shows one event after dedupe, not two.

  3. 03

    Match identifiers to CRM

    The email/phone on the event is the email/phone on the GHL contact. Advanced matching not at war with the form.

    Why: Hashed identifiers Meta cannot match, plus a CRM that has the person, is still two truths.

    Done when: Test lead: GHL contact exists and Meta received the same identity keys.

  4. 04

    Stop junk events

    Remove Purchase on thank-you for free magnets. Remove duplicate Lead on Instant Form + page. Value is real or omitted.

    Why: Junk events are how spend scales the wrong door.

    Done when: Event inventory: each live event maps to a real job.

  5. 05

    Weekly match Meta vs GHL

    Same window, same definition. Gap list: ingest lag, blocked cookies, Instant Forms not in GHL, fake events. Own the gap.

    Why: Unowned gaps become 'the pixel is broken' vs 'GHL is broken' forever.

    Done when: A Monday row: Meta count, GHL count, gap reason.

What an intern should wire first

Write event = GHL job. Fire a test with event_id. Confirm dedupe. Confirm GHL contact. List live events in Events Manager and kill junk. Pull last week Meta vs GHL counts. The gap is the ticket. Do not 'optimize creative' over a definition mismatch.

What a CEO should refuse to fund

More Meta spend, a new CAPI vendor, or an agency 'full funnel' until Purchase/Lead means the same thing as GHL and weekly match exists. Spend into two truths is how ROAS becomes a religion.

The usual failure

Pixel on thank-you for everything. CAPI added later without event_id. Instant Form leads missing in GHL. Ads 'profitable'. Pipeline empty. Agency and operator in a fight. That is two dashboards, zero system.

The test that proves it

Dedupe works. Event definition matches GHL. Identity keys shared. Junk events gone. Monday match with a named gap.

Why

Questions people actually ask

Pushback is normal

Should we just trust Meta’s numbers? They have CAPI now.

Trust the board you operate. CAPI is a signal to buy ads. If it diverges from Wons, you will buy ads for a story.

What about iOS and privacy? Is this hopeless?

Hopelessness is an excuse to skip event_id and CRM match. You will not get perfection. You can get a known gap.

Can the agency own CAPI while we own GHL?

Then you must still share definitions and the weekly match. Agency-owned events with a private GHL is two truths by design.

This week

This week: event definition, event_id dedupe, junk off, identity match, one weekly Meta vs GHL row. No new ad sets until definitions agree.

Continue

Other connections

Same job: write-in
Wire

Calendly only counts when GoHighLevel sees the booking

A full calendar and an empty pipeline is two databases.

Read ↗
Wire

ScoreApp is a door. GoHighLevel is the follow-up.

A high score in a CSV is not a qualified opportunity.

Read ↗
Wire

A form is a writer, not a lead vault

If the thank-you does not change the contact, the page was a brochure.

Read ↗
Wire

Stripe is how Won becomes a fact

If paid lives in Stripe and the opportunity is still open, reporting is theatre.

Read ↗

Working notes

GHL Engine Checklist

The minimum CRM, pipeline, and nurture spec before you add more pages. Request the file. It arrives by email — not a public dump, not a drip of slogans.

Request the notes ↗
Next

If the leak is expensive, talk.

Email and WhatsApp stay open. A call is for installing the system — not for a tour of tools.