Cybersource Pending-Transaction Fix
About 22% of our Cybersource card payments were stuck in pending, never reaching success or failure. My dev team didn't want to dig into it, so I did it myself. I traced the data, listened to support calls, and watched session recordings until I found it: the Pay Now button never disabled. People tapped it around ten times, each tap firing a duplicate request that broke 3DS. Disabling it on first tap lifted success about 10%.

Around 22% of Cybersource card transactions were stuck in pending. Not succeeded, not failed, just pending, which shouldn't be possible. It was bleeding the card step of the funnel and there was no obvious cause anywhere in the payment integration.
I started in the data and saw multiple payment requests firing against the same order. My dev team didn't want to chase it, so I listened to customer calls, found one where the 3DS screen wasn't loading, pulled her session recording, and watched her tap Pay Now over and over. The fix was to disable the button on the first tap, show a loading state, and de-duplicate submissions on the server.
Nobody wanted to dig into it, so I did.
I started in the data. For a single order there were about three payment requests firing on average. Sometimes one succeeded or failed while the rest stayed pending, sometimes every one of them was pending. I took it to the dev team to investigate and they were reluctant to chase it.
So I kept going on my own. I listened to customer calls until one woman mentioned the payment screen never loaded for her. I called her back, walked through exactly what happened, and worked out that the 3DS OTP screen wasn't loading. Then I pulled her Clarity session recording and watched her tap Pay Now over and over. I reproduced it myself right after. After digging that long, finding it felt like hitting treasure.
A front-end button breaking a payment.
Every tap on Pay Now fired another request, and the pile-up was breaking 3DS and stranding transactions in pending. It was our dev team's bug, sitting in the front end the whole time. The fix was simple once we knew where to look: disable the button on the first tap, show a loading state so people know it's working, and de-duplicate submissions on the server. Pending transactions basically disappeared, card success went up about 10%, and drop-off at the card step fell around 20%.
Card payments stuck “pending” · before vs after the fix
−22 ptsUsers tapped “Pay Now” up to ten times because nothing said it was working. Each tap fired a duplicate request that broke 3DS. Disabling the button on first tap took pending transactions from 22% to near zero, lifting success ~10%.