🛠️
Manual do administrador
Super Facily

Configurar e gerenciar o sistema

Você é responsável por importar contatos, criar campanhas, conectar o WhatsApp, cadastrar usuários e manter o anti-ban saudável. Aqui está como fazer cada coisa.

📥 1. Importar contatos

/contacts/import aceita CSV com cabeçalho. A importação roda em background.

Formato esperado do CSV

contatos.csv
nome,telefone,cpf,orgao,vinculo
Ana Silva,11987654321,12345678900,PMESP,Ativo
João Souza,21998765432,98765432100,SPPREV,Pensionista
...

Campos reconhecidos

CampoObrigatórioNotas
telefone✅ SimAceita com/sem DDI/DDD; é normalizado pra E.164
nomeRecomendadoUsado em {{primeiro_nome}}
cpfOpcionalMascarado nos logs (LGPD)
orgaoOpcionalÚtil pra segmentação
vinculoOpcionalAtivo / Pensionista / Aposentado
margemOpcionalDecimal — para priorização

Passo a passo

  1. Acesse /contacts/import.
  2. Escolha o arquivo CSV.
  3. (Opcional) Selecione tags pra aplicar a todos os contatos do arquivo.
  4. Clique em Importar. O sistema processa em background.
  5. Acompanhe o status na lista de jobs — quando terminar, os contatos aparecem em /contacts.

🏷️ 2. Tags e segmentação

Tags são como uma "lista de envio". Você agrupa contatos por critério e dispara campanhas pra um grupo.

Exemplos de tags úteis

PMESP
Polícia Militar SP
SPPREV
Servidores SP
SP-capital
DDD 11
jan-2026
Lote janeiro
margem-alta
Margem > R$ 800
ativo
Servidor ativo
pensionista
Pensão
retornar
Já interessado
Boa prática:
  • Crie tags por origem (PMESP, SPPREV) e por lote/data (jan-2026).
  • Use múltiplas tags por contato — facilita filtrar depois.
  • Gerencie em /contacts/tags.

📣 3. Criar campanha

Em /campaigns/new você combina: tags, mensagem, cadência, datas e prompts.

Nova campanha
Nome
PMESP — Janeiro 2026
Tags
🏷️ PMESP, jan-2026
Mensagem
Olá {{primeiro_nome}}! Sou consultor da empresa. Posso te mandar uma simulação de crédito? Responda SAIR pra não receber mais.
Início
15/01 09:00
Fim
22/01 18:00
Intervalo entre envios
30s — 90s
Contatos / dia
200

Campos da campanha

CampoPara que serve
NomeIdentificação interna da campanha
TagsQuais contatos vão receber (1 ou mais tags)
MensagemSuporta {{primeiro_nome}}. Incluir instrução de saída pra LGPD.
vCardCartão do consultor (nome + telefone) anexado à mensagem
Início / FimJanela em que a campanha pode disparar
IntervaloRange em segundos entre cada envio (jitter)
Contatos/diaQuantos números diferentes recebem por dia
Mensagens/diaTotal absoluto de envios por dia
Prompts IAOverride do classificador/bot (avançado)

📋 Clonar campanha

Botão 📋 Clonar na tela da campanha cria uma cópia em DRAFT com a mesma mensagem, prompts e limites — datas ficam em branco. Útil pra disparar a mesma régua pra outro grupo.

▶️ 4. Disparar e acompanhar

Acompanhe o progresso e os motivos de parada.

DRAFT
rascunho
SCHEDULED
agendada
RUNNING
disparando
PAUSED
pausada
COMPLETED
encerrada

Bloco "Por que ainda não há envios?"

Se total_sent = 0, o sistema mostra exatamente o que está bloqueando:

Possíveis motivos:
  • Kill switch global ativo em /admin/settings
  • Nenhuma instância Z-API conectada/saudável
  • Fora da janela ativa (9h–18h BR)
  • Aguardando data de início
  • Janela da campanha expirou (ends_at)
  • Fila vazia — todos opt-out / blacklist / cooldown

Ações disponíveis

