The shadow phase should compare business effects, not only HTTP success. Two consumers can both return 200 while producing different CRM states because they resolve identities, timestamps, or retries differently. I’d give every captured event a migration correlation ID, run the new consumer in no-side-effect mode, and compare its proposed writes against the legacy writes before cutover. During the overlap, keep a single side-effect owner and use a durable event ID plus destination version so replay cannot create a second write. I’m Ege, co-founder of Atlantic, based in SF—we’ve found that the most useful cutover metric is semantic mismatch rate, not request error rate. Once that stays at zero across retries and out-of-order delivery, the atomic switch becomes much less dramatic.