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.
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
More Sage 100 integrations
Other systems that connect to Tableau
Connect Sage 100 and Tableau
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started