▶ Disparar
Enfileira as mensagens. Vira RUNNING.
⏸ Pausar
Suspende a fila. Vira PAUSED.
📋 Clonar
Cria cópia DRAFT pra reuso.
✏️ Editar
Edita texto/limites (só se não RUNNING).
⚡ Forçar envio
Bypassa anti-ban — só pra TESTE.
🗑 Excluir
Remove a campanha. QUEUED são canceladas.

📅 5. Datas e limites diários

Configure a janela e os tetos da campanha.

📅
Data de início

Mensagens aguardam até essa data. Útil pra preparar uma campanha agora e disparar na segunda de manhã.

Data de fim

Quando chega o fim, mensagens restantes viram FAILED e a campanha vira COMPLETED. Evita continuar mandando uma promoção que já acabou.

👥
Contatos distintos / dia

Quantos telefones diferentes podem receber por dia. Ao atingir, o restante é adiado pra amanhã às 9h BR.

📊
Mensagens / dia

Teto absoluto de envios da campanha por dia. Considera SENT/DELIVERED/READ.

Exemplo prático:

Você tem 1.000 contatos e quer disparar em 5 dias úteis, sem queimar a conta. Configure: início = segunda 9h, fim = sexta 18h, contatos/dia = 200. O sistema espalha o envio e respeita o teto.

📤 6. Botão "Enviar teste"

Antes de disparar pra todo mundo, mande a mensagem pro seu próprio número.

📤 Enviar teste
Como funciona:
  • Envia imediatamente pelo Z-API.
  • Bypassa anti-ban, cooldown, janela 9h-18h e fila.
  • Usa o texto da campanha por padrão, com {{nome}} virando "Teste".
  • Você pode digitar um texto diferente no campo de cima pra testar variações.
  • Audit log registra CAMPAIGN_TEST_SEND com últimos 4 dígitos do número (PII mascarada).

🔌 7. Z-API (WhatsApp)

O envio real de WhatsApp passa pelo Z-API. Você cadastra suas instâncias (números) no painel.

Como conectar um número

  1. Crie uma conta em z-api.io e crie uma instância.
  2. Anote: instance ID, token e client token.
  3. No painel, vá em /admin/instancesNova instância.
  4. Preencha os 3 campos + nome de exibição + telefone associado.
  5. Salve e clique em Conectar QR — escaneie com o WhatsApp do número.
  6. Status muda de DISCONNECTED pra CONNECTED.

Webhooks Z-API

Em /admin/settings → Integrações, você encontra a URL do webhook pra colar no painel do Z-API. Os eventos que devem estar habilitados:

On Receive — mensagens recebidas
On Message Status — entregue/lida (✓✓)
On Connect — instância conectada
On Disconnect — instância caiu
Token do webhook: defina integrations.webhook_internal_token em Settings → senão qualquer um que descobrir a URL pode falsificar mensagens.

🛡️ 8. Anti-ban e kill switch

Mecanismos pra reduzir risco de banimento das contas.

🕘
Janela ativa
Default 9h–18h BR. Configurável em Settings.
⏱️
Jitter
Intervalo gaussiano 25–90s entre mensagens.
🧊
Cooldown
Mesmo contato não recebe 2x em N dias.
🌱
Warmup
Conta nova: 7 dias com limite progressivo.
Circuit breaker
N falhas seguidas → instância marcada unhealthy.
🛑
Kill switch
Pausa TUDO em 1 clique. Botão no topo.

Quando usar o kill switch

🤖 9. Prompts da IA

O sistema usa Claude (Anthropic) pra classificar respostas e gerar auto-respostas. Os prompts são configuráveis.

Dois prompts por campanha

🎯 Classificador

Lê a resposta do cliente e devolve uma de 4 categorias: GREEN_INTEREST, NEUTRAL, YELLOW_DISINTEREST, RED_AGGRESSIVE.

💬 Auto-responder

Gera a próxima mensagem do bot. Pode devolver "ESCALATE" pra sinalizar que precisa de humano.

Onde editar

⚡ 10. Snippets

Textos pré-prontos que os atendentes inserem no chat.

Gerencie em /admin/snippets. Cada snippet tem um título (mostrado na lista) e o texto (vai pro campo de mensagem ao clicar).

Sugestões de snippets úteis

