Para montar um link wa.me com acentos sem quebrar a URL, você precisa de duas coisas: o número só com dígitos, no formato internacional, e o texto da mensagem codificado em UTF-8 com percent-encoding antes de entrar no parâmetro text. Em JavaScript, isso é uma chamada de encodeURIComponent. Em Python, um quote com safe vazio. O resto do artigo explica por que cada detalhe existe e onde os links costumam quebrar mesmo quando parecem certos.
A anatomia do endereço, peça por peça
- Base: https://wa.me/ seguido do número.
- Número: código do país, DDD e telefone, só dígitos.
- Texto (opcional): ?text= seguido da mensagem codificada.
Um exemplo completo, com número fictício, fica assim: https://wa.me/5512999990000?text=Ol%C3%A1%21%20Quero%20um%20or%C3%A7amento. Ao ser aberto, o endereço responde com um redirecionamento HTTP 302 para api.whatsapp.com/send/, que recebe phone e text como parâmetros e acrescenta alguns próprios, como type=phone_number. Dá para ver isso com um simples curl -I no terminal.
Esse redirecionamento importa por um motivo prático: o texto passa por dois servidores e dois parsers de URL antes de chegar ao aplicativo. Qualquer caractere mal codificado tem duas chances de ser interpretado de forma errada.
Por que o domínio wa.me e não o api.whatsapp.com direto?
Os dois funcionam, mas o wa.me é o formato curto que o próprio WhatsApp divulga para links de clique para conversar. É mais fácil de ler, de ditar e de reconhecer como legítimo. Montar direto no endereço de destino do redirecionamento amarra o link a um detalhe de implementação que o serviço pode mudar.
O acento quebra o link, e o espaço também

