ml-connector
DATEVGoCardless

DATEV and GoCardless integration

DATEV runs accounting and tax for German and Austrian businesses. GoCardless collects recurring and one-off bank debit payments. Connecting the two turns each collected payment, payout, and refund into a DATEV booking without re-keying from the GoCardless dashboard. ml-connector verifies every GoCardless webhook, maps customers to the right debtor accounts, and submits the bookings as the EXTF file jobs DATEV expects. The cash you collect in GoCardless lands in your DATEV ledger on the schedule you set.

How DATEV works

DATEV is on-premise accounting (DATEV Rechnungswesen) with a cloud document layer (DATEV Unternehmen Online). It is not a conventional REST API. A REST surface lists clients with the accounting clients product and uploads PDFs with the documents product, but actual bookings go in as asynchronous jobs: EXTF CSV files to the on-premise engine, or DXSO XML to the cloud. Auth is OAuth 2.0 authorization code with PKCE against login.datev.de, and a real user session is always required. DATEV has no webhooks, so you submit a job and poll its status; finalized EXTF bookings are write-only and cannot be read back, and the chart of accounts is not retrievable by API.

How GoCardless works

GoCardless exposes customers, customer bank accounts, mandates, payments, subscriptions, payouts, refunds, and an events log through the GoCardless Payments API, a REST JSON service. The connector authenticates with a direct access token sent as a Bearer header, with environment set to live or sandbox, and every request carries the pinned GoCardless-Version header. Payouts and the events log are read-only and system-generated. GoCardless pushes events to a registered HTTPS endpoint as batches of up to 250, signed with HMAC-SHA256 in the Webhook-Signature header, and this push is the primary real-time path rather than polling.

What moves between them

The flow runs from GoCardless into DATEV. When a payment is confirmed or paid out, or a refund is paid, ml-connector reads the event and posts a booking into DATEV as an EXTF CSV job, debiting or crediting the bank and debtor accounts with the GoCardless reference as the document number. Payout events drive the reconciliation booking, with payout items enumerated so each payment, fee, and chargeback in a payout is accounted for. Customer master data maps to DATEV debtor accounts so each booking lands on a real party. Bookings are write-only in DATEV, so ml-connector never reads ledger entries back into GoCardless; the cadence follows your webhook events plus a scheduled sweep for anything missed.

How ml-connector handles it

ml-connector stores both credential sets encrypted: the GoCardless access token and the DATEV OAuth client id, secret, and refresh token. It verifies the GoCardless Webhook-Signature HMAC-SHA256 against the raw request body before anything is posted, and returns 401 on a mismatch so GoCardless keeps retrying rather than marking the endpoint healthy. DATEV access tokens last only 900 seconds, so it refreshes using the client id alone, never the secret. Because DATEV bookings are asynchronous, it submits each EXTF CSV job and polls the job status with exponential backoff and jitter until the import completes or fails. GoCardless amounts are integers in the smallest currency unit, so they are converted to DATEV decimal amounts with the currency code, and the debit or credit indicator is set from the event type. EXTF filenames are made stable and deterministic so a retry is de-duplicated by DATEV rather than posted twice, and document types are fetched per client before any PDF upload since they are client-specific. Because the standard chart of accounts is not readable from DATEV, the GL and tax accounts are mapped during setup. Every record carries a full audit trail and can be replayed if a job fails.

A real-world example

A subscription software company in Germany with around 60 staff bills several thousand customers by SEPA direct debit through GoCardless and keeps its books in DATEV with its tax advisor. Before the integration, a bookkeeper exported the GoCardless payout report each week and hand-keyed the collected payments, fees, and failed-payment reversals into DATEV, and reconciling a single payout against the bank statement took most of an afternoon. With DATEV and GoCardless connected, each confirmed payment and each payout posts into DATEV as a booking the moment GoCardless reports it, with fees and chargebacks split out from the payout items. The advisor opens a period that is already reconciled, and the weekly re-keying is gone.

What you can do

  • Post confirmed GoCardless payments and refunds into DATEV as EXTF booking jobs with the payment reference as the document number.
  • Turn each GoCardless payout into a reconciliation booking, with payout items split into payments, fees, and chargebacks.
  • Map GoCardless customers to DATEV debtor accounts so every booking lands on a real party.
  • Verify the GoCardless webhook HMAC-SHA256 signature before posting, and return 401 on a mismatch so retries continue.
  • Bridge the GoCardless access token with DATEV OAuth and refresh the 15-minute DATEV token automatically.

Questions

Which direction does data move between DATEV and GoCardless?
Data moves from GoCardless into DATEV. Confirmed payments, payouts, and paid refunds become DATEV bookings, and GoCardless customers map to DATEV debtor accounts. DATEV bookings are write-only and cannot be read back, so ml-connector never writes ledger entries into GoCardless.
Does the integration use GoCardless webhooks or polling?
It uses GoCardless webhooks as the primary path, since GoCardless pushes signed events the moment a payment confirms, fails, or pays out. Each batch is verified with HMAC-SHA256 before any booking is created. A scheduled sweep backs up the webhooks so nothing is missed, because DATEV itself never pushes and must be polled.
How are GoCardless payment amounts written into DATEV bookings?
GoCardless amounts are integers in the smallest currency unit, such as cents for euros, so ml-connector converts them to DATEV decimal amounts and includes the currency code. The debit or credit indicator is set from the event type, and the GL and tax accounts are mapped during setup because DATEV does not expose its chart of accounts by API.

Related integrations

Connect DATEV and GoCardless

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

Get started