One rate for every Malaysian mobile network. You pay per SMS segment actually sent — nothing else.
per 160-character segment · all Malaysian networks
SMS is billed per segment, not per message. This is an industry-wide standard, not our rule — but plenty of providers don't explain it, so here it is.
| Message content | Encoding | Characters per segment | Cost per recipient |
|---|---|---|---|
| English only | GSM-7 | 160 | RM0.20 |
| English, 300 characters | GSM-7 | 153 × 2 segments | RM0.40 |
| Any Chinese / Tamil / emoji | Unicode | 70 | RM0.20 |
| Chinese, 100 characters | Unicode | 67 × 2 segments | RM0.40 |
A single emoji anywhere in your message flips the whole thing to Unicode and cuts your per-segment allowance from 160 to 70. Our dashboard shows the segment count and total cost live as you type, so this never surprises you at checkout.
Per-segment pricing only becomes concrete when you put a message next to it. These are worked
examples at RM0.20 per segment — the arithmetic is segments × recipients × RM0.20.
| What you send | Chars | Segments | To 1,000 people |
|---|---|---|---|
| OTP: Your code is 481203. Valid 5 minutes. | 40 | 1 | RM200 |
| Booking reminder with date, time and address | 145 | 1 | RM200 |
| Promo with brand, offer, link and STOP | 158 | 1 | RM200 |
| The same promo, 12 characters longer | 170 | 2 | RM400 |
| The same promo with one emoji added | 159 | 3 | RM600 |
| Chinese notice, 60 characters | 60 | 1 | RM200 |
| Chinese notice, 90 characters | 90 | 2 | RM400 |
Rows four and five are the ones that catch people. Twelve extra characters double the bill. One emoji triples it, because it converts the whole message to Unicode and drops the per-segment allowance from 160 characters to 70. Nothing about the offer changed.
Paste your draft into the SMS segment calculator before you commit a budget. It counts what you will actually be billed, including the operator prefix described below.
A message longer than one segment is not sent as two independent messages. It is split, and each part carries a small header telling the handset how to reassemble them in order. That header occupies space inside the segment, which is why the allowance drops once you cross the boundary:
| Encoding | Fits in one segment | Per segment once split | Lost to the header |
|---|---|---|---|
| GSM-7 (plain English) | 160 | 153 | 7 characters |
| Unicode (any Chinese, Tamil, emoji) | 70 | 67 | 3 characters |
So 161 characters of English is 2 segments (not 1 + a bit), and 306 characters is 2 — but 307 is 3. The awkward consequence: trimming a message from 161 to 160 characters halves its cost, and no other single edit on this page saves you as much.
One more thing specific to Malaysian commercial routes: operators prepend a short prefix to commercial traffic, and those characters come out of your allowance rather than theirs. A message you measured at exactly 160 characters in a text editor can bill as 2 segments. Our calculator and the send screen both count the prefix, so the number you see before confirming is the number you are charged.
This is the part most pricing pages skip, and it is where invoices stop matching expectations. Operators bill on submission, not on delivery — so the honest answer is that some messages that never reach a handset are still billable, and we would rather say so here than argue about it later.
| Outcome | What happened | Charged? |
|---|---|---|
| Delivered | The network confirmed it reached the handset | Yes |
| Sent | Submitted to the operator, final receipt not back yet | Yes |
| Undelivered | Accepted by the operator but never reached the handset — phone off for days, number recycled, content filtered | Yes — the operator billed us for it |
| Rejected | Never submitted at all — invalid number format, blocked content, duplicate in your list | No — refunded automatically |
Your delivery report separates these four rather than collapsing them into one "failed" number, because two of them are billable and two are not. If a provider shows you a single failure count, you cannot reconcile their invoice even in principle. More on the mechanics: why SMS is not delivered in Malaysia.
Protected brand names. Malaysian operators penalise messages containing protected international brand names at RM1.50 per segment — seven and a half times the price of the message. A 1,000-recipient promo mentioning one is a RM1,500 penalty on RM200 of traffic. We screen for this and reject the message before charging you, rather than sending it and passing you the penalty weeks later.
Duplicates in your list. The same number three times is three charges and one irritated recipient. We de-duplicate before quoting you, so the price you see is for unique recipients.
There is no API plan, no developer tier and no per-request fee. A message sent through the REST API costs exactly what the same message costs from the web console — RM0.20 per segment, from the same prepaid balance.
| Item | Cost |
|---|---|
| Sending an SMS segment | RM0.20 |
| API access | Free |
| API keys (multiple, revocable) | Free |
| Per-number delivery reports | Free |
| Sending from our shared short code | Free |
| Account setup | Free |
| Monthly platform fee | None |
| Minimum spend or contract | None |
| Credit expiry | Never expires |
The reason this matters for transactional sending: OTP and notification volume follows your business, not a plan. A quiet month should cost less, not the same as your busiest one. Prepaid credit with no monthly fee fits that shape; a subscription sized for your peak does not.
A dedicated short code or a registered brand sender ID are the two things that do carry operator charges, because the operators charge for them — see short code SMS and sender ID registration. Neither is required to start.
RM0.20 per segment on HantarSMS, the same rate for every Malaysian network. The cost of a message depends on how many segments it uses: 160 characters of English is one segment, and anything containing a non-English character drops that to 70.
No. No setup fee, no monthly fee, no minimum, no contract. You buy prepaid credit and it does not expire. If you send nothing for three months, it costs nothing.
Almost always encoding or length. One emoji, one Chinese character or a curly apostrophe pasted from a word processor converts the message to Unicode and cuts the per-segment allowance from 160 characters to 70. The other cause is crossing the 160-character line: at 161 characters you are billed for two segments.
It depends which kind of failure. Messages we could not submit at all — invalid numbers, blocked content — are rejected and refunded automatically. Messages the operator accepted but never delivered to the handset are charged, because the operator charged us on submission. Your report separates the two.
No. Same RM0.20 per segment, same balance, no API plan or per-request fee. API keys are free and you can hold several.
Same RM0.20 per segment, but a Unicode segment holds 70 characters instead of 160 — so Chinese text costs roughly 2.3× more per character than English. A 60-character Chinese notice is one segment; at 71 characters it becomes two.
Above roughly 50,000 SMS a month, yes — priced case by case rather than from a published tier table. Message us with your monthly volume and message type.
Yes. We load free trial credit on request so you can send real messages to your own handset and read the delivery report before spending anything.
Sending consistently above 50,000 SMS a month? Message us — we price that case by case rather than publishing a tier table we'd have to keep revising.
We'll load free trial credit so you can send a real SMS before spending anything.