SMS or WhatsApp for OTPs: what a code costs by country

Twilio's SMS rates against Meta's WhatsApp authentication rates in eight countries, the fallback nobody budgets for, and a calculator for your own volume.

For most products, the highest-volume message they will ever send is a six-digit number. Login codes, signup codes, password resets, payment confirmations: all short, all urgent, all billed one at a time. It is also the one message type where the channel decision is almost pure arithmetic, because nobody is loyal to the way their verification code arrives.

The arithmetic is startling in some countries and almost irrelevant in others. Sending an SMS to an Indian number at Twilio's published rate costs 59 times what the same code costs as a WhatsApp authentication template. In Germany, it costs twice as much. Same two channels, same code, wildly different decisions.

Then there is the part that ruins naive projections: you cannot send every code over WhatsApp, so you keep paying for SMS anyway. In the worked example below, the WhatsApp traffic is $112 a month and the fallback SMS is $2,330.

The two rate cards, side by side

SMS prices are Twilio's published outbound rate per segment for each country, taken from their per-country pricing pages on 12 September 2026. WhatsApp prices are Meta's authentication rate on the card that takes effect on 1 October 2026. The US line adds AT&T's A2P 10DLC carrier surcharge, because in the US that is a real per-message cost.

CountrySMS per segmentWhatsApp authenticationSMS ÷ WhatsAppAuthentication-international
India$0.0832$0.001459x$0.0304
Nigeria$0.3868$0.006758x$0.0750
Indonesia$0.4414$0.025018x$0.1360
Brazil$0.0599$0.00688.8x
United Arab Emirates$0.1176$0.01577.5x$0.0510
United States$0.0083 + $0.0035 carrier$0.00343.5x
United Kingdom$0.0560$0.02202.5x
Germany$0.1120$0.05502.0x
Bar chart of how many times more an SMS costs than a WhatsApp authentication message, by country. India 59x, Nigeria 58x, Indonesia 18x, Brazil 8.8x, UAE 7.5x, United States 3.5x, United Kingdom 2.5x, Germany 2x.
Where SMS is expensive and WhatsApp is cheap, the ratio is enormous. In Western Europe both channels cost real money and the decision gets harder.

One caveat matters more than any other number in that table. Twilio's India price is for international long codes. Domestic Indian routes with a registered sender ID are quoted by sales, not published, and they cost far less than $0.0832. If you are an Indian company sending to Indian customers through a local aggregator, your SMS rate is much lower and the 59x shrinks a long way. The calculator lets you type your real rate in, and you should.

What an SMS actually costs

Three things sit between the rate card and the invoice.

Segments, not messages. Twilio bills per segment, and a segment is 160 characters in GSM-7 or 70 in UCS-2. Concatenated messages drop to 153 and 67 characters per segment, because the header takes room. A plain OTP fits in one segment. An OTP with a branded prefix, a policy line and a curly apostrophe does not: the apostrophe alone can flip the whole message to UCS-2 and double the bill.

Carrier fees and registration in the US. American A2P traffic over 10-digit long codes goes through 10DLC registration. Twilio's fees are $44 for a standard brand registration, $15 per campaign to vet it, and $1.50 to $10 per campaign per month, with a $4 brand fee on the low-volume and sole proprietor routes. On top, each carrier adds a per-segment fee, which is why the US row above is $0.0118 and not $0.0083.

DLT registration in India. India's rules are stricter than anywhere else in the table. TRAI requires a sender to register as a principal entity, register a header of up to eleven characters, register the content template with its fixed and variable parts, and register a consent template for promotional traffic. TRAI's own wording is blunt: "All the above steps are necessary to become a registered sender. Failing to follow any steps will not allow you to send CC." Twilio says the same from the other side: registration in the operator DLT portal must be complete before you can register a sender ID with Twilio, and a registered sender ID has to be used for the use case it was approved for.

That is the hidden tax on SMS OTPs. Not the per-message rate, but a registration process per country, per sender ID, per message shape, and a template change that needs re-approval.

WhatsApp codes have their own rules

