ml-connector
Wave AccountingCoupa

Wave Accounting and Coupa integration

Wave Accounting keeps your books for invoicing, expenses, and chart of accounts. Coupa manages procurement, suppliers, purchase orders, and spend. Connecting Wave and Coupa ensures customer records, vendor lists, and invoices are consistent across both systems without manual re-entry. Wave invoices flow into Coupa as purchase orders or line items, and customer and vendor master data stays aligned so your accounting and procurement teams are always looking at the same entities.

How Wave Accounting works

Wave Accounting exposes businesses, customers, invoices, products, accounts, transactions, vendors, and sales taxes through a GraphQL single-endpoint API at https://gql.waveapps.com/graphql/public. Authentication requires OAuth 2.0 Authorization Code Flow with 2-hour access tokens and refresh tokens (offline_access scope required). The connected business must hold a Wave Pro subscription. Wave publishes events via webhooks for invoice creation, updates, and payment, plus customer, product, and transaction changes. Webhook signatures use HMAC-SHA256 with a 5-minute replay window. Invoices support creation, approval, sending, and deletion, but no patch operations. Bills, accounts payable, and payroll are not exposed.

How Coupa works

Coupa exposes suppliers, purchase orders, invoices, payments, and lookup values through a tenant-specific REST API at {instanceUrl}/api/. Authentication uses OAuth 2.0 client credentials flow with X-Coupa-API-Version header pinning. Coupa publishes webhook events for purchase orders, invoices, requisitions, suppliers, expense reports, and payments, with HMAC-SHA256 signature verification. Rate limits return HTTP 429; ml-connector applies exponential backoff with 3 retry attempts capped at 30 seconds. Default request timeout is 30 seconds per call. Webhook payloads are capped at 256 KB with streaming abort on overflow.

What moves between them

The primary flow runs from Wave into Coupa. Wave invoices map to Coupa purchase orders, and Wave transactions flow into Coupa invoice line items or payments. Wave customer records sync to Coupa suppliers and lookup values, while Coupa supplier changes are pulled back into Wave vendor records on a polling schedule. Coupa purchase order events trigger reads of Wave account mappings so procurement allocations land on valid Wave GL accounts.

How ml-connector handles it

ml-connector validates and refreshes Wave OAuth2 tokens on each call, accepting offline_access scope to maintain long-lived sessions. Incoming Wave webhooks are verified using HMAC-SHA256 (x-wave-signature header) and must be acknowledged with HTTP 200 within the 5-minute replay window. On the Coupa side, ml-connector applies client credentials OAuth2 and includes the X-Coupa-API-Version header on every request. Wave invoice data is mapped to Coupa purchase order schema (document headers, line items, amounts) with customer references normalized to Coupa supplier IDs. Vendor master data is bi-directional: Wave vendor changes trigger Coupa supplier updates, and Coupa supplier changes are polled and written back to Wave vendor records. When Coupa returns HTTP 429, ml-connector backs off and retries up to 3 times with exponential jitter. Every record carries an audit log entry and can be replayed if a Coupa write times out.

A real-world example

A small services firm uses Wave Accounting for invoicing and expense tracking and has started buying through Coupa to consolidate procurement and negotiate better terms with suppliers. Before the integration, the finance team manually entered invoice data from Wave into Coupa's purchase order system for vendor reconciliation, and updated Wave vendor records when Coupa's supplier master changed. With Wave and Coupa connected, invoices created in Wave automatically populate Coupa purchase orders, vendor lists stay synchronized, and the month-end reconciliation process is trimmed from hours of re-keying to a simple audit of the automated sync log.

What you can do

  • Map Wave invoices to Coupa purchase orders with customer and vendor cross-references synced automatically.
  • Keep Wave vendor records and Coupa supplier master data aligned bidirectionally.
  • Validate and refresh Wave OAuth2 tokens with offline_access scope to maintain long-lived sessions.
  • Verify incoming Wave webhook signatures using HMAC-SHA256 and apply Coupa OAuth2 client credentials on every request.
  • Retry failed Coupa calls up to 3 times with exponential backoff when rate-limited, with a full audit log on every record.

Questions

Which direction does data move between Wave Accounting and Coupa?
The main flow runs from Wave invoices into Coupa purchase orders, and customer data syncs to Coupa suppliers. Vendor and supplier records are aligned bidirectionally so changes in either system propagate back. Wave transactions and products can map to Coupa line items and lookup values for spend categorization.
How does ml-connector handle Wave's webhook authentication and Coupa's OAuth2 requirements?
ml-connector verifies incoming Wave webhooks using HMAC-SHA256 signature validation with a 5-minute replay window. On the Coupa side, it applies OAuth2 client credentials flow and includes the X-Coupa-API-Version header on every request. Both credential sets are stored encrypted.
What happens if Coupa returns a rate-limit error or times out?
ml-connector applies exponential backoff with up to 3 retry attempts, capped at 30 seconds between retries. If a Coupa call still fails after retries, the record is logged in the audit trail and can be replayed manually or on the next sync run without data loss.

Related integrations

Connect Wave Accounting and Coupa

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

Get started