> For the complete documentation index, see [llms.txt](https://ajuda.digitalsac.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ajuda.digitalsac.io/digicrm/operacao-uso-do-sistema/campanha-waba.md).

# Campanha WABA

### Finalidade

**Campanha WABA** envia mensagens em massa pela **WhatsApp Business API (oficial / Cloud API)**, usando **templates aprovados pela Meta**. Diferente da campanha Baileys (WhatsApp Web), o envio depende de:

* conexão do tipo **WABA Oficial** ('wabaoficial') **conectada**;
* **template** com status **APPROVED** vinculado a essa conexão;
* preenchimento dos **campos de runtime** do template (variáveis, mídia de cabeçalho, botões, carrossel etc.);
* audiência (contatos do sistema e/ou importação CSV/XLSX).

A tela também oferece **régua de relacionamento** (etapas, janela de resposta, tags, fila, carteira, Kanban) e relatórios (PDF, CSV e consolidado).

**Caminho:** menu lateral → grupo **Campanhas** → **Campanha Waba**\
**URL:** '/campanhaswaba'\
**Contatos da campanha:** '/campanhaswaba/:campanhaId'

**Licença / Premium:** recurso **PREMIUM** (e, quando aplicável, liberação pelo plano/módulo do tenant). Sem a licença/permissão adequada, o item de menu e a rota ficam bloqueados.

**Perfis:** tipicamente **admin** / **super** (menus de campanha). Usuários não-admin só veem conexões WABA permitidas para eles.

\[\[FOTO]]

***

### Criar / editar campanha (modal)

Botão **Adicionar** (criação) ou ícone de editar (apenas pendente/cancelada).

**Aviso no cabeçalho do modal:** *“As mensagens sempre serão enviadas em horário comercial e dias úteis.”*\
Na prática o envio respeita a **janela de horário** configurada na própria campanha ('startTime' / 'endTime'), calculada no serviço de start (timezone do tenant).

\[\[FOTO]]

#### Campos do formulário (obrigatórios e opcionais)

| Campo                             | Obrigatório   | Padrão                | Descrição                                                                                                                                                                                                                                                                                                                                                                              |
| --------------------------------- | ------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Nome da Campanha**              | Sim           | —                     | Nome interno. No backend, ao **criar**, o sistema acrescenta um sufixo com data/hora ('Nome-YYYYMMDDHHMM') para evitar conflito de nome único.                                                                                                                                                                                                                                         |
| **Data/Hora início**              | Sim           | —                     | 'datetime-local'. Não pode ser **inferior ao dia atual**. É o momento a partir do qual a fila começa a programar os envios (ajustado à janela horária).                                                                                                                                                                                                                                |
| **Enviar por**                    | Sim           | —                     | Seleção da conexão **WhatsApp Business API**. Só entram conexões 'type === "wabaoficial"', não deletadas e com 'status === "CONNECTED"'. Admin/Master vê todas; outros perfis só as de 'allowedConnections' (ou todas se a lista vier vazia). Cada opção mostra badge Conectado/Desconectado e o texto “WhatsApp Business API”. Se não houver conexão: *“Nenhuma conexão disponível”*. |
| **Delay**                         | Sim (marcado) | '20'                  | Intervalo entre mensagens, em **segundos**. Controla o espaçamento dos jobs na fila.                                                                                                                                                                                                                                                                                                   |
| **Horário de Início**             | Não           | '08:00'               | Início da janela diária de envio (hint: ex. 08:00).                                                                                                                                                                                                                                                                                                                                    |
| **Horário de Fim**                | Não           | '20:00'               | Fim da janela diária de envio (hint: ex. 20:00). Envios fora da janela são reagendados para o próximo horário válido.                                                                                                                                                                                                                                                                  |
| **Template**                      | Sim           | —                     | Lista **somente templates APPROVED**. Ao escolher a conexão WABA, a lista é **filtrada** pelos templates daquela 'whatsappId'. Se o template atual não pertencer à conexão, o campo é limpo.                                                                                                                                                                                           |
| **Campos de runtime do template** | Condicional   | —                     | Aparecem quando há template selecionado (componente 'TemplateRuntimeInputEditor'). Ver seção abaixo.                                                                                                                                                                                                                                                                                   |
| **Pré-visualização**              | —             | —                     | HTML do template com placeholders preenchidos (quando disponível).                                                                                                                                                                                                                                                                                                                     |
| **Configurações avançadas**       | Não           | Desligadas / defaults | Régua, resposta, Kanban etc. Ver seção dedicada.                                                                                                                                                                                                                                                                                                                                       |

Botões: **Cancelar** | **Salvar**.

Validações ao salvar:

* Nome, data/hora, conexão e template preenchidos; senão: *“Verifique se todas os campos obrigatórios estão preenchidos”*.
* Se houver **campos de runtime pendentes**, o save é bloqueado com aviso listando os campos.

Ao criar: notificação *“Campanha criada!”*. Ao editar: *“Campanha editada!”*.

\[\[FOTO]]

#### Campos de runtime do template (variáveis e mídia)

Depois de escolher o template, o editor monta dinamicamente o que a Meta exige naquele modelo. Podem aparecer:

| Tipo de campo                       | Quando aparece                  | O que preencher                                                                         |
| ----------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------- |
| **Parâmetros de cabeçalho (texto)** | Header TEXT com variáveis       | Valores posicionais ('{{1}}'…) ou nomeados                                              |
| **Parâmetros de corpo**             | Body com variáveis              | Idem (posicional ou nomeado)                                                            |
| **Mídia de cabeçalho**              | Header IMAGE / VIDEO / DOCUMENT | Tipo, **link** da mídia e/ou **ID** de mídia na Meta; pode usar galeria conforme o tipo |
| **Localização**                     | Header LOCATION                 | Latitude, longitude, nome, endereço                                                     |
| **Flow**                            | Botão/fluxo WhatsApp Flow       | Token do flow ('flowToken') e parâmetros relacionados                                   |
| **Catálogo**                        | Template de catálogo            | IDs locais de catálogo/produto e seções                                                 |
| **Botões**                          | Template com botões dinâmicos   | Textos / parâmetros de botão (ex.: URL com variável)                                    |
| **Carrossel**                       | Template CAROUSEL               | Por card: mídia (link/id) e parâmetros de corpo/botões do card                          |

Ferramentas auxiliares nos campos de texto ('ParamFieldTools') permitem inserir variáveis / contexto de IA (contexto i18n: *“Variável de template WABA para campanha de WhatsApp”*).

Banner laranja se faltarem campos: **Campos de runtime pendentes:** lista dos nomes.

O payload salvo inclui 'runtimeInput' (e aliases de compatibilidade: 'templateRuntimeInput', 'templateVariables', 'campaignRuntimeState'). O backend normaliza o runtime com base no 'templateId'.

\[\[FOTO]]

#### Configurações avançadas (régua / automação / Kanban)

Bloco expansível: **Configurações avançadas (régua, resposta, Kanban)**.

**Interruptor mestre**

| Estado        | Efeito                                                                             |
| ------------- | ---------------------------------------------------------------------------------- |
| **Desligado** | Campanha simples: campos abaixo desativados; automações não são aplicadas.         |
| **Ligado**    | Tag, fila, usuário, carteira, Kanban etc. **serão aplicados** conforme preenchido. |

**Validade da campanha**

| Campo                                      | Padrão | Intervalo | Função                                                             |
| ------------------------------------------ | ------ | --------- | ------------------------------------------------------------------ |
| **Janela para considerar resposta (dias)** | 7      | 1–365     | Respostas após esse prazo **não** disparam tag/fila/usuário/Kanban |
| **Fechar sem resposta após (dias)**        | 15     | 1–365     | Marca a jornada do contato como 'closed\_no\_reply'                |

**Importação de audiência**

| Campo                                   | Padrão | Função                                                                                  |
| --------------------------------------- | ------ | --------------------------------------------------------------------------------------- |
| **Salvar contato ao importar CSV/XLSX** | Não    | Se desligado, números do CSV ficam só no item da campanha (não poluem Contatos)         |
| **Carteira (vendedor) ao enviar**       | —      | Aplica usuário como carteira do contato **sem sobrescrever** carteira de outro vendedor |

**Automação na resposta**

| Campo                                    | Padrão | Função                                                     |
| ---------------------------------------- | ------ | ---------------------------------------------------------- |
| **Criar contato quando responder (CSV)** | Sim    | Promove número CSV → Contact ao responder dentro da janela |
| **Tag aplicada na resposta**             | —      | Tag no Contact; botão “+” cria etiqueta nova               |
| **Fila atribuída ao ticket**             | —      | Move o ticket para a fila ao responder                     |
| **Usuário atribuído ao ticket**          | —      | Responsável do ticket ao responder                         |

**Etapas da régua**

| Campo                                        | Padrão | Função                                                    |
| -------------------------------------------- | ------ | --------------------------------------------------------- |
| **Etapas máximas**                           | 1      | Quantidade total de mensagens da régua (1–10)             |
| **Permitir reenviar para não respondedores** | Sim    | Habilita o botão de avançar etapa para quem não respondeu |

**Encerramento sem resposta**

| Campo                                       | Padrão | Função                                               |
| ------------------------------------------- | ------ | ---------------------------------------------------- |
| **Tag aplicada no encerramento**            | —      | Tag no Contact quando fecha sem resposta             |
| **Criar ticket no fechamento sem resposta** | Não    | Necessário para mover lead ao Kanban no encerramento |

**Integração com Kanban**

| Campo                                | Função                                                                                        |
| ------------------------------------ | --------------------------------------------------------------------------------------------- |
| **Coluna do Kanban na resposta**     | Move o card quando o cliente responde                                                         |
| **Coluna do Kanban no encerramento** | Move não respondedores (precisa de ticket; aviso se “criar ticket no fechamento” estiver off) |

\[\[FOTO]]

***

### Status da campanha e ações disponíveis

| Status (código) | Label (pt-BR) | Agendar / Iniciar | Pausar | Retomar | Cancelar | Editar | Excluir        | Contatos                                 |
| --------------- | ------------- | ----------------- | ------ | ------- | -------- | ------ | -------------- | ---------------------------------------- |
| 'pending'       | Pendente      | Sim               | —      | —       | —        | Sim    | Sim\*          | Sim                                      |
| 'canceled'      | Cancelada     | Sim               | —      | —       | —        | Sim    | Sim\*          | Sim                                      |
| 'scheduled'     | Programada    | —                 | Sim    | —       | Sim      | Não    | Não (regra UI) | Sim                                      |
| 'processing'    | Processando   | —                 | Sim    | —       | Sim      | Não    | Não            | Sim                                      |
| 'paused'        | Pausada       | —                 | —      | Sim     | —        | Não    | Não            | Sim                                      |
| 'finished'      | Finalizada    | —                 | —      | —       | —        | Não    | Não            | Sim (leitura; import/incluir bloqueados) |

\* **Excluir (UI):** só permite se status for 'pending' ou 'canceled' **e** (na prática da tela) se não houver contatos vinculados quando o status não for pending/canceled — a mensagem de erro da UI: *“Só é permitido deletar campanhas que estejam pendentes ou canceladas e não possuam contatos vinculados.”* O backend também exige status 'pending' ou 'canceled'.

**Editar:** só 'pending' ou 'canceled' (frontend e backend alinhados). Após o disparo, o botão fica cinza com tooltip *“Edição bloqueada após o envio…”*.

**Agendar / Programar envio** ('IniciarCampanha'):

1. Status deve ser 'pending' ou 'canceled'.
2. Data de início **não pode ser anterior ao dia atual** (comparação por dia).
