Reconciliation
Webhooks get lost: deploys, timeouts, misconfigured URLs. Run a scheduled job:
// every 5 minutesfor (const order of await orders.findPendingOlderThan({ minutes: 15 })) { const payment = await pay.payments.reconcile({ provider: order.provider, reference: order.reference }); if (payment.status !== order.status) await orders.update(order.id, { status: payment.status });}- Paymob needs
apiKeyfor transaction inquiry. - Fawry looks up by merchant reference (status v2). Reference codes can take hours or days to be paid, so keep checking until
expiresAt. - Kashier order lookup is beta (
allowBeta: true).