SinalDemo

Módulo 4 · Dados e Cloud API

Ajustes

Este preview simula o funil permitido: opt-in → conversa → uma oferta de infoproduto ou e-commerce. Automações oficiais do Zap em WhatsApp.

Fluxo entre módulos

  1. 1. Radar — pesquisa demanda para anúncio. Não comenta, não chama, não copia handle.
  2. 2. Captura — só entra no inbox com opt-in (formulário ou Click-to-WhatsApp).
  3. 3. Atendimento — bot responde quem já escreveu. Uma oferta permitida por conversa.
  4. 4. Conversão — link rastreado. Follow-up só nessa janela, texto diferente.

Operação

Bloqueado de propósito: apostas, betting, cassino, trading, forex, cripto, disparo frio, comentário comercial em massa. Sem interruptor para ligar isso.

Google Analytics 4

ID de medição

analytics.google.com → Administrar → Fluxos de dados → Web. Cole o G-XXXX. Sem telefone, sem nome no hit.

Vazio ou inválido: o gtag não carrega.

  • page_viewToda rota · SPA — dispara na navegação.
  • view_item/venda e /ir · Oferta vista. Sem PII.
  • generate_lead/quero · Opt-in. Sem telefone no hit.
  • begin_checkoutBotão do checkout · Clique para a Hotmart.

Google Ads

Pixel AW-

O mesmo par de Tráfego. Tag = remarketing. send_to = conversão no clique do checkout.

Vazio

Vazio

Tokens de acesso

System user permanente na Meta. Nunca token de 1 hora do Graph Explorer. O valor não aparece de volta — só se está definido e os 4 últimos.

  • Access token: ausente
  • App secret: ausente
  • Verify token: sinal-verify

Business Manager → Users do sistema → gerar token com whatsapp_business_messaging e whatsapp_business_management. Não cole no chat. Não use VITE_.

Let's Encrypt

No app publicado o HTTPS já sai com certificado de CA pública. Este caminho é o HTTP-01 se você hospedar o callback: Let's Encrypt GET /.well-known/acme-challenge/… e espera o keyAuthorization em texto puro.

Desafios guardados: 0. Preview local não emite cert — porta 80/443 pública + domínio apontando para o app.

Nginx proxy

Só se o callback rodar atrás de um VPS. App publicado já tem HTTPS — não precisa de Nginx na frente. Troque SEU_DOMINIO. O corpo do POST não pode ser reescrito: o HMAC usa os bytes crus.

  • 80: só ACME, o resto redireciona para HTTPS.
  • 443: TLSv1.2/1.3 · Let's Encrypt fullchain.
  • /webhook em até 15s — a Meta abandona se atrasar.
  • Encaminha X-Hub-Signature-256 e X-Forwarded-Proto.
# Sinal — proxy do webhook Cloud API
# TLS 1.2+ · ACME · corpo cru (HMAC-SHA256)

upstream sinal {
    server 127.0.0.1:8080;
    keepalive 8;
}

server {
    listen 80;
    listen [::]:80;
    server_name SEU_DOMINIO;

    location ^~ /.well-known/acme-challenge/ {
        proxy_pass http://sinal;
        proxy_set_header Host $host;
        gzip off;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name SEU_DOMINIO;

    ssl_certificate     /etc/letsencrypt/live/SEU_DOMINIO/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/SEU_DOMINIO/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_session_timeout 1d;
    ssl_session_cache   shared:SSL:10m;

    client_max_body_size 1m;
    proxy_http_version 1.1;
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Hub-Signature-256 $http_x_hub_signature_256;
    proxy_request_buffering on;
    proxy_read_timeout 15s;

    location /webhook {
        proxy_pass http://sinal;
    }

    location ^~ /.well-known/acme-challenge/ {
        proxy_pass http://sinal;
        gzip off;
    }

    location / {
        proxy_pass http://sinal;
    }
}

error.log: cole em Ao vivo. 502 = processo do Sinal. unknown ca = certificado. timeout = Meta desiste.

Dados desta demo

Leads e conversas ficam neste navegador. Reset reconstitui o cenário de demonstração (Marina, Rafael, Camila, Lúcia).