DATEV and Paychex integration
DATEV runs accounting and tax for German businesses. Paychex Flex runs payroll and HR. Connecting the two means the wages, taxes, and deductions from each payroll run land in the DATEV general ledger without anyone re-keying a register. ml-connector reads completed pay data from Paychex, builds a DATEV EXTF booking batch from it, and submits that batch to DATEV Rechnungswesen, while filing the payroll register as a document in DATEV Unternehmen Online. Because the two systems work very differently, ml-connector handles the file-based DATEV side and the REST Paychex side and moves data on your payroll calendar.
What moves between them
The flow runs from Paychex into DATEV. After each pay period, ml-connector reads the processed checks and their pay components from Paychex, aggregates the wages, employer taxes, and deductions by Paychex organization, and writes them as debit and credit rows in a DATEV EXTF booking batch posted against the matching DATEV accounts and cost centers. The payroll register is uploaded into DATEV Unternehmen Online as an incoming document for the tax advisor. Worker and organization data is read from Paychex only to resolve which cost center each amount belongs to. DATEV bookings are write-only, so nothing financial is sent back into Paychex.
How ml-connector handles it
ml-connector stores both credential sets encrypted. On the Paychex side it runs the client-credentials grant and refreshes the bearer token ahead of expiry, retrying once on a 401, and it sends the Paychex vendor media-type Accept and Content-Type headers required on each resource. On the DATEV side it carries the interactive PKCE session and refresh token, sending only the client_id on refresh and attaching the X-DATEV-Client-Id header to every request. Each Paychex pay component and organization is mapped up front to a DATEV expense or liability account and a cost center, because the DATEV chart of accounts cannot be pulled and finalized bookings reject unknown accounts. The EXTF CSV is written as UTF-8 with precomposed characters and a deterministic filename so a retry is not flagged as a duplicate, then submitted and polled with exponential backoff since DATEV gives no synchronous confirmation and no webhook. Paychex pagination is walked sequentially at limit 100 with the ETag carried forward to keep the worker crawl consistent, and a 429 from Paychex or a 429-style limit from DATEV triggers a backoff and retry. Every record carries a full audit trail and can be replayed if a downstream call fails.
A real-world example
A German subsidiary of a US-owned light manufacturing group, about 180 staff across a plant and an office, runs payroll on Paychex Flex because the parent standardized on it, while its German tax advisor keeps the books in DATEV. Before the integration, the local finance lead exported the payroll register from Paychex every period, split the totals across plant and office cost centers by hand, and emailed a spreadsheet to the Steuerberater to book into DATEV, which delayed month-end and caused frequent account mismatches. With DATEV and Paychex connected, each pay run posts to DATEV automatically as an EXTF batch allocated by cost center, and the register is filed in DATEV Unternehmen Online for the advisor. Close starts with the payroll accounts already booked and the manual hand-off is gone.
What you can do
- Post each Paychex payroll run into DATEV Rechnungswesen as an EXTF booking batch allocated to the correct cost centers.
- Upload the Paychex payroll register into DATEV Unternehmen Online as a supporting document for the tax advisor.
- Map Paychex pay components and organizations to DATEV expense and liability accounts so every line books to a valid account.
- Bridge Paychex client-credentials OAuth and the interactive DATEV PKCE login, refreshing both tokens before they expire.
- Submit DATEV jobs with deterministic filenames and poll to completion, with retries and a full audit trail on every record.
Questions
- Which direction does data move between DATEV and Paychex?
- Data moves from Paychex into DATEV. Completed payroll checks and their pay components are read from Paychex, turned into a DATEV EXTF booking batch, and submitted to DATEV accounting, with the register filed in DATEV Unternehmen Online. DATEV bookings are write-only, so ml-connector never writes financial entries back into Paychex.
- Why does ml-connector build a file batch for DATEV instead of posting bookings directly?
- DATEV accounting is not a live REST system. Finalized bookings go into DATEV Rechnungswesen as asynchronous EXTF CSV file jobs through a cloud relay, with no synchronous confirmation and no webhook. ml-connector writes the EXTF file with a deterministic name to stay retry-safe, submits it, and polls the job with exponential backoff until DATEV reports it accepted or failed.
- How are DATEV accounts and cost centers matched to Paychex data?
- Each Paychex pay component and organization is mapped to a DATEV account and cost center during setup. This mapping is required because the DATEV chart of accounts cannot be read back through the API and a booking against an unknown account is rejected. Paychex worker and organization data is read only to decide which cost center each amount belongs to.
Related integrations
More DATEV integrations
Other systems that connect to Paychex
Connect DATEV and Paychex
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started