bKash payments succeed on the wallet side faster than your server can confirm them. If your invoice update isn't idempotent, double-clicks create duplicate credits.
Always store the bKash trxID as a unique key. Reconcile nightly using the bKash merchant statement against your local transactions table.
Offer auto-renew through tokenized payments to cut churn by ~18% based on our customer cohort data.