Our consumer apps run on one backend. A player has a single identity, a single wallet and one payout pipeline across all of them. It was the right decision. It was not the free one.
What it genuinely bought us
A new title does not need an accounts system, a rewards ledger, a payout integration or a fraud pipeline. It needs its game loop and a configuration entry. The gap between an idea and a testable build shrank from months to weeks.
What it cost
- A change to shared code is a change to every app, so the blast radius of a mistake is the whole portfolio
- Every app is coupled to one deploy schedule unless you work to avoid it
- Per-app behaviour creeps into shared code as if-statements until someone stops it
- One incident is now eight incidents
The rules that keep it honest
Shared means shared. The moment a shared service starts branching on which app is calling, it is no longer shared infrastructure - it is a pile of features wearing a trench coat. Differences belong in configuration the service reads, not in conditionals it contains.
When we would not do it again
If the products genuinely have nothing in common - different users, different money, different lifecycle - shared infrastructure is coupling with no upside. Ours share a wallet and a player. That is what made it worth it.