St. Pierre · Concrete Leveling · Tracking

Facebook Lead Tracking — Audit + Rebuild SOW

Make the live account track every Facebook lead the way your visual atlas shows it working: every real conversation counted with the ad that caused it, every hand-off quality-checked and logged. Audited Jul 28, 2026.

1The short version

Your visual atlas (the screen recording of the old, working setup) shows lead tracking as three layers: count every real conversation the moment it starts, with the ad it came from; when the bot finishes qualifying someone, extract their details, quality-check them, and log the hand-off; and a form path for leads a human transfers by hand.

Today, only layer 1 is truly live. Layer 2 has never fired once — the workflow has no trigger wired. Layer 3 is a scaffold whose form may not exist. And one hidden setting may be double-reporting leads to Facebook, which corrupts how Facebook optimizes your ads.

You currently have delivery without bookkeeping. Leads reach you (that pipeline was rebuilt and proven end-to-end on Jul 28), but there is no reliable log of qualified conversations → transfers → which ad produced them — which is exactly the visibility the atlas had.

Nothing in this SOW touches ads, budgets, or live customer messages. It is tracking and logging only. Every change lands paused or is read back and verified before it counts as done.

2How the atlas says it should work

Layer 1 — Count every real conversation (atlas: "Qualified Convo Tracking")

First Messenger reply tag "fb lead" AI: real inquiry or junk? log row + ad fingerprint tag "qualified"
  • An AI step reads the first message and filters out spam, accidental clicks, and people selling to you.
  • Real inquiries get a tracking row: date, time, name, client, message, status, campaign.
  • The contact card saves the first message plus the full ad fingerprint — traffic source, campaign, medium, content, the Facebook click ID, and the exact ad ID.

Layer 2 — Track every automated hand-off (atlas: "Auto Transfer Tracking")

Bot: lead is ready sleep the bot extract phone · ZIP · city · project QC gate: client-facing? log · tag · notify
  • AI steps pull the lead's phone, location, ZIP, city, project type, and a short project description out of the conversation.
  • A quality-control gate checks for missing fields, placeholder text, and AI-sounding leaks before anything reaches a client.
  • Fails → needs-review alert + tag. Passes → transfer row logged, tagged "transferred", client notified, you notified.

Layer 3 — Track manual hand-offs (atlas: "Manual Transfer Tracking")

Human submits transfer form tag "transferred" tracking row deliver + notify
One honest caveat from the atlas itself: even in the recording, Layer 2 shows no trigger wired — today's gap was already on video in the original. The atlas gives us every step of the machine, but the "on switch" was missing when it was filmed. The rebuild has to pick the trigger deliberately (Decision 2).

3What is actually live today

Checked against the Jul-25 full-account map, re-verified against the live system on Jul 28 — nothing in the account changed in between.

Atlas layerLive workflowStatusWhat's wrong
Layer 1 — conversation counting "*1. Qualified Convo Tracking" LIVE Closest to spec — but still logs into the retired EyeFly-era spreadsheet, and the ad-fingerprint fields need a field-by-field readback against the atlas list.
Layer 2 — auto transfer tracking "*3 Auto Transfer Tracking" NEVER FIRED Published but no trigger wired — confirmed live Jul 28. Also unconfirmed whether the right bot is selected in its "sleep the bot" step.
Layer 3 — manual transfer "*4: Manual Transfer Tracking" SCAFFOLD Its trigger form may not exist in this account at all.
The delivery rail (context) "Qualified Tag → Lead Submitted Event" PROVEN JUL 28 Contains a native "report lead to Facebook" step whose on/off state is unknown. Our automation already reports each lead once — if this step is also on, every lead counts twice and Facebook optimizes toward the wrong signal. One click to check.
Ad-side fingerprinting Ad URLs PARTIAL The landing-page side carries tracking automatically, but ad URLs still need tracking parameters added explicitly per ad. Messenger ads pass the ad ID natively.

What changed since the map: the qualified-lead stamp feeding the delivery rail was cut Jul 25 and rebuilt Jul 28 (new trigger + the n8n sender), then proven with synthetic leads end-to-end. That rail is the delivery half — this SOW is the tracking half the atlas describes.

4Pixels + Conversions API datasets — what exists and who sends what

