What is the WhatsApp vs SMS OTP cost comparison?
On WhatsApp, a one-time passcode is sent as an authentication template, with a fixed body containing the code and a copy-code or one-tap autofill button. Meta charges it per delivered message at the authentication rate for the recipient's market; for India the rate quoted on this site is ₹0.14, ex-GST. Authentication volume tiers lower Meta's rate as monthly volume grows. A business based outside India that Meta makes eligible, after more than 750,000 OTPs to listed markets in a moving 30 days, pays a higher authentication-international rate for Indian users (see /pricing). A passcode that is never delivered, because the user has no WhatsApp or stays offline past the template's time-to-live, is not billed.
By SMS, the same passcode travels as a DLT-registered message: the business is a registered principal entity, the message uses an approved header (sender ID) and a registered DLT content template, and an aggregator delivers it. The per-SMS price is set by the provider and volume, and it is charged per segment: 160 characters in GSM-7, or only 70 when the text contains any non-GSM character such as Hindi script or an emoji. Many providers bill each submitted SMS rather than each delivered one, so check the contract.
List rates alone do not settle the comparison. The useful number is cost per verified login: everything spent on passcodes, including resends and fallbacks, divided by successful verifications. Most businesses send WhatsApp first and use SMS as the fallback channel only when WhatsApp has not delivered within a set timeout, so the real bill is WhatsApp's delivered share at the authentication rate plus the fallback share at the SMS rate. Autofill and copy-code buttons can also raise completion rates, which lowers cost per login even at similar per-message prices.
Key takeaways
- Compare OTP channels on cost per verified login, including resends and fallbacks, not on headline per-message rates.
- A WhatsApp OTP is an authentication template billed per delivered message; the India rate quoted on this site is ₹0.14.
- DLT SMS is billed per segment (160 GSM-7 or 70 UCS-2 characters) and often per submission, depending on the contract.
- A high-volume business based outside India can be made eligible for a higher authentication-international rate on OTPs to +91 numbers.
- Send WhatsApp first, wait for the delivered status and fall back to SMS only after a timeout matched to the template's TTL.
The WhatsApp vs SMS OTP cost comparison: key facts and limits
- WhatsApp billing
- Per delivered authentication message
- WhatsApp India authentication rate (ex-GST)
- ₹0.14
- Eligible business based abroad
- Higher authentication-international rate (see /pricing)
- Authentication TTL
- Default 10 minutes; 30 seconds to 15 minutes
- SMS segment size
- 160 GSM-7 or 70 UCS-2 characters (153 / 67 per part when split)
- SMS prerequisites (India)
- DLT entity, header and content template
- SMS billing
- Per segment; often per submission, by contract
Why the difference matters
Why does the WhatsApp vs SMS OTP cost comparison matter?
OTPs are high-volume, low-margin messages: an app with 300,000 logins a month pays for every resend, every fallback and every passcode that arrives too late to use. Choosing a channel on headline rates can lock in a more expensive flow. Modelling cost per verified login, with WhatsApp's charge-on-delivery and SMS's per-segment billing side by side, shows where a fallback design saves money and where it quietly pays twice.
How does the WhatsApp vs SMS OTP cost comparison work?
- Step 1
Price both channels the same way
Take the authentication rate for India (and the authentication-international rate if your business is based abroad and Meta has made it eligible) and your contracted DLT SMS rate, both ex-GST.
- Step 2
Count segments and billable events
Check how many SMS segments your OTP text uses and whether your provider bills on submission or on delivery. WhatsApp bills delivered messages only.
- Step 3
Measure delivery shares
From your logs, find the share of users whose WhatsApp OTP is delivered within your timeout and the share who need SMS.
- Step 4
Set a fallback with no overlap
Wait for the WhatsApp
deliveredstatus, then send SMS only if it has not arrived. Match the template's time-to-live (message_send_ttl_seconds, 30 seconds minimum) to the timeout so a late WhatsApp delivery cannot follow the SMS. - Step 5
Compare cost per verified login
Divide the month's WhatsApp and SMS OTP spend by successful verifications, and track it as the metric instead of either per-message price.
The WhatsApp vs SMS OTP cost comparison in code
const GRAPH = "https://graph.facebook.com/v26.0";async function sendWhatsAppOtp(to, code) {const res = await fetch(`${GRAPH}/${process.env.PHONE_NUMBER_ID}/messages`, {method: "POST",headers: {Authorization: `Bearer ${process.env.ACCESS_TOKEN}`,"Content-Type": "application/json",},body: JSON.stringify({messaging_product: "whatsapp",to,type: "template",template: {name: "login_otp", // an approved authentication templatelanguage: { code: "en" },components: [{ type: "body", parameters: [{ type: "text", text: code }] },{ type: "button", sub_type: "url", index: "0",parameters: [{ type: "text", text: code }] }, // copy-code button],},}),});if (!res.ok) throw new Error(`WhatsApp send failed: ${res.status}`);const data = await res.json();return data.messages[0].id; // wamid, matched against status webhooks}// Wait as long as the template's TTL so WhatsApp cannot deliver after the SMS.export async function sendOtp(to, code, { waitMs = 30_000 } = {}) {try {const wamid = await sendWhatsAppOtp(to, code);// waitForStatus resolves true on "delivered", false on "failed" or timeout.if (await waitForStatus(wamid, "delivered", waitMs)) {return { channel: "whatsapp", charged: "authentication, per delivered message" };}} catch {// Not sent or not deliverable: undelivered WhatsApp messages are not billed.}await sendDltSms(to, code); // your provider: registered header + DLT content templatereturn { channel: "sms", charged: "per SMS segment, per your provider's terms" };}
waitForStatus and sendDltSms stand for your own webhook store and SMS provider client.
Example: A Pune lending app's login flow
A Pune fintech app sends 300,000 OTPs a month. It switches to WhatsApp first: 86% of passcodes are delivered on WhatsApp within 30 seconds and are charged at the authentication rate; the remaining 14% (users without WhatsApp, or offline) fall back to a DLT SMS. Because undelivered WhatsApp OTPs are not billed and the template's 30-second time-to-live stops late deliveries, nobody is charged twice. The team also moves its Hindi OTP text to a shorter English template, which takes the SMS fallback from two segments to one.
Common mix-ups
Common mistakes with the WhatsApp vs SMS OTP cost comparison
Paying twice for one login
If SMS fires while the WhatsApp OTP is still in flight, both can be delivered and charged. Wait for the delivered status and set the template TTL to match the fallback timer.
Comparing headline rates
A cheaper per-message price can lose if it needs more resends or delivers later. Compare cost per verified login across the whole flow.
Forgetting the international rate
A business based outside India that passes Meta's volume threshold pays the higher authentication-international rate for Indian users, after 30 days' notice. Price it into the comparison before the start date.
Unicode SMS doubling the cost
One Hindi character or emoji switches SMS to UCS-2 and 70-character segments. Keep fallback OTP text short or in GSM-7.
WhatsApp vs SMS OTP Cost FAQs
Is a WhatsApp OTP cheaper than an SMS OTP in India?+
Am I charged for a WhatsApp OTP that never arrives?+
Do I still need SMS if I use WhatsApp OTPs?+
Does the authentication-international rate apply to Indian businesses?+
Rules of thumb
Best practices for the WhatsApp vs SMS OTP cost comparison
- Track WhatsApp delivery within your timeout as the key ratio; it decides how much SMS you pay for.
- Use copy-code or one-tap autofill buttons to raise completion on WhatsApp.
- Keep the SMS fallback text in GSM-7 so it fits one segment.
- Rate-limit resend buttons; every resend is another billable message.
* Per-message rates for India, ex-GST: marketing, utility and authentication effective 1 July 2026; service messages ₹0.145 since 1 October 2026 (they were ₹0 until 30 September 2026). Volume commitments earn discounts — final rate is confirmed on your account; applicable GST extra. Rates for other countries differ (see the international rate table on /pricing).