ml-connector
Sage 100Tableau

Sage 100 and Tableau integration

Sage 100 runs your on-premises accounting and inventory. Tableau shows your business data in dashboards. Connecting the two brings your operational metrics into dashboards automatically, so finance teams can monitor AR aging, AP status, and GL balances without manual export and import cycles. ml-connector polls Sage 100 for new and changed records, authenticates both systems, and triggers Tableau extract refreshes on a schedule you control.

How Sage 100 works

Sage 100 exposes customers, sales orders, AP vendors, AP invoices, purchase orders, GL accounts, and journal entries through SOAP Web Services (eBusiness Web Services at the customer's hosted server) for AR and sales data only, or through a local Windows agent wrapping the COM layer for full AP, GL, PO, and vendor access. Authentication uses stateless username and password per call with no OAuth or token refresh. Company code (a three-character identifier) is required for every call. Sage 100 has no webhooks or event stream, so data is retrieved by polling via DateLastUpdated or DateCreated fields. The platform has no standard pagination; SOAP returns single-entity fetches, and agent-wrapped access varies by implementation. Concurrent write operations are limited due to COM record-locking, requiring exponential backoff on retries.

How Tableau works

Tableau operates in two deployment modes: cloud-hosted (Tableau Cloud) or self-hosted (Tableau Server), both exposing data sources, workbooks, views, users, groups, projects, and schedules through REST API. Authentication uses Personal Access Tokens (PAT) with session token exchange, which returns a 240-minute session token on the Cloud version, or Connected Apps with JWT for long-running integrations. Tableau supports webhooks for 24 event types including datasource-created, datasource-refresh-started, datasource-refresh-succeeded, datasource-refresh-failed, and workbook-refresh events, allowing connectors to receive real-time notifications when extracts complete. Views are read-only derived objects, and all operations are site-scoped, requiring the site ID in the API path. Webhook payloads contain no HMAC signature, so secret tokens should be embedded in the endpoint URL.

What moves between them

The flow runs from Sage 100 into Tableau. AR invoices, AP invoices and vendors, and GL journal entries are polled from Sage 100 on a schedule (AR and AP every 15 minutes, GL hourly) and loaded into Tableau data sources. Tableau data source refreshes are triggered after each load batch completes, either through explicit refresh API calls or by listening to Tableau's datasource-refresh-succeeded webhooks to confirm the load landed. Reference data such as customers, vendors, and GL account hierarchies are mapped once during setup. No data moves back from Tableau into Sage 100 - the flow is read-only from Sage.

How ml-connector handles it

ml-connector stores Sage 100 credentials (username, password, company code) and accepts the customer's SOAP endpoint URL or local agent address. On each poll cycle, it calls Sage 100 via SOAP or the agent, checking DateLastUpdated to fetch only new and changed records since the last run. Concurrent write limits in Sage's COM layer can cause transient failures, so ml-connector implements exponential backoff with jitter on retries. On the Tableau side, ml-connector uses PAT authentication with session token exchange, storing the token and refreshing it before expiry. After each batch loads into a Tableau data source, ml-connector triggers a refresh through the REST API or, if webhooks are enabled, listens for the datasource-refresh-succeeded event to confirm success. Records carry a full audit trail, including the Sage poll timestamp and the Tableau refresh job ID, so any downstream discrepancy can be replayed from the source. GL accounts use multi-segment format (e.g. 4000-01-00) that varies by customer config, so account mapping happens in the data transformation layer, not in Sage or Tableau.

A real-world example

A mid-sized B2B distributor runs Sage 100 on-premises for AR, AP, and GL, and uses Tableau dashboards to monitor cash flow, vendor spend, and monthly close progress. Before the integration, the accounting team exported AP aging, GL balance detail, and AR collections data from Sage each morning by hand and loaded it into Tableau data sources to refresh the dashboards. Month-end close required a second manual export to verify final balances. With Sage 100 and Tableau connected, AR and AP records flow automatically every 15 minutes, GL daily, and the company's cash-flow, vendor-spend, and close-progress dashboards refresh on schedule without manual intervention. The accounting team starts each day with current data and closes the month with audit-ready records already in place.

What you can do

  • Extract customer invoices, AP vendor records, and AP invoices from Sage 100 and load into Tableau data sources on a configurable schedule.
  • Authenticate Sage 100 with username and password, poll via the customer's SOAP endpoint or local agent, and retry on COM record-locking failures with exponential backoff.
  • Authenticate Tableau using PAT with session token exchange and trigger data source refreshes after each load, or listen to Tableau refresh-success webhooks for confirmation.
  • Map GL accounts from Sage 100's multi-segment format to Tableau dimensions, and align customer and vendor reference data across both systems.
  • Track audit trails on every record, including the Sage poll timestamp and Tableau refresh job ID, so any discrepancy can be replayed to source.

Questions

How does the integration handle Sage 100's lack of webhooks or a cloud API?
Sage 100 is on-premises only and has no webhooks. ml-connector polls the customer's SOAP endpoint or local Windows agent on a configurable schedule (typically AR and AP every 15 minutes, GL hourly) and checks the DateLastUpdated field to fetch only new and changed records. The agent wrapping Sage's COM layer allows access to AP, GL, PO, and vendor data that SOAP Web Services alone cannot expose.
What happens when Sage 100 COM record-locking causes a transient failure?
Sage 100's COM layer limits concurrent writes and can return errors under high load. ml-connector implements exponential backoff with jitter, retrying the poll after an increasing delay. Successful records carry the Sage poll timestamp, so if a batch partially completes, the next cycle picks up only the records not yet sent to Tableau.
How are GL accounts mapped from Sage 100 to Tableau when each customer's chart of accounts is different?
Sage 100 GL accounts use a multi-segment format (e.g. 4000-01-00) that varies by customer configuration. ml-connector accepts a mapping table during setup that translates Sage segments to Tableau dimension values. The mapping happens in the data transformation layer, so GL entries land on the correct dimensions in Tableau without modifying either system.

Related integrations

Connect Sage 100 and Tableau

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

Get started