Boas-vindas
"Olá! Tudo bem? Sou consultor da empresa, em que posso te ajudar?"
Pedido de CPF
"Pra te dar a simulação correta, me passa seu CPF, por favor?"
Despedida
"Obrigado pelo contato. Qualquer dúvida, é só chamar."
Fora do expediente
"Olá! Nosso atendimento é das 9h às 18h. Retornaremos amanhã."

👥 11. Usuários e SSO

Cadastre quem pode acessar o painel.

Cadastro manual

  1. Acesse /admin/users.
  2. Clique em Novo usuário.
  3. Preencha email, nome, senha temporária e perfil (ADMIN ou OPERATOR).
  4. Compartilhe a senha com o usuário (peça pra ele trocar no primeiro login).

Perfis

ADMIN
Acesso total — configurações, usuários, campanhas, audit log.
OPERATOR
Atendente — conversa, kanban, classifica. Não acessa /admin.

Login com Google (SSO)

  1. Acesse Google Cloud Console, crie um OAuth Client ID.
  2. Adicione o redirect URI mostrado em /admin/settings → Auth.
  3. Copie o Client ID e Client Secret pro painel.
  4. Habilite "Login com Google" no toggle.
  5. (Opcional) Auto-cadastro: usuários novos via Google viram OPERATOR automaticamente.

Toggle "Login com senha"

Você pode desligar o login com senha e forçar todos via SSO Google em /admin/settings → Auth.

📋 12. Audit log

Registro de toda ação sensível. Acesse em /admin/audit.

Ações registradas

LOGIN_OK / LOGIN_FAIL
SETTINGS_UPDATE
KILL_SWITCH_ON / OFF
CAMPAIGN_CREATE / START / PAUSE / DELETE
CAMPAIGN_TEST_SEND
CONVERSATION_RECLASSIFY
CONVERSATION_CLASSIFY_MANUAL
CONVERSATION_BULK_BLACKLIST
OPT_OUT_AUTO / MANUAL
PII mascarada:

CPF vira ***.***.***-**, telefone vira 55********4321, e-mail vira j***@empresa.com. O log é purgado automaticamente após 180 dias.

🚫 13. Blacklist

Números bloqueados nunca recebem mensagem, mesmo que sejam reimportados.

Como um número entra na blacklist

Gerenciar a blacklist

/admin/blacklist lista todos os números com motivo, origem e quem adicionou. Pra remover, clique em Excluir ao lado do número. A remoção é registrada no audit log.

⚖️ 14. LGPD

O sistema foi pensado pra cumprir a Lei Geral de Proteção de Dados.

✅ Opt-out automático
Cliente que demonstra desinteresse ou agressividade é removido das campanhas.
✅ Opt-out manual
Qualquer atendente pode marcar um número pra parar.
✅ Blacklist global
Números bloqueados nunca recebem, nem por reimportação.
✅ PII mascarada
CPF, telefone, e-mail mascarados nos logs.
✅ Instrução de saída
Sistema avisa se a mensagem não diz como sair.
✅ Audit log
Toda ação sensível fica registrada por 180 dias.

🔧 15. Problemas comuns

Disparei a campanha mas ninguém recebeu

Cheque o bloco amarelo "Por que ainda não há envios?" na tela da campanha. Causas mais comuns:

  • Kill switch global ativo
  • Nenhuma instância Z-API conectada
  • Fora da janela 9h–18h BR
  • Aguardando data de início
  • Fila vazia (todos contatos em opt-out/cooldown)
Instância caiu — como reconectar?

Vá em /admin/instances, clique na instância afetada e use Reconectar QR. Escaneie de novo com o WhatsApp do número.

A IA está classificando errado

2 opções:

  • Atendentes podem usar "✎ Ajustar…" pra override manual.
  • Refine o prompt em /admin/settings → Prompts ou direto na campanha. Adicione exemplos do que está errando.
Como pausar TUDO em emergência

Ative o kill switch global em /admin/settings ou pelo banner vermelho no topo. Pausa todos os envios em 1 clique.

Quero remover um número da blacklist

/admin/blacklist → busque o número → clique em Excluir. A remoção fica registrada no audit log.

Backup e restore

Banco MySQL e diretório /storage/media devem ser incluídos no backup. Snapshots completos ficam em /root/backup quando rodados via script.