Partway through a monolith-to-services rewrite, I found out the cut-over date was not mine to pick.
The system I inherited had quietly grown an integration surface. Payment provider callbacks. Carrier webhooks. A couple of partner endpoints. Those addresses all lived in someone else's dashboard, and some were set up years earlier by people who had since left both sides of the integration.
Each of those URLs was a contract I could not version. The handler behind it I could rewrite in an afternoon. Asking a provider to change a notification address on my sprint schedule was a different thing: their change windows ran on their own calendar, and one of them wanted a support ticket plus a round of sandbox re-testing before anything moved.
So it stopped being an architecture exercise and turned into a mapping exercise. Which of my endpoints does an external party hold the address of? What happens to a callback that lands mid-switch: does it get retried, or does it just disappear into a 404 that nobody owns?
The time went to assuming the system boundary sat where my code ended. It sat where someone else's configuration pointed.
Now I inventory the externally-addressed surfaces before any rewrite, and I keep the old paths alive as thin forwarders. No cut-over moment, no scheduling calls with third parties: the old URL keeps working while the logic moves behind it.
I've written up more of how I sequence migrations like this on my blog: https://polycratia.com/c/89136140
If you've done a rewrite with live third-party callbacks pointing at the old system, I'd be curious whether you forwarded or coordinated a window.