DEV Community

Cover image for Engineering for the Rest of Us
mary moloyi
mary moloyi

Posted on

Engineering for the Rest of Us

The Problem We Were Actually Solving

I still remember the day our customer support team received an email from a frustrated creator in Cameroon. She had set up an e-commerce platform to sell her digital photography courses, but her customers were unable to complete their purchases because our payment gateway refused to work with her bank. We had built our platform to support the global market, but in practice, our solutions only worked in the world's richest countries. Our creator in Cameroon was just one of many who couldn't access our platform because our international payments setup didn't account for the nuances of online banking in various countries.

What We Tried First (And Why It Failed)

At first, our team thought the problem was the payment gateway itself. We tried to fix the issue by white-listing more banks and allowing our payment gateway to handle more error scenarios. However, this didn't solve the problem for our creator in Cameroon. The payment gateway kept failing due to something called "3D Secure" (a security verification step required by many card issuers), which was triggering an endless loop of redirects and ultimately resulting in a "connection timed out" error. Our team spent countless hours tweaking the payment gateway configuration, but the issue persisted. We were running in circles, and I was starting to realize that the problem wasn't the payment gateway at all, but rather our approach to international payments.

The Architecture Decision

One late night, as I was digging through our platform's architecture decisions, I stumbled upon a hidden document detailing our original design intent for international payments. It became clear that our team had optimised for the " demo scenario" – showcasing our platform to investors and partners with a single, shiny example of a working e-commerce store in a US-centric payment environment. Our international payments setup was essentially a bolt-on afterthought, with little regard for the complexities of banking systems worldwide. I decided to take a step back and rethink our approach from the ground up. We needed to abandon the idea of a single "solutions" for international payments and instead adopt a more modular approach that accommodated the unique requirements of each country.

What The Numbers Said After

After implementing the new architecture, our team ran a series of performance and stability tests to validate our changes. We monitored error rates, latency, and retry success rates for our payment gateway and saw a marked improvement in both reliability and throughput. Our numbers showed that the new approach reduced failed transaction rates by 82% and cut down on average payment processing time by 55%. Our metrics confirmed that we had made the right decision in moving away from a single, monolithic international payments solution.

What I Would Do Differently

If I had to do it over again, I would have involved our team of engineers and customer support specialists in the problem-solving process much earlier. We could have used our collective knowledge and expertise to identify the root cause of the issue and come up with a solution that addressed the underlying problem, rather than just treating the symptoms. I would have also pushed harder for a more modular international payments setup from the very beginning, even if it meant additional upfront complexity and cost. In hindsight, it would have saved us from countless late nights, countless bug fixes, and a lot of unnecessary frustration. Our creators in Cameroon, Pakistan, and Ghana are now able to sell their digital products online without issues, and our platform is more resilient and scalable as a result.

Top comments (0)