Everything inside your boundary can be elegant; the outside world arrives as it is — REST if you're lucky, EDI over SFTP if you're not, and a fax-era mindset either way. This page maps the three external integration families a commerce + fulfillment stack meets — carriers, 3PLs/retail partners, marketplaces — with the open-source tooling and the defensive postures each demands. (Route/mode optimization on top of these rails is TransportationManagement.)
The per-shipment loop is rate-shop → buy label (returns a ZPL/PDF and tracking number) → manifest at day's end → consume tracking events. Every carrier exposes some API; every carrier's API is different, and multi-carrier is table stakes (rate arbitrage, coverage, resilience to a carrier's bad week). The classic answer was commercial aggregators (EasyPost, Shippo) — clean APIs, per-label fees, closed. The open-source answer is Karrio: a self-hosted multi-carrier shipping API (Apache-2.0 core; its /ee directory is separately licensed — the OSS build is the Apache files) that normalizes rating, labels, manifests, and tracking across carrier connectors behind one API you own. Posture advice regardless of tool: treat carrier calls as unreliable sync dependencies (timeouts, retry budgets, queue-and-retry label purchases rather than blocking the pack station — the label printer queue is a point-to-point channel); and treat tracking as at-least-once, out-of-order event streams (idempotent consumers, last-status-wins with timestamps).
Outsource fulfillment to a 3PL and your WMS box in the reference architecture becomes their system, reached across a partner boundary. Modern 3PLs offer REST; large 3PLs, retail/wholesale partners, and drop-ship arrangements still run on EDI X12 (EDIFACT outside North America), and if you sell into big retail you will meet it, not choose it. The core commerce document set: 850 purchase order, 855 PO acknowledgment, 856 ASN (advance ship notice — the one partners fine you for getting wrong), 810 invoice, 846 inventory advice, 940/945 warehouse ship order and confirmation (the 3PL pair), 997 functional acknowledgment.
The transport is batch file exchange — SFTP drops on schedules, or AS2 (signed, encrypted HTTP push with receipts — Walmart-class partners mandate it). The honest integration shape is therefore file-based, asynchronous, acknowledgment-tracked: pick up files, parse, validate, translate to your canonical order/shipment model (IntegrationPatternVocabulary: translator at the boundary), emit domain events inward, and track acks/timeouts per interchange — a missing 997 is an incident, not a shrug.
Open-source EDI tooling is genuinely thin — the industry runs on commercial VANs and translators. What exists and works: parser/serializer libraries for building your own translator (Python pyx12, bots EDI translator (mature GPL), Java smooks/EDIReader lineage, the newer x12-serde style libs), and AS2 via openas2 (BSD, Java, battle-tested). A pragmatic open-first pattern: self-host the parsing/translation as a small owned service, and accept a commercial VAN as transport only when a partner's connectivity checklist demands one — transport is a commodity; keep the translation logic (where the business rules live) yours.
Amazon (SP-API), eBay, Walmart, Etsy — each is "just REST," and each is its own integration project: OAuth dances, aggressive rate quotas, asynchronous feed-based writes (submit a feed, poll a report), and policy engines that suspend sellers over data-quality slips. The two flows that matter operationally: inventory feeds out (your available-to-promise, minus a marketplace-specific buffer — marketplaces are where the oversell window (DataConsistencyAndSyncPatterns) turns into account-health damage) and orders in (treat each marketplace as another storefront emitting orders into the same OMS intake, translated to canonical at the edge). Open-source marketplace connectors exist per-platform in varying health; expect to own glue code here, and design it as boringly as the EDI service: pull, translate, emit, reconcile.
Across all three families the same rules recur — this is the page's actual pattern content: