ml-connector
OdooFishbowl

Odoo and Fishbowl integration

Odoo handles your procurement and accounting. Fishbowl Advanced manages your on-premise inventory and manufacturing. When connected, purchase orders flow from Odoo into Fishbowl, and inventory levels sync back into Odoo so your accounting and warehouse stay aligned. ml-connector handles the very different authentication models and the on-premise infrastructure that Fishbowl requires, so you do not have to manage separate updates.

How Odoo works

Odoo exposes purchase orders, purchase order lines, vendors, parts, inventory, GL accounts, and analytic accounts through XML-RPC and JSON-2 REST APIs. Authentication uses an API key paired with a username, and the base URL depends on your Odoo deployment type: Odoo Online at https://<subdomain>.odoo.com, Odoo.sh at https://<subdomain>.odoo.sh, or self-hosted at a custom domain. Odoo has no native webhook system for external integrations, so data is read by polling with write_date timestamps to detect changes.

How Fishbowl works

Fishbowl Advanced exposes purchase orders, sales orders, parts, inventory, vendors, customers, and manufacturing orders through a REST API running on the customer's on-premise server at http://{FISHBOWL_SERVER}:{PORT}/api, where PORT is typically 2456 but configurable per site. Authentication is session-based: a session token is obtained via POST /api/login with username and password, then included as a Bearer token on every request. Fishbowl has no outbound webhooks, so connectors must poll the API.

What moves between them

Purchase orders flow from Odoo into Fishbowl. When a purchase order is created or updated in Odoo, ml-connector reads it and creates or updates the matching purchase order in Fishbowl, including line items and vendor references. Inventory levels flow the opposite direction: Fishbowl inventory quantities are polled and written back to Odoo so the warehouse and accounting stay synchronized. GL accounts and vendors are aligned in both directions so purchase order lines map to the correct accounts and vendors in each system.

How ml-connector handles it

ml-connector stores both sets of credentials encrypted and handles the two very different authentication flows: for Odoo, it uses the API key as a Bearer token in the JSON-2 REST path or includes it in the XML-RPC authenticate call; for Fishbowl, it exchanges username and password for a session token via POST /api/login, then renews the token when it expires. Because Fishbowl runs on-premise at a customer-supplied server URL, ml-connector requires that URL to be provided in the setup and validates connectivity before polling. Both systems are pull-only, so ml-connector polls Odoo purchase orders and Fishbowl inventory on a cadence you set, typically 5 to 15 minutes for Fishbowl. It tracks high-water-mark timestamps in Odoo to avoid re-reading unchanged records, and it maps vendors and GL accounts from Odoo so purchase order lines land on the correct dimensions in Fishbowl. Every record carries a full audit trail, and if a write to Fishbowl fails, the record is queued for replay.

A real-world example

A mid-sized distributor runs Odoo for procurement and accounting, and uses Fishbowl Advanced on-premise for warehouse and manufacturing management across two locations. Before the integration, the procurement team entered purchase orders into both systems by hand. When inventory arrived at the warehouse, Fishbowl staff recorded receipt, but Odoo inventory levels had to be updated separately, leading to month-end stock reconciliation taking days. With Odoo and Fishbowl connected, each new PO flows into Fishbowl automatically, and warehouse receipts update Odoo inventory in real time. Stock reconciliation is now a single-day task with variances under 2%.

What you can do

  • Sync purchase orders from Odoo into Fishbowl with line items and vendor references.
  • Update Odoo inventory levels from Fishbowl so warehouse receipts and accounting stay aligned.
  • Authenticate Odoo with API key and Fishbowl with session token, handling token renewal and expiry.
  • Accept a customer-supplied Fishbowl server URL and validate on-premise network connectivity.
  • Poll both systems on a schedule you control, with retries, high-water-mark deduplication, and a full audit trail.

Questions

Which direction do purchase orders and inventory flow between Odoo and Fishbowl?
Purchase orders flow from Odoo into Fishbowl so warehouse staff see what is being ordered. Inventory levels flow from Fishbowl back into Odoo so accounting and procurement have real-time warehouse counts. Vendors and GL accounts are aligned in both directions so purchase orders land on the correct accounts and vendors in each system.
How does ml-connector handle Fishbowl's on-premise infrastructure?
ml-connector requires the customer to provide the Fishbowl server URL and port, typically http://{server}:2456/api. It validates connectivity before polling and stores the credentials encrypted. The session token is renewed when it expires so polling does not drop mid-stream.
What happens if a purchase order write to Fishbowl fails?
The record is queued for replay with full context in the audit trail. ml-connector retries with exponential backoff, so transient network or server issues do not cause permanent data loss.

Related integrations

Connect Odoo and Fishbowl

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

Get started