ml-connector
Sage 100Paychex

Sage 100 and Paychex integration

Sage 100 runs your enterprise finance and operations. Paychex Flex manages your workforce and payroll. When the two systems stay aligned, your GL reflects true labor costs, your vendor master stays current with employee records, and month-end close starts with payroll already reconciled. ml-connector automates the sync between your on-premises Sage 100 and Paychex's cloud payroll, handling the authentication differences and moving data on a schedule you control.

How Sage 100 works

Sage 100 is an on-premises ERP that covers accounts receivable, accounts payable, general ledger, inventory, purchasing, and sales. It does not expose a native REST API. Instead, Paychex data flows into Sage 100 through SOAP Web Services (limited to Sales Orders and AR Customers) or through BOI COM, a Windows-hosted business object interface accessed by a local agent on the customer's Sage 100 server. Sage 100 requires username and password authentication passed with every call, uses a three-character company code, and exposes GL accounts in a multi-segment format that varies by customer configuration. It supports polling only - no webhooks or events. Key entities include vendors, AP invoices, GL accounts, and GL journal entries.

How Paychex works

Paychex Flex is a cloud payroll and HCM platform that exposes workers, jobs, pay components, checks, and pay periods through REST APIs hosted at api.paychex.com. Authentication uses OAuth2 Client Credentials, and Paychex publishes webhook events for worker and employment changes across multiple domains. Webhook payloads contain notification only, so full data must be fetched via GET. Paychex retries non-successful webhook deliveries every 5 minutes. The platform does not expose accounting entities such as vendors, invoices, GL accounts, or accounting dimensions - payroll data must be mapped into Sage 100's chart of accounts by ml-connector.

What moves between them

Worker records and payroll cost data flow from Paychex into Sage 100. After each payroll run, ml-connector reads Paychex checks and pay components, calculates labor cost totals by pay period, and posts them into Sage 100's GL as payroll-expense and liability journal entries. Worker hire, termination, and status changes in Paychex are also synced to Sage 100's vendor master so your employee records stay current. Reference data such as job codes and organizational hierarchies are aligned in both directions. No data flows back from Sage 100 to Paychex.

How ml-connector handles it

ml-connector must run on or have network access to the customer's Sage 100 server, since Sage 100 is on-premises and accessed via local SOAP or a local Windows agent. On the Paychex side, ml-connector authenticates using OAuth2 Client Credentials against https://api.paychex.com/auth/oauth/v2/token, then fetches worker and check data via GET. When Paychex webhooks are enabled, ml-connector subscribes to WRKR_DEM (demographics), WRKR_CMP (compensation), and WRKR_EMPL (employment) events, and fetches the full worker record when a webhook arrives. For polling-only setups, ml-connector reads Sage 100's DateLastUpdated field to find new or changed records since the last run. Payroll expenses are mapped to Sage 100's configured GL account structure - for example, gross pay might land on account 5100-01-00 and payroll taxes on account 5200-02-00, depending on the customer's chart of accounts. Because Sage 100 is on-premises with COM record-locking limits, ml-connector implements exponential backoff on write conflicts and validates each GL account before posting. Paychex OAuth tokens are refreshed proactively before expiry so an expired token does not interrupt a payroll posting.

A real-world example

A regional healthcare staffing firm runs Sage 100 on-premises for billing, AP, and GL. They use Paychex Flex to manage 400+ part-time and full-time workers across five regional offices. Before the integration, the finance team downloaded a payroll register from Paychex at the end of each pay period, manually categorized labor expenses by cost center and project, and entered the totals into Sage 100 as GL journal entries - a four-hour monthly task prone to errors. With Sage 100 and Paychex connected, each payroll run's labor costs flow directly into Sage 100 and are allocated to the correct GL accounts and cost centers based on worker job codes and organizational assignments. Worker changes like new hires and terminations automatically sync to the vendor master. The manual payroll posting step is eliminated, and the GL reconciles to Paychex automatically at period close.

What you can do

  • Post Paychex payroll costs into Sage 100 as GL journal entries, mapped to the correct GL accounts and cost centers by worker assignment.
  • Keep worker and employment records aligned between Paychex and Sage 100's vendor master.
  • Map Paychex compensation components to Sage 100's GL dimensions so labor expenses land on the right accounts.
  • Authenticate Paychex with OAuth2 and Sage 100 with username-password credentials through the local agent or SOAP interface.
  • Poll on a schedule tied to your payroll calendar, with retries for COM record-lock conflicts and a full audit trail on every entry.

Questions

How does ml-connector handle Sage 100 being on-premises?
ml-connector must run on the customer's network with access to the Sage 100 server. It connects to Sage 100 via SOAP Web Services or through a local Windows agent that wraps Sage 100's BOI COM interface. Since Paychex is cloud-hosted, ml-connector bridges the on-premises Sage 100 and cloud Paychex by running at the network boundary.
Which direction does payroll data move between Sage 100 and Paychex?
Data flows from Paychex into Sage 100. Worker records, payroll costs, and pay components move from Paychex to Sage 100's GL and vendor master. Nothing flows back from Sage 100 to Paychex. Paychex is read-only in this integration.
Does ml-connector use Paychex webhooks or polling?
ml-connector can use either. If Paychex webhooks are enabled for worker and employment events, it subscribes and fetches full worker records when events arrive. If webhooks are not available, it polls Paychex on your payroll schedule. On the Sage 100 side, it always polls because Sage 100 does not emit events.

Related integrations

Connect Sage 100 and Paychex

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

Get started