Summary
A company cannot coordinate reliably if every internal workflow has to relearn the eccentricities of each external system. Providers will send incomplete payloads, change enums, and disagree about what the same business fact looks like. That mess belongs at the edge. It should not become the platform's native language.
Problem
External payloads contain optional fields, shifting schemas, and provider-specific failure behavior. Letting those shapes flow inward appears to avoid translation work. It actually distributes that work across every service, job, and review surface. Each caller then makes its own guess about missing values and unfamiliar states.
That is how one uncertain input becomes several conflicting interpretations.
Principle
Let integrations absorb provider-specific transport and payloads, then convert them into validated internal contracts before they reach services, jobs, review surfaces, or shared libraries. Preserve uncertainty explicitly; normalization should name an unknown state, not pretend it does not exist.
Platform Shape
Integrations own authentication, transport, and provider adaptation. Services own capabilities. Shared typed contracts belong in libs/ when more than one consumer depends on the same meaning. Conversion happens at the boundary so internal code can reason in company terms while the adapter remains responsible for the provider's version of reality.
The distinction also sharpens failure handling. A transport timeout, an invalid provider payload, and a genuine business ambiguity may all arrive during one workflow, but they do not deserve the same retry or repair path.
Tradeoffs
Adapters and typed models require maintenance as providers evolve. Some provider-specific detail must remain available for diagnostics. The goal is not to erase that detail; it is to keep it from silently setting the semantics of the entire platform.