WhatsApp marketing ROI calculator

Free · no signup

Set your list size, send cost and funnel rates. You get reach, clicks, orders, revenue and ROAS, the numbers to take to whoever signs off the spend.

Return on the campaign
14.2×
Revenue for every $1 of send cost
Messages delivered 1,900
Clicks 228
Orders 18
Revenue $810.00
Send cost $57.00
Net after send cost: $753.00. A single broadcast on DMly costs the same to send whether it lands 500 or 5,000 chats.
Next step

Turn the model into a monthly habit.

DMly runs the send, tracks the clicks and attributes the bookings so ROAS stops being an estimate.

Two Broadcasts That Cost the Same to Send

A tile showroom messages 2,000 customers about a bank holiday clearance. A physiotherapy clinic messages 2,000 of its own about a cancellation slot. The two sends cost almost exactly the same. What comes back is not remotely the same, and the reason is never the messaging.

Closing that gap before the money is spent is the job of a WhatsApp marketing ROI calculator. Four figures decide the answer: how many people click, how many of those buy, what one of them spends, and what a single message costs to deliver. The panel above turns them into one number under the kicker Return on the campaign, and the line beneath it says exactly what that number means. Revenue for every $1 of send cost.

It is a ratio, not a margin. The five rows under it are there so that anybody can check it.

Five Multiplications and a Division

The chain runs down the results card in the order the arithmetic happens, which is also the order the input boxes ask in.

  • Messages delivered. List size multiplied by the delivery rate. This is the reach figure everything below it is measured against.
  • Clicks. Delivered messages multiplied by the click rate. The click rate is a share of what landed, not of what you uploaded.
  • Orders. Clicks multiplied by the order rate. The order rate is a share of clicks, and it is the input people most often enter against the wrong base.
  • Revenue. Orders multiplied by the average order value.
  • Send cost. Delivered messages multiplied by the cost per message.

The headline divides revenue by send cost. Net after send cost, on the closing line, subtracts one from the other instead, which is a different question with a different answer.

List → Delivered → Clicks → Orders → Revenue

Two decisions inside that arithmetic are worth knowing before you argue with the output. Counts are rounded at every step rather than only at the end, so the rows on screen multiply out to the revenue printed under them. And send cost is charged on delivered messages rather than on the whole list, because a message that never arrived is not a message anybody gets billed for.

The Two Inputs That Do Not Move the Multiple

Push the list size from 2,000 to 20,000 and the headline barely twitches. That is not a fault in the model. Revenue and send cost both scale with the number of messages delivered, so the two cancel out in the division.

Write the chain out end to end and the multiple depends on four things only: click rate, order rate, average order value and cost per message. List size and delivery rate drop out of it. Rounding nudges the figure a little at small volumes, and that is the entire effect.

What those two inputs do move is net after send cost, which is cash rather than a ratio. Ten times the list at the same rates is roughly ten times the money left over, and ten times the bill. If the argument is about how much a campaign puts in the account, read the net. If it is about whether the campaign is worth running at all, read the multiple.

Where Honest Inputs for the WhatsApp Marketing ROI Calculator Come From

Six boxes, and each one has a right answer sitting somewhere in your last campaign.

  • List size. The contacts you will actually attempt, after opt-outs and after duplicates are collapsed. The panel opens on 2,000. This is not your database total.
  • Delivery rate. Delivered divided by attempted on your last send. It opens on 95. Delivery means the message reached the handset. It is not read, and it is not an open rate.
  • Click rate. Link clicks divided by delivered messages. It opens on 12. If the template carries no link, treat this box as your reply rate and the rest of the chain still holds together.
  • Order rate. Orders divided by clicks. It opens on 8. Take the orders from a fixed window after the send, and be strict about which window.
  • Average order value. What one of those orders is worth at the till, before cost of goods. It opens on 45.
  • Cost per message. What one delivered message costs. It opens on 0.03, and the arrows move it in half-cent steps, because the difference between 0.03 and 0.045 is a different campaign.

