How to track conversions on the WhatsApp Business API
Sending template messages is only half the job — the half that matters to your finance team is knowing which sends actually turned into a signup, an order or a paid invoice. This tutorial walks through setting up end-to-end conversion tracking on the official WhatsApp Business API with InfiQ: tagging your outbound campaigns, capturing button and link clicks, wiring delivery and read webhooks, and attributing the final conversion back to the exact message that drove it. It takes a few minutes to configure and, once live, gives you a clean cost-per-conversion figure against WhatsApp's per-delivered-message rate card.
What you'll do
Set up conversion tracking on WhatsApp Business API by tagging campaigns with UTM parameters and a campaign ID, capturing button/link clicks and delivery-read webhooks in InfiQ, then attributing the downstream signup or purchase back to the originating message — giving you a true cost-per-conversion against Meta's per-message rates.Step 1 — Define the conversion before you send anything
Conversion tracking falls apart when nobody has agreed what a conversion is. Do this first, on paper. A conversion is a business outcome recorded in your system of record — an order marked paid, a demo booked, a KYC completed, a cart recovered. It is explicitly not a read receipt: a read only tells you the message was opened inside WhatsApp's free 24-hour service window, not that anything of value happened. Pick one primary conversion per campaign so your cost-per-conversion has a single, unambiguous denominator, and write down where in your stack that event is recorded (CRM, order table, payments webhook).
- Name the exact event and the system that owns it (e.g. 'invoice.paid' in your billing DB).
- Decide the attribution window — how many hours or days after the send a conversion still counts.
- Separate 'engagement' signals (delivered, read, clicked) from the 'conversion' signal so you never conflate a click with a sale.
Step 2 — Tag every outbound campaign with a stable identifier
Attribution is just joining three datasets — what you sent, what got clicked, and what converted — on a shared key. Give each campaign one identifier and reuse it everywhere. In InfiQ, set a campaign ID when you schedule the broadcast; on any URL button or in-body link, append UTM parameters that echo the same campaign. Keep the naming scheme boring and consistent so a human and a spreadsheet can both read it. Because WhatsApp now bills per delivered message by category, tagging by category (marketing, utility, authentication) also lets you split cost-per-conversion by message type later.
- Use a single campaign ID across InfiQ, your tracked links and your CRM.
- Standardise UTMs: utm_source=whatsapp, utm_medium=<marketing|utility|authentication>, utm_campaign=<your-id>.
- For per-recipient attribution, add a unique token to the link and store the outbound message ID that InfiQ returns at send time.
Step 3 — Capture clicks and message status via webhooks
The middle of the funnel lives in two places. Link and button clicks land in your web analytics through the UTM-tagged URL, while delivery and read status arrive from the WhatsApp Business API as webhook events that InfiQ relays to your endpoint. Subscribe your receiver to the message-status webhook so every sent, delivered, read and failed event is logged against its message ID. This status stream is what powers your delivered-message denominator and surfaces failures early, before they quietly deflate your conversion rate.
- Point the InfiQ webhook at an HTTPS endpoint that verifies the signature and returns 200 fast.
- Persist message ID, status, timestamp and campaign ID for every event.
- Watch the 'failed' and quality-signal events — undelivered messages can never convert and skew your rate.
Step 4 — Fire a server-side conversion event and close the loop
When the customer actually converts, record it from your backend, not the browser. Client-side pixels are lost to ad blockers, closed tabs and dropped sessions, which silently undercounts real conversions and makes campaigns look worse than they are. From your system of record, emit a conversion event carrying the campaign ID and, where you set one, the per-recipient token. That single field lets you join the conversion back through the click and the delivered message to the original send. Server-side events also survive a finance audit in a way a JavaScript pixel never will.
- Trigger the event from the source of truth — payments webhook, order service or CRM automation.
- Include the campaign ID (and per-recipient token) so it joins cleanly to the send.
- De-duplicate on the conversion's own primary key so retries don't double-count.
Step 5 — Reconcile spend against conversions, then optimise
Now you can build the number that justifies the channel. Take delivered messages for a campaign as the cost base, apply InfiQ's transparent ₹ pricing (ex-GST) for that message category, and divide total spend by attributed conversions. Do this per category so you can see, for example, that authentication OTPs convert cheaply while a marketing broadcast needs a sharper offer. Once the loop is trustworthy, iterate on the levers that move it: template copy, the call-to-action button, send timing and audience segmentation. Test changes with your own number first, ship to a small segment, and only then scale the winner.
- Cost-per-conversion = category spend on delivered messages ÷ attributed conversions.
- Break it out by marketing / utility / authentication to compare like with like.
- A/B one variable at a time — CTA wording, offer or send time — and let the attributed conversions pick the winner.