Migrar SMS de outro provedor
Use este guia para mover SMS de produção de outro provedor para Bird. Duas coisas bloqueiam o primeiro envio aqui que seu provedor atual trata de forma diferente, por isso vêm antes do código: os países para os quais você envia e o remetente de onde você envia. Depois disso, porte a chamada de envio, transfira sua lista de opt-out, redirecione relatórios de entrega para webhooks e teste contra destinos simulados antes de mover o tráfego real.
Checklist da migração:
- Habilite seus países de destino
- Configure um remetente
- Mapeie a chamada de envio para POST /v1/sms/messages
- Transfira sua lista de opt-out
- Redirecione relatórios de entrega para webhooks
- Teste contra destinos simulados antes da virada
Os passos 3, 4 e 5 dependem de qual provedor você está deixando. Seu guia do provedor tem o mapeamento campo a campo do payload, a tradução de status e eventos, e onde obter sua lista de opt-out.
Comece pelos passos 1 e 2. O registro de remetente é o caminho crítico em uma migração de SMS: a análise da operadora e do registro pode demorar mais que a mudança de código. Avalie ambos antes de definir uma data de virada.
1. Habilite seus países de destino
Seu espaço de trabalho tem uma lista de destinos permitidos que nega por padrão e começa apenas com o país de origem da sua organização habilitado. Um envio para qualquer outro lugar retorna 422 SMSDestinationNotEnabled antes que Bird resolva um remetente, então uma integração que você portou fielmente ainda falha na primeira mensagem internacional até você abrir o país.
Habilite todos os países para os quais você envia em SMS > Destinations. Extraia a lista dos logs de mensagens do seu provedor atual em vez de confiar na memória: um país que você esquecer é uma falha silenciosa no dia da virada, e um país que você habilitar mas nunca usar é uma exposição desnecessária. Negar por padrão também é o que limita o dano de SMS pumping, em que tráfego fraudulento para faixas premium é cobrado de você.
2. Configure um remetente
Em um envio de texto livre, from é o remetente que seu destinatário vê, e assume uma de três formas: um sender ID alfanumérico, um número de telefone em E.164 que seu espaço de trabalho possui, ou um short code. Quais formas funcionam depende do país de destino, e um remetente que não é válido lá é rejeitado com um 422 indicando o motivo. Enviando SMS tem as regras por forma.
Como obter cada um:
- Sender IDs alfanuméricos você cria em SMS > Senders. Quando o país de destino exige que o sender ID seja registrado, envie o registro lá e aguarde a aprovação antes de direcionar tráfego para ele.
- Tráfego comercial nos EUA via long codes locais precisa da marca e campanha 10DLC aplicável, configuradas em SMS > 10DLC, enquanto números toll-free e short codes dedicados têm seus próprios programas de verificação ou aplicação. Os EUA não aceitam sender IDs alfanuméricos, então um sender ID europeu que funciona em todo lugar não tem equivalente nos EUA.
- Números são obtidos pelo fluxo de Numbers, com disponibilidade e provisionamento gerenciado dependentes do tipo e destino. Consulte números SMS para o caminho correto; adicionar um sender alfanumérico não adquire um número.
- Manter seus números atuais não é autoatendimento: Bird não tem um fluxo de portabilidade que você possa conduzir pelo dashboard. Se seus assinantes respondem a números que você possui, solicite a portabilidade ao suporte antes de agendar uma data de virada, e planeje para que a portabilidade e a mudança de código sejam eventos separados.
Um envio via template de sistema usa um formato de solicitação diferente. Ele ainda precisa do destino e da permissão do destinatário aplicáveis. Ele fornece o corpo, a categoria e o remetente, então from não é aceito junto com ele e Bird escolhe um remetente válido para o destino.
3. Mapeie a chamada de envio
O endpoint de envio único é POST /v1/sms/messages. Monte um payload JSON com to, from, text e category, e uma chamada bem-sucedida retorna 202 Accepted com um ID de mensagem prefixado por sms_. A entrega acontece após a resposta e chega a você por eventos de webhook e pelos endpoints de leitura. O payload completo está em Enviando SMS; o mapeamento campo a campo do seu payload atual está no seu guia do provedor.
Antes de portar o código, considere estas diferenças:
- Um destinatário por solicitação. Bird não tem array de destinatários. Se seu provedor atual distribui uma chamada para vários números, isso se torna uma chamada por destinatário, ou um batch de mensagens independentes em uma única solicitação.
- category é obrigatório em texto livre, e pode ser transactional, marketing, authentication ou service. A maioria dos provedores infere a intenção a partir da campanha ou do remetente; aqui você declara por mensagem, e quando o país de destino exige que o remetente seja registrado, esse registro é aprovado para uma categoria e um envio fora dela é rejeitado com 422 SenderCategoryNotPermitted. O status active do remetente não consegue informar isso antecipadamente, porque é reportado sem referência a nenhuma categoria; consulte os requisitos por país. Acerte na portabilidade em vez de padronizar tudo com um único valor.
- O corpo é limitado em segmentos, e Bird não trunca. Um corpo mais longo é rejeitado com 422. Caracteres não GSM-7 reduzem pela metade o que cabe em um segmento, então se seu provedor atual transliterava silenciosamente aspas curvas e travessões, ative options.smart_encoding para manter as contagens de segmentos com as quais você está acostumado. Está desativado por padrão porque altera o corpo que você compôs.
- Use tags para dimensões de filtro e metadata para contexto. Tags são pares {name, value} pelos quais você pode filtrar e segmentar analytics; metadata é JSON arbitrário que Bird armazena, retorna em leituras e repete em cada evento de webhook. Um campo de referência de cliente único no seu provedor antigo geralmente mapeia para metadata.
- Agendamento de envio individual e MMS de saída precisam de um plano separado. scheduled_at, media_urls, validity_period e personalization por destinatário são campos reservados, rejeitados com 422 SMSUnsupportedFeature. Essas partes da sua integração não migram junto com o resto: mantenha envios agendados na sua própria fila e chame o endpoint de envio no horário de submissão desejado. Para campanhas de audiência, avalie Broadcasts separadamente; um broadcast não é uma renomeação de campo de endpoint.
- Use Idempotency-Key para retentativas limitadas. Envie uma chave única por mensagem lógica e reutilize-a para retentativas da mesma solicitação dentro da janela de replay de três horas. Replays reduzem solicitações duplicadas, mas não são uma garantia de entrega exatamente uma vez. Veja Idempotency.
4. Transfira sua lista de opt-out
Importe seus opt-outs antes do primeiro envio de produção. Enviar mensagem para alguém que pediu ao seu provedor antigo para parar é a falha de conformidade que arruina uma migração, e nem a operadora nem o regulador se importa com qual fornecedor perdeu o registro.
Uma supressão Bird cobre um par remetente-e-assinante, que pode ser mais restrito que o bloqueio por serviço, perfil ou conta do seu provedor antigo. Preserve a revogação real da pessoa em todos os remetentes e programas relevantes. Adicione cada par com POST /v1/sms/suppressions:
Exemplo de código
while IFS=, read -r destination originator; do
curl -s -X POST https://us1.platform.bird.com/v1/sms/suppressions \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"destination\": \"$destination\", \"originator\": \"$originator\"}"
done < opt-outs.csvA mesma importação é executada a partir do CLI como bird sms suppressions add --destination +15550001234 --originator +15557654321.
Duas coisas para saber sobre a importação:
- Ambas as pontas são obrigatórias para supressões específicas de remetente. Um opt-out para todo o espaço de trabalho pertence ao preference owner separado. A chamada é idempotente: 201 registra uma nova supressão, 200 retorna a manual já existente, então reexecutar uma importação parcial é seguro.
- Pares importados recebem reason: manual, que bloqueia todas as categorias incluindo transacional. Isso é mais restritivo que uma supressão que Bird registra a partir de uma palavra-chave de parada. Se um assinante cancelou apenas marketing, decida deliberadamente se deve importar esse par.
Revise o comportamento existente de palavras-chave e preferências antes de desativar o código. Bird responde a palavras-chave suportadas e registra supressões onde seu catálogo de países se aplica. Mantenha o tratamento para solicitações não suportadas, preferências mais amplas e outros canais de contato. Palavras-chave e respostas de campanha personalizadas usam Keyword rules. Veja Opt-outs and keywords para cobertura e escopo.
5. Redirecione relatórios de entrega para webhooks
Registre um endpoint com POST /v1/webhooks e inscreva-o em uma lista explícita de tipos de evento. Esta é a mudança estrutural que a maioria dos provedores exige: em vez de uma URL de callback por mensagem ou por número, seu espaço de trabalho tem endpoints, e cada endpoint se inscreve nos eventos que deseja.
Os nomes de evento de Bird seguem resource.action. O caminho feliz é sms.accepted, depois sms.sent, depois sms.delivered, com sms.undelivered, sms.failed, sms.expired e sms.rejected cobrindo o restante, e sms.received trazendo respostas aos seus números. A tradução do vocabulário de status do seu provedor atual está no seu guia do provedor, e os payloads por evento estão em eventos SMS.
A correlação porta sem problemas. Cada evento carrega sms_id, workspace_id, to e from, e repete tags e metadata do envio, então seu handler lê seus próprios identificadores direto do evento em vez de buscar a mensagem.
Duas mecânicas para portar com o handler:
- Entregas são assinadas conforme Standard Webhooks, usando os headers webhook-id, webhook-timestamp e webhook-signature com um HMAC-SHA256 sobre {id}.{timestamp}.{raw body}. Provedores que assinam com esquema próprio precisam trocar a verificação; a receita está em Webhooks & events.
- A entrega é at-least-once e sem ordem garantida. Deduplique por webhook-id e ordene pelo timestamp do payload, nunca pela ordem de chegada.
Mensagens de entrada seguem o mesmo modelo. Inscreva-se em sms.received uma vez para o espaço de trabalho em vez de configurar uma URL de entrada por número, e lembre que Bird ainda emite sms.received para uma resposta que correspondeu a uma palavra-chave de parada, após registrar a supressão.
6. Teste contra destinos simulados
Bird sintetiza resultados de entrega para um conjunto de destinos de teste, então você pode exercitar seu caminho de envio portado e seu handler de webhook contra respostas reais de API e entregas assinadas reais sem um aparelho. Estes são os mesmos números que vários provedores usam para credenciais de teste, e uma mensagem para um deles nunca chega a uma operadora.
| Destino | O que sua integração vê |
|---|---|
| +15005550001 | Rejeitado na submissão com invalid_destination |
| +15005550002 | sms.sent, depois sms.undelivered com unreachable |
| +15005550003 | sms.sent, depois sms.failed com provider_unavailable |
| +15005550004 | sms.sent, depois sms.failed com blocked_by_carrier |
| +15005550006 | sms.sent, depois sms.delivered |
| +15005550009 | sms.sent, depois sms.failed com recipient_opted_out |
Três condições se aplicam, e as duas primeiras pegam as pessoas de surpresa em um espaço de trabalho novo:
- Estes são números dos EUA, então os Estados Unidos devem estar habilitados em Destinations, e from deve ser um remetente válido para os EUA. Um sender ID alfanumérico é rejeitado lá.
- Um envio simulado é cobrado na tarifa normal do destino. Nada chega a um aparelho, mas a cobrança na carteira é real, então dimensione seu smoke test de acordo.
- O resultado vem apenas do destino. Não há credencial de teste separada nem modo de teste para desativar.
Um smoke test funcional envia para +15005550006 e verifica que seu handler percorre sms.accepted até sms.sent até sms.delivered; envia para +15005550002 e +15005550009 e verifica que seu tratamento de falha e opt-out dispara no código error correto; e envia uma mensagem real para um aparelho que você controla para confirmar que o remetente e o corpo renderizam como esperado.
Depois, faça a virada por fatia de tráfego em vez de tudo de uma vez. Mova uma pequena porcentagem de envios de produção para Bird, monitore o log de SMS e as métricas quanto a taxas de entrega e códigos de erro em comparação com o que seu provedor antigo reportava para as mesmas rotas, e aumente a fatia conforme os números se mantêm. Mantenha a integração antiga implantável até que o primeiro período de faturamento completo pareça correto.
Migrando de um provedor específico
- Twilio: PascalCase form-encoded para JSON, Messaging Services para remetentes, StatusCallback para webhooks inscritos
- Plivo: src e dst para from e to, Powerpacks para remetentes, pares DND para supressões
- Telnyx: o envio mais próximo do de Bird, messaging profiles desmembrados em remetentes e inscrições, opt-outs no nível de perfil para pares
- Bandwidth: dois hosts para um, callbacks applicationId para webhooks do espaço de trabalho, e uma lista de opt-out que sua própria aplicação já mantém
- Sinch: batches para envios individuais, body para text, membership de grupo reconstruída como supressões
- Infobip: um payload de três níveis achatado, uma URL base por conta para um host regional, uma Blocklist expandida para pares
- Bird Connectivity Platform: o rest.messagebird.com API, originator e recipients para from e to, callbacks GET reportUrl para webhooks assinados
Próximos passos
-
Comparar provedores de SMS: avalie o fluxo de trabalho do produto e as considerações de migração
-
Enviando SMS: o payload completo de envio, remetentes, segmentos e o modelo assíncrono 202
-
Opt-outs and keywords: o que Bird responde por você e como gerenciar supressões
-
Eventos SMS: o vocabulário de eventos e payloads por evento
-
Webhooks & events: configuração de endpoint, verificação de assinatura, retentativas e replay
Recursos relacionados
Continue com a documentação, guias e exemplos sobre este tópico. Os recursos estão em inglês.