The three rate boxes are capped at 100 and floored at zero. Type 140 into the click rate and the box will hold 140. The card still prices the send at 100, so a figure the model would refuse to reproduce never reaches the rows. List size, average order value and cost per message have a floor of zero and no ceiling at all.

Cost per message is the one figure you should not invent. It moves with the country you are sending to and with the template category, so price the send properly with the broadcast cost calculator, or work out a rate across a mixed list with the WhatsApp API pricing calculator, then carry one number back into this box.

Not every business sells an order. A clinic or a salon is counting bookings, so read the order rate as a booking rate and the average order value as what one appointment is worth. If the campaign exists to fill gaps rather than shift stock, the no-show cost calculator puts a figure on the other half of that problem.

A WhatsApp Broadcast to 2,000 Contacts, Worked Through

Leave the six boxes on their opening values and the card prices exactly this send. Here is how to arrive at the same five rows with nothing but a pocket calculator.

  • Delivered. 2,000 contacts at a 95 per cent delivery rate gives 1,900 messages delivered.
  • Clicks. 1,900 delivered at a 12 per cent click rate gives 228 clicks.
  • Orders. 228 clicks at an 8 per cent order rate gives 18.24, which the card rounds to 18 orders.
  • Revenue. 18 orders at $45 each gives $810.00.
  • Send cost. 1,900 delivered messages at $0.03 each gives $57.00.

Divide $810.00 by $57.00 and the headline reads 14.2. Net after send cost reads $753.00.

Two details in that run are the whole reason the card survives being handed to somebody else. Revenue is 18 whole orders at $45, not 18.24 orders at $45, which would have produced $820.80 that no row on the card accounts for. And the send cost is 1,900 messages at $0.03 rather than 2,000, so it is $57.00 and not $60.00. Both are the size of gap that loses an argument about a budget.

Reading 14.2 Without Calling It Profit

The multiple weighs revenue against one cost, the messages. Everything else a sale takes to fulfil sits outside it, and net after send cost carries exactly the same blind spot.

Which is why messaging returns look enormous beside paid advertising and are not comparable to it. A per-message charge is small, so almost any funnel that works at all divides into a large number. Read the figure as a test of whether the send paid for itself several times over, not as a margin you can bank.

Set cost per message to zero and the headline prints 0.0 rather than an infinity. With nothing spent there is nothing to return against, and zero is the honest reading of an unfunded campaign.

None of it is drawn from your account either. Nothing is imported, nothing is read back from Meta, and no figure on the card came out of your history. Every number in it is one you typed or one the panel opened with.

The Assumptions That Quietly Break the Number

Every wrong answer this panel gives arrives through an input. These are the ones that go in wrong most often.

  • An order rate measured against the wrong base. Eighteen orders out of 1,900 delivered messages is under 1 per cent of delivered, but the box is asking for orders as a share of clicks, which is 8 per cent. Put the first figure in the second box and the model collapses to nothing.
  • An attribution window nobody agreed. An order placed three weeks later is not obviously the broadcast’s work. Pick the window before the send, write it down, and use the same one next month.
  • No baseline. Some of those customers were coming in anyway. There is no control group in here, so the model credits the campaign with everything that happened after it.
  • A blended rate that was never blended. One box, one cost per message. A list spanning several countries, or a campaign mixing template categories, has several rates behind it, and the weighted average has to be worked out before it is typed in.
  • A single send priced as a habit. This models one broadcast. Message the same list every week and the click rate you measured on the first send will not survive to the sixth.

Four Readings That Look Like a Bug and Are Not

Most of the confusion this panel causes comes from rounding, and all of it is visible on the card if you know what you are looking at.

Orders Reads Zero