A WhatsApp code is not a free-form message. Meta's documentation is explicit that apps offering verification codes over WhatsApp must use authentication templates, and those templates come with fixed text: "{{code}} is your verification code", where the code is the only thing you supply. You may add an optional security line, "For your security, do not share this code", and an optional expiry line, "This code expires in N minutes". That is the whole message. No branding paragraph, no marketing.

The button is your real choice. A copy code button puts the code on the clipboard. A one-tap autofill button hands it straight back to your Android app, which Meta calls the preferred option because the user never leaves the app. Zero-tap goes further and delivers the code to the app without the user touching anything.

Two operational details are easy to miss. Authentication messages are delivered only to a user's primary WhatsApp device, with linked devices shown a prompt to look at the phone. And some countries have an authentication-international rate that applies when your business is outside the recipient's country and you send more than 750,000 messages outside customer service windows in a 30-day period. Meta lists Egypt, India, Indonesia, Malaysia, Nigeria, Pakistan, Saudi Arabia, South Africa and the UAE. For a large sender based outside India, the Indian authentication rate goes from $0.0014 to $0.0304, and the 59x becomes 2.7x. That single line has moved more OTP budgets than any rate card change.

The fallback is most of the bill

Here is the part that rate-card comparisons miss. You do not know which of your users can receive a WhatsApp message, and the ones who cannot still need their code. So a WhatsApp-first flow is really two flows, and you pay for both.

Take 100,000 codes a month to Indian numbers at the published international SMS rate. Send everything by SMS and it is $8,320. Send WhatsApp first to the 80% of users you can reach, with 10% of those attempts falling back to SMS, and the bill is $2,442: only $112 of WhatsApp, and $2,330 of SMS. You save 71%, and almost none of the remaining cost is the channel you switched to.

Line chart of monthly OTP cost for 100,000 codes to Indian numbers as WhatsApp coverage rises from 0 to 100 percent. SMS only costs $8,320. With a 10 percent fallback rate the cost falls to $972 at full coverage; with no fallback at all it falls to $140.
The line never reaches the floor while any message falls back. Coverage saves money; fallback rate decides how much.

Push coverage to 100% and the same 10% fallback still leaves you at $972 a month, seven times the $140 of pure WhatsApp traffic. That is the number to optimise: not the WhatsApp rate, which is already tiny, but how often you give up on WhatsApp and send an SMS as well.

Work it out for your own numbers

The defaults are that Indian example: 100,000 codes a month, 80% coverage, 10% of WhatsApp attempts needing an SMS anyway. Change the country and the rates update from Twilio's and Meta's published prices, and both stay editable, because your negotiated rate is the one that matters.

calculator · twilio sms rates and meta's authentication rates, 12 sep 2026

What a month of OTPs costs on each channel

SMS ONLYa month
WHATSAPP FIRSTa month, SMS fallback included
SAVING
PER CODE DELIVEREDSMS against WhatsApp first

a month, by channel

SMS prices are Twilio's published outbound rate per segment for each country, checked 12 September 2026; domestic routes bought from a local aggregator are often cheaper, so the rate is editable. WhatsApp rates are Meta's authentication rates on the card that takes effect 1 October 2026, before volume tiers. Taxes, phone number rental and registration fees are not included on either side.

Some results worth trying. Germany, where the ratio is 2x: 100,000 codes cost $11,200 by SMS and $7,536 WhatsApp-first, a 33% saving that has to pay for the integration work. Indonesia, where SMS is $0.4414: the same volume goes from $44,140 to $14,359. And India with the authentication-international box ticked, which is the honest setting for a foreign sender at scale.

quick check

You send 100,000 codes a month to Indian numbers. 80% of users are on WhatsApp, and 10% of those WhatsApp sends fall back to SMS. At $0.0014 for WhatsApp and $0.0832 for SMS, roughly what do you pay?

WhatsApp carries 80,000 codes for $112. The 20,000 users without WhatsApp and the 8,000 failed attempts still go by SMS, which costs $2,330. The fallback is 95% of the bill.

Building it so you do not pay twice

The cost model above assumes a sane implementation. Three things make it come true.

