Webhooks

Recepção de eventos externos (Google Ads, Meta Ads) para criação automática
de leads e registro de conversões offline.

Endpoints

Origem Método Rota
Google Ads POST /webhooks/google
Meta Ads (verificação) GET /webhooks/meta?hub.mode=subscribe&hub.verify_token=...&hub.challenge=...
Meta Ads (eventos) POST /webhooks/meta

Os endpoints não usam CSRF (são chamados por terceiros).

Segurança

Fluxo

1. Google/Meta envia POST → /webhooks/{origem}
2. WebhookController::receber() valida assinatura HMAC
3. Persiste em webhook_eventos (status=recebido)
4. Enfileira ProcessarWebhookJob na fila 'webhooks'
5. Worker (bin/console queue:work webhooks) processa
6. Job cria/atualiza lead conforme tipo de evento
7. webhook_eventos.status vira 'processado' ou 'erro'

Fila

Rodar o worker

Uma vez (teste):

php bin/console queue:once webhooks

Contínuo (produção):

php bin/console queue:work webhooks

No cron (recomendado em hospedagem compartilhada sem systemd):

* * * * * cd /caminho && php bin/console queue:once webhooks >> logs/queue.log 2>&1

Como serviço systemd (VPS):

# /etc/systemd/system/gt-queue.service
[Unit]
Description=Gestão de Tráfego — Queue Worker
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/gestao-trafego
ExecStart=/usr/bin/php bin/console queue:work webhooks
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Monitoramento

Simulação local

# Enviar webhook de teste (dev, sem assinatura)
curl -X POST http://localhost/gestao-trafego/webhooks/google \
    -H "Content-Type: application/json" \
    -d '{"event_type":"conversion","gclid":"abc123","cliente_id":1,"full_name":"Teste"}'

Se WEBHOOK_ALLOW_UNSIGNED=true (dev), o evento é aceito.

Prune

php bin/console queue:prune 7      # remove jobs de +7 dias
# em produção, adicione em cron semanal