The Roku migration was forty million subscribers, seven months, eight organizations, and a contract deadline that could not move. Everything went wrong at some point. The program delivered on time. Here is what I learned.

The first lesson is that financial reconciliation is the hardest integration problem in a payment migration. Not the API, not the settlement, the reconciliation. Connecting what went through the payment processor to what landed in the financial ledger requires a level of data integrity that neither system was designed to provide independently. Build the reconciliation system before you build the migration. If you build it after, you are reconciling a moving target.

The second lesson is that Finance sign-off is a launch criterion, not a post-launch check. I gated go-live on a signed reconciliation report from Finance. That forced the reconciliation work to be done and verified before I moved subscribers. It also forced Finance to engage with the technical implementation earlier than they wanted to, which was uncomfortable and exactly right.

The third lesson is about scope. I cut ZipRecruiter from the initial scope when it became clear the integration would take longer than the timeline allowed. That decision was painful because the business wanted it. It was correct because a delayed launch would have cost more than the missing feature. Scope control at the end of a program is harder than scope control at the beginning. Practice it at the beginning so you have the muscle when you need it at the end.

The fourth is that a tiger team for a specific, bounded integration problem works better than adding the problem to the general program. I stood up a three-person team to resolve the reconciliation gap with Finance. Two weeks, one deliverable. That team moved faster than the broader program could have, because the problem was theirs alone.