Running two providers at the same time is usually a deliberate, temporary state during a migration, not a permanent architecture, but it needs enough structure that it does not become a confusing mess of conditional logic scattered through a codebase. A checklist helps keep this phase short and its purpose clear.
Before you start sending real traffic to a second provider:
Confirm both providers' response shapes have been mapped against a shared internal data structure, so your application code reads from one normalized format regardless of which provider actually answered a given request
Decide the split logic up front: percentage of traffic, specific endpoints, specific customer segments, or a shadow mode where the second provider is called but its result is only logged, not used
Set up separate logging or tagging so you can tell which provider served any given request after the fact, which matters enormously when something goes wrong and you need to know where to look first
While both providers are live:
Compare error rates and response times between the two on a regular cadence, not just once at the start, since behavior can drift over days or weeks in ways a single initial test would miss
Watch for discrepancies in actual results between the two providers on the same input, and have a clear decision process for what to do when they disagree, rather than assuming one is simply right
Keep a running note of any request pattern that behaves noticeably differently between the two, since these are the exact cases worth testing more thoroughly before the old provider is retired
Before retiring the original provider:
Confirm that every code path which could call the old provider has actually been exercised against the new one, not just the common cases
Check for any hardcoded fallback logic that assumes the old provider is always available, since dual-provider periods sometimes leave behind fallback code nobody remembers to remove
Set a specific date for turning off the old provider rather than letting the dual-provider period drift indefinitely, since an open-ended transition tends to never actually finish
My Geocode's compatibility hosts are built specifically to make the first half of this process, response shape normalization, mostly unnecessary if the provider you are moving from already has a matching host, since the shape stays identical to the original and your existing normalization code (if you already had any) keeps working unchanged. The full list of 17 compatibility hosts is at /compatibility/. Every request also carries quota headers, X-Quota-Limit, X-Quota-Used, X-Quota-Free-Remaining, and others, documented at /docs/rate-limits/, which are useful for the comparison logging step above regardless of which provider is being evaluated as the second one.
A dual-provider period done well is short, well instrumented, and ends on a planned date. Done poorly, it becomes a permanent and confusing fixture. The difference is almost entirely in whether a checklist like this one gets followed rather than skipped under time pressure.