Black Friday series
Black Friday client report: what to include
Key takeaways
- Period sales and cohort sales are different numbers; the report shows both and says which is which.
- "Unattributed" is a line in the report, not a gap: a sale with no known source is not distributed among campaigns.
- CPL, CPA and ROAS are calculated only on attributed leads and sales; the correct denominator is the source's spend, not total spend.
- Different currencies go in different tables; adding R$ to US$ or to Hotmart in another currency invents revenue.
- Attribution does not prove incrementality; the report describes what was observed and states what could not be measured.
What does the Black Friday report need to answer?
Three questions, in this order: how much was spent and on what; how much was sold and where it came from; what to do based on that. Anyone selling through WhatsApp does not decide by impressions or "conversations started"; they decide by confirmed sales and cost per sale.
Before calculating any indicator, reconcile the base: paid orders, amounts, cancellations and currency. Separate confirmed sales from proposals sent and from pending payments. According to Confi Neotrust (2025), Black Friday had more orders and a lower average ticket; counting links sent as sales overstates the result precisely when the ticket drops.
State the period with two dates: the click date (when the lead arrived) and the sale date (when the money came in). The difference between the two is what separates cohort from period.
Cohort or period: which number to show?
Both, in separate lines, with an explicit label. A cohort is the set of leads that arrived in an interval (for example, November 20 to 30), tracked until they buy or not, even if the purchase happens in December. A period is the set of sales that happened in an interval, regardless of when the lead arrived.
| Client's question | Right number | Common mistake |
|---|---|---|
| "How much did the Black Friday campaign generate?" | Sales from the cohort of leads captured by the campaign | Counting period sales, which include October leads |
| "How much did we sell on Black Friday?" | Period sales | Attributing all of them to the campaign |
| "What is the cost per sale?" | Source spend ÷ attributed sales from the cohort | Total spend ÷ period sales |
Decision rule: if the sale happened in the period but the lead arrived before the campaign, it goes under "period sales, earlier lead", never under the campaign. How tracking needs to be set up for this to work is in tracking from the ad to WhatsApp.
"Unattributed" is a category, not an error
Every sale whose source was not identified goes in the "unattributed" line, with the total amount and the number of orders. The report neither distributes those sales among campaigns nor deletes them.
The source goes missing for known reasons: the customer wrote directly to the saved number, clicked a link without parameters, came from a referral, or the ad click happened on WhatsApp Web, where Meta does not pass the ad data the same way it does in the apps. A CRM with attribution that does not invent sources, such as RASTRO, shows that line as it is; the media buyer's job is to explain the proportion and the plan to reduce it.
Coverage metric: sales with a known source ÷ total sales. Above 80%, the per-campaign report is reliable; between 60% and 80% it works as a trend; below 60% it should not drive budget cuts, and the first decision becomes fixing the tracking.
CPL, CPA and ROAS: attributed only
Each indicator uses the source's spend in the numerator and the result attributed to that source in the denominator. Mixing total spend with attributed results, or source spend with total results, produces numbers that look better or worse for no reason.
| Indicator | Formula | Reading |
|---|---|---|
| CPL (cost per lead) | Source spend ÷ conversations attributed to the source | Compare with the account's own previous November; in November the auction gets more competitive |
| CPA (cost per sale) | Source spend ÷ confirmed attributed sales | Compare with the product's unit margin, not with another client's CPA |
| Attributed ROAS | Confirmed attributed revenue ÷ source spend | Above 1 ÷ margin is profit on media; below, a loss |
| Coverage | Sales with a source ÷ total sales | Defines how much to trust the three above |
"Confirmed revenue" is the amount paid, net of cancellations known up to the report date. Later refunds come in as an adjustment in the next delivery, they do not disappear. How the value of each sale reaches the report depends on the CRM record and, for Meta, on sending through the Conversions API with event_id deduplication; validating that is covered in CAPI: checklist before scaling.
Hypothetical example: from spend to attributed ROAS, step by step
A hypothetical example, with made-up numbers. Supplement store, campaign from November 20 to 30.
- Spend: R$ 20,000 on the Click-to-WhatsApp campaign.
- Conversations attributed to the campaign: 800. CPL = 20,000 ÷ 800 = R$ 25.
- Period sales (Nov 20 to Nov 30): 60 orders, R$ 72,000.
- Breakdown: 42 sales came from leads in the campaign cohort (R$ 50,400); 10 came from leads before Nov 20 (R$ 12,000); 8 have no known source (R$ 9,600).
- Coverage: (42 + 10) ÷ 60 = 87%. Per-campaign report is reliable.
- Attributed CPA: 20,000 ÷ 42 = R$ 476 per sale.
- Attributed ROAS: 50,400 ÷ 20,000 = 2.52.
- Reading with margin: if the contribution margin is 45%, the ROAS break-even point is 1 ÷ 0.45 = 2.22. At 2.52, the media produced a profit of (50,400 × 0.45) − 20,000 = R$ 2,680.
- What stays out: the 8 unattributed sales (R$ 9,600) stay on their own line. Added to the campaign, the ROAS would "rise" to 3.0 with no evidence.
The sentence that goes to the client: "The campaign generated 42 attributed sales and R$ 50,400 through Nov 30, with a ROAS of 2.52 on R$ 20,000 of spend; 8 sales in the period have no identified source and 180 leads are still being followed up." It is the same vocabulary as the dashboard the business owner should look at.
Separate currencies and stated limitations
Revenue in Brazilian reais, revenue in dollars and revenue in another currency go in separate tables, each with its own ROAS, or converted with the rate and date stated in the footer. Adding without converting invents money; converting without stating the rate stops the client from checking.
Every delivery has a "Limitations" block, in plain text, with at least these items when they apply:
- Attribution coverage and the known reasons for the unattributed share.
- Sales pending confirmation and cancellations not yet processed.
- Changes made during the period (script, offer, budget), with dates.
- Data the channel does not provide: Meta does not deliver ad data for clicks made outside the WhatsApp apps.
- What the report does not prove: attribution shows where the sale came from, not how much of it would not have happened without the ad.
When a number does not exist, write "not available" and the plan to have it in the next delivery. That is better than a zero the client reads as "didn't sell."
How to structure the delivery and the three decisions
One summary page, four blocks and three decisions. The client reads the summary; the media buyer backs it up with the blocks.
| Block | Content | Data owner |
|---|---|---|
| Acquisition | Spend, attributed conversations, CPL by campaign/ad set/ad | Media buyer |
| Customer service | Median and p90 first response, queue, unanswered conversations | Operations, with the CRM report |
| Sales | Period and cohort, attributed, earlier lead, unattributed, cancellations | Operations and finance |
| Result | CPA, attributed ROAS, margin, coverage, limitations | Media buyer |
Each decision follows the format "what, why, who, by when, how we will know it worked." Example: "Reduce ad set X by 30% because its CPA was R$ 900 versus the R$ 476 average; media buyer; by Dec 5; CPA below R$ 600 within 7 days." The customer service indicators that feed block 2 are in WhatsApp SLA and queue, and the general format for proving results to the client follows the same structure.
Common mistakes in the Black Friday report
- Adding period sales as if they were from the campaign. It inflates the ROAS with October leads and the client scales a campaign that did not deliver that.
- Prorating "unattributed" among campaigns. It creates false precision and hides the tracking problem.
- Using gross revenue as profit. A ROAS of 2 with a 30% margin is a loss; show the break-even point.
Frequently asked questions
Sources
- Confi Neotrust, Black Friday 2025 report
- Meta, Conversions API (event_id deduplication)
- Meta, WhatsApp Business Platform pricing documentation (2025)
How do I prove the campaign caused the sales?
Attribution does not prove causation; it shows where the sale came from. Estimating incrementality requires a comparison design, such as a group not exposed to the ad, rarely feasible on Black Friday. Without it, the report describes observed results and states that limit in writing.
What do I do with sales that happened after the campaign ended?
If the lead arrived during the campaign, the sale belongs to the cohort and goes into the next delivery, with the sale date recorded. Keep the cohort open for 30 to 60 days, depending on the buying cycle, and show the evolution week by week.
Should I show Meta's ROAS or the CRM's?
Both, in separate lines, with an explanation of the difference. Meta's ROAS depends on what was sent through the Conversions API and on the platform's attribution window; the CRM's uses confirmed sales per lead. A large divergence indicates a sending or recording problem.
How do I report when half the sales have no source?
With the "unattributed" line highlighted, the coverage calculated and the first decision being to fix the tracking. Per-campaign indicators with coverage below 60% should not drive budget cuts; present them as a trend and state the limitation.


