order.completed event from Fire. You’ll set up an HTTPS endpoint, configure an Integration Flow in the Fire dashboard, and verify end to end.
By the end you will:
- Have a Fire flow that fires on every completed order
- Have an HTTPS endpoint receiving the event body
- Be processing events idempotently and responding fast
This guide is for the four events Fire emits in production:
order.completed, order.cancelled, order.invoiced, order.reversed. The walkthrough uses order.completed; the other three follow the same pattern with different data shapes.What you’ll build
Single endpoint, single Integration Flow. Once it works fororder.completed, the same endpoint handles every other Fire event by branching on event.type.
Prerequisites
- A Fire account with dashboard access (Settings → Integration Flows)
- A publicly reachable HTTPS URL (use ngrok for local dev)
- A way to run a small Node/Python/Go service — anything that can serve
POSTand parse JSON
Step 1 — Run a minimal endpoint
Start with the smallest viable handler. We’ll add the production concerns (auth, dedup, persistence) in step 5.Node.js
https://<random>.ngrok.app). You’ll paste it into the Fire flow in the next step.
Step 2 — Configure an Integration Flow
In the Fire dashboard, go to Settings → Integration Flows → New flow.Scope it
Pick the account, vendor, and (optionally) specific stores this flow should fire for. Leave stores empty to match all stores under the vendor.
Add an HTTP node
Drag an HTTP node onto the canvas. Connect it from the trigger.
- Method:
POST - URL: the ngrok URL from step 1, plus the path
/fire/events - Headers:
Content-Type: application/json - Auth: leave blank for now — we’ll add it in step 5
Use the canonical body template
Paste the canonical body template into the Body field. It produces the standard Most teams start from the Webhook Test — Full Order Data example template the dashboard ships with — it’s the same shape with each
{ event, data, _meta } envelope your handler expects.data.* field expanded explicitly.Step 3 — Fire a test event
Two ways to verify the wiring: Option A — Probar Flujo (dry run). In the flow editor, click Probar Flujo and pick a sample scenario. Fire dispatches a synthetic event through your live flow. Your endpoint should log it within seconds. Option B — Real order. Inject a real test order through your normal pipeline (POS, kiosk, orPOST /v1/orders). Once it reaches status=COMPLETED and paymentStatus=SUCCEEDED, the flow runs and you’ll see the request hit your endpoint.
If nothing arrives within 30 seconds, check Settings → Integration Flows → Executions for failed executions and the error message.
Step 4 — Read the payload
Your handler now receives a request whose body looks like:data object is the V4 order snapshot — the full record of the order. See order.completed for the field-by-field reference.
Step 5 — Make it production-ready
The minimal handler from step 1 works for the demo. For production you need three more things.Acknowledge fast, process async
Fire times out after 30 seconds. Acknowledge first; process in the background.Deduplicate by event.id
Fire retries on any non-2xx response. Use event.id (the flow execution ID) to skip duplicates.
Authenticate the request
Fire does not currently sign outbound webhooks with HMAC. Authenticate by adding a credential to your flow’s HTTP node and validating it on your side. Three options:- Bearer token — set
Authorization: Bearer <secret>in the flow’s headers; check it in your handler. - API key — set
x-api-key: <secret>in the flow’s headers; check it. - OAuth2 client credentials — for tenants that need rotating tokens; the flow auto-fetches the token.
HMAC signing (
X-Fire-Signature) is on the roadmap and will be opt-in when it ships. For now, a shared secret in the flow header is the canonical authentication mechanism.Common pitfalls
- Money values are strings × 10000.
payments.totals[0].total === "229000"means 22.9. Parse with a decimal library; neverparseFloat. event.idis the flow execution ID, not the order ID. Useevent.idfor idempotency keys; usedata.orderIdfor business keys.fulfillment.deliverymay be present even on dine-in / pickup orders with placeholder zeros. Branch onfulfillment.service.code, not ondelivery !== null.payments.totals[]andpaymentMethods[]mix camelCase and snake_case. Read bothcurrencyCodeandcurrency_codedefensively in those objects.
What’s next
order.completed reference
Full payload reference, including the BR fiscal blocks.
order.cancelled reference
Cancellation payload with audit metadata.
Integration Flows
Deeper coverage of flow scoping, body templates, and node types.
Delivery & retries
Retry policy, dead-letter, and idempotency model.

