ml-connector
DATEVADP

DATEV and ADP integration

DATEV is the accounting backend used by German tax advisors and their business clients. ADP runs payroll and HR. Connecting the two moves payroll results into the books without re-keying. After each payroll run, the general ledger document ADP produces is converted into a DATEV EXTF booking batch and submitted as a job, mapped to the correct account numbers and cost centers. ml-connector handles the very different file-based and event-based APIs on each side and tracks each DATEV job until it finishes posting.

How DATEV works

DATEV is not a conventional REST API. The accounting engine (DATEV Rechnungswesen) is on-premise, with a cloud document layer (DATEV Unternehmen Online). REST products cover listing clients and uploading documents, but finalized bookings are submitted as asynchronous EXTF CSV file jobs, and booking suggestions as DXSO XML jobs, on tenant client IDs looked up first. Authentication is OAuth 2.0 Authorization Code with PKCE against login.datev.de; a real tax advisor login is required, there is no machine-to-machine flow, and access tokens last only 900 seconds. DATEV has no webhooks, so job status is read by polling, and the standard chart of accounts cannot be read back.

How ADP works

ADP exposes workers, pay data input, pay distributions, validation tables for cost centers and departments, and general ledger documents through ADP API Central, a paid REST add-on that also supports OData query parameters. Every call requires OAuth2 client credentials and a mutual TLS client certificate, and the TLS handshake fails without the certificate. Writes go through event endpoints such as /events/hr/v1/worker.hire rather than direct field updates, and the GL documents ADP generates after payroll are read-only. ADP can also push worker and payroll events to a registered endpoint.

What moves between them

The flow runs from ADP into DATEV. After each payroll run, ml-connector reads ADP's general ledger documents and writes the labor cost lines into DATEV as an EXTF booking batch, mapped to the matching debit and credit account numbers and cost centers, then polls the DATEV import job until it completes. Supporting payroll PDFs are uploaded to DATEV Unternehmen Online against the right document type. Both sides treat their GL output as read-only: ADP GL documents are pull-only, and finalized DATEV bookings cannot be read back, so ml-connector never writes financial entries back into payroll and never expects a confirmation read from DATEV beyond job status.

How ml-connector handles it

ml-connector stores both credential sets encrypted and presents the ADP client certificate at the TLS layer on every request, re-calling the ADP token endpoint when a call returns 401. On the DATEV side it runs the interactive PKCE login once with the tax advisor, then refreshes the 900-second token automatically using the client_id alone, and looks up the DATEV client ID before any submission. ADP GL documents become an EXTF CSV batch: amounts, debit and credit accounts, document numbers, and cost centers are written into the Buchungsstapel layout, with account numbers and cost centers mapped first because DATEV's chart of accounts cannot be read back and must be configured in advance. The file is UTF-8 NFC normalized with a whitelisted filename so DATEV does not reject it, and a deterministic filename makes a retry safe since DATEV rejects a duplicate filename plus document-type pair. Because DATEV has no webhooks, ml-connector submits the job and polls the job endpoint with backoff until it posts or fails. ADP rate limits return HTTP 429 per gateway node, so it backs off, and it tracks the ADP certificate expiry so a renewal does not become an outage. Every record carries a full audit trail and can be replayed if a call fails.

A real-world example

A German engineering firm with around 180 employees keeps its books in DATEV through its Steuerberater and runs payroll on ADP Workforce Now across two locations. Before the integration, the bookkeeper exported the payroll journal from ADP each month and typed the wage and tax postings into DATEV by hand, matching each line to the right SKR account and Kostenstelle, then reconciled headcount against the labor accounts at month-end. With DATEV and ADP connected, each payroll run's GL document is written into DATEV as a booking batch automatically, allocated to the cost center for each location, and the supporting PDFs land in DATEV Unternehmen Online. The manual re-keying step is gone and the labor accounts are already in agreement when close begins.

What you can do

  • Write ADP payroll general ledger documents into DATEV as EXTF booking batches after every pay run, then poll the job until it posts.
  • Upload supporting payroll PDFs to DATEV Unternehmen Online against the correct client document type.
  • Map ADP cost centers and accounts to DATEV SKR account numbers and Kostenstellen so payroll lands on valid dimensions.
  • Authenticate ADP with OAuth2 and its required mutual TLS certificate, and DATEV with interactive PKCE login plus automatic token refresh.
  • Submit on a schedule tied to your payroll calendar, with deterministic filenames, retries, and a full audit trail on every record.

Questions

Which direction does data move between DATEV and ADP?
The flow is ADP into DATEV. Payroll GL documents move from ADP into DATEV as booking batches, and supporting PDFs are uploaded to DATEV Unternehmen Online. ADP general ledger documents are read-only, and finalized DATEV bookings cannot be read back, so ml-connector does not write financial entries back into payroll.
Why does DATEV use file jobs instead of a normal API write?
DATEV's accounting engine is on-premise, so finalized bookings are submitted as asynchronous EXTF CSV files to a cloud relay that forwards them, rather than written field by field. ml-connector builds the EXTF batch, submits it as a job, and polls the job endpoint until it posts or fails, because DATEV sends no webhook to confirm completion.
How does the integration handle DATEV's short token and missing chart of accounts?
DATEV access tokens last only 900 seconds, so ml-connector refreshes them automatically using the client_id alone after the one-time tax advisor login. Because DATEV does not expose its standard chart of accounts over the API, the SKR account numbers and cost centers are configured in advance and ADP values are mapped to them, so every booking line references a valid account.

Related integrations

Connect DATEV and ADP

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

Get started