Webhook is not being delivered
What to check when a sale or order should have happened but no webhook reached your URL. First use a test send and the delivery log to tell whether ReceiptRoller did not send anything or sent it and your server failed it, then work through the causes for that case.
Check your server with a test send
curl -X POST https://receiptroller.io/api/v1/webhooks/test/{webhook_id} \
-H "Authorization: Bearer {access_token}"
| Result | Meaning |
|---|---|
success: true | Your server is fine. Go to "No rows in the delivery log" |
httpStatus: 0 | No connection, or no response within 10 seconds. Go to "Cannot connect" |
httpStatus: 401 and similar | It arrives but your server rejects it. Go to "Your server rejects it" |
The API returns 404 | The webhook ID is wrong, or you are using another app's token |
A test send goes out once, regardless of subscribed events or whether the webhook is switched on. The developer portal has no test button, so use the API.
Look at the delivery log
curl https://receiptroller.io/api/v1/webhooks/{webhook_id}/deliveries \
-H "Authorization: Bearer {access_token}"
You get the latest 50 attempts, newest first. Whether there are rows around the time of the missing event decides where to look next.
- No rows: ReceiptRoller did not send it. See "No rows in the delivery log"
- Rows with
success: false: it was sent and failed. Depending onhttpStatus, see "Cannot connect" or "Your server rejects it"
No rows in the delivery log
- Is the webhook switched off? Check
activeinGET /api/v1/webhooks/{webhook_id}, or whether the app details page in the developer portal shows Inactive. Four failed attempts in a row switch it off, and nothing is sent while it is off. Once fixed, send{ "active": true }withPATCHor use the resume button - Are you subscribed to an event that is sent? Only
receipt.created,order.createdandorder.updatedare sent.receipt.updated,receipt.deleted,coupon.redeemed,coupon.expiredandcustomer.visitedcan be subscribed to but are never sent - Is it the right business account? A webhook receives events only from the business account it was registered for (through the API, the token's business account; in the portal, the business account that owns the app). Check
organizationIdinGET /api/v1/webhooks/{webhook_id} - Does that action raise an event?
receipt.createdis sent only when a sale is saved for the first time. It is not sent when a POS resends the same sale, on a re-sync, when the same period's CSV is imported again, or for a deleted sale. Order events are sent when an order is created, edited, confirmed, started, cancelled or handed over at a POS in order management - A restart on the ReceiptRoller side: pending retries are held on the server, so if it restarts while a retry is waiting, the remaining retries do not happen. The log then stops at a failed row. Fetch the missing period from the API
Cannot connect (httpStatus is 0)
errorMessage holds the reason.
- Is the URL reachable from the internet (not inside a corporate network or VPN, and the server is running)?
- Is the TLS certificate valid (not expired, not self-signed)?
- Is a firewall or WAF blocking outside
POSTrequests? - Does your server answer within 10 seconds? Move heavy work after the response (Designing resends, ordering, and idempotency)
- Did you change the URL's host or path? A registered URL cannot be changed, so register a new webhook for the new URL
Your server rejects it (4xx or 5xx)
401/403: usually a failed signature check- Are you using the secret from the webhook's registration (not the client secret)?
- Are you computing over the raw body, before JSON parsing?
- Are you comparing
sha256=plus lower-case hex? - Webhooks registered before the fix of 23 October 2026 are signed with the app's client ID. Registering again gets you one signed with its secret
404/405: your routing does not accept aPOSTon that path5xx: your processing errors. Look in your logs for theX-RR-Deliveryreceived at that time
For details see Signature verification and security.
Recovering missed events
ReceiptRoller cannot resend past events. After fixing your server and switching the webhook back on, fetch the sales for the period you missed from the Transactions API.
Related guides
-
403/401 is returned (permissions and scopes)How to isolate the cause when an API call returns 401 or 403. Explains the typical cases: invalid token, insufficient scope, no store access permission, and User-scope review not passed.
-
The developer portal is not shown while on the Free planWhat to check when the ReceiptRoller developer portal is not shown. Explains what to do when your plan is Free, switching business accounts, and the timing of when the display updates.
-
app_not_approved is returned for User-scope callsWhat to check when using a User-scope results in an app_not_approved error. Explains development with a sandbox slot, applying for review, and the flow from sandbox to production.
-
Cannot obtain a token (authentication error)How to narrow down a 400 or 401 from the token endpoint, with the fix for each error and error_description, including invalid_client and invalid_grant.