ml-connector
SAP ECCFishbowl

SAP ECC and Fishbowl integration

SAP ECC runs procurement and inventory planning in your enterprise. Fishbowl Advanced runs inventory tracking and purchase order management on premises. Connecting the two keeps your procurement source and your inventory system in sync. Purchase orders created or changed in SAP ECC flow into Fishbowl, mapped to the correct vendors and parts. Vendors and material masters are aligned in both directions so order lines always reference valid Fishbowl parts and suppliers.

How SAP ECC works

SAP ECC exposes vendors, purchase orders, materials, GL accounts, and cost centers through RFC/BAPI function modules via an on-premises agent (SAP .NET Connector or Java Connector), OData v2 REST through SAP Gateway, or IDoc XML over HTTP. Polling retrieves purchase order changes by calling RFC_READ_TABLE on the EKKO and EKPO tables or by reading BAPI_PO_GETDETAIL1 per order key. Authentication uses HTTP Basic Auth for OData and IDoc endpoints, or RFC Basic Auth credentials for BAPI calls. SAP ECC has no native webhook registry, so changes are detected by polling on a configured interval. Write operations via BAPI_PO_CHANGE and BAPI_PO_CREATE1 require an explicit BAPI_TRANSACTION_COMMIT call to persist changes.

How Fishbowl works

Fishbowl Advanced is deployed on a customer-managed on-premises server and exposes all data through REST APIs over HTTP at http://{FISHBOWL_SERVER}:{PORT}/api, where the port is typically 2456 but customer-configurable. Authentication requires a single POST /api/login call with username, password, appName, appId, and optional mfaCode to obtain a UUID session token. All subsequent requests include that token as an Authorization Bearer header. Fishbowl exposes Vendor, Purchase-Order, Sales-Order, Part, Product, Inventory, and Customer entities. There are no outbound webhooks, so ml-connector polls the endpoints including GET /api/purchase-orders with date filters and GET /api/data-query with custom SQL for inventory and part changes.

What moves between them

The main flow is from SAP ECC into Fishbowl Advanced. Purchase order headers and line items created or updated in SAP ECC are detected via RFC_READ_TABLE polling, then pushed into Fishbowl as Purchase-Order records. Vendor masters from SAP (LFA1 table) and material masters (MARA table) are synced into Fishbowl Vendor and Part records on a schedule. If a purchase order line in SAP references a vendor or material that does not yet exist in Fishbowl, ml-connector creates the vendor or part first. Updates to existing orders (quantity, delivery date, status) flow from SAP into Fishbowl. GL account references in SAP cost centers are kept as metadata tags in Fishbowl for traceability.

How ml-connector handles it

ml-connector stores SAP RFC credentials (username and password) encrypted and uses them to authenticate RFC_READ_TABLE calls through the on-premises agent. It polls EKKO (purchase order headers) and EKPO (line items) on a schedule, typically every 15 minutes or tied to your procurement cycle. For each new or changed order, it retrieves the full details via BAPI_PO_GETDETAIL1 to get vendor, material, and cost center mappings. On the Fishbowl side, ml-connector posts a login request to obtain a session token, then uses that token for all subsequent API calls. Before posting a purchase order to Fishbowl, it checks whether the SAP vendor exists as a Fishbowl Vendor by querying GET /api/data-query with the SAP vendor number; if not, it creates the vendor first by calling the Vendor endpoint. The same check happens for materials mapped to Fishbowl parts. Each order line is matched by SAP PO number and line number to prevent duplicates. SAP ECC has no built-in idempotency key for BAPI calls, so ml-connector uses the REF_DOC_NO field to detect duplicates on retry. Fishbowl has no documented rate limit and no published webhook signature scheme, so ml-connector tracks which orders have been synced and handles retries with exponential backoff if a Fishbowl API call returns 500 or times out. Because both systems are on-premises, network connectivity is a shared risk; if the SAP agent is unreachable or Fishbowl server goes down, ml-connector backs off and retries until the service is available again.

A real-world example

A mid-sized discrete manufacturer runs SAP ECC for enterprise procurement and finance, and uses Fishbowl Advanced on-premises for inventory tracking and shop-floor visibility. The procurement team creates purchase orders in SAP for materials and outsourced parts, but the shop floor uses Fishbowl to monitor inbound inventory and production schedules. Before the integration, SAP purchase order data was exported to CSV each week and manually uploaded into Fishbowl, causing delays and data entry errors. With SAP ECC and Fishbowl connected, each new PO automatically appears in Fishbowl within minutes. When a vendor or material code changes, both systems stay aligned. Shop-floor staff see purchase order status in Fishbowl without waiting for a manual sync, and the procurement team can track Fishbowl inventory receipts back to SAP PO numbers for month-end close.

What you can do

  • Sync purchase orders from SAP ECC into Fishbowl Advanced on a configurable schedule, mapped to the correct vendors and parts.
  • Detect new and updated purchase orders in SAP by polling RFC_READ_TABLE on EKKO and EKPO tables, then push them into Fishbowl.
  • Create vendors and parts in Fishbowl on demand if they do not exist, using SAP vendor masters and material masters as the source.
  • Authenticate SAP ECC via RFC Basic Auth through an on-premises agent, and Fishbowl via session token over REST.
  • Handle retries and duplicate detection using SAP REF_DOC_NO fields and Fishbowl PO number deduplication, with a full audit trail of every sync.

Questions

How does ml-connector detect changes in SAP ECC if there are no webhooks?
ml-connector polls SAP ECC by calling RFC_READ_TABLE on the EKKO and EKPO tables at a scheduled interval, typically every 15 minutes. It retrieves purchase orders modified since the last sync date and fetches full details via BAPI_PO_GETDETAIL1 to map vendors, materials, and cost centers. Because SAP ECC has no native webhook registry, polling is the standard method to detect procurement changes.
Does the integration require the SAP on-premises agent to be running?
Yes. RFC and BAPI calls must originate from an on-premises agent (SAP .NET Connector or Java Connector) that runs on the customer network with network access to the SAP ECC system. Alternatively, if the customer has activated OData services via TCODE SICF in SAP Basis, ml-connector can use OData v2 REST instead, which still requires HTTP Basic Auth but avoids the RFC agent dependency.
What happens if a purchase order in SAP references a vendor or material that does not exist in Fishbowl yet?
ml-connector checks whether the vendor and material exist in Fishbowl before posting the order. If either is missing, ml-connector creates the vendor or part record first by syncing from SAP vendor masters (LFA1 table) and material masters (MARA table). The order is then posted with the correct references. This ensures Fishbowl always has valid vendor and part links for every purchase order.

Related integrations

Connect SAP ECC and Fishbowl

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

Get started