The EyeFly-era setup (what the atlas shows)

  • One shared web pixel for the whole client fleet — "EyeFly Client Data" 1302204368413290, stamped into every client's account settings. Deprecated April 2026 for messaging clients and kept only for diagnostics — Messenger leads never touch a web page, so a web pixel can't see them.
  • One messaging dataset per client, linked to their Facebook page — 37 clients carry one in the brain today. This is the thing Meta actually optimizes on for click-to-Messenger ads. Events are LeadSubmitted with the person identified by page ID + their Messenger ID (messaging datasets only accept LeadSubmitted and Purchase — not "Lead", not "QualifiedLead").
  • The atlas send path — the "Qualified Tag → Lead Submitted Event" workflow fires on the qualified tag and does two sends: a webhook to the n8n relay and GHL's built-in "Meta Conversion API" action (event "Lead", token + dataset pulled from the account's custom values). The built-in action used the deprecated shared pixel and unresolvable merge fields — which is exactly why the double-fire question in Phase 0 exists: the atlas itself shipped with both senders wired.
  • Why the n8n relay became the real sender — GHL's webhook can't resolve the Messenger ID field (ships blank, Meta rejects the event). When that silently broke in April 2026, cost per qualified conversation went from ~$58 to ~$428 in two weeks. The fix was a server-side relay: look the contact up properly, build the identity payload, post to the client's dataset with the fleet system-user token, log every fire to a ledger. Weekly health monitor + backfill + per-dataset test-fire tooling wrapped around it.
  • That EyeFly relay went quiet Jun 22 — 4,025 events logged lifetime, zero since. If any EyeFly client campaigns are still spending, Meta has been optimizing blind for them for five weeks (flagging, not asserting — needs one check against active client spend).

The St. Pierre setup (live right now)

DatasetWhat it's forSenderStatus
3727287274206232
Level King messaging dataset
Dan's click-to-Messenger ads (page 1308868515634109). "Lead" event fires when a lead hits qualified. n8n "Qualified Client Inquiry → Meta Lead (universal dataset)" — every 5 min from the brain's qualified-leads table, deduped in sp_capi_fired_events WORKING 27 live events Jul 21 → today 10:15 (kept firing through the transfer-rail outage)
959350118926295
St. Pierre web pixel
stpierre.ai B2B funnels — richer event set: Lead, Schedule, Purchase, ApplicationStart, VSL-watch n8n "SP CAPI Relay" — hourly IDLE + AT RISK Last event Jul 23 (B2B campaigns paused). It authenticates through Pipeboard, which is dead per canon — expect it to fail on relight until migrated to the vault Graph token.
New CL market pages
TX · ATX · HTX · SATX · (OKC…)
Each new market page needs its own page-linked messaging dataset before its ads can optimize on qualified leads Would ride the same universal sender once routed NOT CREATED Dataset creation is UI-only in Events Manager (the API path is permission-blocked) — one more Akash click-task per page
Net: for Dan's campaign, conversion tracking is genuinely live and healthy — the modern equivalent of the atlas setup, minus the double-send risk (Phase 0) and minus the bookkeeping layers (sections 2–3). The two real conversion-tracking to-dos beyond this SOW's phases: migrate the SP web-pixel relay off Pipeboard before any B2B relight, and mint a messaging dataset per new market page as the factory scales.

5The gaps, numbered

  • 1. Layer 2 has never run — no automated transfer has ever been logged with extracted, quality-checked data.
  • 2. Layer 1 logs into the retired EyeFly spreadsheet — the numbers land where nobody looks.
  • 3. The possible double-report to Facebook — one unknown toggle, the single highest-risk item.
  • 4. The manual-transfer form path is unverified and probably broken.
  • 5. Ad-fingerprint capture is unaudited field-by-field — this morning's real transfers had "unknown" city/ZIP on some rows.
  • 6. Sleep-the-bot steps may point at the wrong bot — which would keep it messaging people after transfer.

6The rebuild plan

0

The one dangerous toggle Akash · ~2 min · first

Open the "Qualified Tag → Lead Submitted Event" workflow → click the Meta Conversion API step → if it's enabled, disable it. The n8n sender stays the only thing reporting leads to Facebook. While in there, open the sleep-the-bot steps in "*3" and "*5" and confirm the selected agent is Jordan.

This is the only place where a wrong state is actively hurting ad optimization today. Everything else is missing visibility, not damage.
1

Rebuild Layer 1 to atlas spec Claude · same day

Read back "*1. Qualified Convo Tracking" field-by-field against the atlas list (first message, source, campaign, medium, content, click ID, ad URL, ad ID). Add any missing fields. Re-point the logging row from the EyeFly sheet to the St. Pierre tracking store (Decision 1). Verify with one synthetic first message: row appears, fields fill, tags land.

