ml-connector
VismaFishbowl

Visma and Fishbowl integration

Visma runs your accounting and financial records across AP, AR, purchasing, and payroll. Fishbowl runs your inventory and procurement in the warehouse. Connecting them keeps your purchase orders, supplier master, and inventory counts in sync without manual re-entry. Purchase orders created in Fishbowl flow into Visma's AP system; supplier changes in Visma sync back to Fishbowl so your procurement teams always have current names and terms; and payments posted in Visma are reflected as paid in Fishbowl.

How Visma works

Visma.net ERP is a cloud accounting and ERP platform widely used in the Nordic region. It exposes suppliers, purchase orders, supplier invoices, GL accounts, dimensions, and purchase receipts through REST APIs over HTTPS, documented in Visma's API reference. Authentication uses OAuth 2.0 client credentials flow via Visma Connect, with tenant-specific company IDs required on every call. Visma supports both webhooks and polling; webhooks have one-time delivery with no automatic retry, so polling via the lastModifiedDateTime query parameter is often more reliable for connectors.

How Fishbowl works

Fishbowl Advanced is an on-premise inventory and light-ERP system running on customer hardware with a customer-supplied server URL and port. It exposes vendors, purchase orders, sales orders, parts, inventory, and customers through REST APIs, but has no outbound webhooks. Authentication is session-based: POST /api/login returns a token that goes into the Authorization header on all subsequent calls. Fishbowl is pull-only, so ml-connector must poll for changes using date filters on endpoints like GET /api/purchase-orders or issue custom SQL queries via GET /api/data-query.

What moves between them

Purchase orders, suppliers, payments, and parts inventory move primarily from Fishbowl into Visma. When a purchase order is created or modified in Fishbowl, ml-connector sends it to Visma as a PurchaseOrder record linked to the Supplier. When Visma records a supplier invoice or marks a SupplierPayment as complete, ml-connector polls and updates the status in Fishbowl. Supplier master records (Vendor in Fishbowl, Supplier in Visma) are synced bidirectionally so changes to name, terms, or contact information do not fall out of step. Inventory quantities move from Fishbowl to Visma as part-level status, though Visma does not expose a direct inventory endpoint, so the mapping is often via PurchaseReceipt records. All syncs are polling-based on a schedule you define, typically every 5 to 15 minutes.

How ml-connector handles it

ml-connector stores both credential sets encrypted: the Visma client_id, client_secret, and tenant company_id for the OAuth flow, and the Fishbowl server URL, username, and password for the session login. On startup, it obtains a fresh Visma OAuth token via the client credentials grant and a fresh Fishbowl session token via login, then refreshes each before expiry. Because Fishbowl is on-premise and runs on a customer-supplied port, ml-connector accepts the full server URL and port from the customer configuration. For each sync cycle, ml-connector queries Fishbowl's purchase orders and parts using date filters or SQL, maps fields to Visma's entity structure, and POST the data to Visma. Visma's optimistic locking requires ETag/If-Match headers on updates, so ml-connector reads the current ETag before each PUT. Fishbowl has no GL accounts exposed (those live in the paired QuickBooks or Xero instance), so ml-connector maps purchase orders at the Supplier level only. Test credentials in Visma are rate-limited to 500 calls per hour per company, so ml-connector batches requests and backs off when rate limits are hit. Every record carries a full audit trail.

A real-world example

A Nordic distributor uses Visma for accounting and supplier management, and Fishbowl on-premise for warehouse and purchase order operations across three locations. Before the integration, the purchasing team entered each purchase order in Fishbowl, then the accounting team manually re-keyed the order into Visma, creating delays and data-entry errors. Supplier address or terms changes in Visma were not communicated to the warehouse, leading to orders sent to outdated addresses. With Visma and Fishbowl connected, purchase orders created in Fishbowl flow automatically into Visma's AP system, supplier updates in Visma are pushed to Fishbowl overnight, and the warehouse team has a single source of truth for terms and delivery addresses.

What you can do

  • Move purchase orders created or modified in Fishbowl into Visma as new supplier invoice records linked to the correct vendor.
  • Sync supplier master records bidirectionally so name, contact, and payment terms stay in step across systems.
  • Poll Fishbowl inventory and parts data on a schedule and reflect inventory receipts in Visma when purchase orders are received.
  • Bridge Visma's OAuth 2.0 tenant-scoped authentication and Fishbowl's session-based bearer token, handling token refresh before expiry.
  • Schedule polling every 5 to 15 minutes and retry on failure with a full audit trail and error state visibility.

Questions

Which direction does data move between Visma and Fishbowl?
Purchase orders and supplier data flow primarily from Fishbowl into Visma's AP system. Supplier master changes flow bidirectionally so both systems stay synchronized. Payment status updates flow from Visma back to Fishbowl so the warehouse sees which orders are paid.
How does ml-connector handle Fishbowl's on-premise server and lack of webhooks?
ml-connector accepts the full server URL and port from customer configuration, since Fishbowl has no shared SaaS endpoint. Because Fishbowl has no outbound webhooks, ml-connector polls purchase orders and parts on your defined schedule, typically every 5 to 15 minutes, using date filters or SQL queries to detect changes.
Does the integration handle the differences in authentication between Visma and Fishbowl?
Yes. ml-connector stores Visma's client credentials and obtains tokens via OAuth 2.0, and stores Fishbowl's username and password for session login. Each token is refreshed before expiry, and ml-connector manages both authentication flows transparently so your team does not need to manage tokens manually.

Related integrations

Connect Visma and Fishbowl

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

Get started