Overview
The platform already captures paid traffic: click-to-WhatsApp ads (CTWA) and lead-form leads (leadgen) arrive attributed to their source campaign. Conversion tracking is the other side of that loop: it sends back to Meta the events that happen afterwards β a captured lead, a first contact, a closed sale β through the Conversions API (CAPI).
With it, Meta can optimize campaigns on real outcomes (not just the click), and you measure cost per conversion and return on ad spend with real data.
Key points:
- Configuration is per inbox (each WhatsApp/ads inbox has its own destination).
- Events are deduplicated by a deterministic identifier β the same sale is never counted twice.
- The token never appears in the UI (only its presence and the last 4 characters).
- The active provider today is the Meta Conversions API; Google Ads and TikTok exist as prepared scaffolding but do not send events yet.
Capture (CTWA/leadgen) and conversion are distinct modules. This article covers only sending events back to Meta. For capture and attribution, see the Ads/CTWA/leadgen article.
Prerequisites
- Opt-in module: your account needs the
ads_conversion_trackingflag enabled. It is different from the capture flag (growth_ads) β you can have capture without conversion sending. - Administrator permission (all configuration and manual triggering are admin-only).
- A WhatsApp Cloud inbox with the WhatsApp Business Account (WABA) and a Meta token with Conversions API permission. WhatsApp Web, 360dialog or Twilio inboxes have no WABA β in those cases the Dataset ID and token are entered manually.
- Dark-ship: when created, the configuration starts off (
enabled= false). Nothing is sent until you flip the switch β by design, so you validate first.
Step by step
- Open the Inbox Settings for the inbox you want and go to the Conversions tab.
- Token: check use the channel token to reuse the inbox's own credentials (WhatsApp Cloud already provides the WABA and a usable token). On channels without a WABA, paste the Meta token.
- Dataset ID: click discover automatically β the platform looks the dataset up from the WABA on the Graph API and fills the Dataset ID for you. On channels without a WABA, enter it manually.
- Test code: enter the test event code (find it in Meta Events Manager, under Test Events).
- Run a test event: the platform fires synthetic LeadSubmitted and Purchase events straight to Meta with the test code. Confirm they show up under Test Events in Events Manager.
- Only after the test passes, flip the switch (
enabled). From then on, lifecycle events start being sent for real.
The test event bypasses the master switch and the triggers (it exists precisely to validate the wiring before going live). It requires a test event code and valid Meta credentials.
Settings & options
Lifecycle triggers (each one turns an event on/off):
| Option | Event sent | Default |
|---|---|---|
lead_on_capture |
LeadSubmitted when the lead is captured |
On |
contact_on_first_message |
ViewContent on the contact's first message |
Off |
purchase_on_won |
Purchase when the deal is won in the CRM |
On |
purchase_on_payment |
Purchase when a payment is confirmed |
On |
custom_on_lost |
one supported event selected in lost_event_name |
Off / no event |
- Events Meta accepts for business messaging:
LeadSubmitted,QualifiedLead,ViewContent,AddToCart,InitiateCheckoutandPurchase. Meta rejects website-CAPI names (Lead,Contact,Schedule) and custom events such asLead_Lostin this flow. - CRM stage β event map (
stage_event_map): map a pipeline stage to one of those six supported events to report intermediate milestones beyond won/lost. - Advanced matching: improves matching by sending extra user signals (always hashed β no raw personal data ever leaves the platform).
- API version (
meta_api_version, defaultv25.0) and partner agent (meta_partner_agent, defaultConversa Labs): identify your calls to Meta. - Write-only token: the token is stored and masked β the UI shows only that it exists and the last 4 characters. Saving with the field blank keeps the stored token; there is an explicit action to clear the token when needed.
Ledger & manual triggering
Every send attempt becomes a row in the conversion ledger, with the delivery state:
pending(processing),sent(delivered to Meta),failed(failed) orskipped(ignored).- The ledger stores only the hashed / non-PII body that was sent, plus Meta's reply for debugging.
- Each lead has its own ledger β open the lead to see every event sent for it.
Manual triggering (admin): from a lead, you can force an event β for example, record a
Purchase for a lead that converted outside the CRM. Manual triggering:
- uses a deterministic per-(event, lead) identifier, so re-clicking the same event deduplicates (no double count) but retries if the previous attempt failed;
- accepts only the six business-messaging events listed above; legacy
LeadandContactvalues sent to the API are normalized toLeadSubmittedandViewContent; - requires conversions to be enabled on the lead's inbox.
Reports
The Ads report includes the conversion delivery metrics, side by side with attribution:
- Sent (
sent), failed (failed) and skipped (skipped). - Value delivered to Meta β the sum of the value of delivered events (handy to check what was actually returned as revenue).
skipped events are expected when a deal has no ad attribution: the platform records the event as
skipped (visible in the leads center) instead of sending something with no source.
Providers
- Meta Conversions API β active provider (v1). Sends business-messaging (WhatsApp) events to your WABA's dataset, auto-discovering the Dataset ID when it isn't provided.
- Google Ads and TikTok β exist as prepared scaffolding in
provider_settingsbut do not send events in this version. They stay off by default.
Use cases
- Optimize WhatsApp campaigns on the captured lead and the closed sale, not just the click.
- Return the sale value to Meta to compute ROAS per campaign.
- Manually record a
Purchasefor a customer who bought through a channel outside the CRM. - Report intermediate funnel milestones by mapping CRM stages to Meta events.
Tips, limits & best practices
- Always test first: run the test event and confirm it in Events Manager before flipping the switch.
- Idempotency: rely on the deterministic deduplication β won and payment for the same deal collapse
into a single delivered
Purchase. - No attribution = skipped: if you see many
skipped, check that conversations/leads are really arriving with the ad reference (a healthy CTWA/leadgen capture). - Token security: never share the token; it is stored encrypted and never displayed.
- Sending never breaks the flow: a delivery failure is recorded in the ledger, it does not interrupt the conversation or the CRM.
Troubleshooting
conversions_not_enabled: theads_conversion_trackingflag is off for the account, or the inbox switch is off. Enable the flag and turn on the inbox configuration.- Dataset not found (
no_conversions_dataset): click Detect or create again. The operation is idempotent: it returns the existing dataset or provisions one for the WABA. If it persists, enter the Dataset ID manually and check the Graph API version. - Invalid event (
invalid_conversion_event): choose one of the six supported business-messaging events. Website events and custom names are not accepted by Meta in this flow. no_permission: the token lacks scope/validity for the Conversions API. Generate a token with the right permission and redo the configuration.- The test event doesn't appear in Events Manager: confirm the correct test event code and that the token and WABA belong to the same ad account; check under Test Events.
- Events coming out as
skipped: the deal has no ad attribution β review the capture (CTWA/leadgen) before sending.