ml-connector
Exact OnlineCoupa

Exact Online and Coupa integration

Exact Online runs your ERP, purchasing, and general ledger across Europe and North America. Coupa runs your procurement and spend management. Connecting the two keeps your purchase orders and invoices synchronized without re-entry. When a purchase order or supplier invoice is created or updated in Exact Online, it flows into Coupa under the same supplier and amounts, so your procurement and financial records stay in agreement.

How Exact Online works

Exact Online is a cloud-based ERP and accounting platform covering accounting, purchasing, sales, inventory, and HR across seven regions (Netherlands, Belgium, UK, Germany, France, Spain, USA), each with a region-specific base URL. It exposes suppliers as Accounts entities with the IsSupplier flag, purchase orders, purchase invoice lines, GL accounts, cost centers, and items through REST APIs with OData v3 query syntax. Authentication is OAuth2 Authorization Code Grant with a 10-minute access token and 30-day rotating refresh token, and app registration is required in the Exact Online App Center. Exact Online supports webhooks for purchase orders, purchase invoices, accounts, and other topics, posting changes via HTTP with HMAC-SHA256 validation. Webhook payloads include only the entity key and action type, so full entity data must be fetched separately from the REST API.

How Coupa works

Coupa is a cloud-based procurement and business spend management platform that provides REST API access to suppliers, purchase orders, invoices, payments, and events. It authenticates with OAuth2 client-credentials flow and requires an X-Coupa-API-Version header on each request. The base URL is tenant-specific in the form of {instanceUrl}/api (e.g., https://acme.coupahost.com/api). Coupa supports webhooks for purchase orders, invoices, suppliers, and other events, verifying webhook signatures with HMAC-SHA256. Rate limits return HTTP 429, and Coupa enforces a 30-second default timeout and 256KB webhook body size limit.

What moves between them

Purchase orders and supplier invoices flow from Exact Online into Coupa. When a purchase order is created or updated in Exact Online, ml-connector detects it via webhook, fetches the full record and its line items from Exact Online, maps the supplier to the correct Coupa supplier account, and creates or updates the matching purchase order in Coupa. The same applies to supplier invoices. Cost centers and GL account codes from Exact Online can be attached as custom fields or references in Coupa for downstream reconciliation. Reference data such as supplier accounts are synchronized in both directions to keep supplier lists aligned.

How ml-connector handles it

ml-connector stores both OAuth2 credential sets encrypted and refreshes tokens on demand when a call returns 401. On the Exact Online side, it accepts the region-specific base URL and division ID (retrieved from the /api/v1/current/Me endpoint) and receives webhook push notifications for purchase orders and invoices from the Exact Online App Center. The webhook signature is validated using HMAC-SHA256 and the webhook secret from the App Center. When a webhook arrives, ml-connector fetches the full entity and related line items from Exact Online's REST API using OData filters (since $expand is not supported), then maps the supplier account (Accounts with IsSupplier=true) to the corresponding Coupa supplier by name or code. The mapped purchase order or invoice is then written to Coupa via its REST API. Because Exact Online division IDs can change and refresh tokens rotate, ml-connector caches the division ID per customer and refreshes the Exact Online token before the 30-day expiry window. Coupa rate limits are respected with exponential backoff on 429 responses. Every record carries a full audit trail and the raw webhook payloads are stored for replay if a downstream Coupa write fails.

A real-world example

A mid-sized distribution company uses Exact Online in the Netherlands for ERP and purchasing, and Coupa in the corporate procurement office for vendor management and spend analysis across three countries. Before integration, the purchasing team created purchase orders in Exact Online, then the Coupa team manually re-entered them to track spend against contracts and vendor budgets. This created a delay of one to two days between order creation and spend visibility, and occasional mismatches in supplier names or purchase order amounts caused disputes during invoice reconciliation. With Exact Online and Coupa connected, purchase orders and invoices flow automatically the moment they are created in Exact Online, Coupa's spend analytics reflect real purchasing activity with no lag, and the purchasing and procurement teams operate from a single source of truth.

What you can do

  • Sync purchase orders and invoice lines from Exact Online into Coupa automatically when they are created or updated.
  • Map suppliers from Exact Online's Accounts entities to Coupa suppliers by name or code to ensure consistency across systems.
  • Receive Exact Online webhook push notifications for changes and fetch full entity details on demand using OData filters.
  • Authenticate Exact Online with OAuth2 Authorization Code Grant and respect the 10-minute access token and 30-day refresh token lifecycle.
  • Handle region-specific Exact Online base URLs and division IDs, with full audit trail and replay capability on every record.

Questions

Which direction does data move between Exact Online and Coupa?
The main flow is from Exact Online into Coupa. Purchase orders and supplier invoices created or updated in Exact Online are automatically synced into Coupa. Supplier reference data can be synchronized in both directions to keep supplier lists aligned, but financial records do not flow back to Exact Online from Coupa.
How does ml-connector handle Exact Online's regional URLs and division IDs?
ml-connector accepts the region-specific base URL for the customer's Exact Online instance (Netherlands, Belgium, UK, Germany, France, Spain, or USA). The division ID is retrieved once from the /api/v1/current/Me endpoint and cached per customer, since all API calls require it. If the division ID changes, ml-connector detects it on the next token refresh and updates the cache.
Does the integration rely on Exact Online webhooks or does it poll?
The integration uses Exact Online's webhook push model for real-time notification when purchase orders and invoices are created or updated. Webhook signatures are validated with HMAC-SHA256 using the webhook secret from the Exact Online App Center. When a webhook arrives, ml-connector fetches the full entity and line items from Exact Online's REST API and writes them to Coupa.

Related integrations

Connect Exact Online and Coupa

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

Get started