Wave Accounting and ADP integration
Wave Accounting runs invoicing and bookkeeping for small businesses. ADP runs payroll and HR. Connecting the two keeps the payroll cost in your books in step with what ADP actually paid, without re-keying. After each ADP payroll run, the general ledger document ADP produces posts into Wave as a balanced journal entry against the right accounts. ml-connector handles the very different APIs on each side and moves the data on a schedule you control.
What moves between them
The flow runs from ADP into Wave Accounting. After each payroll run, ml-connector reads the general ledger document ADP generates and posts it into Wave as a money transaction, with the labor-cost debits and credits mapped to the matching Wave chart-of-accounts GL accounts. Reference data such as ADP cost centers, departments, and job codes is aligned to Wave GL accounts so each journal line references an account that already exists. Cadence follows your payroll calendar: the sync runs on a schedule, or kicks off when ADP sends a payroll event notification. ADP general ledger documents are read-only and Wave has no payroll object, so ml-connector never writes financial entries or worker data back into ADP.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the ADP side it presents the client certificate at the TLS layer on every request and re-calls the token endpoint with client credentials when a call returns 401. On the Wave side it exchanges the OAuth2 authorization code for a bearer token, refreshes that token before its roughly two-hour expiry rather than waiting for a failure, and fetches the businessId once so it can scope every GraphQL call. ADP cost centers and departments are mapped to Wave GL accounts first, so every debit and credit lands on a valid account. Each posted journal carries a stable externalId derived from the ADP payroll batch, which Wave's moneyTransactionCreate mutation uses as an idempotency key so a retry never creates a duplicate entry. Because Wave returns GraphQL errors with an HTTP 200, ml-connector inspects the errors array on every response rather than trusting the status code. ADP rate limits return HTTP 429 per gateway node and Wave throttles per token, so both sides back off and retry, and ml-connector tracks the ADP certificate expiry so a renewal does not turn into an outage. Every record carries a full audit trail and can be replayed if a Wave post fails.
A real-world example
A twenty-person design studio keeps its books in Wave Accounting and runs payroll through ADP Workforce Now. Before the integration, the bookkeeper opened the ADP payroll register after every run and hand-entered the wage, tax, and benefit totals into Wave as a journal entry, which was easy to fat-finger and slow to reconcile at month-end. With Wave Accounting and ADP connected, each payroll run's general ledger document posts into Wave automatically, split across the correct wage and liability accounts, so the books reflect what ADP paid the moment the run finishes. The manual entry is gone and close starts from numbers that already tie out.
What you can do
- Post ADP payroll general ledger documents into Wave Accounting as balanced journal entries after every pay run.
- Map ADP cost centers, departments, and job codes to Wave chart-of-accounts GL accounts so each line lands on a valid account.
- Authenticate ADP with OAuth2 client credentials and the required mutual TLS certificate, and Wave with its bearer token and businessId.
- Deduplicate posted journals with a stable externalId so a retry never creates a double entry in Wave.
- Run on your payroll schedule or on an ADP event notification, with retries and a full audit trail on every record.
Questions
- Which direction does data move between Wave Accounting and ADP?
- The flow is one way, from ADP into Wave Accounting. The payroll general ledger document ADP generates after each run is posted into Wave as a journal entry against the matching GL accounts. ADP general ledger documents are read-only and Wave has no payroll object, so ml-connector does not write financial entries or worker data back into ADP.
- Does ADP send employee records into Wave Accounting?
- No. Wave Accounting is small-business bookkeeping software and has no employee or payroll object, so individual worker records have no place to land. What moves is the summarized labor cost from ADP's payroll general ledger document, posted into Wave as debits and credits across your wage, tax, and liability accounts.
- How does ml-connector avoid duplicate journal entries on a retry?
- Wave's moneyTransactionCreate mutation accepts an externalId field that acts as an idempotency key. ml-connector derives a stable externalId from the ADP payroll batch and sends it with each post, so if a sync retries after a network error, Wave recognizes the entry and does not create a second one.
Related integrations
More Wave Accounting integrations
Other systems that connect to ADP
Connect Wave Accounting and ADP
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started