Black Friday series

Black Friday Tracking: From the Ad to WhatsApp

Key takeaways

  • The click on a click-to-WhatsApp ad carries the ctwa_clid and the ad id; bio links, website and referrals do not, unless they carry their own parameters.
  • Attribution coverage = sales with origin ÷ total sales; below 70% (hypothetical reference) the per-ad report cannot support a budget decision.
  • "Unattributed" is a report category, not a mistake to hide; automatic splitting across campaigns is made-up data.
  • The sale must be recorded with value, currency and date on the same lead that carried the origin; different currencies are never added up.
  • Test every entry path before the event and check what actually reaches the CRM; tracking is validated by testing, not by configuration.

What is tracking from the ad to WhatsApp, and why does Black Friday break it?

Tracking from the ad to WhatsApp is the process of linking each conversation to the creative that generated it and each sale to the conversation that produced it. Black Friday breaks that process because it multiplies entry paths and volume at the same time: the customer clicks the ad, comes back through the bio, then writes to the saved number, and the team records the sale on any of the three. Definitions:

  • ctwa_clid: the click identifier of a click-to-WhatsApp ad; it arrives with the first message and links the conversation to the ad id.
  • utm parameters: fields added to a trackable link (utm_source, utm_medium, utm_campaign, utm_content) that identify the path when there is no ad click.
  • Attribution window: the period, counted from the click, within which Meta accepts crediting a conversion to the ad. A sale outside the window does not show up in Meta's report, even with an origin in the CRM.

Meta optimizes a messaging campaign for conversations started. If the sale does not come back with its origin, the algorithm never learns who buys, and you decide budget on CPL. The article on creatives judged by sales shows what you lose.

Which entry paths carry an origin, and which do not?

Only the click on a click-to-WhatsApp ad carries the ad identifier by default. The other paths carry an origin only if you put parameters in the link, and some carry nothing.

Entry pathWhat arrivesOrigin availableWhat to do before Black Friday
Click-to-WhatsApp ad (Android/iOS app)ctwa_clid + ad idYes, per adTest one click per ad and check in the CRM
Ad with the Page buttonEntry point identifierPartialValidate what the channel delivers; do not assume an ad id
Trackable link (bio, website, QR, email)utm parameters you definedYes, per path, not per adStandardize utm_source/medium/campaign/content
Saved number, referral, searchNothingNoRecord as "unattributed"
Old lead from an ad returning via the saved numberNothing on the new conversationDepends on the CRM recognizing the phone numberEnsure the same record, not a duplicate

Decision rules:

  • If more than 30% (hypothetical) of conversations arrive with no identifier, the priority is not creative: it is putting trackable links in the bio, on the website and on the QR code before raising the budget.
  • If the same phone number shows up in two records (one with origin, one without), merge them before recording the sale; the sale belongs to the lead that carried the origin.
  • Never put a phone number, email or any personal data in link parameters; utm is public and ends up in logs.

According to Opinion Box (2025), 82% of Brazilians already communicate with brands through WhatsApp. Part of those conversations arrive via the saved number, with no origin; the mistake is pretending that does not exist.

How do you record the sale so the origin is not lost?

