PaidRadar › Bulk-repairing orders after a webhook outage
The endpoint was blocked, timing out or pointing at the wrong URL, and nobody noticed until the backlog became obvious. The instinct is to select everything in the order list and bulk-change the status. That instinct is the expensive one. Here is what goes wrong with it, and a procedure that does not require trusting a guess.
A bulk status change is a bulk assertion that all of those payments succeeded. Nothing in it checks whether any of them did. Two separate problems follow from that.
A stuck-order backlog is never uniformly “paid”. It contains genuinely paid orders, abandoned checkouts, declined cards, retries that succeeded on a second order, authorisations that were never captured and asynchronous payments that later failed. Completing the whole list ships goods against every one of those categories. The unpaid ones cost you inventory and shipping with no payment behind them, and you find out at reconciliation.
WooCommerce records a payment through its own completion flow, which sets the paid date, stores the transaction reference and fires the hooks other systems listen to. A status edit changes the status and little else. The orders then look complete in the admin while reports, exports, accounting integrations and anything keyed to actual payment still treat them as never paid — a second cleanup job you inherit later.
Even when every order in the batch is genuinely paid, completing hundreds of them in one action has consequences that are easier to prevent than to undo.
| Approach | Verifies payment? | Uses the payment completion flow? | Effort for hundreds of orders | Main risk |
|---|---|---|---|---|
| Bulk status edit | No | No | Minutes | Shipping against payments that never cleared, plus orders with no paid date or transaction reference. |
| Replaying events at the gateway | Yes | Yes | Feasible, but per event and only inside the retention window | Events older than the window cannot be replayed at all. |
| Manual check, order by order | Yes | Depends how you complete it | Hours to days | Fatigue errors, and it stops being realistic well before a few hundred orders. |
| Automated reconciliation against the gateway API | Yes | Yes | One configured run | Another moving part, and it needs read access to the gateway API. |
Gateway retention and replay behaviour is documented by the respective providers and can change. Check the current rules for your gateway rather than relying on any third-party summary.
PaidRadar performs the verification step mechanically. It scans orders in pending,
on-hold or failed inside a look-back window you define, queries the gateway API read-only for each
one, and completes only the orders the gateway unambiguously confirms as captured with a matching
amount and currency — using WooCommerce's own payment_complete() flow, so paid date,
transaction reference, stock and emails behave as they would have on the day. Everything ambiguous is
skipped and logged with the gateway's answer next to it, so the backlog you are left with is a short
list you can look at by hand.
It never captures, refunds or moves money, it is self-hosted with no account, and it does not replace fixing your webhook delivery — it is the cleanup and the safety net underneath it. Full trade-offs against the other three approaches are in the recovery options comparison.
You can, and it is the one action most likely to cost you money. A bulk edit asserts that every one of those payments succeeded without checking any of them, and the backlog always contains abandoned checkouts, declines and uncaptured authorisations alongside the genuinely paid orders. It also skips the payment completion flow, so the repaired orders carry no paid date or transaction reference.
Use the gateway's webhook delivery log to find the first and last failed delivery, then filter your order list to pending, on-hold and failed within that window. A tight window keeps ordinary abandoned checkouts out of the candidate list. Cross-check against server or firewall logs if the delivery log is incomplete.
Yes, whenever it is still possible. A replayed event is processed by your existing payment plugin exactly as it would have been originally, so nothing about the order is reconstructed after the fact. The limitation is the gateway's event retention window — beyond it there is nothing left to replay and you have to verify against the payment record instead.
It can, and days late. Decide in advance whether those notifications should go out, throttle them if they should, and warn support before you start. The same applies to stock movements and to fulfilment or accounting integrations that will suddenly receive several days of orders at once.
They should be left alone and listed, not guessed at. Partial payments, currency mismatches, authorisations without capture and payments that were later refunded or disputed all need a human decision. Any automation that completes an order on an ambiguous answer removes the only guarantee that makes automation acceptable here.
Monitor delivery rather than orders. Gateways report failing endpoints and will disable one that keeps failing, so route those notifications somewhere a person reads them. A scheduled reconciliation run is the second layer: it surfaces the gap within hours instead of at month-end, but it is a backstop, not a substitute for working webhooks.