Direct answer: give each person 1 visitor code that travels from the ad click to the WhatsApp chat to the invoice. Then send Meta only buying signals, and send Purchase only when money arrives. This way, Meta and your AI models learn from real buyers, not from people who only open a chat.

Main condition: this method fits a business that sells through click-to-WhatsAppCTWAA Click-to-WhatsApp ad. It sends people from Facebook or Instagram straight into your WhatsApp conversation.How to track CTWA ads ads (CTWA) or a landing pageLanding pageThe page an ad points to. It carries 1 offer and 1 action, with no menu pulling the visitor elsewhere.What is a landing page?. The buyer then pays by bank transfer or invoice. Limit: attributionAttributionHow a system decides which ad or channel receives the credit for 1 sale.High clicks, low sales: the tracking gap connects data, but it does not promise a lower cost per buyer. The ad, the price, and the chat replies still decide the result.

Rama Aditya wrote this article from the Rama Digital Meta Ads audits of 23 to 26 September 2026. Other sources: our visitor code flow document and the official Meta Conversions APICAPIA server path that sends conversion data from your system to the ad platform, without depending on the buyer browser.What is the Conversions API (CAPI)? documentation. All numbers are totals, with no customer names or numbers. Data updated 3 October 2026.

The problem: the ad, the chat, and the transfer live in 3 places

Meta records clicks and chats. WhatsApp keeps the conversation. The bank account or the invoice system keeps the payment. Without 1 shared key, nobody knows which ad made the transfer.

We saw the result on 23 September 2026. Our BOFU campaign spent Rp 387,321 in 5 days, and Meta recorded 0 Purchase. On the same day, our own data recorded 6 paid class invoices: 2 from CTWA ads and 4 from WhatsApp links or broadcasts.

So the Meta numbers and the cash numbers did not meet. If you set budgets from the Meta report only, you stop ads that bring money. For the basics, read the AI marketing consultant guide and the CTWA ad tracking guide.

How it works: 1 code, 2 axes, 1 lane to Meta

The attribution system we use has 3 parts. Each part answers 1 question. The image below shows the same code at each point.

One teal thread connects the ad, the WhatsApp chat, and the transfer, with the same amber tag at each point
The same visitor code stays on the ad click, the WhatsApp chat, and the transfer. That code lets you join the 3 records.

Visitor code: who is this person

One person gets 1 fixed code in the form RD-xxxxxxx. The website, the site chat, and WhatsApp share the same code. The code travels in the first WhatsApp text, for example [RD-4721057] Hello, I want a consultation.

The first touch never changes. The last touch changes only when the person arrives from a new source. So the ad click stays when the person opens a second page.

Stage and temperature: how far, and how hot

Stage is the position of the person on the buying path, from visitor to paid. Stage only rises. Temperature is a score from 0 to 100 that falls 6 points each day while the person stays quiet.

We keep the 2 apart because the decisions are different. A person who got an invoice and went quiet stays at a high stage, but the temperature falls. The ad for that person is not the ad for a person who only opened a page.

Buying signals: what Meta may read

Rama Digital recommendation: send Meta only buying signals and stage moves. Reading data, such as scroll and time on page, stays in your own database. Meta optimises ads toward the events you send, so noisy signals teach Meta to find readers, not buyers.

EventSend to Meta?Value and currencyReason
Page view, scroll, time on pageNoNoneThis is reading telemetry, not buying intent.
WhatsApp button tapYes, as a stage moveNoneIn Indonesia, a WhatsApp tap is a high-effort action.
Quotation with a price sentYesYes, value + IDRThere is a real price.
Newsletter signupYes, as CompleteRegistrationNoneNot Subscribe, because there is no recurring payment.
Invoice issuedYes, as a stage moveNoneNo money has arrived yet.
Payment receivedYes, as PurchaseYes, the paid amount + IDROnly money received may be called Purchase.

What you need first

  • Admin access to Meta Business ManagerBusiness ManagerThe place where Meta holds your business ad assets: ad accounts, Pages, pixels, and people access.Open the glossary, Events Manager, and your ad dataset.
  • 1 landing page or WhatsApp button that you can edit.
  • A consent banner with a marketing choice that is separate from statistics.
  • An invoice system or payment log that can store 1 code per order.
  • 1 test identity: a WhatsApp number and an email that belong to your team, not to a customer.

