ml-connector
DATEVSAP Concur

DATEV and SAP Concur integration

DATEV is the accounting book of record for German and Austrian businesses. SAP Concur is where employees submit expenses and where invoices clear approval. This connection takes the documents Concur marks ready for the general ledger and turns them into DATEV bookings, so finance does not re-key approved spend. Approved invoices and expense reports post into DATEV Rechnungswesen as EXTF booking batches, the underlying receipt PDFs land in DATEV Unternehmen Online, and ml-connector sends a posting confirmation back to SAP Concur once each DATEV job finishes. The two systems use very different transports, and ml-connector handles the async file jobs on the DATEV side and the OAuth and event flow on the Concur side.

How DATEV works

DATEV is not a conventional REST API. Core bookings move as asynchronous file jobs: an EXTF CSV booking batch is submitted to DATEV Rechnungswesen through accounting:extf-files, or a DXSO XML job is sent to DATEV Unternehmen Online, and you poll the job status endpoint until it completes because there are no webhooks. Invoice and receipt PDFs upload through the accounting:documents REST API using a PUT with a caller-supplied GUID, and document types are client-specific so they must be fetched first. Authentication is OAuth 2.0 Authorization Code with PKCE against Login mit DATEV, which needs an interactive user session and offers no machine-to-machine flow, and access tokens last 15 minutes. Finalized EXTF bookings are write-only, the full chart of accounts cannot be read back, and the APIs are not built for high-frequency polling.

How SAP Concur works

SAP Concur is a cloud platform exposing REST JSON APIs across Expense, Invoice, and Financial Integration. The Financial Integration Service v4 endpoint is purpose-built for ERP sync: it returns approved invoice, expense, and related documents ready for posting, and it accepts acknowledgements, posting confirmations, and payment confirmations back from the ERP. Vendors, payment requests, purchase orders, and expense reports are available through their own v3.0 and v4 endpoints. Authentication is OAuth 2.0, with company-level access bootstrapped by a one-time auth token from the App Center that is exchanged for a six-month refresh token, and the token response returns a geolocation base URL that every later call must use. The Event Subscription Service can push expense and invoice status changes to a registered HTTPS endpoint, secured with mutual TLS and a Concur-Signature header, with at-least-once delivery.

What moves between them

The flow runs from SAP Concur into DATEV. ml-connector pulls approved documents from Concur Financial Integration v4, maps each one to a DATEV EXTF booking batch, and submits it as a file-import job to DATEV Rechnungswesen, while the matching receipt or invoice PDF uploads to DATEV Unternehmen Online against the correct client-specific document type. Vendor and creditor master data from Concur is written into the EXTF creditor master rows so each booking references a real account. Once the DATEV job completes, ml-connector posts a posting confirmation back to Concur so the document is marked as recorded in the ledger. DATEV bookings are write-only and the chart of accounts cannot be read back, so account and cost center mappings are configured up front rather than discovered from DATEV.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Concur side it performs the company-level OAuth exchange, holds the refresh token, rotates the one-hour access token, and always calls the geolocation base URL returned with the token rather than a hardcoded datacenter. On the DATEV side it carries the interactive Login mit DATEV session, refreshes the 15-minute token using client_id only, and sends the X-DATEV-Client-Id header on every request. Document types are fetched per client before any upload, and EXTF files are written as NFC-normalized UTF-8 with whitelisted filenames so DATEV does not silently reject them. Concur Expense and Invoice events can trigger work as documents are approved, with a scheduled Financial Integration poll as the backstop, since DATEV itself cannot push. DATEV submissions are asynchronous, so each job ID is polled with exponential backoff and jitter from about five seconds up to sixty, and DATEV deduplicates by filename plus document type and returns a duplicate error on a repeat, so deterministic filenames make retries safe. Concur returns at-least-once events, so each is verified and tracked by document ID, and a posting confirmation is sent back only after the DATEV job reports complete. Account numbers, tax codes, and cost centers are mapped first so every booking line lands on a valid SKR account.

A real-world example

A mid-sized engineering firm headquartered in Germany with around 300 employees runs DATEV through its tax advisor for statutory accounting and uses SAP Concur for travel, expense, and supplier invoices. Before the integration, an accountant exported approved expense reports and invoices from Concur each week, hand-keyed the totals into DATEV with the right SKR accounts and cost centers, and separately filed the PDFs into DATEV Unternehmen Online. Month-end close stalled while the team reconciled which approved documents had actually been booked. With DATEV and SAP Concur connected, each approved document becomes a DATEV booking automatically, the receipt PDF is filed in DUO, and Concur is told the moment the posting lands, so the manual re-keying and the filing step are gone and close starts from documents already recorded.

What you can do

  • Post approved SAP Concur invoices and expense reports into DATEV Rechnungswesen as EXTF booking batches.
  • Upload the matching receipt and invoice PDFs into DATEV Unternehmen Online against the correct client-specific document type.
  • Map Concur vendors, account codes, tax codes, and cost centers to DATEV SKR accounts and creditor master rows.
  • Bridge SAP Concur company-level OAuth and the interactive Login mit DATEV session, rotating both short-lived tokens.
  • Poll each asynchronous DATEV file job to completion and send a posting confirmation back to SAP Concur.

Questions

Which direction does data move between DATEV and SAP Concur?
The flow is SAP Concur into DATEV. Approved invoices and expense reports move from Concur Financial Integration v4 into DATEV as EXTF bookings, and their PDFs upload to DATEV Unternehmen Online. After each DATEV job completes, ml-connector posts a posting confirmation back to Concur. DATEV finalized bookings are write-only, so ml-connector does not read posted journal entries back out of DATEV.
How does the integration deal with DATEV having no webhooks and asynchronous jobs?
DATEV is pull-only and processes bookings as asynchronous file jobs, so ml-connector submits each EXTF file and then polls the job status endpoint with exponential backoff and jitter until it reports complete or failed. SAP Concur supplies the trigger instead, through Event Subscription Service notifications on approval plus a scheduled Financial Integration poll as a backstop. A posting confirmation is sent back to Concur only once the DATEV job actually finishes.
Can the integration read GL accounts from DATEV automatically?
No. DATEV does not expose its full chart of accounts through the API, so standard SKR account numbers cannot be pulled programmatically. Account numbers, tax codes, and cost centers are configured in the mapping up front, and ml-connector validates each Concur document against that mapping so every EXTF booking line references an account and cost center that already exists in DATEV.

Related integrations

Connect DATEV and SAP Concur

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

Get started