ml-connector
DATEVDayforce

DATEV and Dayforce integration

DATEV runs accounting and tax for German and Austrian businesses. Dayforce runs HR and payroll. Connecting the two moves payroll cost data into the accounting ledger without re-keying. After each Dayforce pay run, the earnings, employer taxes, and deductions are posted into DATEV as a booking batch, allocated to the right accounts and cost centers. ml-connector handles the very different APIs and auth models on each side and submits the bookings on the schedule your pay calendar sets.

How DATEV works

DATEV is not a conventional REST API for accounting. Finalized bookings are submitted as asynchronous jobs: EXTF CSV files go to the on-premise Rechnungswesen engine through the accounting:extf-files product, and DXSO XML booking suggestions go to DATEV Unternehmen Online through accounting:dxso-jobs. A REST surface exists for listing clients (accounting:clients) and uploading PDF documents (accounting:documents). Auth is OAuth 2.0 Authorization Code with PKCE against login.datev.de, with a 900-second access token and a required interactive user login. DATEV has no webhooks, so submitted jobs are tracked by polling the job status endpoint. The standard chart of accounts cannot be read back through the API.

How Dayforce works

Dayforce is an HRIS and payroll platform, not a finance system, so it has no vendor, invoice, purchase order, or AP objects. It exposes employees, organizational units, jobs, positions, pay summaries, and pre-built reports through a JSON REST API. Auth is OAuth 2.0 with the password grant: a dedicated web-services username and password plus a fixed client id and the company namespace return a one-hour Bearer token. Payroll journal data is not a direct endpoint; it is pulled from a customer-configured report through the Reports API, which returns earnings, taxes, and deductions with GL account codes and cost dimensions. Dayforce has no real-time webhooks, so changes are detected by date-range filters on each poll.

What moves between them

The flow runs from Dayforce into DATEV. After each pay run, ml-connector pulls the configured Dayforce payroll journal report and posts its earnings, tax, and deduction lines into DATEV as an EXTF booking batch, or as a DXSO XML job where booking suggestions are preferred, mapped to the matching DATEV accounts and cost centers. Employee hires, terminations, and rehires from Dayforce inform the creditor and debtor master data carried in the EXTF file. Reference data such as departments and cost centers is aligned so each payroll line lands on a valid DATEV Konto and Kostenstelle. DATEV bookings are write-only and cannot be read back, so ml-connector never pulls posted journals into Dayforce.

How ml-connector handles it

ml-connector stores both credential sets encrypted and bridges two different auth flows: it requests a Dayforce Bearer token with the password grant and refreshes it before the one-hour expiry, while it holds a DATEV OAuth session from the PKCE login and refreshes that token before its 900-second window closes, sending client id only on refresh as DATEV requires. Because Dayforce payroll data lives in a report rather than an endpoint, the customer first configures a payroll journal report whose XRefCode the connector reads through the Reports API, following the Paging.Next cursor until it is empty. Dayforce departments and the report GL codes are mapped to DATEV Konto, Gegenkonto, and Kostenstelle values first, so every booking line references an account and cost center that exists. The mapped lines are written as an EXTF CSV file using NFC-normalized UTF-8 with a sanitized, deterministic filename, then submitted as an async job and polled with exponential backoff and jitter until the job reports complete or failed, since DATEV pushes no status. Both systems are pull-only, so ml-connector schedules reads on your pay calendar; Dayforce rate limits are tenant-wide, so calls are queued and backed off, and DATEV duplicate-file detection lets a failed submission be replayed safely under the same filename.

A real-world example

A German manufacturer with about 600 employees across two plants runs DATEV through its tax advisor for accounting and uses Dayforce for HR and payroll. Before the integration, payroll staff exported the journal from Dayforce after each run and a bookkeeper re-keyed the labor totals into DATEV by hand, then spent the start of month-end close reconciling headcount against the wage accounts in the ledger. With DATEV and Dayforce connected, each pay run's journal report posts into DATEV automatically as a booking batch, split by plant cost center, and employee changes keep the master data aligned. Close begins with the wage accounts already reconciled and the manual re-keying step is gone.

What you can do

  • Post Dayforce payroll journal reports into DATEV as EXTF or DXSO booking batches after every pay run.
  • Allocate earnings, employer taxes, and deductions to the correct DATEV Konto, Gegenkonto, and Kostenstelle.
  • Map Dayforce departments and org units to DATEV cost centers so payroll lands on valid accounts.
  • Bridge the Dayforce password-grant token and the DATEV PKCE login, refreshing each before it expires.
  • Poll both pull-only systems on your pay calendar and replay a failed DATEV submission safely under the same filename.

Questions

Which direction does data move between DATEV and Dayforce?
The flow is Dayforce into DATEV. Payroll journal lines and the employee changes that affect master data move from Dayforce into DATEV as booking batches. DATEV finalized bookings are write-only and cannot be read back through the API, so ml-connector does not pull ledger entries into Dayforce.
How does the integration get payroll data out of Dayforce?
Dayforce has no direct payroll journal or GL account endpoint. The customer configures a payroll journal report inside Dayforce that outputs earnings, taxes, and deductions with GL codes and cost dimensions, and ml-connector pulls that report through the Reports API by its XRefCode, following the cursor pages. Those lines are then mapped and submitted into DATEV.
Since neither system has webhooks, how are syncs triggered?
Both DATEV and Dayforce are pull-only. ml-connector runs on a schedule tied to your pay calendar, using Dayforce date-range filters to read only changed records and polling the DATEV job status endpoint with backoff until each booking job completes. There is no real-time push from either side.

Related integrations

Connect DATEV and Dayforce

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

Get started