ml-connector
Sage 100Paylocity

Sage 100 and Paylocity integration

Sage 100 runs accounting and operations on-premises. Paylocity runs payroll and HR in the cloud. Connecting the two keeps your employee master and general ledger in sync with each pay run. New hires and terminations in Paylocity update your Sage 100 employee records and AP vendors, and the labor cost journals Paylocity generates flow into Sage 100's general ledger without manual re-entry. ml-connector bridges the on-premises and cloud systems through the local Sage 100 agent and handles the different authentication and data shapes on each side.

How Sage 100 works

Sage 100 is an on-premises ERP covering accounts receivable, accounts payable, general ledger, purchasing, inventory, and sales orders. It exposes data through SOAP Web Services at a customer-hosted endpoint for sales orders and customers only, or through the full BOI COM layer wrapped by a local Windows agent for AP invoices, GL accounts, GL journal entries, vendors, and purchase orders. Sage 100 requires username and password authentication on each call with no token refresh or OAuth, and mandates a three-character company code for every transaction. The system has no webhooks or event stream, so data is fetched by polling DateLastUpdated and DateCreated fields, and concurrent writes face COM record-locking limits that require retries with backoff. The GL account format is multi-segment and customer-specific, such as 4000-01-00.

How Paylocity works

Paylocity is a cloud HCM and payroll platform delivered via REST API at https://api.paylocity.com/api/v2 with OAuth 2.0 client credentials and Bearer token authentication, with token lifetime of 3600 seconds. The platform exposes employees, pay statements, earnings, deductions, work locations, positions, and pay grades. Paylocity supports both webhooks and polling. Webhooks deliver events such as New Hire, Employee Change, Termination, and Payroll Processed as HTTPS POST JSON with 30-minute retries for up to 24 hours on failure, but webhook payloads carry only identifiers, so full record data must be fetched via API calls. Paylocity requires TLS 1.2 minimum, and client secrets must be rotated annually.

What moves between them

The primary flow moves from Paylocity into Sage 100. Employee records (new hires, changes, terminations) flow from Paylocity into Sage 100's customer and AP vendor tables, updating your employee master with the latest headcount and status. Payroll journals generated after each pay run in Paylocity are read by polling and posted into Sage 100's general ledger, allocated to the cost centers and GL accounts you map. Earnings, deductions, and pay distributions are rolled up into labor cost journal entries, one per GL dimension. Reference data such as work locations and pay grades is queried on a schedule to keep Sage 100's dimension tables current.

How ml-connector handles it

ml-connector stores both credential sets encrypted and connects to Sage 100 via the local Windows agent endpoint you specify, sending the company code and username/password on each call over HTTPS to the agent. It refreshes the Paylocity OAuth token on a 3600-second cycle and polls employee and payroll records on a schedule aligned to your pay calendar. Because Sage 100's BOI COM layer enforces record locks on concurrent writes, ml-connector retries with exponential backoff when a write fails due to lock contention. Cost centers and GL accounts are mapped from Paylocity pay locations and earnings types to Sage 100's multi-segment GL format, so payroll journals post to the correct ledger accounts. Employee records create or update Sage 100 AP vendors with IDs tied to Paylocity employee IDs, so repeated syncs find and update the same vendor record. Every record carries an audit trail and can be replayed if a downstream call fails.

A real-world example

A mid-sized US manufacturer runs Sage 100 on-premises for accounting and materials management and Paylocity in the cloud for payroll across three plants. Before the integration, the accounting team ran a manual weekly export from Paylocity and keyed labor costs into Sage 100's general ledger by plant and job code, then spent the first week of month-end chasing discrepancies between payroll headcount and AP vendor balances. With Paylocity and Sage 100 connected through a local agent, each payroll run posts labor cost journals into the ledger automatically, allocated to the plant cost centers already configured in Sage 100, and employee hires and terminations update the AP vendor master in real time. Month-end close begins with labor accounts already reconciled and vendor headcount matching HR.

What you can do

  • Sync employee records from Paylocity into Sage 100, creating and updating AP vendors tied to Paylocity employee IDs.
  • Post payroll cost journals into Sage 100's general ledger after each pay run, allocated to your cost centers and GL accounts.
  • Map Paylocity pay locations, earnings types, and deductions to your Sage 100 chart of accounts and AP vendor tables.
  • Authenticate Paylocity with OAuth 2.0 and Sage 100 through the local Windows agent with username/password and company code.
  • Poll Paylocity on a schedule aligned to your payroll calendar, with retries on COM locks and a full audit trail on every record.

Questions

How does ml-connector connect to Sage 100 if it is on-premises and has no native cloud API?
ml-connector connects through the local Windows agent endpoint you deploy on your Sage 100 server. The agent wraps the BOI COM layer and exposes HTTPS endpoints for AP, GL, vendors, and employees. ml-connector calls the agent endpoint over HTTPS, sending Sage 100 username/password and company code on each request, and the agent handles the COM calls to Sage 100 itself.
What happens if Paylocity generates multiple Employee Change events in the same minute?
Paylocity's webhooks may fire multiple times per minute for rapid employee changes. ml-connector deduplicates using the combination of Paylocity employee ID and the timestamp of the last change reported in the event, so duplicate events are skipped and only the latest state is synced to Sage 100.
How are payroll journals allocated to Sage 100's multi-segment GL accounts?
During setup, you map each Paylocity pay location to a Sage 100 cost center and each Paylocity earnings type (salary, hourly, bonus) to a GL account. ml-connector looks up the pay location and earnings type for each employee in the pay run, constructs the full GL account code using your mapping and any company-specific segment rules, and posts the rolled-up journal entry to that account.

Related integrations

Connect Sage 100 and Paylocity

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

Get started