Record the sale on the same lead that carried the origin, with value, currency, date and order identifier, and let the CRM send Purchase to Meta through the Conversions API with an event_id for deduplication. Checklist:

  1. Right lead: the sale goes into the record that has the ctwa_clid or the utm, not into a new lead created by the agent.
  2. Value and currency: R$ 240.00 BRL, not "240". A client who also sells in dollars needs two reports; currencies are not added up.
  3. Sale date: the date of the confirmed payment, not of sending the link. That defines whether the sale falls inside or outside the attribution window.
  4. Stable event_id: the same order resent after a network failure needs the same event_id; a new order needs a different one. Meta uses the event_id to deduplicate when the same event arrives via pixel and server.
  5. Cancellation: a sale cancelled or returned under the cooling-off right (article 49 of the CDC, Brazil's Consumer Protection Code: 7 days for purchases made outside the store, including WhatsApp) is flagged in the CRM so it does not inflate ROAS.

A CRM with attribution, such as RASTRO, records the sale value on the lead, sends Purchase with value and currency through the Conversions API with duplicate control, and leaves the sale without origin in its own category instead of inventing one. The technical checklist for the send is in CAPI: checklist before scaling.

How do you calculate attribution coverage, and what does it change in the report?

Attribution coverage = sales with proven origin ÷ total sales. It defines how much the per-ad report can explain, and it needs to appear on every page that shows CPA or ROAS per creative.

Hypothetical example, step by step:

  1. Total Black Week sales: 100, revenue R$ 24,000 (all in BRL).
  2. Sales with an ad id or utm on the lead: 70, revenue R$ 16,800.
  3. Coverage: 70 ÷ 100 = 70%.
  4. Meta Ads spend: R$ 6,000.
  5. Attributed ROAS: 16,800 ÷ 6,000 = 2.8. ROAS on total revenue: 24,000 ÷ 6,000 = 4.0.
  6. Correct report: "Attributed ROAS 2.8 with 70% coverage; 30 sales (R$ 7,200) unattributed". Wrong report: "ROAS 4.0".

The 4.0 ROAS credits the ad with 30 sales that may have come from referrals or another channel. With 45% coverage, the per-creative budget decision stops being reliable and becomes "fix tracking". If coverage drops more than 15 points (hypothetical) between validation and Black Week, something changed in the entry path (broken link, new number, lead created by hand). Investigate before reading any CPA.

How do you test tracking before raising the budget?

Test every entry path with a real click, from a phone, and check what reached the CRM. Configuration does not replace testing: the channel may not deliver the identifier in every scenario. Script (one week before):

  1. Click every active ad from the WhatsApp app on Android and on iOS, send a message and check that the lead showed up with the right ad id.
  2. Open every trackable link (bio, website, QR) and check that the utm parameters arrived intact.
  3. Send a message via the saved number and check that the lead came in as "unattributed", and not with the origin of some earlier lead.
  4. Record a test sale on the lead and check value, currency, date and the Purchase event sent. Flag and delete the test sale afterwards.
  5. Repeat the test every time the number, the ad or the landing page changes.

Common mistake: testing only from a desktop browser. The free 72-hour entry point applies to clicks made in the Android and iOS WhatsApp apps, according to Meta's WhatsApp Business Platform pricing documentation (2025); the desktop test does not represent the real customer.

Second mistake: the agent creating the lead manually. A manual record is born without an origin; if the lead already existed with a ctwa_clid, the sale goes to the wrong record and becomes "unattributed" through carelessness.

What should you measure during Black Friday to know whether tracking holds up?

Measure lead coverage, sales coverage, duplicates and time to record. Each metric has a formula and a range:

  • Lead coverage = leads with origin ÷ total leads. Good: stable compared with the validation week. Bad: a drop of more than 15 points (hypothetical).
  • Sales coverage = sales with origin ÷ total sales. Good: ≥ 70%. Bad: < 50%.
  • Duplicate rate = leads with the same phone number ÷ total leads. Good: close to zero. Bad: above 5% (hypothetical), a sign of manual creation.
  • Time to record = median between confirmed payment and the sale recorded in the CRM. Good: same day. Bad: days later, which pushes the sale outside the attribution window and distorts the cohort reading.

Separate observed attribution (the sale has origin X) from incremental effect (the sale would not have happened without the ad). Tracking proves the first; the second requires an incrementality test and should not be promised. The report that presents that difference is in a report that helps the client decide.

Action plan: what to do this week

Follow this order to validate tracking before raising the budget.

WhenActionOwnerDone when
TodayList the entry paths and create a trackable link with utm for the bio, website, and QRMedia buyerLinks with standardized utm and no personal data
By FridayAgree that no lead is created by hand; the sale goes on the lead with the originCRM owner and customer serviceDuplicate rate by phone number close to zero
D-7Click each active ad from the app (Android and iOS), open each trackable link, and record a test saleMedia buyer and CRM ownerTest leads with ad id or utm, saved number as "unattributed", and test Purchase with value and currency; test sale deleted
D-3Calculate sales coverage for the validation weekMedia buyerCoverage ≥ 70% (hypothetical reference) before releasing the budget
Event dayRecord each sale on the day payment is confirmedCustomer serviceMedian time from payment to record within the same day
D+3Compare lead coverage with the validation weekMedia buyerDrop under 15 points (hypothetical) or cause investigated

Frequently asked questions

Sources

Should a sale without origin be dropped from the report?

No. It stays in the commercial result and in total revenue; it just cannot be attributed to an ad without evidence. Show unattributed sales as their own line, with value, and explain to the client which entry paths carry no identifier.

What is ctwa_clid?

It is the click identifier Meta attaches to the conversation when the lead taps a click-to-WhatsApp ad in the Android or iOS WhatsApp apps. It arrives with the first message and makes it possible to link the conversation to the ad id, the ad set and the campaign. Without it, the conversation has no ad origin.

Do utm parameters replace the ctwa_clid?

No. The utm identifies the path (bio, website, QR) and the campaign you named in the link; the ctwa_clid identifies the exact ad that received the click. Use utm on paths without an ad and preserve the ctwa_clid on ad clicks. Both live together in the same CRM.

Why does Meta's report show fewer sales than the CRM?

Because Meta only counts what it received through the Conversions API within the attribution window and with enough matching. The CRM records every sale with origin, on any date. The difference is expected; the report needs to explain window and coverage, not pick the bigger number.