Six weeks into a monolith-to-services rewrite I asked one question that stopped everything: when a payment lands, which service writes the balance?
Four people, three answers.
The inherited system had one database and no ambiguity. Any module could touch any table, and over the years the write paths had braided together: the payment handler adjusted a balance, a reconciliation job adjusted the same balance, an admin action adjusted it again, and the order of those writes was whatever the schedule happened to produce. It worked because a single transaction boundary quietly forgave all of it.
Split that into services and the forgiveness is gone. Two services writing the same number is not a refactor, it is a distributed consistency problem you volunteered for.
What it cost: I had to stop, map every write path against actual production traffic, and then find that one of them existed only to patch a rounding mismatch nobody had documented. That patch was load-bearing. It would have been dropped in the rewrite, and it would have surfaced as reconciliation drift weeks later, far from anything I had touched...
What I do differently now. Before any rewrite I answer five things, and none of them are about the stack.
Which entities carry money or legal state, and which single component owns each write.
What the system does today that nobody can state out loud: the undocumented behaviour that lives in code, not in tests.
Which of the current boundaries exist for a reason, and which exist because someone was in a hurry in 2019.
What the invariant is that must hold during the migration, while the old path and the new one are both live.
How I prove the new path matches the old one on real traffic before anything gets cut over.
Skip the ownership question and what you ship is the same confusion as before, spread across more network hops.
I write up more of these migration post-mortems on my blog, if that's useful: https://polycratia.com/c/20ba6814
If you've done a monolith split with money in the system, what did you run in parallel to prove the new write path was correct?