Incoming webhook do Slack
Receba uma mensagem no Slack toda vez que um evento do Zenovay disparar — pico de tráfego, conclusão de meta, pico de erros ou indisponibilidade.
Esta receita usa o recurso nativo de incoming webhook do Slack: nenhum app ou bot Slack necessário.
Webhooks de saída são um recurso Pro+. Faça upgrade do seu plano para habilitá-los.
1. Criar o incoming webhook do Slack
- No Slack, abra seu workspace → Apps → pesquise "Incoming Webhooks" → Add to Slack.
- Escolha o canal que deve receber os alertas do Zenovay (ex:
#alertasou#crescimento). - Clique em Add Incoming Webhooks integration.
- O Slack exibe uma Webhook URL com o formato
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX— copie-a.
2. Adicionar o webhook no Zenovay
- Em
app.zenovay.com, acesse Settings → Webhooks. - Escolha o site para o qual deseja receber notificações.
- Clique em Add webhook.
- Preencha:
- Name:
Slack #alertas(ou qualquer nome que faça sentido para você) - URL: cole a URL do webhook do Slack do Passo 1
- Events: escolha os eventos que deseja monitorar (Pico de tráfego, Meta concluída, Site fora do ar, …)
- Name:
- Clique em Create webhook.
- Clique no Send test event (ícone de avião de papel) no novo cartão. Em cerca de 5 segundos, você deverá ver uma mensagem no canal do Slack.
Isso é tudo para a configuração básica — o Slack aceita o payload JSON padrão do Zenovay como um campo text genérico.
3. (Opcional) Formatar as mensagens do Slack
Os incoming webhooks do Slack aceitam um payload mais rico com blocos, attachments e formatação Markdown. O Zenovay envia um evento JSON genérico — o Slack o renderizará como um valor text de fallback.
Se quiser mensagens Slack formatadas com attachments coloridos por severidade ou layouts em blocos, execute um pequeno relay entre o Zenovay e o Slack:
// Cloudflare Workers / qualquer runtime Node-style
export default {
async fetch(req) {
const event = await req.json();
const slackPayload = {
text: `📈 Evento Zenovay: *${event.event_type}* em ${event.website_id}`,
attachments: [{
color: event.event_type === 'website_down' ? '#dc2626' : '#3b82f6',
fields: [
{ title: 'Evento', value: event.event_type, short: true },
{ title: 'Hora', value: event.timestamp, short: true },
],
}],
};
await fetch(SLACK_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(slackPayload),
});
return new Response('ok');
},
};
Aponte a URL do webhook do Zenovay para o seu relay em vez do Slack diretamente.
4. Verificar a assinatura do Zenovay (recomendado para relays)
Se você usar um relay, verifique a assinatura HMAC-SHA256 do Zenovay para que o Slack receba apenas eventos genuínos do Zenovay:
import { createHmac } from 'crypto';
const signature = req.headers.get('x-zenovay-signature'); // 'sha256=<hex>'
const provided = signature.replace(/^sha256=/, '');
const expected = createHmac('sha256', YOUR_WEBHOOK_SECRET)
.update(rawBody)
.digest('hex');
if (provided !== expected) {
return new Response('invalid signature', { status: 401 });
}
Seu segredo do webhook é exibido em Settings → Webhooks → clique no ícone de olho no cartão do webhook.
Solução de problemas
- Nenhuma mensagem chega no Slack: verifique o cartão do webhook no Zenovay em busca de um timestamp "Last fired" — se estiver vazio, nenhum evento foi disparado ainda. Clique em Send test event para forçar um.
invalid_payloaddo Slack: o webhook do Slack retornou 400 porque o formato JSON não correspondia. Use um relay (Passo 3) para reformatar no formato esperado pelo Slack.- Alertas frequentes demais: na configuração do webhook, desmarque tipos de eventos muito frequentes como
traffic_spike. Mantenha apenas os de alto sinal.