ml-connector
QADFishbowl

QAD and Fishbowl integration

QAD runs manufacturing and finance. Fishbowl Advanced runs inventory, purchasing, and receiving on the customer's own server. Connecting the two keeps vendors and purchasing in agreement across both systems. Vendors and purchase orders managed in Fishbowl, and the goods receipts recorded when stock arrives, flow into QAD so the procurement and accounts payable records do not have to be re-entered. ml-connector handles the different APIs on each side and moves the data on a schedule you control.

How QAD works

QAD Adaptive ERP exposes suppliers, purchase orders, supplier invoices, GL accounts, cost centers, items, and goods receipts through REST business document APIs, documented in Swagger inside each customer instance. The cloud product authenticates with a JWT session or OAuth2 bearer token against a tenant-specific URL, so there is no shared hostname. Older on-premise sites run QAD Enterprise Edition with the QXtend SOAP framework instead. QAD has no public webhook system for cloud connectors, and supplier invoices post only after the matching goods receipt, so finance records are read by polling.

How Fishbowl works

Fishbowl Advanced exposes vendors, purchase orders, sales orders, parts, products, inventory, payments, and manufacture orders through its Advanced REST API, which returns JSON and uses standard HTTP verbs. The API runs on the customer's own on-premise server, so there is no shared cloud endpoint and the connector must accept each customer's server URL and port. Authentication is a session token: credentials are posted to the login endpoint, which returns a UUID that is attached as a Bearer token on every later call and refreshed by logging in again on an auth error. Entities without a dedicated REST path, such as customers and invoice tables, are read through a data-query endpoint that runs SQL, and bulk writes go through an import endpoint. Fishbowl has no GL account endpoint and no webhook or event push, so the chart of accounts lives in the connected QuickBooks or Xero, and changes are detected by polling.

What moves between them

The main flow runs from Fishbowl into QAD. ml-connector reads Fishbowl vendors and purchase orders and creates the matching suppliers and purchase orders in QAD, and reads the receiving activity Fishbowl records when stock arrives so the corresponding goods receipts and supplier invoices can be posted in QAD. Because QAD enforces a three-way match, supplier invoices are only posted after the related goods receipt exists, which Fishbowl tracks against the purchase order. Part numbers and vendor records are aligned so every purchase line references an item and supplier that already exists in QAD. QAD owns the general ledger and Fishbowl has no GL account API, so ml-connector never writes accounts or financial entries back into Fishbowl, and item and inventory reference data can be pushed from QAD into Fishbowl through its import endpoint where the customer wants the catalog kept in step.

How ml-connector handles it

ml-connector stores both credential sets encrypted and signs into Fishbowl by posting the app name, app id, username, and password to its login endpoint, then attaches the returned UUID as a Bearer token on every request and logs in again when a call returns an auth error, since the token has no documented expiry. On the QAD side it accepts the full tenant URL per customer, since QAD publishes no shared base address, and refreshes the QAD bearer token when a call returns 401. Because Fishbowl runs on the customer's own server and offers no webhooks, and QAD cloud is also pull-only, it polls the Fishbowl purchase order, vendor, and inventory endpoints on a schedule using the pageNumber and pageSize parameters, and reads entities without a REST path, such as customers, through the Fishbowl data-query SQL endpoint. Vendors and part numbers are mapped first, so every line posted into QAD references a supplier and item that already exists there, and supplier invoices are held until the matching goods receipt is present to respect the QAD three-way match. Fishbowl has no idempotency header, so ml-connector relies on natural keys such as the vendor name and purchase order number to avoid duplicates, and because many Fishbowl servers sit behind a firewall on plain HTTP it supports an on-premise polling agent and backs off on server errors with exponential backoff and jitter. Every record carries a full audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized discrete manufacturer with around two hundred staff runs QAD Adaptive ERP for production planning, costing, and finance, and uses Fishbowl Advanced on a server in the warehouse to manage parts, vendor purchase orders, and receiving. Before the integration, the buying and receiving teams raised purchase orders and booked in deliveries in Fishbowl, then the finance team re-keyed the same vendors, purchase orders, and bills into QAD by hand, which slowed month-end close and produced mismatches between received goods and posted invoices. With QAD and Fishbowl connected, vendors and purchasing flow into QAD automatically, supplier invoices post only after the goods receipt is in place, and each line lands on the right item and account. The duplicate data entry is gone and the accounts payable figures reconcile against what was actually received from the first day of close.

What you can do

  • Create QAD suppliers, purchase orders, supplier invoices, and goods receipts from Fishbowl vendors and purchasing activity.
  • Hold supplier invoices in QAD until the matching Fishbowl goods receipt exists, to respect the QAD three-way match.
  • Read Fishbowl entities without a REST path, such as customers, through the data-query SQL endpoint, and write reference data through the import endpoint.
  • Authenticate Fishbowl with its session-token Bearer login against each customer's own server URL, and QAD with its tenant-specific token.
  • Poll Fishbowl on a schedule with an optional on-premise agent, natural-key dedup, server-error backoff, and a full audit trail on every record.

Questions

Which direction does data move between QAD and Fishbowl?
The main flow is Fishbowl into QAD. Vendors, purchase orders, and goods receipts move from Fishbowl into QAD as suppliers, purchase orders, supplier invoices, and receipts, while item and inventory reference data can be pushed from QAD into Fishbowl through its import endpoint. Fishbowl has no GL account API and QAD owns the general ledger, so ml-connector never writes accounts or financial entries back into Fishbowl.
How does the integration connect to an on-premise Fishbowl server?
Fishbowl is on-premise software, so each customer runs the REST API on their own server at their own host and port rather than a shared cloud address. ml-connector takes that server URL as a per-customer setting and signs in with the Fishbowl session-token login. For servers behind a firewall it supports an on-premise polling agent so the connector does not need the Fishbowl port exposed to the internet.
Why does the integration poll Fishbowl instead of using webhooks?
The Fishbowl Advanced REST API has no outbound webhooks, no event subscription, and no signature scheme, so there is no reliable push to listen for. QAD cloud is also pull-only and has no webhook system for connectors. For these reasons ml-connector polls the Fishbowl purchase order, vendor, and inventory endpoints on a schedule using the pageNumber and pageSize parameters, and uses the data-query SQL endpoint for entities that lack a dedicated REST path.

Related integrations

Connect QAD and Fishbowl

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

Get started