Resources Insight
WhatsApp marketing ROI: how to measure what a campaign earned, with the arithmetic
Nobody can tell you what your campaign will return, and the open rates quoted around the internet have no primary source. What you can do is measure your own, in one send, with a held-back group and a calculator.
The short version
- ROI is the extra margin a campaign brought in, minus its full cost, divided by that cost. Use margin, not revenue, and extra orders, not all orders.
- The cost has three parts: Meta's charge of ₹0.8631 per delivered marketing message in India before GST, a share of your tool fee, and staff time.
- WhatsApp reports sent, delivered, read and failed for each message, and quick-reply taps arrive as messages. It doesn't tell you who tapped a link or who bought.
- UTM links and coupon codes count orders that touched the campaign. Only a randomly held-back group tells you how many of those orders would have come anyway.
- Break-even is the campaign's cost divided by your margin per order. Stop or shrink the list when 131049 failures and opt-outs rise while reads fall.
Aditi Hegde sells forest honey and filter coffee online from Mysuru, with four people and about 6,000 customers who have opted in to offers on WhatsApp. Last month she sent a harvest offer, saw 140 orders in the week after, and told her accountant the campaign “did 140 orders”.
It didn’t. Some of those customers would have reordered that week with no message at all. Working out WhatsApp marketing ROI means separating the orders the message caused from the orders it merely preceded, then setting them against everything the campaign cost. This page shows the arithmetic with Aditi’s campaign. Every number in her example is illustrative.
Why there are no benchmarks on this page
Because we haven’t found one with a primary source. We couldn’t trace the open rates and return multiples quoted for WhatsApp to anything Meta has published, and we found no public Meta table of read rates by industry.
Meta does offer benchmarks, described as a comparison of read and click rates “versus similar templates from other businesses in your region”, but only to businesses onboarded to its Marketing Messages API. If that matters to you, ask your provider whether you’re on it.
You don’t need someone else’s average anyway. One campaign with a held-back group gives you your own number, for your own list and your own margins, which is the only one you can act on.
What does a WhatsApp marketing campaign cost?
Three things: Meta’s charge per delivered message, a share of your tool fee, and the time your team spent. Most ROI sums count only the first and so flatter the result.
Meta’s INR rate card effective 1 October 2026 lists a marketing template to an Indian number at ₹0.8631 per delivered message, before GST. There are no volume discounts for marketing, and you’re charged on delivery, so failed messages cost nothing. The October cost guide has the other categories.
Aditi’s list is 6,000 people. She holds back 1,000 at random (more on that below) and sends to 5,000, of which 4,700 are delivered.
| Cost line | Illustrative figure | How it’s worked out |
|---|---|---|
| Meta message charges | ₹4,057 | 4,700 delivered × ₹0.8631 |
| Tool fee, apportioned | ₹1,000 | ₹4,000 a month, half of its use is campaigns, two campaigns this month |
| Staff time | ₹1,200 | 4 hours writing, building the audience and answering replies, at ₹300 an hour |
| Replies to customers | ₹0 | 180 free-form replies, inside the month’s 1,000 free service messages on her number |
| Total | ₹6,257 | About ₹1.33 per delivered message |
The apportioning is a judgement, and that’s fine as long as you make the same judgement every month. If the tool also runs your support inbox, don’t load the whole fee onto marketing. If replies to a campaign push you past the 1,000 free service messages a number gets each month, add ₹0.115 for each one beyond that.
What does WhatsApp report, and what doesn’t it?
It reports what happened to the message. It doesn’t report what happened in your shop.
For every message, Meta’s status webhook says sent, delivered, read or failed, with an error code on failures. “Read” means the message was displayed in an open chat on the person’s phone. Meta’s page doesn’t say how people who have switched off read receipts are counted, so treat your read rate as a way to compare your own campaigns, not as an exact share of people who saw the offer.
A quick-reply button tap comes back to you as a message from that person. So you know exactly who tapped “Show me the coffee”, and you can reply to them.
Links are different. Meta’s template analytics count how many times a URL button was tapped, per template per day, once you’ve confirmed template analytics on your account. That is a total, not a list of people, and Meta says read and click data is only available for up to 7 days from the send. Meta’s page describes button clicks only and doesn’t mention links typed into the body of a message, so put the link on a button.
Purchases aren’t reported. Meta lists website and app conversion metrics, but “exclusively for businesses onboarded to MM API for WhatsApp”. For everyone else, the order has to be matched to the campaign on your side.
How do you attribute orders to a campaign?
With UTM links and coupon codes to count the orders that touched the campaign, and a held-back group to find out how many of them the campaign caused. The first two are easy and biased. The third is slightly painful and correct.
UTM links
Put UTM tags on every link in the template, with the campaign’s name in them, and your website analytics will show visits and orders that arrived through that link. It undercounts. A customer who reads the message at lunch and orders from her laptop that night shows up as a direct visit.
Coupon codes
A code used only in this campaign catches the laptop order. It overcounts in the other direction: a regular who was about to reorder anyway uses the code, and now a full-price order has become a discounted one that the campaign gets credit for.
Replies
Orders placed in the chat, or after a quick-reply tap, can be tied to the person directly. Count them, but they have the same flaw as coupon codes.
A held-back control group
Before the send, pick a random slice of the audience and don’t message them. Afterwards, compare the order rate of the two groups over the same days. The difference is what the message did, because everything else (the season, the salary date, your Instagram posts that week) hit both groups equally.
Three rules make it work. The slice must be random: sort the list by a random number in a spreadsheet, not by city or by who ordered last. Count everyone in the send group, including people whose message failed, or you’ll compare your reachable customers with your whole list. And decide the counting period before you send. Seven days suits most repeat purchases.
It’s the only honest measure because it’s the only one that asks what would have happened otherwise. The price is real: the people you held back didn’t get the offer, and some of them would have bought.
The worked example
All figures are illustrative.
| Sent group | Held-back group | |
|---|---|---|
| People | 5,000 | 1,000 |
| Orders in the 7 days after the send | 140 | 12 |
| Order rate | 2.8% | 1.2% |
Without the message, the sent group would have ordered at about the held-back rate: 5,000 × 1.2% = 60 orders. The campaign’s extra orders are 140 − 60 = 80.
Aditi’s average order is ₹900 and she keeps 40% of that after the product, packing, shipping and payment fees, so each order is worth ₹360 in margin.
ROI = (extra orders × margin per order − campaign cost) ÷ campaign cost
- Extra margin: 80 × ₹360 = ₹28,800
- Campaign cost: ₹6,257
- Net: ₹28,800 − ₹6,257 = ₹22,543
- ROI: ₹22,543 ÷ ₹6,257 = 3.6, or about 360%
Now the version she told her accountant. All 140 orders × ₹360 = ₹50,400, less cost, over cost: about 705%. Nearly double, and wrong. Her other counts disagree too: analytics showed 70 orders through the UTM link and 95 orders used the coupon code. Neither is the 80.
Be straight about the noise. Twelve orders is a small number. Had the held-back group placed 9 or 15, the extra orders would come out at 95 or 65. One campaign gives you a range; four or five campaigns added together give you a figure you can plan on.
And the cost of knowing: the 1,000 people held back would have placed about 16 more orders at the sent group’s rate, roughly ₹5,760 of margin. If that’s too much, hold back fewer people and accept a wider range.
How many orders to break even?
Divide the campaign’s cost by your margin per order. For Aditi that’s ₹6,257 ÷ ₹360 = 17.4, so the campaign pays for itself at 18 extra orders, which is 0.36% of the 5,000 people she sent to.
Work this out before you send. It answers “is WhatsApp marketing worth it” for your business better than any average can. A brand with ₹360 of margin an order and a list that knows it needs very few extra orders. A shop with ₹40 of margin an order needs 157 from the same send, and probably shouldn’t message the whole list.
When do the numbers say stop?
When failures and opt-outs rise while reads fall, across two or three campaigns. One bad send is a bad message. A trend is the list telling you something.
- Error 131049 as a share of sends. WhatsApp limits how many marketing templates each person receives from all businesses combined, and a message held back by that limit fails with this code. Meta says to wait at least 24 hours before trying that person again. A rising share in an ordinary month means you’re sending more than your list wants. Our 131049 explainer has the detail.
- Read rate against your own earlier sends. Meta’s template quality rating drops for “negative feedback” or “low read-rates”, and a low-rated template can be paused.
- Blocks. You can’t see them directly. WhatsApp’s policy says users can block or report a business and that it may limit what you can send based on that feedback, so a falling quality rating is the nearest thing to a block count you’ll get.
- Opt-outs. Count the people who wrote “stop” after each campaign, and take them out of marketing the same day.
- Extra margin below cost, twice in a row, with a held-back group both times.
Stopping doesn’t have to mean stopping everything. Usually it means sending to the half of the list that read the last three campaigns, less often. The marketing guide covers what gets a number limited, and the glossary defines quality rating and the other terms here.
A one-page monthly review
Fill this in once a month, per campaign, and keep the pages together. The value is in the comparison across months.
Campaign and date:
Audience (segment, size): Held back at random:
Sent: Delivered: Read:
Failed: of which 131049:
Quick-reply taps (by button):
Opt-outs after the send:
Template quality rating a week later:
Orders in 7 days, sent group: Order rate:
Orders in 7 days, held-back group: Order rate:
Extra orders = sent orders - (sent people x held-back rate):
Orders by UTM link: Orders by coupon code:
Meta charges (delivered x rate):
Tool fee share: Staff hours x rate:
Total cost:
Margin per order:
Break-even orders = total cost / margin per order:
ROI = (extra orders x margin - total cost) / total cost:
Same figures last month:
One thing to change next time:
If you’re planning quarter by quarter, the 90-day strategy shows where each campaign sits. Festive weeks distort everything, since everyone orders more and every brand sends more. Hold back a group in the same week rather than comparing with September; the Diwali send plan is built in waves that make this easy.
For your next send, do one thing differently: before you press schedule, pull one person in six out of the audience at random and write down today’s date plus seven. That single step turns “it did 140 orders” into a number you can defend.
Common questions
How do you calculate WhatsApp marketing ROI?
Take the extra orders the campaign caused, multiply by your margin per order, subtract the campaign's full cost, and divide by that cost. Extra orders means orders from the people you messaged minus what a randomly held-back group of the same size would have ordered without the message.
What does WhatsApp marketing cost in India?
Meta charges ₹0.8631 per delivered marketing template to an Indian number on its INR rate card effective 1 October 2026, before GST. Add a share of your WhatsApp tool's monthly fee and the staff time spent writing the message, building the audience and answering replies.
Is WhatsApp marketing worth it?
It is when the extra margin beats the full cost, and you can check that in one campaign. Divide the campaign's cost by your margin per order to get the break-even number of extra orders. If a held-back group shows the campaign cleared that number, it paid.
What is a good open rate for WhatsApp campaigns?
We haven't found a primary source for an industry read rate, so we don't quote one. Compare each campaign's read rate with your own earlier sends to the same kind of audience. Meta offers benchmarks against similar templates only to businesses on its Marketing Messages API.
Can WhatsApp track link clicks and purchases from a campaign?
Not per person. Meta's template analytics give a daily count of URL button clicks for a template, kept for up to 7 days after the send. Purchases are not reported unless your business is onboarded to Meta's Marketing Messages API, so use UTM links, coupon codes and a held-back group.
Sources
- Pricing on the WhatsApp Business Platform, with the INR rate card effective 1 October 2026 (Meta for Developers) · Updated 30 Sep 2026, read 13 Oct 2026
- Messages webhook reference: status (sent, delivered, read, failed) (Meta for Developers) · Updated 14 Sep 2026
- Analytics: template analytics, button clicks and their limitations (Meta for Developers) · Updated 14 Sep 2026
- Marketing Messages API for WhatsApp: features (Meta for Developers) · Updated 30 Jun 2026
- Per-user marketing template message limits (Meta for Developers) · Updated 17 Jun 2026
- Template quality rating (Meta for Developers) · Updated 17 Jun 2026
- WhatsApp Business Messaging Policy · Last updated 23 Sep 2026
Run this on your own number
Create an account, connect your WhatsApp number, and invite your team.