Step 1: Put ad parameters in every destination URL

UTMUTMA label you attach to a page address to mark the source of a visit, for example the campaign and the channel.Open the glossary tells you "which campaign". Ad parameters tell you "which ad, in which placement". You need both to match your data with the Meta report.

Add these 5 parameters to the destination URL of each ad: rd_campaign_id, rd_adset_id, rd_ad_id, rd_placement, and rd_platform. Fill them with Meta dynamic parameters, for example {{campaign.id}} and {{ad.id}}. The list is in the Meta Business Help Center page on dynamic URL parameters.

Check: click your own ad, then confirm that the visit stores the correct ad id. One warning from our data: on 7 September 2026, the placement value showed the Facebook right column for 8 of 9 visits. That placement was not active. Trust the campaign, ad set, and ad ids, and read placements from the Meta breakdown report.

Step 2: Make 1 visitor code and carry it into the WhatsApp chat

Make the code on the first visit, and keep it in a first-party cookie. Put the code in the first text of every WhatsApp link. Do not change a link that already carries a code, so a repeat run stays safe.

The return path matters too. Every link that the chatbot or the team sends in WhatsApp carries the same code. When the person opens the payment page, the web visit and the payment join the same person.

Check: send a chat from the site button with your test identity. The first text must show the code, and the chat record must point to the same visit.

Step 3: Keep stage and temperature apart

Write 12 stages, from visitor to repeat customer. The stage rises by itself and never falls, because 1 late event can erase real progress. Only the team may lower a stage by hand.

Weight the temperature by buyer behaviour. In our system, a WhatsApp tap adds 22 points and a page view adds 1 point. Quiet for 30 days means asleep, not lost, because Indonesian leads often come back.

Check: make 2 test leads. The first gets an invoice and goes quiet. The second only opens a page. The 2 must land in different audiences.

Record visits until the person refuses. "Not chosen yet" is not a refusal. Before we changed this rule on 7 September 2026, 27 ad clicks gave only 3 visitor records.

Send an event to Meta only when the person chose marketing consent. In the 7 days to 27 September 2026, our system held back 11,507 events because there was no marketing consent. Those events never went out, and that is correct.

Send from the server, through a queue that is separate from the page request. A send to Meta can be slow, and a send inside the page request is lost when the person closes the page. For the basics of the ConversionsConversionThe action you count as a result, for example a paid order, a sign-up, or a chat that becomes a qualified buyer.Open the glossary APIAPIThe official door 2 systems use to exchange data, without anybody copying it by hand.Open the glossary, read what CAPI is.

Step 5: Send Purchase only for money received

Send Purchase when the payment arrives, with the paid amount and the currency IDR. The Meta custom data page says value and currency are required for Purchase. Send them together, because a currency without a value reads as broken price data.

A gate lets only amber coins pass to the ad engine while other teal signal dots stay on the left, with an hourglass beside it
Only money received passes as Purchase. Other signals stay in your data, and the hourglass is a reminder that payments arrive late.

Fill the match data correctly. The Meta customer information parameters page says email, phone, name, city, and external_id must be hashed with SHA-256. A phone number must include the country code, so 08xx becomes 628xx.

Send fbc whole. The Meta fbp and fbc page says the fbclid is case sensitive, so do not change it. Use a fixed event_id for each event. The Meta deduplication page says Meta removes duplicates only within 48 hours of the first event.

The result matters: do not resend an event that Meta already received just to add data. After 48 hours, Meta counts a second Purchase. Match quality is explained in the Event Match Quality article.

Step 6: Judge a campaign from payment data after 48 hours

Our class buyers pay 0 to 2 days after the chat. We recorded this pattern in the audit of 26 September 2026. So wait 48 hours after the last chat before you stop a sales campaign.

We learned this the expensive way. On 23 September 2026, we stopped a BOFU campaign because it had no sale that same day. On that same day, 2 buyers from that campaign paid.

Read payments from your own data, then link them to the ad id through the visitor code. On 25 September 2026, our data recorded 12 paid class invoices since 17 September, Rp 2,148,000 in total. In the same period, the BOFU campaign spent Rp 484,316 and Meta recorded 0 Purchase.

