Testes de lançamento da campanha Futura
Use este runbook antes de lançar uma campanha Futura no WhatsApp. O fluxo depende de definições de segmento tipadas, um snapshot materializado de destinatários, personalização de template, respostas de botão normalizadas, tratamento de consentimento e acompanhamento manual com equipe dedicada para respostas de interessados.O pacote de lançamento durável BORD-433/BORD-441 está em
planning/campaigns/futura-launch-runbook.md, planning/campaigns/futura-dry-run-fixtures.json, planning/futura/futura-strategy-templates-compliance.md e planning/campaigns/bord-431-campaign-journey-scope note.md.Escopo
O fluxo de campanha recém-mesclado suporta:- definições de audiência com direcionamento
all,tagsousegment; - filtros de campo customizado tipados para audiências de segmento;
- materialização de destinatários em
campaign_recipientsantes do disparo; - vínculo de template por nome ou ID de template aprovado, locale e variáveis de corpo;
- IDs de resposta de botão normalizados para roteamento de campanha e journey;
- eventos de opt-out via botão de campanha gravados no ledger de consentimento;
- ações de rota determinísticas para tags de contato, atributos de contato, conversas abertas e opt-outs.
start_journey da resposta de campanha BORD-431.
Contrato de metadados da campanha
Os rascunhos de campanha Futura devem carregar os metadados de campanha v1 junto com as colunas legadas de campanha. Os metadados são o contrato de go-live que os operadores revisam antes da materialização.Checklist de pré-voo
1
Confirmar a fonte da audiência
Escolha
tags para a lista inicial da Futura ou segment quando a campanha depender de atributos de contato. Evite all a menos que o workspace tenha aprovado explicitamente um envio para a lista completa.2
Validar os filtros de segmento tipados
Para audiências
segment, verifique todos os filtros antes da materialização. Os campos suportados são tags, name, phone e custom_fields. Campos customizados usam a sintaxe key=value; comparações gt e lt devem comparar valores numéricos ou de data, seja a partir de definições de campo customizado ou de valores que possam ser interpretados como números ou datas em formato ISO.3
Pré-visualizar a contagem do segmento
Pré-visualize o segmento no app ou pelo mesmo caminho de backend usado por
previewSegment. Confirme a contagem e uma amostra de contatos em relação ao briefing da campanha.4
Verificar o consentimento antes de gerar o snapshot
O materializador ignora contatos cujo
consent_state seja opted_out ou cujo subscriber_status legado seja unsubscribed. Confirme a contagem esperada de opt-outs com o responsável pela campanha antes de continuar.5
Verificar o vínculo do template
Confirme que o template do WhatsApp está aprovado na Meta e no Switchbord, que o
locale corresponde ao código de idioma aprovado, que toda variável de corpo tem uma origem e um fallback, que as proposições de valor no corpo usam negrito do WhatsApp e que a resposta rápida de opt-out aparece como Stop promozioni ou Non scrivermi, e não como STOP.6
Congelar rotas e limites de segurança
Confirme que
responseRoutes usa apenas os IDs de botão suportados: futura_not_booked, futura_already_booked e marketing_opt_out. Confirme que as ações de rota não incluem start_journey para o lançamento MVP. Confirme que launchSafety.maxRecipients está no valor aprovado para o envio ou abaixo dele.Materializar destinatários
A materialização transforma a definição de audiência em linhas duráveis emcampaign_recipients. Trate isso como o snapshot da audiência para o envio.
Comportamento esperado:
- lê o
audienceDefinitionda campanha a partir dos metadados v1; - resolve audiências
all, de tag ou de segmento dentro do workspace; - remove duplicidade de contatos por ID;
- ignora contatos com opt-out ou não inscritos;
- insere novos destinatários
queuedcom uma chave únicacampaign_id,contact_id; - atualiza os metadados da campanha com
materialization.materializedCount,skippedOptOutCount,duplicateCountematerializedAt.
materializedCountcorresponde à contagem aprovada após os pulos de consentimento;skippedOptOutCounté explicável e diferente de zero apenas quando esperado;- uma segunda execução de materialização reporta duplicados em vez de criar destinatários duplicados;
- nenhuma linha de
campaign_recipientsfoi criada para contatos fora do workspace; - não existem linhas para contatos de teste conhecidos com opt-out.
Verificações de disparo e personalização
O disparo da campanha processa apenas destinatários no statusqueued enquanto a campanha está running. O envio ocorre em lotes e reenfileira campaign.dispatch até que não restem destinatários em fila.
Para cada destinatário de teste, verifique:
- existe ou é criada uma conversa no canal esperado;
- uma linha de
messagesde saída é enfileirada comsend_mode: templateeauthor_label: Campaign; payload.templateNameé o nome do template vinculado;payload.templateLocaleestá presente quando um locale é configurado;payload.templateComponentsinclui os parâmetros de corpo na ordem dos índices;contact.first_nameé resolvido primeiro a partir decontacts.metadata.first_name, depois do primeiro token decontacts.name, e só então do fallback configurado;- a pré-visualização da mensagem renderizada substitui
{{1}},{{2}}e placeholders subsequentes de forma consistente com os componentes do template; - destinatários com opt-out encontrados no disparo são marcados como falhos com
error_code: skipped_opt_oute não são enviados.
A materialização de destinatários ignora opt-outs conhecidos de antemão, mas o disparo reverifica o consentimento, de forma que contatos que optam por saída entre a materialização e o envio ainda são bloqueados.
Normalização de respostas de botão
O processamento do webhook de entrada normaliza os dois formatos de botão do WhatsApp em um único ID de botão antes do tratamento de rota:- botões de resposta legados:
message.button.payload; - botões interativos:
message.interactive.button_reply.id; - respostas de lista interativa:
message.interactive.list_reply.id.
Rejeite definições de rota que usem rótulos de botão, títulos traduzidos, espaços ou variações de maiúsculas/minúsculas como chaves. As rotas devem usar IDs normalizados, não texto de exibição.
Teste de opt-out de consentimento
Para o botãomarketing_opt_out:
- Envie uma mensagem de teste de campanha para um contato de seed que tenha consentido.
- Responda tocando no botão de opt-out, não digitando uma palavra-chave STOP.
- Confirme que uma linha em
consent_eventsé gravada comevent_type: opted_out,source: campaign_button,actor: systeme metadados contendo obuttonIde o ID da mensagem do provedor. - Confirme que o
subscriber_statusdo contato é atualizado paraunsubscribede que o contato não é mais elegível para materializações subsequentes de campanha. - Confirme que tentativas de disparo posteriores ignoram o contato antes de criar um envio via Meta.
Acompanhamento manual em vez de journeys iniciadas por campanha
A execução destart_journey da resposta de campanha BORD-431 está fora do escopo do lançamento MVP. Uma ação de rota com type: "start_journey" é aceita pelo schema de domínio, mas não é executada como um caminho de anexação/início de campanha para journey. Os operadores não devem depender disso para o acompanhamento do lançamento da Futura.
Use este caminho de acompanhamento manual:
futura_not_bookedmarca o contato com tag, registrafutura_response=not_bookede abre/roteia a conversa para vendas;- um operador humano revisa a conversa e envia manualmente a próxima resposta aprovada;
futura_already_bookedmarca ou identifica o contato como já reservado e não requer journey automática;marketing_opt_outregistra o opt-out de consentimento e nunca deve acionar um acompanhamento de marketing.
Checklist operacional de go-live
Antes do lançamento em produção:- Os metadados da campanha validam contra o schema v1.
- A pré-visualização do segmento ou a contagem de tags corresponde à audiência aprovada.
- Os filtros de campo customizado tipados foram testados com pelo menos um contato de seed correspondente e um não correspondente.
- As contagens de materialização de destinatários foram registradas nas notas de lançamento.
- O nome do template aprovado, o locale e os fallbacks de variável de corpo foram verificados.
- Os payloads de componente de template foram inspecionados para pelo menos dois contatos de seed.
- Os IDs de botão foram testados a partir do WhatsApp, não apenas de payloads de webhook mockados.
-
marketing_opt_outcriou um evento no ledger de consentimentocampaign_button. - A materialização e o disparo pós-opt-out ambos ignoraram o contato de seed.
- A equipe de acompanhamento manual está designada para
futura_not_bookede quaisquer respostas opcionais defutura_already_booked. - Os metadados de rota de produção não contêm ações
start_journey. - Os jobs de outbox
campaign.dispatchemessage.dispatchforam esvaziados sem falhas inesperadas. - As contagens de entrega, leitura, falha e pulo foram comparadas com as métricas de detalhe da campanha.
- O responsável pelo incidente e o ponto de decisão de rollback/pausa estão documentados.
Critérios de rollback e pausa
Pause a campanha e interrompa o processamento da fila se qualquer um destes ocorrer:- a materialização inclui contatos fora da audiência aprovada;
- contatos com opt-out recebem mensagens de campanha;
- respostas de botão são registradas como rótulos de exibição em vez de IDs normalizados;
- o planejamento de lançamento depende de início automático de campanha para journey antes de o BORD-431 estar implementado;
- a Meta retorna erros sustentados de política ou de template para o template Futura;
- as falhas de entrega excedem o limite acordado pelo responsável pela campanha.