Case Study - The server behind a US business bank: card approvals, credit, and the APIs the phone apps later used.
Six months on a business bank’s servers. We built a service that approves or declines a card while the customer is still standing there, moved two generations of code onto one toolchain, and kept shipping credit, payments, and cash-flow tools on that same server.
- Client
- Business bank
- Year
- Service
- Platform, product engineering
Overview
This is the server work for a US business bank serving smaller firms with checking, company cards, and credit lines. It is not the later phone-app project. Those apps use what this project left behind.
The through-line was a decision on a card swipe while the customer was still standing there. We started a dedicated service for that path: verify the caller, read balances, apply spending rules, and keep a log. Through the spring it gained a database, a message bus, and the partner bank’s auth. Deposit cards and charge cards ended on one table. By midyear the isolated read models were gone. Authorization read the same banking tables as the rest of the money system.
In parallel, two generations of services moved onto one toolchain and one internal framework. Language and build upgrades, a reproducible developer setup, a shared money and secrets library, and an internal admin surface with a normal login. Midway we moved the SQL layer toward a typed mapper and replaced the old dependency container. A few mapper paths came back out when they were not stable yet. The rule was to ship the product, not to win the migration.
Product work rode the same platform. Credit-line monitors and agreement generation. International payment consumers and bill-pay audit trails. Cash-flow sync that stopped holding database connections open across a slow partner call. A cache in front of a third party that could not keep up. Object-level checks after an outside review, including a fix on a transactions route that trusted an id it should not have.
The build had to keep up with that. CI was rebuilt so master finished in about a quarter of the previous wall-clock. A pre-merge check started catching missing infrastructure changes. Staging pool and CPU incidents were diagnosed rather than restarted and forgotten. Deploys stopped replacing a newer manual release with an older automated one.
The result was one server that could approve a card swipe, keep shipping credit and payments, and feed both the website and the later phone apps.
What we did
- Card decisions
- Toolchain unification
- Capital and payments
- Build and deploys
- API for web and phones
- On the platform
- 6 months
- Previous master build time
- ~1/4
- Web and phones share it
- 1 stack