ml-connector
Microsoft Dynamics 365 F&OFishbowl

Microsoft Dynamics 365 F&O and Fishbowl integration

Microsoft Dynamics 365 F&O runs finance, procurement, and accounts payable. Fishbowl runs inventory, receiving, and purchasing on the warehouse floor. Connecting the two means the parts and vendors the warehouse buys against match the Dynamics masters, and the purchase orders and goods receipts captured in Fishbowl flow into Dynamics for procurement tracking and AP without re-keying. ml-connector handles the very different APIs on each side and moves the data on a schedule you control. Because Fishbowl has no general ledger of its own, the chart of accounts and posted ledger stay in Dynamics where they belong.

How Microsoft Dynamics 365 F&O works

Microsoft Dynamics 365 F&O exposes vendors, products, released products, purchase order headers and lines, vendor invoices, main accounts, and financial dimensions through OData v4 REST entities at a tenant-specific environment URL such as contoso.operations.dynamics.com, so there is no shared hostname. It authenticates with OAuth 2.0 client credentials issued by Microsoft Entra ID, returning a bearer token that expires in about an hour. It can push outbound notifications through the Business Events framework, but those payloads are lightweight stubs carrying identifiers and a ControlNumber rather than full records, so most reads are done by polling OData with server-driven paging.

How Fishbowl works

Fishbowl is on-premise software, so its Advanced REST API runs on the customer's own server at a configurable host and port rather than a fixed cloud endpoint. It exposes parts, products, vendors, purchase orders, sales orders, inventory, and manufacture orders over REST with JSON, and accepts bulk writes through a POST /api/import/:name endpoint. Authentication is a session token: the connector posts a username and password to /api/login and receives a UUID it sends as a Bearer token on every later call. Fishbowl has no outbound webhooks and no native GL account resource, so change detection is poll-based and the ledger lives in the connected accounting system.

What moves between them

Reference data flows from Microsoft Dynamics 365 F&O into Fishbowl so the warehouse buys against valid records. ml-connector reads products and released products from Dynamics and writes them as Fishbowl parts, and aligns the vendor master the same direction. Transactional data then flows back the other way: ml-connector polls Fishbowl for new and updated purchase orders and goods receipts and posts them into Dynamics as purchase order headers and lines for procurement and accounts payable. Inventory quantities can be read from Fishbowl for visibility. GL postings stay in Dynamics, since Fishbowl has no general ledger, so ml-connector never writes ledger entries into Fishbowl.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Dynamics side it requests an Entra ID client-credentials bearer token scoped to the environment host and refreshes it when a call returns 401, and it accepts the full tenant URL per customer since Dynamics publishes no shared base address. It scopes reads and writes to the right legal entity with the dataAreaId, adding cross-company=true where a customer runs more than one. On the Fishbowl side it logs in with the username and password to obtain the UUID session token, attaches it as a Bearer token, and re-logs in when the session is rejected. Because both Fishbowl and Dynamics are effectively pull for connector use, ml-connector polls on a schedule rather than waiting for a push, paging Fishbowl with pageNumber and totalPages and following the Dynamics OData nextLink. Products and vendors are mapped first, so every Fishbowl purchase order line resolves to a real Dynamics product number and the matching VendorAccountNumber. Dynamics OData has no idempotency header and uses natural keys like PurchaseOrderNumber, so ml-connector dedupes on that key and a BullMQ jobId before posting to avoid a duplicate-key error on a re-read record. Vendor invoice writes are pre-posting only in Dynamics, so once an invoice is posted it is read-only. Fishbowl writes go through the import endpoint using the part or PO number as the natural key, which updates rather than duplicates. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized contract manufacturer with about 150 staff runs Microsoft Dynamics 365 F&O for finance, procurement, and accounts payable, and uses Fishbowl on a server in the plant for receiving, inventory, and shop-floor purchasing. Before the integration, buyers raised purchase orders in Fishbowl while the finance team re-keyed each one and its receipt into Dynamics, which meant the procurement and AP picture in the ERP lagged the floor by days and part numbers drifted between the two systems. With Microsoft Dynamics 365 F&O and Fishbowl connected, products and vendors are pushed from Dynamics into Fishbowl so buyers work from valid records, and each Fishbowl purchase order and receipt flows into Dynamics within the polling window, allocated to the matching product and vendor. The double entry is gone and the ledger reflects committed and received spend without a manual catch-up.

What you can do

  • Push Microsoft Dynamics 365 F&O products and released products into Fishbowl as parts so the warehouse buys against valid records.
  • Keep the Fishbowl vendor list aligned with the Dynamics vendor master.
  • Read Fishbowl purchase orders and goods receipts and post them into Dynamics for procurement and accounts payable.
  • Bridge Dynamics Entra ID OAuth 2.0 and the Fishbowl session token, refreshing each when it expires.
  • Poll on a schedule with purchase order number and jobId dedup, retries, and a full audit trail on every record.

Questions

Which direction does data move between Microsoft Dynamics 365 F&O and Fishbowl?
It moves both ways for different records. Products and vendors flow from Dynamics into Fishbowl so the warehouse buys against valid master data, while purchase orders and goods receipts flow from Fishbowl into Dynamics for procurement and accounts payable. Fishbowl has no general ledger, so the chart of accounts and posted ledger stay in Dynamics and ml-connector never writes ledger entries into Fishbowl.
Does the integration use webhooks or polling?
It uses polling. Fishbowl has no outbound webhooks, and the Dynamics Business Events that exist deliver lightweight identifier stubs rather than full records. ml-connector polls Fishbowl with pageNumber and totalPages and reads Dynamics OData with server-driven paging on a schedule you control, then makes follow-up reads where it needs full detail.
How does it handle the two different logins and the on-premise Fishbowl server?
ml-connector stores both credential sets encrypted. It requests an Entra ID OAuth 2.0 client-credentials bearer token for the Dynamics environment host and refreshes it on expiry, and it logs in to Fishbowl with a username and password to get the UUID session token, re-logging in when the session is rejected. Because Fishbowl runs on the customer's own server, the connector takes the server URL as a configuration field rather than assuming a fixed cloud endpoint.

Related integrations

Connect Microsoft Dynamics 365 F&O and Fishbowl

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

Get started