ml-connector
Sage X3Paylocity

Sage X3 and Paylocity integration

Sage X3 runs finance and manufacturing. Paylocity runs payroll and HR. Connecting the two keeps your labor costs in your general ledger aligned with your actual payroll. New hires and terminations in Paylocity flow into Sage X3 so headcount matches, and deduction and earnings data is mapped to the cost centers where the work happens. ml-connector handles the different auth schemes on each side and ensures every payroll transaction reaches X3 without manual re-keying.

How Sage X3 works

Sage X3 is an on-premise and cloud ERP that exposes GL accounts, general ledger entries, cost centers, suppliers, purchase orders, and other finance records via REST (api1 with HTTP Basic Auth) or GraphQL (Xtrem with OAuth2 bearer token). The system does not publish webhooks for cloud connectors, so records are discovered by polling and checking the updatedDate or modifiedDateTime fields since the last sync. Access tokens expire in 5 minutes and refresh tokens last 30 days. The server URL, port, and X3 application folder are customer-specific with no central tenant registry, and on-premise is the dominant deployment model.

How Paylocity works

Paylocity is a cloud HCM and payroll platform that exposes employees, pay statements, deductions, earnings, work locations, pay grades, and company reference data via REST at https://api.paylocity.com/api/v2, secured by OAuth2 client credentials with 3600-second token lifetime. It publishes webhook events for New Hire, Employee Change, Termination, and Payroll Processed with 30-minute retries for up to 24 hours on failure. Webhook payloads carry only identifiers, so full employee and pay data must be fetched via separate API calls. Paylocity exposes no vendor, invoice, or GL account objects, so the integration is unidirectional from Paylocity into Sage X3.

What moves between them

Employees, deductions, and earnings flow from Paylocity into Sage X3. When Paylocity processes a payroll run, ml-connector fetches the pay statement details for each employee, maps the earnings and deductions to the Paylocity work location, cross-references that location to a Sage X3 cost center stored in the customer's mapping table, and posts the combined labor costs to the matching GL accounts in X3. If a cost center is missing or unmapped, the record is held in audit and flagged for manual review. Employee hire and termination records also flow through the same audit pipeline so headcount in X3 stays current with Paylocity.

How ml-connector handles it

ml-connector stores both OAuth2 credential sets encrypted and refreshes the Paylocity bearer token on each call, retrying with exponential backoff if a 401 is returned. On the X3 side it accepts the full customer-specific server URL and application folder name and uses either OAuth2 (GraphQL Xtrem path) or HTTP Basic Auth (REST api1 path) depending on the customer's X3 version and configuration. It polls X3 on a schedule to fetch the current GL account and cost center master data, building a validation cache so every Paylocity work location can be mapped before posting. When a Paylocity webhook arrives, ml-connector immediately fetches the affected employee or pay statement details, applies the cost center mapping, and queues the GL post to X3. If the X3 POST returns an error (invalid GL account, locked cost center, stale token), the record is logged with the full request and response and can be manually re-run once the issue is fixed. Paylocity's client secret must be rotated annually, and ml-connector tracks the X3 refresh token expiry so it does not silently fail mid-sync.

A real-world example

A mid-sized manufacturing company runs Sage X3 on-premise for its finance and production systems across two plants and headquarters, and uses Paylocity for payroll and HR for all 150 employees. Before the integration, the finance team received payroll registers from Paylocity every two weeks and manually distributed the gross pay and deductions into X3 GL accounts based on employee work location and cost code, then spent two days at month-end close hunting discrepancies between the payroll data in Paylocity and the labor account balances in X3. With Sage X3 and Paylocity connected, each payroll run triggers an automatic sync that maps each employee's earnings and deductions to the correct plant cost center and posts the totals to X3 GL accounts. The month-end labor accounts reconcile automatically, and the manual entry step is completely gone.

What you can do

  • Sync employees, deductions, and earnings from Paylocity to Sage X3 after each payroll run, mapped to the correct cost centers.
  • Keep Sage X3 headcount and cost allocation aligned with Paylocity hires, terminations, and pay statement data.
  • Map Paylocity work locations to Sage X3 cost centers so labor costs post to the correct general ledger accounts.
  • Authenticate Paylocity with OAuth2 bearer tokens and Sage X3 with OAuth2 (GraphQL) or HTTP Basic Auth (REST api1) depending on customer version.
  • Hold unmatched or invalid records in audit and enable manual replay once cost centers or GL accounts are corrected.

Questions

What data moves between Paylocity and Sage X3, and in which direction?
Employees, deductions, earnings, and pay statements flow from Paylocity into Sage X3. Work locations in Paylocity are mapped to Sage X3 cost centers so that labor costs are allocated to the correct plant or department. The integration is unidirectional from Paylocity to X3 because Sage X3 is the accounting system of record and Paylocity has no GL account objects.
How does the integration handle Sage X3's customer-specific URLs and lack of webhooks?
ml-connector accepts the full server URL, port, and X3 application folder per customer, since there is no central Sage X3 tenant registry. Because X3 does not publish outbound webhooks, ml-connector polls X3 on a regular schedule to refresh its cache of GL accounts and cost centers. It also receives Paylocity webhooks immediately when payroll runs or employees change, so the integration combines push from Paylocity with pull from X3.
What happens if a Paylocity work location does not map to a Sage X3 cost center?
The record is logged with full details in the audit trail and marked as unmatched. The GL post is not attempted until the work location is mapped to a valid X3 cost center. Once the mapping is added or corrected, the record can be manually replayed via the audit interface so the payroll data reaches X3 without loss or duplicate entry.

Related integrations

Connect Sage X3 and Paylocity

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

Get started