Recibir webhooks de entrega en Next.js

Maneja eventos de entrega (delivered, opened, bounced) de Publiq en una Route Handler, validando la firma HMAC.

Lee el cuerpo crudo para validar la firma en el header Publiq-Signature antes de confiar en el 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 });
}

Registra la URL del webhook en el panel (o vía SDK: Webhooks). El secret se muestra solo una vez al crear.

Buenas prácticas

  • Llama a Publiq siempre desde el servidor — nunca expongas la API key en el cliente.
  • Crea la instancia del cliente una vez y reutilízala entre peticiones.
  • Prefiere templateKey sobre HTML inline para mantener el contenido versionado.
  • Maneja PubliqError (status/code); el SDK ya reintenta errores transitorios con backoff.
  • Envía desde un dominio verificado — ver Dominios.

Ver también

Recibir webhooks de entrega en Next.js — Publiq Docs