ml-connector
Wave AccountingSAP Concur

Wave Accounting and SAP Concur integration

Wave Accounting manages invoicing and transactions for small businesses; SAP Concur handles expense reports, purchase orders, and vendor payments at enterprise scale. Connecting them keeps your financial records aligned without manual re-entry. Expense reports from Concur flow into Wave as transactions against the correct vendor accounts. New vendors added to Concur automatically sync to Wave so invoice matching works. Concur's financial integration documents are linked to Wave transactions for end-to-end audit traceability.

How Wave Accounting works

Wave Accounting exposes customers, invoices, transactions, accounts, vendors, products, and sales taxes through a GraphQL single endpoint at https://gql.waveapps.com/graphql/public. Authentication is OAuth 2.0 Authorization Code Flow with 2-hour access tokens and refresh tokens; the connected business must hold a Wave Pro subscription. Wave publishes webhook events for invoice creation, updates, payment, customer changes, transaction creation, and product changes, with retries on failed delivery. Webhooks require HMAC-SHA256 signature verification. Bills and accounts payable are not exposed via the GraphQL API.

How SAP Concur works

SAP Concur exposes vendors, purchase orders, purchase requests, expense reports, and payment request invoices through multi-datacenter REST endpoints. Geolocation routing is determined by OAuth token response (US, EMEA, or China), and all subsequent calls must use the matched datacenter. Authentication is OAuth 2.0 with password grant (credtype=authtoken) using company ID and a 24-hour bootstrap token; access tokens expire in 1 hour and refresh tokens in 6 months. Concur supports Event Subscription Service webhooks for expense reports, invoices, travel requests, and user provisioning, with at-least-once delivery and retry on server errors. Each app is limited to 5 active webhook subscriptions.

What moves between them

Expense reports and purchase orders from SAP Concur sync into Wave Accounting as transactions and vendor records on a schedule tied to your monthly close cycle. New invoices created in Wave trigger webhook events that feed into Concur's Payment Request documents for vendor matching and payment approval workflows. Vendor master records flow bidirectionally: new vendors created in Concur sync to Wave so invoice matching is accurate, and Wave transaction customer records update Concur user and vendor data when synchronization detects changes. Payment status updates and invoice approvals are tracked as audit trail entries and can be replayed if a downstream sync fails.

How ml-connector handles it

ml-connector handles Wave's GraphQL interface by querying the full customer, vendor, and transaction payload and filtering by modification timestamp to detect changes. On the Concur side it performs geolocation routing by parsing the OAuth token response and then routes all subsequent API calls to the matched datacenter (US, EMEA, or China). Concur's OAuth tokens expire hourly, so ml-connector refreshes them before each request and caches the result. Wave webhook events are verified using HMAC-SHA256 against the x-wave-signature header with a 5-minute replay window to prevent duplicate processing. Concur's Event Subscription Service is limited to 5 active subscriptions per app, so ml-connector pools multiple event topics under a single webhook and routes internally by event type. Vendor master matching uses the vendor name and tax ID to prevent duplicates. If Concur's API returns HTTP 429 (rate limit), ml-connector backs off with exponential jitter and retries. Every transaction carries the source system, transaction ID, and timestamp, so any record can be traced back to its origin and replayed if needed.

A real-world example

A mid-sized management consulting firm uses Wave Accounting for invoicing and cash tracking, and SAP Concur for employee travel expenses and reimbursements. Before the integration, the finance team received Concur expense reports monthly, manually exported them as CSV, and re-entered approved expenses into Wave as transactions against consultant vendor accounts. Month-end reconciliation involved searching both systems for matching amounts and approvals. With the integration, each approved Concur expense report syncs to Wave as a vendor transaction within hours, already assigned to the correct consultant account code. Vendors onboarded in Concur automatically appear in Wave, eliminating duplicate vendor master records. The finance team now reconciles simply by matching Wave transaction entries against Concur export snapshots, cutting month-end close by one full day.

What you can do

  • Sync SAP Concur expense reports into Wave Accounting as vendor transactions with automatic account assignment.
  • Sync new vendors from SAP Concur to Wave so expense invoices match against existing vendor accounts.
  • Route SAP Concur API calls to the correct datacenter (US, EMEA, or China) based on OAuth token geolocation.
  • Verify Wave webhook signatures using HMAC-SHA256 and prevent duplicate processing within a 5-minute replay window.
  • Track all synced records with full source system traceability and replay capability for audit compliance.

Questions

How does ml-connector handle SAP Concur's multi-datacenter requirement?
ml-connector parses the OAuth token response to determine the customer's geolocation (US, EMEA, or China) and routes all subsequent API calls to the matched datacenter. Every customer's routing is cached, so geolocation is evaluated only once per token refresh. This prevents 401 and 403 errors that occur when API calls are sent to the wrong region.
What records flow from SAP Concur into Wave Accounting?
Approved expense reports sync into Wave as transactions against vendor accounts. Purchase orders and purchase requests create additional transaction records tied to the vendor master. New vendors added to Concur sync to Wave as customer records so invoice matching and reporting work across both systems.
Why does Wave require a Pro subscription, and what happens if it expires?
Wave's GraphQL API and webhook system are only available on Wave Pro subscriptions. If a subscription lapses, webhooks stop firing and the GraphQL endpoint becomes unavailable. ml-connector will detect 401 responses and alert the customer to renew their Wave Pro plan before the sync can resume.

Related integrations

Connect Wave Accounting and SAP Concur

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

Get started