Building Our 3D Secure Flow: A Technical Postmortem
Sarah Namubiru
May 3, 2026

When we launched card payments, our 3D Secure flow used an iframe overlay to keep users on the checkout page during authentication. We quickly discovered that many banks block iframes with X-Frame-Options headers, causing the authentication to fail silently.
We replaced the iframe approach with a full browser redirect. When a card requires 3DS authentication, we redirect the user to the bank's ACS page, and the bank redirects back to our callback URL with the authentication result.
The redirect approach has a new challenge: users might close the browser tab during authentication. We added a polling mechanism on the checkout page that checks the transaction status every three seconds and shows a resume prompt if the user returns.
Callback reconciliation was another learning. The bank's callback includes provisional status in URL parameters, but the definitive status comes via server-to-server webhook. We display the provisional status immediately and update it when the webhook arrives.
Sarah Namubiru
Engineering team
Related articles

Jun 8, 2026
How We Process 10,000 Transactions Per Minute
A deep dive into the architecture powering RohoPay's payment engine — from load balancing to idempotency keys and real-time reconciliation.

Mar 22, 2026
Why We Chose Go for Our Payment Gateway
After evaluating Node.js, Python, and Rust, we chose Go for its concurrency model, compilation speed, and operational simplicity.
