Receber webhooks de entrega no Next.js

Trate eventos de entrega (delivered, opened, bounced) do Publiq numa Route Handler, validando a assinatura HMAC.

Leia o corpo cru para validar a assinatura no header Publiq-Signature antes de confiar no evento:

import { NextResponse } from 'next/server';
import crypto from 'node:crypto';

const secret = process.env.PUBLIQ_WEBHOOK_SECRET!;

export async function POST(req: Request) {
  const raw = await req.text();
  const sig = req.headers.get('Publiq-Signature') ?? '';
  const expected = crypto.createHmac('sha256', secret).update(raw).digest('hex');
  if (sig !== expected) return new NextResponse('invalid signature', { status: 401 });

  const event = JSON.parse(raw);
  // event.type: 'message.delivered' | 'message.opened' | 'message.bounced' ...
  console.log(event.type, event.data.message_id);
  return NextResponse.json({ ok: true });
}

Registre a URL do webhook no painel (ou via SDK: Webhooks). O secret é mostrado só uma vez na criação.

Boas práticas

  • Chame o Publiq sempre do servidor — nunca exponha a API key no cliente.
  • Crie a instância do cliente uma vez e reutilize-a entre requisições.
  • Prefira templateKey a HTML inline para manter o conteúdo versionado.
  • Trate PubliqError (status/code); o SDK já retenta erros temporários com backoff.
  • Envie de um domínio verificado — veja Domínios.

Veja também

Receber webhooks de entrega no Next.js — Publiq Docs