The first market is easy. You pick a verification provider, integrate their SDK, handle the callback, and store the result. The second market is where the trouble starts: different documents, different data sources, a different regulator, and a provider who does not operate there. So you integrate a second vendor, and because their model differs from the first, you write a second flow.
By the fourth market you have four flows, four result shapes, four audit trails and a compliance team who cannot answer a simple question about how decisions are made, because the answer is genuinely different in each country.
Model the sequence, not the vendor
The durable abstraction is the verification sequence: an ordered set of steps, each with a type, a configuration, a set of accepted outcomes and branching rules based on what earlier steps returned. Sequences are data. Adding a market means adding a row, not writing a flow.
- A step has a type (document, biometric, registry lookup, sanctions screen, manual review) and a provider-agnostic outcome.
- Providers implement a step type behind one interface, so substitution touches configuration rather than the domain model.
- Branching is declared in the sequence, not embedded in code — "if the document check returns low confidence, add a manual review step".
- Every step execution is recorded with its inputs, its provider, its raw response and its interpreted outcome.
Make execution durable
Verification steps call external services that time out, rate-limit and go down. If your sequence executes inside a request handler, a provider outage leaves cases in an ambiguous state that a human resolves manually — and in our experience the manual resolution queue is where compliance failures accumulate.
Execute sequences as durable, resumable workflows. A provider outage suspends the case and resumes it when the provider returns. The customer sees "we are still checking" rather than a failure, and the operations team sees a suspended case rather than a mystery.
Separate the score from the decision
Risk signals should be exposed at component level, not collapsed into a number before a human sees them. When reviewers are handed a score they cannot decompose, they rubber-stamp it — and the organisation has effectively automated a decision it believes is being made by a person. Show the components, show which rule fired, and record the reasoning the reviewer gives.