A flow of five stages for a WhatsApp-first OTP: user asks for a code, WhatsApp authentication template, a brief wait for the delivered status, SMS fallback, then verification. Below it, a table showing India costs $0.0014 for a WhatsApp code and $0.0846 when the fallback also fires, against $0.055 and $0.167 in Germany.
A fallback that fires too early pays for both channels on the same code, which in Germany costs more than sending the SMS alone.

One code, both channels, one expiry. Generate the code once, store it once, and let either channel deliver it. Two codes for one login attempt is the single most common way to turn a saving into a support ticket.

A fallback timer based on delivery, not on hope. Wait for Meta's delivered status, not read, because people read codes from the notification. If it has not arrived in a few seconds, send the SMS. Too eager, and you pay for both on every login: in Germany that is $0.167 against $0.112 for SMS alone, so an aggressive fallback is worse than never using WhatsApp at all. Too patient, and users start hammering the resend button, which also costs you a message each time.

Retries that cannot double-send. Every send is a job with a retry policy, and every retry needs an idempotency key so a webhook redelivery or a queue replay cannot bill you twice. This is how I run every external call in PostEngage: an explicit retry policy, a dead-letter queue, and an alert, because messaging failures are invisible until they are expensive. A silent drop in WhatsApp delivery looks exactly like nothing for a week, and then looks like a spike in SMS spend.

Worth measuring from day one: delivery rate per channel and country, time from send to delivered, fallback rate, and verification success rate. That last one is what actually matters. A cheaper channel that verifies fewer users is not cheaper. At Acefone, Interaction Hub keeps every interaction on an event log for exactly this reason: when WhatsApp, SMS and voice all touch the same customer, per-channel outcomes are the only way to tell which one is failing.

One more sanity check before switching. Neither channel comes with an uptime promise you can lean on: Meta publishes no commercial SLA for the Cloud API, and an SMS route depends on carriers you have no relationship with. If login depends on a single channel, your login availability is that channel's availability, which is a good argument for keeping the fallback working even when it is expensive.

questions people ask

Is WhatsApp cheaper than SMS for OTPs?

Per message, yes in every country checked here. The gap is 59x in India and 58x in Nigeria, but only about 2x in Germany and 2.5x in the UK. Blended with an SMS fallback, real savings are typically 30% to 70%.

How much does a WhatsApp OTP cost?

Meta's authentication rate for the recipient's country: $0.0014 in India, $0.0034 in North America, $0.022 in the UK and $0.055 in Germany, on the rate card effective 1 October 2026.

What is the WhatsApp authentication-international rate?

A higher authentication rate that applies when your business is outside the recipient's country and you send more than 750,000 messages outside customer service windows in 30 days. It applies in nine countries including India, at $0.0304 instead of $0.0014.

Do I still need SMS if I send OTPs over WhatsApp?

Yes. Some users are not reachable on WhatsApp and some messages do not arrive, so every WhatsApp-first flow needs an SMS fallback. In the Indian example above, the fallback is 95% of the remaining bill.

Do I need DLT registration to send OTPs in India?

For domestic Indian SMS, yes: TRAI requires principal entity, header and content template registration, and unregistered traffic is not delivered. WhatsApp templates go through Meta's own approval instead.

Why is my SMS bill higher than the rate card?

Usually segments and carrier fees. Twilio bills per 160-character segment, and a single emoji or curly quote drops the limit to 70. In the US, each carrier adds a per-segment fee on top of Twilio's price.

The short version

Work out two numbers before anything else: the SMS rate you actually pay in each country, and the share of your users you can reach on WhatsApp. The published ratio between channels is dramatic in India, Nigeria and Indonesia, and unremarkable in Western Europe.

Then budget for the fallback, because it will be most of the bill. Send the WhatsApp template first, wait for a delivered status rather than a read one, fall back to SMS on a timer you have tested, and keep one code with one expiry across both channels. And if you are sending from outside the recipient's country at volume, check the authentication-international rate before promising anyone a 59x saving.

S

Sanjeev Sharma

Product Engineer at Acefone, building real-time communications at carrier scale: WhatsApp, voice and IVR in one agent inbox. Built and runs PostEngage, a WhatsApp automation SaaS, on his own. Contributor to litellm and the Vercel AI SDK. Takes on a small number of consulting engagements each year.