← Works

The attribution report

Twenty-seven reservations, eight sources, one at a time — until the dashboard’s version of the story fell apart.

49 days · 2026R$9,171 spend → R$75,929 attributed8.28× blended · documented floor

I.The brief

A boutique hotel, running paid media on Google and Meta, wanted the question every owner eventually asks and almost never gets answered: what did the money do. Not impressions. Not reach. Reservations, in the bank, with a name attached to a channel.

The platforms each had an answer, and the answers did not agree with each other or with the CRM. So I stopped asking the platforms and started asking the reservations.

II.The method

Forty-nine days. Twenty-seven reservations closed in the CRM inside that window. Each one crossed, individually, against eight independent sources:

01
The Meta ads manager — 36 campaigns, cost per campaign, ad set and ad.
02
Google Ads — 16 campaigns, 131k impressions, 8,740 clicks.
03
GA4 — sessions, audiences, identified purchasers.
04
The property management system — the hotel’s own booking engine, used as corroboration, never as the authority on origin.
05
99 lead-form entries, matched phone number by phone number against the 27 closed reservations.
06
Thirty-odd WhatsApp conversations, exported and read from the first message down.
07
The trigger-phrase map: every channel sends the guest into WhatsApp with a different pre-filled opening line, so the first sentence a guest types names the campaign that produced them.
08
The OTA — the reservations that arrived already booked.

Nothing here is modelled and nothing is inferred from a platform’s own conversion window. Every real attributed to paid media has a document behind it.

III.The ledger

ChannelSpendRevenueROASReservations
Google Ads — PMax + SearchR$2,250R$48,57421.6×6
Meta — profile-visit campaignsR$1,854R$23,93712.9×4
Meta — lead formR$1,157R$3,4182.95×1
Meta — remaining campaignsR$3,910indirect
Total paid mediaR$9,171R$75,9298.28×11

average cost per confirmed reservation · R$834

Two channels carry the operation: Google Ads at 21.6× and the Meta profile-visit campaigns at 12.9× produce R$72,511 between them — 95.5% of everything paid media can be shown to have generated. The blended figure is 8.28×.

IV.The reservation that broke last-click

One booking made the whole exercise worth the days it took. Reading it in order:

  1. day 0 · 13:20The guest fills in a Meta lead form, served on Instagram, from a qualification campaign. Cost to Meta of producing that lead: about R$10.
  2. day +4The same guest books the hotel through an OTA. The OTA notification arrives at the property carrying no link whatsoever to the form entry from four days earlier.
  3. day +4 · 09:15The reservations desk opens WhatsApp and greets them as an OTA booking, because that is genuinely all anyone can see.
  4. day +6Reservation confirmed, R$3,418. Origin recorded in the CRM: the OTA.

Under last-click, the lead-form campaign converted zero reservations and was a candidate for being switched off. It had in fact produced a confirmed booking at a cost of roughly ten reais, and handed the credit to a channel that charges commission for receiving it.

That is one case I could prove because the phone number appeared in two systems on two different days. The same pattern is statistically certain to sit inside the six reservations the OTA was credited with, and inside the R$46,274 of revenue in the window where nobody filled in the origin field at all — an average ticket of R$6,610, which is the profile of high-intent paid traffic, not of walk-ins.

V.The sale nobody had a line item for

One reservation in the window, R$2,721, came from an AI assistant. The guest’s partner asked ChatGPT for pet-friendly hotels near a major city, the property came back inside the answer, and they booked direct. No campaign, no spend, no optimisation, no schema markup — the property was simply legible enough to be repeated.

I put it in the report as a documented channel rather than an anecdote, because it is the first time I have been able to point at a line in a CRM and say: this is what being cited instead of ranked looks like, and it is worth R$2,721 a go.

VI.The conclusion

8.28× is not the result. It is the floor — the number that survives after you throw away everything you cannot document.

The dashboard undercounts, and it undercounts in one direction. Every missing origin field, every cross-channel journey, every sale closed over WhatsApp by bank transfer instead of through the website is revenue that paid media produced and that last-click gives to somebody else. Nothing in this report inflates the number; the entire method is designed to be able to defend the smallest honest version of it.

Which is also the argument for building the tooling in the first place. The fix here was never more budget — it was a mandatory origin field, a second WhatsApp line connected to the CRM, server-side conversions going back to the platforms, and UTMs on the autoresponders. Measurement problems look like media problems right up until someone counts by hand.

Anonymised on purpose. The client is a boutique hotel and stays that way — no property name, no guest names, no lead identifiers, no CRM or PMS product names. The currency is Brazilian reais and the window is 49 consecutive days in 2026. Every figure above comes from the original report, which was written for the client and is not published.