Route through canonical
Never wire format A straight to format B. Every source maps into one shared canonical message; every destination maps out of it. The bus speaks one language, and the integration count stops exploding.
When you map each source directly to each destination, the work grows as the product of the two. Three sources feeding three destinations is nine maps to write and maintain; add one of either and you are rewriting a column of the matrix. Worse, a change to one partner’s format ripples into every map that touched it.
Route everything through a canonical message instead and the mesh collapses into a hub. Each source needs exactly one inbound map (its format → canonical) and each destination one outbound map (canonical → its format). Three plus three maps, not nine. A new source is one new map; it can immediately reach every existing destination because they already speak canonical.
The canonical message is a deliberate internal contract — see the canonical data model pattern for how to design one per business entity. The rule here is simpler: nothing on the bus is ever in a partner’s native shape. External formats live only at the edges, which is exactly where mapping belongs.