How it happens
Payment completes on the gateway, which then calls your store to confirm. If that call fails, times out, or hits an error while your server is under load, the payment exists and the order does not.
Neither side treats this as an error worth surfacing. The gateway recorded a successful payment. Your store simply never heard about an order, so it has nothing to report.
What the customer experiences
A charge on their statement, no confirmation email, and no order in their account. From their side it looks like the store took their money and did nothing, which is precisely the impression that produces a chargeback and a public review.
The support burden is disproportionate, because each case requires manual reconciliation before it can be resolved.
How to check
- Export gateway transactions for a month and match the count against store orders for the same period
- Check the gateway dashboard for failed webhook deliveries, which most providers log
- Look for payments marked successful with no corresponding order ID
- Test the full payment flow yourself after any plugin, theme or PHP version update
Reducing the risk
Enable webhook retries where the gateway supports them, so a single failed delivery is not final. Make sure your endpoint responds quickly, since slow responses time out under load, which is exactly when volume is highest.
Set up a monthly reconciliation as a routine rather than as a response to a complaint. It takes minutes and it catches the cases nobody reported.
Why this belongs in a marketing conversation
Missing orders distort every downstream number. Conversion rate looks worse than it is, ROAS looks worse than it is, and campaigns get judged on data with holes in it.
Verifying that money and orders reconcile is a measurement prerequisite, not a purely technical concern.
Key takeaways
- A silent webhook failure leaves the customer charged and the order missing
- Reconcile gateway transactions against store orders monthly
- Missing orders also distort conversion rate and ROAS