Default behavior
Out of the box, with no retry configuration, an HTTP node makes a single attempt with these defaults:| Setting | Default |
|---|---|
| Method | POST |
| Timeout per attempt | 30 seconds |
| Retries on failure | disabled (retryOnFailure: false) |
Content-Type | application/json (auto-injected when body is present) |
Accept | application/json (auto-injected) |
2xx, or the network drops, the execution fails immediately and lands in the dead letter unless you’ve enabled retries.
Retries are opt-in at the flow level. Most production flows enable them. Set
retryOnFailure: true and tune retryCount per flow.Retry policy
When retries are enabled, the HTTP node attempts the request up toretryCount + 1 times in total, waiting between attempts with exponential backoff capped at 8 seconds.
| Setting | Range | Default | Maximum |
|---|---|---|---|
retryCount | 0–5 | 2 | 5 (so up to 6 attempts total) |
| Backoff | min(1000 × 2^(attempt - 2), 8000) ms | — | — |
retryCount: 5:
timeout).
What counts as a failure
| Outcome | Retried? |
|---|---|
Non-2xx response | Yes |
| Timeout | Yes |
| Network error / DNS failure | Yes |
| Auth resolution error (e.g. OAuth2 token fetch failed) | No — fails immediately |
| Blocked URL (request to internal-only host) | No — fails with BLOCKED_URL |
Idempotency on your side
Because retries replay the same body, your endpoint must be idempotent. Useevent.id (the flow execution UUID, generated once per execution and stable across retries) as your dedup key.
Dead letter
When all retries are exhausted, the execution is moved to theflow_dead_letter table. Failed flows can be inspected and manually replayed from Settings → Integration Flows → Executions → Dead letter. Replays produce a new event.id (because they are a new flow execution); your idempotency dedup will not block them, which is what you want.
Ordering guarantees
- No ordering guarantee across orders. Two
order.completedevents can arrive out of business order. Sort bydata.createdAtif you need order. - No ordering guarantee across event types for the same order.
order.invoicedmay arrive before or afterorder.completedfor the samedata.orderId. Don’t assume one precedes the other. - Within a single flow execution, retries preserve identity. The same
event.idwill arrive multiple times during retries; later retries do not change the body.
Authentication
Configure the auth on the flow’s HTTP node. Fire injects the credential into the request before sending.Bearer token
Authorization: Bearer <token>. Use it for static secrets or short-lived JWTs you rotate periodically.
API key
OAuth2 client credentials
Authorization: Bearer <access_token>.
None
URL safety
Outside development environments, Fire blocks requests to internal/private IP ranges (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16, IPv6 link-local). Attempts to reach those hosts fail with BLOCKED_URL and are not retried.
In dev environments (NEXT_PUBLIC_ENVIRONMENT=dev or NODE_ENV=development), this check is skipped so localhost/ngrok and similar can be used.
Observability
Every execution writes a row visible in the dashboard at Settings → Integration Flows → Executions. Each row includes:- Trigger type, store, account, vendor
- Execution start/end timestamps
- Attempt count
- Final status (success / failed / dead-letter)
- Per-node summaries (HTTP request URL, response status, body excerpt, error message)
HMAC signing (roadmap)
HMAC-SHA256 signing of outbound bodies is on the roadmap. When it ships:- A per-flow secret will be generated in the dashboard
- Outbound requests will carry an
X-Fire-Signatureheader with the body’s HMAC - This page will document the algorithm and verification steps
Common patterns
- Always enable retries on production flows. A single timeout shouldn’t drop an event.
- Cap retries at 3 unless you have a long-tail flaky downstream. More retries means longer dead-letter latency.
- Use
event.idfor idempotency, notdata.orderId. A retried delivery has the sameevent.idbutdata.orderIdis the same across the entire order lifecycle (completed, cancelled, fiscal authorized, fiscal cancelled all share it). - Store
_meta.executionIdand_meta.attempton persisted events — they’re invaluable for debugging “why did the same order get processed twice”. - Keep
timeoutshort (5–10s) and acknowledge fast in your handler. Use a queue to do real work in the background.
Next
Events overview
The event model in one page.
Integration Flows
Flow definition, body templates, and matching rules.