2

Resurrect Layer 2 the modern way Claude · approval-gated

Rebuild the atlas's Layer 2 semantics — sleep bot → extract → QC gate → needs-review vs transferred split → log + notify — inside the proven n8n transfer rail instead of the dead workflow ( recommended, Decision 2). Complete the extraction to the atlas field list, add the QC gate with its placeholder/AI-leak checks, route fails to a needs-review alert + tag, and write the transfer tracking row on passes. Then delete the dead "*3" workflow — it has never fired, so there is no history to lose. Prove it: dirty synthetic data lands in needs-review, clean data lands as a tracked transfer.

3

Manual transfer path Claude + Akash clicks · after 1–2

Recreate the internal transfer form (the atlas's transfer form, rebranded), and fold its submissions into the same rail as Phase 2 so manual and auto transfers land in one log ( one log, two doors — Decision 3). Any workflow-builder clicks come to you as a numbered click-path.

4

Ad-side fingerprint audit Claude · read-only · parallel

Sweep every live ad's URL for the explicit tracking parameters; list any ad missing them. The fix list comes back as an approval pack — no live-ad edits without your go, per the standing gate.

5

Prove it end-to-end Claude

One synthetic Messenger lead through the whole chain: conversation counted with ad fingerprint → qualified → extracted + QC'd → transfer logged → delivery SMS received. Screenshot pack of every log row and tag to you before this SOW closes.

7Who does what

OwnerWorkTime
AkashPhase 0 clicks (Facebook-reporting toggle + Jordan check) — the workflow builder can only be driven by a human~5 min
AkashThe decisions in section 7~2 min
ClaudePhases 1, 2, 4 builds + all readbacks and synthetic-lead proofssame day once unblocked
ClaudePhase 3 form + wiring (numbered click-path handed over for any builder steps)after 1–2

8Decisions needed

  • 1 · Where do tracking rows live? ★ The brain database with your dashboards on top — matches the standing "own pages + database" reporting doctrine. The atlas used Google Sheets; say "sheets too" and we mirror rows to a sheet as well for the atlas-identical view.
  • 2 · Layer 2 home? ★ Rebuild the atlas semantics inside the proven n8n rail and delete the dead workflow. Alternative: wire a trigger into the existing dead workflow and fix it in place — slower, and duplicates the rail that already works.
  • 3 · Manual path: ★ one log, two doors (form feeds the same rail) vs. an atlas-literal separate workflow.
  • 4 · Phase 0 result: report what the Facebook-reporting toggle showed so the account map can be marked resolved.

9Technical notes

IDs and sources
  • Location: St. Pierre Consulting 6c4MSgjdfngrPhwWD2cb
  • Workflows: *1 Qualified Convo Tracking 30b1b3e3 · *2 Full Convo Logging 62fb0271 · *3 Auto Transfer Tracking 210bddd6 (no trigger; delete candidate) · *4 Manual Transfer Tracking a9cc50e3 · *5 AI DQ 105d0996 · Qualified Tag → Lead Submitted Event 47e4e83e (contains the native Meta CAPI action)
  • Atlas sources: Build-Plans/ghl-atlas-text-extraction/wf04 · wf07 · wf08 · wf09 (+ wf06 for the manual form) · full-account map ghl-automation-map-2026-07-25.html
  • Attribution fields per atlas: First Message {{message.body}} · UTM Source/Campaign/Medium/Content {{contact.attributionSource.*}} · FBCID {{contact.attributionSource.fbclid}} · Video URL {{contact.attributionSource.url}} · Ad ID {{contact.lastAttributionSource.adId}}
  • Delivery rail (live): qualified tag → webhook → n8n bridge → sp_client_leads → enqueue trigger → n8n drain → GHL SMS · instant-send push added Jul 28
  • Meta lead events: the n8n relay is the ONLY authorized sender (Level King dataset 3727287274206232)
  • CAPI senders: n8n gp1NILFWhEfkUGx3 "Qualified Client Inquiry → Meta Lead" (5-min, dedup sp_capi_fired_events) · n8n rHCGWJnWv3oSGv3w "SP CAPI Relay" (hourly, pixel 959350118926295, Pipeboard-token — migrate) · EyeFly-era relay q9cyJuKnxBT7xeBM (ledger capi_fired_events, quiet since Jun-22) · legacy shared pixel 1302204368413290 (deprecated)
  • Standing rule: the GHL workflow-builder iframe cannot be driven by browser agents — all builder UI work is Akash-only with numbered click-paths