order.completed real de Fire. Vas a configurar un endpoint HTTPS, configurar un Integration Flow en el dashboard de Fire y verificar end to end.
Al final vas a tener:
- Un flow de Fire que dispara en cada orden completada
- Un endpoint HTTPS recibiendo el body del evento
- Procesamiento idempotente con respuesta rápida
Esta guía aplica a los cuatro eventos que Fire emite en producción:
order.completed, order.cancelled, order.invoiced, order.reversed. El walkthrough usa order.completed; los otros tres siguen el mismo patrón con distintas formas de data.Lo que vas a construir
Un solo endpoint, un solo Integration Flow. Una vez que funciona paraorder.completed, el mismo endpoint maneja todos los demás eventos de Fire ramificando por event.type.
Prerrequisitos
- Una cuenta Fire con acceso al dashboard (Settings → Integration Flows)
- Una URL HTTPS accesible públicamente (usa ngrok para dev local)
- Algo para correr un servicio Node/Python/Go — cualquier cosa que pueda servir
POSTy parsear JSON
Paso 1 — Levanta un endpoint mínimo
Empieza con el handler más chico posible. Las preocupaciones de producción (auth, dedup, persistencia) se agregan en el paso 5.Node.js
https://<random>.ngrok.app). La pegas en el flow de Fire en el siguiente paso.
Paso 2 — Configura un Integration Flow
En el dashboard de Fire, ve a Settings → Integration Flows → New flow.Define el scope
Elige el account, vendor y (opcionalmente) tiendas específicas para las que debe disparar este flow. Deja tiendas vacío para matchear todas las tiendas del vendor.
Agrega un nodo HTTP
Arrastra un nodo HTTP al canvas. Conéctalo desde el trigger.
- Método:
POST - URL: la URL de ngrok del paso 1 más el path
/fire/events - Headers:
Content-Type: application/json - Auth: déjalo en blanco por ahora — lo agregamos en el paso 5
Usa el template canónico de body
Pega el template canónico del body en el campo Body. Produce el envelope estándar La mayoría de equipos parten del template Webhook Test — Full Order Data que viene en el dashboard — es la misma forma con cada campo de
{ event, data, _meta } que tu handler espera.data.* expandido explícitamente.Paso 3 — Dispara un evento de prueba
Dos formas de verificar el cableado: Opción A — Probar Flujo (dry run). En el editor del flow, click en Probar Flujo y elige un escenario de muestra. Fire despacha un evento sintético a través de tu flow vivo. Tu endpoint debería loguearlo en segundos. Opción B — Orden real. Inyecta una orden de prueba real por tu pipeline normal (POS, kiosko, oPOST /v1/orders). Una vez que llegue a status=COMPLETED y paymentStatus=SUCCEEDED, el flow corre y vas a ver la petición en tu endpoint.
Si nada llega en 30 segundos, revisa Settings → Integration Flows → Executions para ver ejecuciones fallidas y el mensaje de error.
Paso 4 — Lee el payload
Tu handler ahora recibe una petición cuyo body se ve así:data es el snapshot V4 de la orden — el registro completo de la orden. Consulta order.completed para la referencia campo por campo.
Paso 5 — Hazlo production-ready
El handler mínimo del paso 1 funciona para el demo. Para producción necesitas tres cosas más.Confirma rápido, procesa async
Fire hace timeout a los 30 segundos. Confirma primero; procesa en background.Deduplica por event.id
Fire reintenta ante cualquier respuesta no-2xx. Usa event.id (el ID de ejecución del flow) para saltarte duplicados.
Autentica la petición
Fire actualmente no firma webhooks salientes con HMAC. Autentica agregando una credencial al nodo HTTP de tu flow y validándola de tu lado. Tres opciones:- Bearer token — pon
Authorization: Bearer <secret>en los headers del flow; valídalo en tu handler. - API key — pon
x-api-key: <secret>en los headers del flow; valídalo. - OAuth2 client credentials — para tenants que necesitan tokens rotativos; el flow obtiene el token automáticamente.
La firma HMAC (
X-Fire-Signature) está en el roadmap y será opt-in cuando salga. Por ahora, un secret compartido en el header del flow es el mecanismo canónico de autenticación.Errores comunes
- Los valores monetarios son strings × 10000.
payments.totals[0].total === "229000"significa 22.9. Parsea con una librería decimal; nunca conparseFloat. event.ides el ID de ejecución del flow, no el ID de la orden. Usaevent.idcomo llave de idempotencia; usadata.orderIdcomo llave de negocio.fulfillment.deliverypuede estar presente incluso en órdenes dine-in / pickup con ceros placeholder. Ramifica porfulfillment.service.code, no pordelivery !== null.payments.totals[]ypaymentMethods[]mezclan camelCase y snake_case. Lee tantocurrencyCodecomocurrency_codedefensivamente en esos objetos.
Próximos pasos
Referencia order.completed
Referencia completa del payload, incluyendo bloques fiscales BR.
Referencia order.cancelled
Payload de cancelación con metadata de auditoría.
Integration Flows
Cobertura más profunda de scoping, body templates y tipos de nodo.
Entrega y reintentos
Política de retry, dead-letter y modelo de idempotencia.