Worked example: 1 buyer from click to transfer

Simulation with dummy data. The code, times, and amounts are examples, not customer data.

TimeInputWhat the system recordsDecision and output
Monday 10:02Ad click with rd_ad_id filledCode RD-0000001, ad id, fbc from the URLStage Visitor. Nothing goes to Meta, because no consent choice yet.
Monday 10:03Marketing consent chosen, WhatsApp button tappedFirst text carries [RD-0000001]Stage Reached out, temperature up 22 points. 1 stage event to Meta.
Monday 10:20Chatbot sends a Rp 179,000 quotationQuotation stored on the same codeStage Quoted. Value 179000 and IDR to Meta.
Monday 10:25Invoice issued, link carries the codeInvoice stores RD-0000001Stage Invoiced. No value, because no money yet.
Wednesday 08:40Transfer arrivesPayment marked paid on the same codePurchase 179000 IDR with 1 event_id. The campaign gets 1 buyer.

Decision from this example: if you judge the campaign on Monday night, you see 0 sales. On Wednesday morning, the same campaign has 1 buyer linked to its ad id.

What went wrong in our own operations

We write these failures down so you do not repeat them. All numbers come from our own data.

  • Buyer identity did not travel. Until 27 September 2026, match data came only from WhatsApp chats, not from orders. So our Purchase events went out with 0% email.
  • Meta diagnostics lag. On 27 September 2026, Meta still warned that fbc had changed. Our data showed 808 of 808 stored fbc values equal to the last click. Check your data before you change code again.
  • A chat is not a buyer. On 26 to 27 September 2026, 87 of 92 class leads marked ready to buy sent only 1 or 2 messages. Many only tapped the automatic ad text.

These lessons match how we audit Meta ads with AI and our WhatsApp AI chatbot closing audit.

Checklist: attribution from ad to transfer

  1. Put the 5 ad parameters in every destination URL. Owner: ad manager. Evidence: 1 test click with the ad id stored.
  2. Make sure the first WhatsApp text carries the visitor code. Owner: web developer. Evidence: a screenshot of the test chat.
  3. Make sure every invoice stores the visitor code. Owner: sales team. Evidence: 1 test invoice with the code.
  4. Keep stage and temperature apart in lead data. Owner: CRM manager. Evidence: 2 test leads in 2 different audiences.
  5. Hold back every send to Meta without marketing consent. Owner: developer. Evidence: the weekly count of held events.
  6. Send Purchase only for money received, with value and IDR. Owner: developer. Evidence: 1 test Purchase in Events Manager.
  7. Do not resend an event that Meta already received. Owner: developer. Evidence: 1 event_id for each payment.
  8. Stop criterion: do not pause a sales campaign before 48 hours after its last chat. Owner: ad manager. Evidence: the payment list per ad id.

Frequently asked questions

Is the Pixel alone not enough for a business that sells through WhatsApp? The Pixel sees only browser events. Transfers and WhatsApp chats happen outside the browser, so you need the Conversions API from a server and 1 code that joins the chat to the payment.

Why does Meta show 0 Purchase when transfers came in? Usually the payment is not linked to the ad click, or the server does not send Purchase. On 23 September 2026, our data recorded 6 paid invoices while Meta recorded 0 Purchase.

May I resend a Purchase to add the buyer email? No. Meta removes duplicates only within 48 hours. After that, the second send counts as a new purchase, and your numbers become wrong.

How long should I wait before I stop a sales campaign? Our recommendation: 48 hours after the last chat. Our class buyers paid 0 to 2 days after the chat, according to the audit of 26 September 2026.

Does this attribution break customer privacy? Not when you respect consent. Send to Meta only with marketing consent, hash personal data with SHA-256, and stop recording when the person refuses.

Next step

A limit that still applies: attribution makes the data honest, but it does not fix a weak ad or a price that does not fit. If you do not know yet where your data leaks, start with Data Health Audit. That audit checks GA4, Pixel, CAPI, UTM, and events.

If you know the gaps and want this system installed, see Attribution Bridge. To talk about your case first, book a 30 minute initial consultation. For Instagram and Messenger DM ads, read how to track Instagram and Messenger DM ads with CAPI.

Sources