Counts are rounded, so a chain producing less than half an order produces none. Forty clicks at a 1 per cent order rate is 0.4, which shows as 0 orders, revenue of $0.00 and a headline of 0.0. Nothing is broken. The model is saying the send is too small to expect an order from at those rates.

Revenue Will Not Budge

Nudge the order rate by half a per cent and revenue sometimes does not move at all. Same cause. Orders are whole orders, and until the rounding rule tips over a boundary the row underneath stays exactly where it was.

Net Comes Out Negative

Revenue has landed below send cost. The minus sign is printed in front of the currency symbol rather than between the symbol and the digits, so read the figure whole. A negative net on a healthy looking list usually means the order value is optimistic, the order rate is optimistic, or the cost per message is higher than that funnel can carry.

The Figures Never Change

The card is rendered complete, with its opening values already in it, before any script runs. If typing into the boxes moves nothing, the script has not loaded. What you are looking at is still correct arithmetic for the values shown rather than a broken page, so reload before you distrust the numbers.

The Costs That Sit Outside the Send Cost Row

The send cost row is one multiplication: delivered messages at the cost per message. Nothing else a campaign spends is priced anywhere on the card.

The goods are not in it. Neither is the staff hour spent fulfilling an order, nor the discount buried inside the offer, nor the software the broadcast went out through. The card’s own closing line draws that last distinction, noting that a single broadcast on DMly costs the same to send whether it lands 500 or 5,000 chats. Subscription sits outside the model, and so does everything you pay to fulfil an order once it exists.

That row also prices one send, in one currency, at one per-message rate, and it does not know your messaging tier. The tier decides whether the list you typed is the list that can actually be reached inside twenty-four hours. If you are anywhere near a cap, check it with the WhatsApp messaging limit calculator first, because delivered messages are what the send cost is counted on.

Re-running the Marketing Model After Every Send

The first run of this is fiction with a structure. The second run is not, provided you wrote down what you assumed the first time.

The widest gap is the funnel rates. On a first campaign you are guessing at three of them, and a guess dressed as a decimal is still a guess. With DMly, you can run the send, track the clicks and attribute the bookings, so the rates you type next month are measured rather than estimated. That does nothing for the first estimate. It makes the second one honest.

Keep four figures from every broadcast: messages delivered, clicks, orders inside the window you agreed, and what those orders were worth in total. That is everything the six boxes need. It takes a minute at the end of a campaign instead of an afternoon at the end of a quarter.

Run the model twice before you commit. Once on the rates you believe, and once on half the click rate. If the pessimistic version still clears the send cost comfortably, the decision was never really about the model. If it does not clear, you have found the number the whole campaign is resting on, and it is usually the offer rather than the wording.

Then screenshot the card. Five rows, one multiple, and the six inputs still sitting beside them. Somebody who was not in the room can follow every step of it, which is the only reason to show working in the first place.

Frequently asked

It runs one chain. List size times the delivery rate gives messages delivered, delivered times the click rate gives clicks, clicks times the order rate gives orders, and orders times the average order value gives revenue. Send cost is delivered messages times the cost per message, and the headline divides revenue by that send cost.

The box holds whatever you typed, so 140 stays sitting on screen. The card still prices the send at 100, because each rate is held between the minimum and maximum on its own field before the chain is worked out. The delivery rate and the order rate behave the same way.

Counts are rounded at every step rather than only at the end. A chain producing less than half an order produces none, so orders reads 0, revenue reads nothing and the multiple reads 0.0. That is the model saying the send is too small to expect an order at those rates.

Not the multiple. Revenue and send cost both scale with messages delivered, so list size and delivery rate cancel out in the division and only rounding moves the figure. What they do move is net after send cost, which is cash rather than a ratio.

No. The only cost on the card is delivered messages at the cost per message. Goods, the staff hour spent fulfilling an order, the discount inside the offer and the software the broadcast went out through all sit outside the model, so read the multiple as a test of whether the send paid for itself rather than as a margin.

Scroll to Top