A WhatsApp link that arrives exactly as you typed it
Type the number and the message once. Copy the link, or print the QR code — every character is encoded, so emoji, ampersands and line breaks all survive the trip.
🔒 100% client-side · zero server upload
Type a number and the link, the preview and the code appear together — there is no Run button.
- Type the number customers should message. The page tells you which number it read back.
- Type the message. Emoji and line breaks are encoded, not stripped.
- Copy the link, or download the QR after the code has been decoded back.
What WhatsApp will show
Nothing is sent from this page: no account, no upload, no WhatsApp Business API. This tool cannot tell you whether anyone clicked, either — counting clicks needs a redirect service, and this site deliberately runs none.
Malaysian rules & edge cases
WhatsApp answers the same request at two addresses, and only one of them is safe to print. A wa.me link replies with a redirect to api.whatsapp.com/send, and during that hop every 4-byte UTF-8 character is rewritten to %EF%BF%BD — U+FFFD, the replacement character. So an emoji typed into a wa.me link arrives at WhatsApp as a black diamond with a question mark inside it, while Chinese and Malay text (three bytes per character) come through unharmed. That asymmetry is what makes the bug so easy to miss. This tool builds api.whatsapp.com/send links directly, so there is no hop to rewrite anything, and it proves the result by decoding the QR code back to the exact string it drew.
The second failure is quieter. A link written by hand as ?text=Harga RM89 & ada stok arrives as Harga RM89 : WhatsApp ends the message at the & and everything after it is gone. Every message here is percent-encoded, so the ampersand travels as %26, quotes as %22 and a newline as %0A — which WhatsApp draws as a line break.
| You type | The link carries |
|---|---|
012-345 6789 | +60 12 345 6789 |
+60 12-345 6789 | +60 12 345 6789 |
60123456789 | +60 12 345 6789 |
0060123456789 | +60 12 345 6789 |
+65 9123 4567 | +65 9123 4567 · SG +65 |
12345 | — Too few digits for a phone number. |
- Malaysian numbers are read, not rewritten. A leading
0is the national trunk prefix and means+60;0060is the same thing written the way a fax machine prints it. The number is parsed with the same Google numbering library the rest of this site uses, so an impossible length is refused with a reason instead of being cleaned up into something dialable. - A foreign number is accepted, and named.
+65 9123 4567builds a Singapore link — and the field says which country code it used, because a link that silently assumes +60 for a Singapore number is a link that rings a stranger in Johor. - There is no documented length limit for click-to-chat. The 4,096 figure that gets quoted belongs to the Cloud API body, a different product. What is real is Chrome's practical whole-URL ceiling of about 2,057 characters, and non-ASCII text costs three to four bytes per character once encoded. The page counts the whole encoded URL and warns past 2,000; it does not block, because a long link that works is better than a tool that ate the message.
- Newlines survive. A line break in the textarea becomes
%0Aand a line break in the chat — not one long paragraph with the punctuation squeezed out. - The QR is print-grade or it is not offered. Four modules of quiet zone (ISO 18004), whole pixels per module at 300 dpi, error correction Q by default and H only if you plan to cover part of the code. Below about 2.5 cm a printed code stops scanning on cheap phone cameras under shop lighting, and the page says so instead of shipping a pretty sticker that fails at the counter.
- Reading it back is the promise. After drawing, the code is decoded with the same kind of scanner a phone uses and compared character for character with the link. If the two differ, the download buttons never appear — a QR that opens the wrong chat is worse than no QR.
- What this page is not. It does not send messages, it does not use the WhatsApp Business API, and it cannot tell you whether anyone clicked. Counting clicks needs a redirect service in the middle of the link; this site deliberately runs none, so the honest answer is that a scan is invisible to it.
Before and after
Before
012-345 6789
Hai! Baju kurung Raya masih ada 😊
Harga RM89 — nak tempah? After
https://api.whatsapp.com/send?phone=60123456789&text=Hai%21%20Baju%20kurung%20Raya%20masih%20ada%20%F0%9F%98%8A%0AHarga%20RM89%20%E2%80%94%20nak%20tempah%3F How it works
- Type the number customers should message. Any Malaysian shape works — 012-345 6789, +60 12-345 6789, 60123456789 — and the line under the field tells you which number it read back.
- Type the message. Emoji, ampersands and line breaks are all encoded; check the “what WhatsApp will show” block against what you meant, because that block is the decoded link, not a copy of your typing.
- Copy the link, or pick a print size and download the QR. The code is decoded back first: if it does not read as the same link, no download is offered.
FAQ
Why not just use a wa.me link?
Because wa.me redirects, and the redirect rewrites every 4-byte UTF-8 character to %EF%BF%BD. That is every emoji. A message that looks perfect in your browser arrives at WhatsApp with black diamonds where the emoji were, and because Chinese and Malay text survive, the problem looks random. api.whatsapp.com/send serves the same page with no redirect and no rewrite, so this tool builds that address.
Does this actually send a WhatsApp message?
No. The link only opens WhatsApp with the number and the message already filled in; the sender still has to press Send. Nothing is transmitted from this page, there is no account, no upload, and no WhatsApp Business API key anywhere near it.
Can I see how many people scanned the QR code?
Not with this tool, and anyone who says otherwise is selling you a redirect. Click counting requires a link that points at a service which logs the visit and forwards to WhatsApp — a third party in the middle of a customer conversation. This site runs no such service, so a scan is invisible here. If you need numbers, use a link shortener that you control and accept that it sees every click.
How long can the message be?
There is no documented limit for click-to-chat; the 4,096 figure belongs to the Cloud API. The limit that bites in practice is the browser: Chrome stops following a URL at around 2,057 characters, and an emoji costs four of them once encoded. The page counts the whole encoded URL and warns past 2,000 characters. Keep a prefill to a couple of lines anyway — a wall of text in a chat is a message people close.
Will a small sticker still scan?
Below about 2.5 cm, no, not reliably: cheap phone cameras need roughly 8 pixels per module under shop lighting, and a 29-module code at 2 cm cannot provide them. Print at 5 cm for a shopfront, 3 cm for a table card, and always scan the printed sheet with two phones before you order fifty of them. The page reports the size that survives rounding, not the size you asked for.