Wave Accounting and Paychex integration
Wave Accounting handles your books. Paychex runs payroll. Connecting the two keeps your ledger in agreement with what you actually paid. Payroll GL entries flow from Paychex into Wave's chart of accounts automatically after each pay run, mapped to the correct expense accounts. Worker data syncs back to Wave so your headcount reporting is always accurate, and payroll costs land on the accounts you set them to. ml-connector hides the complexity of two different OAuth2 implementations and moves the records on a schedule tied to your payroll calendar.
What moves between them
Payroll GL entries and labor costs flow from Paychex into Wave Accounting after each pay run. Worker data flows bidirectionally so Wave headcount matches Paychex employee status and hire/termination dates. Expense accounts in Wave are mapped to Paychex pay components and cost centers so payroll costs land on the correct accounts. The sync runs on a schedule aligned with your payroll calendar, typically weekly or biweekly depending on your setup.
How ml-connector handles it
ml-connector stores both credential sets encrypted and refreshes each independently according to their OAuth2 rules. For Paychex, tokens are refreshed proactively before expiry because no refresh token is issued. For Wave, refresh tokens are used when the access token expires. Payroll GL data is pulled from Paychex webhooks and full records are fetched via REST; Wave receives the entries through its GraphQL API endpoint. Because Paychex webhook payloads contain only a notification and not the changed data, ml-connector fetches the full record via GET and validates expense accounts against Wave's chart of accounts before posting. Worker synchronization maps Paychex worker status to Wave customer records or a dedicated contact table, depending on your Wave setup. The integration handles Paychex's eventual consistency model and Wave's lack of a bills or AP module by treating payroll GL as a transaction-only flow, never writing payroll back into Paychex.
A real-world example
A small business with 20-40 employees runs Wave Accounting for bookkeeping and invoicing, and Paychex Flex for payroll. Before the integration, the owner or accountant manually exported the payroll summary from Paychex each week, calculated the labor cost allocations, and entered them into Wave's expense accounts by hand. With Wave and Paychex connected, each payroll run automatically flows into Wave as expense transactions mapped to the correct accounts. Bank reconciliation is faster because the payroll expenses are already there, and monthly P&L reporting needs no manual payroll adjustments.
What you can do
- Sync payroll GL entries from Paychex into Wave Accounting's expense accounts after every pay run.
- Map Paychex pay components and worker costs to Wave expense accounts so labor allocations are automated.
- Keep Wave headcount and employee records in sync with Paychex hires, terminations, and status changes.
- Manage distinct OAuth2 implementations on both sides: Authorization Code Flow for Wave and Client Credentials for Paychex.
- Poll Paychex webhooks and fetch full payroll records on a schedule tied to your payroll calendar, with a full audit trail on every entry.
Questions
- How does the integration handle Wave's lack of accounts payable and Paychex's lack of GL accounts?
- Payroll GL entries flow one direction only, from Paychex into Wave's expense accounts. Wave does not have an AP or invoice module for payroll, so ml-connector treats payroll as a transaction-only sync and never writes back into Paychex. The integration focuses on posting labor costs to the correct expense accounts rather than managing vendor invoices or AP liability.
- Why must ml-connector re-acquire Paychex tokens before they expire?
- Paychex's OAuth2 Client Credentials flow does not issue refresh tokens. Tokens expire after a set period and cannot be refreshed. ml-connector proactively requests a new token before expiry to avoid failed payroll requests. This is different from Wave's Authorization Code Flow, which issues refresh tokens that extend the session.
- How does the integration handle Paychex webhook payloads that do not include the changed data?
- Paychex webhooks are notification-only. ml-connector listens for worker, employment, and check events, then immediately fetches the full record via REST GET to ensure it has all current data. This adds a second API call per webhook event but guarantees that all fields are up to date, avoiding issues with partial or stale data.
Related integrations
More Wave Accounting integrations
Other systems that connect to Paychex
Connect Wave Accounting and Paychex
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started