ml-connector
Sage 300Looker

Sage 300 and Looker integration

Sage 300 manages accounts payable, accounts receivable, general ledger, and purchase orders across mid-market businesses. Looker turns data into insight. Connecting the two lets your finance team see real-time Sage 300 transactions in interactive dashboards and scheduled reports, without exporting and re-loading. AP invoices, AR receipts, GL journal batches, and purchase orders move from Sage 300 into Looker on a polling schedule you control.

How Sage 300 works

Sage 300 is an on-premise ERP system running on Windows IIS with SQL Server, exposing accounts payable, accounts receivable, general ledger, purchase orders, order entry, and inventory through REST and OData APIs. The API base URL includes the customer's domain and Sage 300 company code, since it is self-hosted with no Sage-managed cloud endpoint. Authentication uses HTTP Basic Auth with uppercase username and password sent with every request; no OAuth2 or API keys. Sync is pull-based only via OData filters and pagination, with no webhooks or change-data-capture. Master data endpoints support GET, POST, PUT, and DELETE, while transaction batch endpoints support GET and POST. Large request volumes (1500+) can trigger IIS AppPool timeouts.

How Looker works

Looker is a business intelligence platform (part of Google Cloud) that models data warehouse content and exposes it through REST APIs, dashboards, looks, and scheduled delivery plans. OAuth2 client credentials are exchanged for a bearer token that expires after 1 hour; there is no refresh token, so ml-connector must re-authenticate to get a new token. Looker has no native write path to financial data; it reads and models warehouse data only. Scheduled Plans can deliver data via webhooks, email, S3, or SFTP, but the primary integration pattern for active ERP sync is pull-based REST querying. Looker does not store ERP master data natively, so Sage 300 vendors, GL accounts, and items must be modeled in the warehouse beforehand.

What moves between them

Sage 300 financial and operational records flow one direction into Looker for analytics. ml-connector polls Sage 300 for AP invoices, AR receipts, GL journal batches, purchase orders, and inventory on a schedule tied to your financial close calendar. The records are extracted and either pushed to a Looker data action endpoint or loaded into a warehouse connected to Looker, where they are modeled into dashboards, looks, and scheduled reports. Master data such as vendors, customers, and GL accounts are aligned first so transaction records reference valid dimensions.

How ml-connector handles it

ml-connector handles the fundamental auth difference between the two systems: Sage 300 uses HTTP Basic Auth with uppercase credentials sent with every request, while Looker uses OAuth2 bearer tokens that expire after 1 hour. ml-connector caches credentials encrypted, transforms Sage 300's uppercase-only requirement at the request layer, and refreshes Looker's bearer token on every 401 response to avoid stale tokens mid-sync. Since Sage 300 is pull-only with no webhooks, ml-connector polls on a schedule; OData filters ($filter=DocumentDate gt '2026-01-01') and pagination ($skip, $top) ensure only new and changed records are read each run. Because Looker does not store financial master data, the mapping is handled upfront: Sage 300 vendors map to Looker dimension keys in the warehouse model, GL accounts to cost centers or profit centers, and items to product hierarchies. ml-connector tracks Sage 300 company and module context (AP, AR, GL, PO) so each record lands in the correct Looker looks and dashboards. Every record carries a full audit trail so failed deliveries can be replayed.

A real-world example

A mid-sized manufacturing distributor runs Sage 300 on-premise for AP, AR, GL, and inventory. The CFO needs weekly cash flow forecasts, vendor aging summaries, and margin analysis by product line, but today's process is manual: export AP and AR aging from Sage 300, export inventory on-hand from the warehouse, upload to spreadsheets, and build Looker dashboards by hand. With Sage 300 and Looker connected, each night ml-connector polls Sage 300 for the day's invoices, receipts, and GL transactions, and loads them into the warehouse. The next morning, Looker dashboards refresh automatically with current AP aging, AR collections status, margin trends, and inventory turnover, and stakeholders get scheduled email reports without re-keying.

What you can do

  • Poll Sage 300 for AP invoices, AR receipts, GL journal batches, and purchase orders on a schedule, using OData filters to fetch only new records.
  • Transform Sage 300's HTTP Basic Auth uppercase-only credentials and load records into Looker dashboards and looks without manual extraction.
  • Refresh Looker OAuth2 bearer tokens on expiry so long-running syncs do not fail mid-stream.
  • Map Sage 300 company codes, modules, vendors, GL accounts, and items to Looker dimensions so each transaction lands in the correct dashboard.
  • Audit and replay every record movement from Sage 300 into Looker, so failed Scheduled Plans or Looker changes can be recovered without losing financial data.

Questions

Which direction does data move between Sage 300 and Looker?
Data flows one direction: from Sage 300 into Looker. AP invoices, AR receipts, GL journal batches, and purchase orders are polled from Sage 300 and loaded into Looker's data warehouse or delivered via Looker Scheduled Plans. Looker is a read-only analytics layer, so no updates flow back to Sage 300.
How does ml-connector handle Sage 300's uppercase-only HTTP Basic Auth requirement?
ml-connector stores Sage 300 credentials encrypted and transforms them to uppercase at the request layer, so the integration works with normal username and password formats. The API user must be created in Sage 300 Administrative Services with the Web API security group assigned; the built-in Admin user does not have API privileges.
What happens when Looker's OAuth2 token expires after 1 hour?
ml-connector detects the 401 response and re-authenticates immediately by exchanging the client_id and client_secret for a new bearer token. Since Looker has no refresh token, ml-connector must call the login endpoint again; the integration tracks token age to avoid expiry in the middle of a large sync.

Related integrations

Connect Sage 300 and Looker

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

Get started