ml-connector
QuickBooks DesktopPaylocity

QuickBooks Desktop and Paylocity integration

QuickBooks Desktop runs accounting and payroll for small to mid-sized businesses on Windows. Paylocity runs cloud-based HCM and payroll processing. When the two systems are connected, employee records, deductions, and earnings flow from Paylocity into QuickBooks Desktop automatically, keeping your payroll register and employee list in sync without re-keying. ml-connector handles the very different authentication models and polling mechanisms on each side and maps the data on a schedule you control.

How QuickBooks Desktop works

Paylocity is a cloud-based HCM and payroll platform accessible via REST API at https://api.paylocity.com/api/v2 for production and https://dc1demogwext.paylocity.com for sandbox. It authenticates with OAuth2 client credentials (client_id and client_secret) and returns a bearer token valid for 3600 seconds. Paylocity exposes employees, pay statements, deductions, earnings, work locations, positions, and pay grades. It supports both webhooks (New Hire, Employee Change, Termination, Payroll Processed) and polling, with webhook events delivered as HTTPS POST JSON; however, webhook payloads carry identifiers only, so full record data must be fetched via subsequent API calls.

How Paylocity works

QuickBooks Desktop is a locally-installed Windows accounting product that does not expose a REST API. Instead, integration requires a customer-hosted SOAP Web Connector agent (QBWC) that polls your SOAP web service at an interval you configure. The agent calls your SOAP endpoint with a session-token handshake: QBWC provides username and password, your service returns a session ticket (GUID) for all subsequent calls. Your service submits QBXML (XML request/response envelopes) that QuickBooks processes sequentially. Key entities include employees, vendors, invoices, journal entries, purchase orders, and accounts. QuickBooks must be running and logged into the company file on the Windows machine for QBWC to process requests.

What moves between them

The main flow runs from Paylocity into QuickBooks Desktop. Employee records, earnings, and deductions flow from Paylocity into QuickBooks as employee objects and journal entries on every payroll cycle or on a schedule you define. When Paylocity fires a Payroll Processed webhook or when the polling interval triggers, ml-connector fetches the latest employee and pay statement data from Paylocity via REST, translates it into QBXML format, and submits it through the QBWC polling cycle. Employee additions, terminations, and pay data updates land in QuickBooks without manual re-entry.

How ml-connector handles it

ml-connector stores both credential sets encrypted and handles the complete polling bridge between the two systems. On the Paylocity side, it uses OAuth2 client credentials to obtain a bearer token, refreshes the token before expiry (every 60 minutes within the 3600-second lifetime), and fetches employee and pay statement records via REST. On the QuickBooks Desktop side, ml-connector implements the SOAP Web Connector protocol: it receives poll() calls from the customer's QBWC agent, authenticates with the session-token handshake, and returns QBXML requests for QuickBooks to process. It tracks each transaction's EditSequence (QB's version counter) so concurrent edits do not create duplicates, re-queries before every modification to get the current EditSequence, and handles the sequential nature of QBWC (only one request at a time per session). Because Paylocity webhook payloads carry only identifiers, ml-connector fetches the full employee and deduction records via separate REST calls when a webhook fires. It deduplicates across polling intervals and retries failed QBXML submissions on the next QBWC cycle.

A real-world example

A mid-sized retail group with 150 employees runs QuickBooks Desktop at head office for accounting and payroll processing, and uses Paylocity Workforce Now for HCM and benefits administration across 4 locations. Before the integration, the payroll administrator exported the pay register and employee list from Paylocity each month, then manually entered employee changes and deductions into QuickBooks to update the payroll register and GL accounts. With QuickBooks Desktop and Paylocity connected, employee hires, terminations, and pay data sync automatically to QuickBooks on every payroll run, the payroll register stays current without re-keying, and the finance team has accurate headcount and labor costs at month-end close without manual workarounds.

What you can do

  • Sync Paylocity employees, earnings, and deductions into QuickBooks Desktop employee and journal entry objects via the QBWC polling cycle.
  • Authenticate Paylocity with OAuth2 bearer tokens and QuickBooks with SOAP session-token handshake.
  • Track EditSequence on every QuickBooks transaction to prevent duplicate entries from concurrent or retried writes.
  • Fetch full employee and deduction records from Paylocity when webhooks fire, since webhook payloads carry identifiers only.
  • Poll on a configurable interval (minimum 1 minute, typical 5-15 minutes) matching your payroll cycle, with deduplication and error replay on the next cycle.

Questions

Which direction does data move between QuickBooks Desktop and Paylocity?
Data flows from Paylocity into QuickBooks Desktop. Employee records, earnings, and deductions from Paylocity sync into QuickBooks as employee objects and journal entries. QuickBooks is treated as read-only for this integration, so ml-connector does not write employee or payroll changes back to Paylocity.
Why does ml-connector need to handle EditSequence and re-query before modifications?
QuickBooks tracks a version counter called EditSequence on every record to prevent concurrent edits from creating duplicates or losing updates. Before modifying an employee or journal entry in QuickBooks, ml-connector must fetch the current EditSequence value and include it in the QBXML request. If the EditSequence has changed since the last read, QuickBooks rejects the modification and ml-connector retries on the next polling cycle.
Does the integration work with Paylocity webhooks, or does it only poll?
ml-connector listens for Paylocity webhook events (New Hire, Employee Change, Termination, Payroll Processed) to trigger immediate syncs and reduces latency compared to polling alone. However, because Paylocity webhook payloads carry identifiers only, ml-connector must fetch the full employee and pay data via REST API calls. For systems without webhook registration, polling on a configurable interval remains the fallback.

Related integrations

Connect QuickBooks Desktop and Paylocity

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

Get started