ml-connector
SAP ECCShipBob

SAP ECC and ShipBob integration

SAP ECC runs your financial close and inventory valuation. ShipBob runs your fulfillment operations across multiple warehouses. When the two systems are disconnected, you spend time reconciling inventory counts, re-entering shipping costs, and chasing stock level discrepancies across locations. SAP ECC and ShipBob connected keep your inventory accounts accurate and your fulfillment orders reflected in your GL immediately, without manual re-keying or spreadsheet sync cycles.

How SAP ECC works

SAP ECC exposes purchase orders, purchase order line items, material masters, inventory balances, storage locations, cost centers, and GL accounts through RFC/BAPI function modules, OData v2 REST via SAP Gateway, and IDoc XML. Authentication uses HTTP Basic Auth for OData and IDoc endpoints, or RFC Basic Auth via SAP .NET Connector or Java Connector for BAPI calls. SAP ECC is on-premises only, so RFC calls originate from a customer-managed agent running on the local network. OData services must be activated by the SAP Basis team and published on a customer-specific SAP Gateway instance. There is no native webhook registry, though outbound IDoc push can be configured in transaction WE21 and WE20 if the customer enables it.

How ShipBob works

ShipBob exposes orders, shipments, products, variants, inventory balances, warehouse receiving orders (WRO), returns, and billing through REST APIs at https://api.shipbob.com. Authentication uses OAuth2 Authorization Code flow (for multi-merchant integrations) or Personal Access Token (for single-merchant use). Access tokens expire after one hour; refresh tokens expire after 30 days. All API calls require the Authorization header with a bearer token and the shipbob_channel_id header to identify the application channel. ShipBob uses webhooks for push events including order.shipped, order.shipment.tracking.updated, return.created, return.updated, wro.created, wro.updated, and wro.completed. Webhook signatures use HMAC-SHA256 with the webhook-id, webhook-timestamp, and webhook-signature headers.

What moves between them

The primary flow is from ShipBob into SAP ECC. When ShipBob completes a warehouse receiving order (WRO), ml-connector reads the receiving details, matches the materials to SAP material masters using SKU or external ID, and posts a goods receipt into SAP ECC's inventory management and GL. Inventory balances from ShipBob are also synced back to SAP by storage location and plant, updating the inventory tables that drive month-end valuation. Return records from ShipBob flow into SAP as stock reversals. Outbound, SAP ECC sends purchase orders and shipment demands to ShipBob via scheduled polling or IDoc push (if WE21 is configured), so fulfillment orders reflect the latest demand from the SAP supply chain.

How ml-connector handles it

ml-connector manages the on-premises agent requirement for SAP ECC by accepting the customer's RFC connection parameters (host, port, client, username, password) and validating connectivity before any transaction. It refreshes ShipBob OAuth tokens before expiry (at 50 minutes) and retries failed token calls with exponential backoff. On receiving a ShipBob WRO webhook event, it verifies the HMAC signature using the webhook secret stored encrypted, then queries ShipBob for full receiving details. It then maps each received line item to an SAP material master via external ID or SKU cross-reference, retrieves the GL account and cost center for goods-received-in-transit from the SAP material master extended data, and calls BAPI_GOODSMVT_CREATE followed by BAPI_TRANSACTION_COMMIT to post the receipt atomically. If BAPI_GOODSMVT_CREATE fails due to a missing storage location or cost center, it rolls back and queues the event for replay after the SAP Basis team adds the reference data. Inventory sync from ShipBob to SAP runs on a schedule tied to business hours (e.g., every four hours) and updates the MARD table (inventory by plant and storage location) using RFC_READ_TABLE followed by BAPI_MATERIAL_STOCK_GET and a series of BAPI_GOODSMVT_CREATE with negative quantities to reverse overstocks. Every WRO receipt and inventory update carries a full audit trail with the ShipBob event ID and timestamp.

A real-world example

A mid-market e-commerce brand manufactures products at a third-party vendor and stores finished goods at three ShipBob fulfillment centers. Finance runs SAP ECC on-premises to manage the supply chain cost accounting and monthly closing. Before the integration, the warehouse team sent inventory reports to finance by email after each receiving event, and finance re-entered the goods receipts into SAP by hand, often three days late. Month-end inventory variance reports showed stock mismatches because SAP had not yet been updated with the latest receipts. With SAP ECC and ShipBob connected, each warehouse receiving order posts into SAP automatically the same day, allocated to the correct cost center and plant, and inventory balances sync every four hours. Finance can close the books without waiting for manual receiving entry, and inventory reconciliation starts with current, audited numbers.

What you can do

  • Post ShipBob warehouse receiving orders into SAP ECC as goods receipts, with GL impact to the materials ledger and cost of goods sold accounts.
  • Sync inventory balances from ShipBob across multiple fulfillment locations back into SAP ECC storage locations and plants, updating the MARD table on a scheduled basis.
  • Map ShipBob SKUs to SAP material masters and fulfill backlinks so purchase orders from SAP flow to ShipBob as shipment demands.
  • Verify ShipBob webhook signatures using HMAC-SHA256, refresh OAuth tokens before expiry, and manage the on-premises RFC agent connection to SAP ECC.
  • Maintain a full audit trail of every receiving transaction and inventory sync with ShipBob event IDs, GL posting references, and replay capability for failed postings.

Questions

How does ml-connector handle the on-premises RFC agent requirement for SAP ECC?
SAP ECC is an on-premises system that does not expose RFC or BAPI calls directly to the cloud. ml-connector accepts the customer's RFC connection parameters (host, port, client, username, password, possibly SNC settings) and stores them encrypted. It validates the connection before any transaction, and every BAPI call (BAPI_GOODSMVT_CREATE, BAPI_TRANSACTION_COMMIT, etc.) is routed through the customer's SAP .NET Connector or Java Connector running on the local network. If the agent is unavailable, the WRO event is queued for replay.
What happens if SAP ECC rejects a goods receipt because a storage location or cost center does not exist?
BAPI_GOODSMVT_CREATE returns an error and ml-connector rolls the transaction back without committing. The WRO event is marked as failed, logged in the audit trail with the SAP error message, and queued for manual review or replay once the SAP Basis team has created the missing reference data in SAP Configurator (transaction SPRO or transaction SICF for OData exposure).
Does the integration require ShipBob webhooks or can it poll instead?
ShipBob pushes fulfillment events via webhooks only; there is no polling API for receiving or shipment events. ml-connector registers a webhook endpoint with ShipBob for the relevant event topics (wro.created, wro.updated, wro.completed) and verifies every incoming webhook signature using HMAC-SHA256 with the shared secret. SAP ECC polling (for outbound POs) is supported via scheduled RFC_READ_TABLE queries on the EKKO and EKPO tables if the customer prefers pull over IDoc push.

Related integrations

Connect SAP ECC and ShipBob

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started