A especificação de URIs, a RFC 3986, define um conjunto pequeno de caracteres que podem aparecer livremente num endereço: letras sem acento, dígitos e alguns símbolos. Todo o resto precisa ser representado em percent-encoding, um sinal de porcentagem seguido de dois dígitos hexadecimais para cada byte.
O detalhe que pega muita gente é que a conversão é feita sobre os bytes em UTF-8, não sobre o caractere. Uma letra acentuada vira dois bytes; um emoji, quatro. A tabela mostra os casos mais comuns numa mensagem em português:
| Caractere | Codificado | Bytes | Se ficar sem codificar |
|---|---|---|---|
| espaço | %20 | 1 | Link cortado no primeiro espaço em muitos apps |
| á | %C3%A1 | 2 | Caractere trocado por símbolos estranhos |
| ç | %C3%A7 | 2 | Idem |
| & | %26 | 1 | Texto termina ali; o resto vira outro parâmetro |
| # | %23 | 1 | Tudo depois vira fragmento e não é enviado |
| ? | %3F | 1 | Pode ser lido como início de outra query |
| quebra de linha | %0A | 1 | Link quebra em duas linhas ao ser colado |
| 😀 | %F0%9F%98%80 | 4 | Emoji vira losangos com interrogação |
O & e o # são os vilões silenciosos. Uma mensagem como “Quero orçamento de mesa & cadeiras” montada sem codificação chega ao WhatsApp como “Quero orçamento de mesa ”. O navegador entendeu que “ cadeiras” era outro parâmetro, e nenhum erro aparece em lugar nenhum.
encodeURIComponent, URLSearchParams e o problema do sinal de mais
No navegador e no Node, a função certa para codificar o valor de um parâmetro é encodeURIComponent. A documentação da MDN sobre encodeURIComponent lista os caracteres que ela deixa intactos: letras, dígitos e os símbolos – _ . ! ~ * ‘ ( ). Todo o resto é convertido, incluindo &, #, ? e acentos.
Duas armadilhas aparecem com frequência em código de produção:
- Usar encodeURI no lugar de encodeURIComponent. A primeira foi feita para endereços inteiros e, por isso, preserva &, ? e #. Aplicada só ao texto, deixa passar exatamente os caracteres que quebram o parâmetro.
- Montar a query com URLSearchParams e esperar %20. URLSearchParams segue o formato application/x-www-form-urlencoded, que representa espaço como “+”. O Python faz o mesmo com urlencode. Muitos destinos aceitam o “+” como espaço, mas depender disso num redirecionamento que você não controla é desnecessário. Se quiser previsibilidade, use encodeURIComponent (ou quote(texto, safe=””) em Python) e concatene o resultado.
A terceira armadilha é a codificação dupla. Se o texto já veio codificado de um formulário e você codifica de novo, o %20 vira %2520 e o cliente recebe a mensagem cheia de porcentagens. Codifique uma única vez, no último momento antes de montar a string.
O número também tem regras
Metade dos links “quebrados” que chegam ao suporte não tem problema no texto, e sim no telefone. O parâmetro do número aceita apenas dígitos, no formato internacional completo:
- sem sinal de mais, parênteses, hífen ou espaço;
- sem o zero de operadora ou de DDD na frente;
- com o código do país (55 no Brasil) seguido do DDD e do número;
- com o nono dígito em celulares brasileiros.
Uma normalização simples resolve quase tudo: remover tudo o que não é dígito, tirar zeros à esquerda e prefixar o código do país quando ele não estiver presente. O que nenhuma validação de formato descobre é se o número tem conta ativa. O gerador da Geobot assume essa limitação de forma explícita: ele confere se o formato faz sentido, mas não verifica se existe um WhatsApp por trás do número.
Quebra de linha, emoji e o tamanho da mensagem
Quebras de linha funcionam com %0A e deixam a mensagem pré-preenchida mais legível quando ela tem duas partes (“Olá!” numa linha, a pergunta na outra). Emojis funcionam, mas cada um soma quatro bytes codificados, ou doze caracteres no endereço.
A especificação não fixa um limite de tamanho para URLs, mas navegadores, encurtadores, redes sociais e campos de formulário impõem os seus. Mensagens longas também têm um custo de experiência: o cliente precisa rolar a caixa de texto para ver o que vai mandar. Ferramentas de geração costumam limitar o texto por esse motivo; a da Geobot, por exemplo, aceita até mil caracteres na mensagem inicial. Na prática, uma ou duas frases bastam.
Quando montar à mão e quando usar ferramenta
Se você está construindo um sistema que gera links dinamicamente (um por produto do catálogo, um por vendedor, um por pedido), monte no código, com as funções certas e testes automatizados que cubram acento, &, # e emoji. Esse é o caso em que entender a anatomia vale o esforço. E se o objetivo final é encadear o link com automações de atendimento, a lógica de fluxos é a mesma explicada no guia sobre como criar fluxos inteligentes para o WhatsApp Business.
Para links fixos (bio, assinatura de e-mail, um anúncio), escrever código é exagero. Um gerador de link wa.me resolve a codificação e mostra uma prévia da conversa. É o que a Geobot oferece de graça: o usuário digita número e texto, e a ferramenta devolve o endereço pronto, sem que ninguém precise lembrar de tabelas de bytes. Para a equipe de marketing, isso significa montar o link sem programar e sem abrir chamado para o time de desenvolvimento.
Num site, o link costuma ser só a ponta. O mesmo endereço pode alimentar um botão flutuante de WhatsApp para sites, gerado como um trecho de código para colar no HTML; a Geobot tem um gerador separado só para isso. Quem precisa ir além, conectando o canal a um CRM ou a outro sistema, encontra os detalhes na documentação de integrações da plataforma, e pode evoluir para automação de WhatsApp com fluxos e encaminhamento entre departamentos.
Os quatro testes antes de publicar
Qualquer que seja o caminho, um link só está pronto depois de quatro verificações:
- Abrir no celular com WhatsApp instalado e ler a mensagem que aparece na caixa de texto, caractere por caractere.
- Abrir no computador e ver se a página intermediária mostra o número certo.
- Colar o link no aplicativo onde ele vai circular (Instagram, e-mail, WhatsApp) e conferir se a prévia não cortou nada.
- Testar uma mensagem com &, # e um acento, mesmo que a versão final não tenha esses caracteres. Se o seu código passa nesse teste, ele está codificando de verdade.
Feito isso, guarde o endereço final num lugar versionado. Link de contato é infraestrutura: quando alguém “só ajusta o texto” sem passar pela codificação, é ali que o próximo bug começa.
Para o caso mais comum, aquele link do WhatsApp com texto pré-preenchido que vai para a bio ou para um anúncio, a recomendação é direta: gere, teste nos quatro passos e só então publique.











