Bifrost (Malouf)
Integration middleware decoupling Malouf's ERP from the outside world — orders in, shipments out, nothing tightly coupled.
Before Bifrost, every new channel or trading partner meant writing bespoke glue code directly into the ERP. Adding Amazon required touching order routing. Adding a new drop-shipper required touching fulfillment. The surface area for breakage kept growing.
Bifrost was built to stop that pattern. It sits between the ERP and everything external — an internal event bus where systems publish facts (order placed, shipment confirmed, invoice issued) and consumers react independently. Neither side knows about the other.
What it does
- Ingests orders from channel middleware platforms (Pipe17, DSCO) covering Amazon, Walmart, Shopify, and others, and translates them into ERP-native events
- Routes outbound purchase orders to drop-ship vendors via EDI (850 PO, 855 PO acknowledgement, 856 ASN, 810 invoice, 945 shipping advice, 846 inventory feed)
- Processes inbound EDI acknowledgements and ASNs, reconciling them against open orders
- Publishes inventory updates back to channel listings when stock levels change
- Handles shipment confirmations and pushes tracking back to the originating channel
Architecture
The system is structured as 8 loosely-coupled integration modules, each owning a bounded slice of the external world. Modules communicate only through events — no direct calls between them, no shared database tables.
Each module has its own queue, its own failure handling, and its own test suite. A bug in the EDI acknowledgement processor cannot affect the order ingestion pipeline.
Failed events are recorded with full context for replay. Most failures are transient (rate limits, network timeouts) and resolve on retry. The ones that don't are surfaced in the admin panel for manual review.
Impact
Onboarding a new channel used to take weeks and required careful coordination with the core ERP team. With Bifrost, a new channel integration is an additive change: a new module that publishes and subscribes to existing events, with no changes to anything upstream.