Mensagens em Massa / Campanhas
← Voltar para o Índice da Documentação
Visão Geral
O recurso de campanhas envia uma única mensagem de texto simples para muitos destinatários enquanto protege o SMSC de sobrecarga. Você faz o upload de uma lista de destinatários nomeada uma vez, e então executa uma ou mais campanhas contra ela. Cada campanha distribui mensagens na fila normal de mensagens a uma taxa configurável e relata o progresso ao vivo e as estatísticas de entrega.
Dois objetos reutilizáveis:
| Objeto | O que é |
|---|---|
| Lista de Campanhas | Um conjunto nomeado e reutilizável de MSISDNs de destinatários, cada um com até quatro variáveis opcionais. Faça o upload uma vez (array JSON ou CSV), reutilize em campanhas. |
| Campanha | Uma execução de envio: uma lista (ou todos os assinantes ativos) + um modelo de mensagem, distribuído na fila. |
Tudo é exposto através da API HTTP. Todo o estado é armazenado no Mnesia junto com o restante do SMSC.
Segmentação: listas e o padrão de assinantes ativos
Os destinatários de uma campanha vêm de uma das duas fontes:
- Uma lista de destinatários (
list_id) — os MSISDNs que você enviou. - Nenhuma lista — se você criar uma campanha sem um
list_id, ela segmenta todos os assinantes atualmente ativos (registrados) — cada MSISDN com um registro não expirado no armazenamento de localização no momento em que a campanha começa. Esta é a maneira mais fácil de alcançar "todos na rede agora".
Variáveis por destinatário e modelagem
Cada destinatário da lista pode carregar até quatro variáveis — var1, var2, var3,
var4 — para coisas como primeiro nome, sobrenome ou nome do plano. A mensagem da campanha
é um modelo: {{ var1 }}…{{ var4 }} (e {{ msisdn }}) são
inseridos para cada destinatário quando a mensagem é enviada. O espaço em branco dentro das
chaves é opcional, e qualquer espaço reservado sem valor é renderizado como uma string vazia.
A modelagem é deliberadamente mínima — substituição de variáveis apenas (sem condicionais ou filtros), portanto, não há dependência extra e nenhuma surpresa no que os assinantes recebem.
Fazendo upload de variáveis via CSV — a coluna MSISDN é a chamada
msisdn/destination_msisdn/number/phone (ou a primeira coluna se nenhuma for
nomeada); cada outra coluna se torna var1…var4 na ordem das colunas:
msisdn,first,last,plan
12025550101,Alice,Smith,Gold
12025550102,Bob,Jones,Silver
Fazendo upload de variáveis via JSON — objetos de destinatários podem definir as variáveis diretamente:
{ "name": "VIPs", "recipients": [
{ "msisdn": "12025550101", "var1": "Alice", "var2": "Gold" }
] }
Exemplo de modelo:
Oi {{ var1 }}, seu plano {{ var2 }} renova em breve. Responda STOP para cancelar.
Para o destinatário 12025550101 acima (var1=Alice, var2=Gold) isso envia:
Oi Alice, seu plano Gold renova em breve. Responda STOP para cancelar.
Filtro de público
Quando uma campanha usa uma lista, a flag audience decide quem realmente recebe uma
mensagem:
| Público | Comportamento |
|---|---|
active_only (padrão) | Apenas membros da lista que estão registrados (uma localização não expirada) no momento em que a campanha começa. Todos os outros são registrados como skipped_inactive e nunca recebem. |
all | Cada membro da lista, independentemente do registro. |
A verificação de registro é uma foto tirada no momento do início — assinantes que
se registram depois não são considerados. Quando uma campanha não tem lista, o conjunto de destinatários
já é a base de assinantes ativos, então audience é implicitamente
active_only e qualquer valor fornecido é ignorado.
Ciclo de Vida
- draft — criado, ainda sem alvos.
- start — a campanha captura seus alvos (de sua lista ou da base de assinantes ativos), e então passa para running. Se não há nada para enviar, ela vai direto para completed.
- running — o trabalhador de distribuição envia mensagens para a fila.
- pause / resume — parar temporariamente / continuar a distribuição.
- completed — cada alvo foi distribuído na fila (a entrega continua assíncronamente, e as estatísticas de entrega continuam a ser atualizadas).
- cancelled — parado permanentemente.
Excluindo uma campanha
Excluir uma campanha a para, mas mantém o registro — ela é cancelada em vez de
excluída, então seu histórico e estatísticas finais permanecem visíveis. Campanhas paradas e
completadas são removidas automaticamente uma vez que envelhecem além do TTL de retenção
(campaign_retention_hours, padrão 7 dias).
Taxa de Distribuição (proteção contra sobrecarga)
Cada campanha tem um drip_tps (mensagens submetidas na fila por segundo,
padrão da configuração). Um trabalhador em segundo plano acorda em um intervalo fixo e
submete no máximo drip_tps × interval mensagens por campanha por tick — assim, uma campanha
de um milhão de destinatários nunca inunda a fila. A taxa é por campanha; várias
campanhas em execução cada uma distribui em sua própria taxa.
Progresso e estatísticas de entrega
Cada objeto de campanha inclui um bloco stats ao vivo (poll GET /api/campaigns/:id):
| Campo | Significado |
|---|---|
total | Alvos capturados no início |
pending | Ainda não distribuídos na fila |
queued | Submetidos, aguardando um relatório de entrega |
delivered | Confirmado como entregue |
failed | Falha na entrega / marcado como carta morta |
skipped_inactive | Ignorado porque não registrado no início |
dispatched | queued + delivered + failed |
progress_percent | Percentual de alvos que não estão mais pending |
delivery_percent | Percentual de mensagens enviadas entregues |
Contagens de entrega e falha são atualizadas automaticamente à medida que os relatórios de entrega fluem de volta
através do caminho normal de entrega do SMSC. Detalhes por destinatário (e filtragem por
estado, por exemplo, todos que falharam) estão disponíveis via
GET /api/campaign_targets/:id?state=failed.
Configuração
config :sms_c, :campaigns,
# Iniciar o trabalhador de distribuição (defina como falso para pausar TODA entrega de campanhas)
enabled: true,
# Intervalo entre ticks de distribuição em milissegundos
drip_tick_ms: 1000,
# Mensagens por segundo por campanha quando uma campanha não define seu próprio drip_tps
default_drip_tps: 50,
# Janela de validade da mensagem padrão quando uma campanha não define validity_hours
message_validity_hours: 72,
# Quanto tempo uma campanha parada/completada persiste antes de ser excluída (horas)
campaign_retention_hours: 168
Validade e entrega programada
Uma campanha pode definir, no momento da criação:
validity_hours— o período de validade da mensagem. Cada mensagem submetida é carimbada com umexpirespara que mensagens não entregues expirem em vez de permanecerem na fila. O padrão émessage_validity_hoursda configuração.deliver_after— um horário ISO8601 opcional (deve estar no futuro) para um envio programado.
Como a entrega programada interage com a distribuição. A campanha ainda começa
a distribuir imediatamente a drip_tps, mas o relógio de cada mensagem é deslocado para frente
por um deslocamento fixo delta = deliver_after − started_at. Assim, uma mensagem distribuída em
tempo real t é carimbada send_time/deliver_after = t + delta e
expires = t + delta + validity_hours. Como as mensagens são inseridas a
drip_tps em tempo real, seus valores deliver_after por mensagem saem
escalonados a drip_tps começando em deliver_after — a entrega é limitada por taxa
em vez de ser uma enxurrada no instante programado. Sem deliver_after,
delta = 0 e as mensagens são distribuídas e entregues imediatamente.
Fluxo de trabalho típico
# 1. Fazer upload de uma lista de destinatários nomeada com variáveis por destinatário (CSV ou JSON)
curl -k -X POST https://smsc:8443/api/campaign_lists \
-H 'Content-Type: application/json' \
-d '{"name":"Clientes VIP",
"csv":"msisdn,first,plan\n12025550101,Alice,Gold\n12025550102,Bob,Silver\n"}'
# => {"id": 1, "recipient_count": 2, ...}
# 2. Criar uma campanha contra essa lista, modelando nas variáveis
curl -k -X POST https://smsc:8443/api/campaigns \
-H 'Content-Type: application/json' \
-d '{"name":"Aviso de Renovação","message":"Oi {{ var1 }}, seu plano {{ var2 }} renova em breve.",
"source_msisdn":"12345","source_smsc":"IMS_SMSC",
"list_id":1,"audience":"active_only","drip_tps":50}'
# => {"id": 7, "status": "draft", ...}
# 3. Iniciá-la
curl -k -X POST https://smsc:8443/api/campaigns/control \
-H 'Content-Type: application/json' \
-d '{"campaign_id":7,"action":"start"}'
# 4. Consultar progresso / estatísticas de entrega
curl -k https://smsc:8443/api/campaigns/7
# => {... "stats": {"total":..,"delivered":..,"failed":..,"progress_percent":..}}
Para enviar mensagens a todos os assinantes ativos, omita list_id no passo 2 (e pule
o passo 1 completamente).
Veja também
- Referência da API de Campanhas
- Guia de Roteamento de SMS — como mensagens distribuídas são roteadas/entregues
- Referência de Configuração