notify_url you supplied when creating the checkout. This callback is your source of truth for order state.
The payload
Headers:
Verifying the signature
Float signs the raw JSON body with your signing key (the same one you use for request signing). Verify every callback before trusting it:Responding
- Return any
2xxstatus to acknowledge. Anything else counts as a failed delivery and triggers retries. - Respond fast (well under 10 seconds). Do heavy work — emails, ERP syncs — asynchronously after acknowledging.
Dynamic redirect (optional)
If your2xx response body is JSON containing a redirect_url, Float sends the shopper’s browser there instead of your static success_url/cancel_url:
- Only honoured on the initial synchronous delivery (the one made while the shopper is waiting on Float’s page). Retried deliveries can’t affect a redirect that already happened.
- Omit the field (or return an empty body) to use your static URLs — that’s perfectly fine.
Delivery and retries
- The first delivery happens synchronously while the shopper is still on Float’s payment page.
- If it fails (timeout, non-2xx, network error), Float retries in the background — up to 18 attempts at ~10-minute intervals (~3 hours).
- The shopper is still redirected using your static URLs even when the callback fails, so your
success_urlpage must tolerate the order not being marked paid yet. - After retries are exhausted, Float’s team is alerted and can re-trigger the notification manually. Your safety net is reconciliation via
GET /api/checkouts/:id.
Idempotency
Duplicate deliveries are possible (retry races, manual re-triggers). Key your handler onclient_reference_id + status: if the order is already in the target state, return 2xx without side effects.
Endpoint requirements
- Public HTTPS with a valid certificate — SSL errors are a common cause of failed deliveries and will page Float’s support team.
- No authentication challenge (signature verification replaces it).
- If your infrastructure requires IP allowlisting, ask Float support about static egress IPs.
Testing your handler locally
Simulate a callback with curl (signature computed with your sandbox signing key):notify_url.