Resumen de Webhooks
Entiende cómo Whatalo entrega notificaciones de eventos en tiempo real a tu plugin y cómo declarar suscripciones en tu manifiesto.
Los webhooks notifican a tu plugin de los eventos a medida que ocurren en la tienda de un comerciante. Cuando se realiza un nuevo pedido, se actualiza un producto o se registra un cliente, Whatalo envía una solicitud HTTP POST a tu webhookUrl con un payload JSON estructurado.
Cómo Funciona
- Declara los eventos en tu manifiesto
whatalo.app.ts - Establece tu
webhookUrl— Whatalo envía todos los eventos ahí - Verifica las firmas en cada solicitud entrante
- Procesa el payload del evento y responde con
200 OKen menos de 15 segundos
Declaración en el Manifiesto
// whatalo.app.ts
import { defineApp } from "@whatalo/plugin-sdk";
export default defineApp({
name: "Mi Plugin",
pluginId: "mi-plugin",
webhookUrl: "https://mi-plugin.com/api/webhooks",
webhooks: [
{ event: "order.created", description: "Rastrear nuevos pedidos para cumplimiento" },
{ event: "order.status_changed", description: "Sincronizar actualizaciones de estado" },
{ event: "product.updated", description: "Sincronizar cambios del catálogo" },
{ event: "app.installed", description: "Provisionar recursos del comerciante" },
{ event: "app.uninstalled", description: "Limpiar datos del comerciante" },
],
// ... rest of manifest
});Solo declara los eventos que tu plugin realmente maneja. Declarar eventos no utilizados crea carga innecesaria y confunde a los comerciantes que revisan los permisos de tu plugin.
Detalles de Entrega HTTP
Cada entrega de webhook es una solicitud POST con estas características:
| Propiedad | Valor |
|---|---|
| Método | POST |
| Content-Type | application/json |
| User-Agent | Whatalo-Webhooks/1.0 |
| Timeout | 15 segundos |
Encabezados de la Solicitud
| Encabezado | Descripción |
|---|---|
X-Webhook-ID | Identificador único de entrega — úsalo para verificaciones de idempotencia |
X-Webhook-Event | Tipo de evento (e.g., order.created) |
X-Webhook-Signature | Firma HMAC-SHA256 para verificación |
X-Webhook-Timestamp | Marca de tiempo Unix de cuándo se generó la firma |
Estructura del Payload
Todos los payloads de webhooks comparten el mismo sobre:
{
"id": "evt_01HX4KQMZ7B9XVNR2T6WQFG3P",
"event": "order.created",
"store": "mi-tienda",
"timestamp": "2024-03-01T14:30:00Z",
"data": {
// Datos específicos del evento
}
}Requisitos de Respuesta
Tu endpoint debe responder con HTTP 200 OK dentro de 15 segundos. Cualquier otro código de estado o un timeout se trata como un fallo de entrega.
Whatalo reintenta las entregas fallidas con backoff exponencial:
| Intento | Retraso |
|---|---|
| 1er reintento | 1 minuto |
| 2do reintento | 5 minutos |
| 3er reintento | 30 minutos |
| 4to reintento | 2 horas |
Después de 4 reintentos fallidos, la entrega se abandona y se registra.
Idempotencia
Dado que las entregas pueden reintentarse, tu handler debe ser idempotente — procesar el mismo evento dos veces no debe producir efectos secundarios duplicados.
async function handleOrderCreated(payload: WebhookPayload) {
const orderId = payload.data.id;
const deliveryId = payload.id; // X-Webhook-ID value
// Check if this delivery has already been processed
const existing = await db.processedEvents.findUnique({
where: { deliveryId },
});
if (existing) {
return; // Already processed — skip
}
// Process the order
await fulfilOrder(orderId);
// Record that this delivery was processed
await db.processedEvents.create({ data: { deliveryId } });
}Siguientes Pasos
- Manejo de Webhooks — Handlers del SDK para Next.js, Hono y Express
- Verificación y Seguridad — Verificación de firma y protección contra replay attacks
- Referencia de Eventos — Los 13 eventos disponibles