ml-connector
Epicor KineticCoupa

Epicor Kinetic and Coupa integration

Epicor Kinetic runs manufacturing, distribution, and finance. Coupa runs procurement and spend management. Connecting the two keeps purchase orders and supplier invoices in agreement across both systems, eliminates re-entry, and surfaces approval workflows that feed back into Epicor Kinetic's accounting. New purchase orders created in Epicor Kinetic are published to Coupa for approval and contract compliance, and when Coupa marks an invoice as approved and ready to pay, that payment instruction flows back to Epicor Kinetic for posting. ml-connector handles the different credential and transport requirements on each side and syncs the data on a schedule you control.

How Epicor Kinetic works

Epicor Kinetic exposes vendors, purchase orders, AP invoices, AP payments, customers, parts, GL accounts, and custom business activity queries through REST and OData v4 APIs. Cloud instances use a tenant-specific URL (https://<tenant>.epicorsaas.com) and authenticate with Basic Auth, API keys, or OAuth2 client credentials. On-premises instances use a similar path but on a self-hosted server. Epicor has no native outbound webhooks, so records are retrieved by polling with OData filters on date fields (e.g., UpdatedOn gt {timestamp}) using offset pagination. Write operations on complex objects like invoices and purchase orders follow a two-step pattern: GetNewXxx call followed by UpdateMaster call. Bearer tokens expire in roughly one hour and must be refreshed on each authentication call.

How Coupa works

Coupa exposes suppliers, purchase orders, invoices, payments, and lookup values through REST APIs authenticated with OAuth2 client credentials. Every API call includes an X-Coupa-API-Version header pinning the version. Coupa supports six event types: requisition events, purchase order events, invoice events, supplier events, expense report events, and payment events. Webhooks are verified with HMAC-SHA256 signature validation, and the webhook body is capped at 256KB with streaming abort on overflow. Rate limits return 429 on high demand, and Coupa enforces a 30-second default request timeout per call. Multi-instance support (separate prod and sandbox tenants) is not yet implemented.

What moves between them

Purchase orders and supplier invoices flow from Epicor Kinetic to Coupa on a schedule aligned with your procurement cycle. Coupa events (invoice approvals, payment instructions) flow back into Epicor Kinetic for posting to the GL and AP ledgers. Suppliers and lookup values are synchronized bidirectionally to keep master data aligned so that every Coupa transaction references a supplier that exists in Epicor Kinetic.

How ml-connector handles it

ml-connector stores both credential sets encrypted and manages two separate OAuth2 flows: Epicor Kinetic's bearer token with hourly refresh, and Coupa's client credentials with token caching. On the Epicor Kinetic side, it polls for changed POs and AP invoices using OData date filters and handles the GetNewXxx / UpdateMaster two-step pattern for any write operations. On the Coupa side, it receives and verifies webhook signatures using HMAC-SHA256, matches the signature to the registered webhook secret, and processes invoice approvals and payment events. Supplier masters are synced first so all transactions reference valid Coupa suppliers that map to Epicor Kinetic vendors. Rate limit responses (429) trigger exponential backoff with jitter, capped at 30 seconds, and up to 3 retries per API call. Every record carries a full audit trail and failed records are replayed on the next sync cycle.

A real-world example

A mid-sized discrete manufacturer uses Epicor Kinetic for procurement and accounting, and has rolled out Coupa for supplier management and contract compliance. Before the integration, the procurement team created purchase orders in Epicor Kinetic, then had to manually re-enter them into Coupa for approval workflows and compliance checks. When an invoice arrived, Coupa approved it, and then a different team re-entered approval status and payment instructions back into Epicor Kinetic. With Epicor Kinetic and Coupa connected, new POs flow automatically to Coupa for approval, Coupa contract and supplier compliance is enforced in real time, and when an invoice is approved in Coupa the payment instruction posts directly to the Epicor Kinetic GL. The re-entry work is gone, and compliance is centralized in Coupa without blocking Epicor Kinetic workflows.

What you can do

  • Sync purchase orders from Epicor Kinetic to Coupa for approval workflows and contract compliance.
  • Push supplier invoices from Epicor Kinetic to Coupa for centralized approval and payment instruction processing.
  • Receive Coupa invoice approval and payment events and post them back to Epicor Kinetic's AP and GL accounts.
  • Bridge Epicor Kinetic's API key and OAuth2 authentication to Coupa's OAuth2 client credentials and webhook signature validation.
  • Handle Epicor Kinetic's two-step write pattern (GetNewXxx / UpdateMaster), token refresh on both sides, rate limit backoff, and a full audit trail on every record.

Questions

Which direction does data move between Epicor Kinetic and Coupa?
Purchase orders and invoices flow from Epicor Kinetic to Coupa for approval and compliance. Invoice approvals and payment instructions flow from Coupa back to Epicor Kinetic's GL and AP ledgers. Supplier and lookup value data is synchronized bidirectionally so that every transaction in both systems references valid masters. Epicor Kinetic remains the source of truth for chart of accounts and cost centers.
How does ml-connector handle Epicor Kinetic's polling and Coupa's webhooks?
ml-connector polls Epicor Kinetic for changed purchase orders and invoices on a schedule you define, using OData date filters and offset pagination. When Coupa publishes webhook events (invoice approvals, payment instructions), ml-connector receives them, verifies the HMAC-SHA256 signature against the registered secret, and processes the approved invoices for posting back to Epicor Kinetic. If a webhook delivery fails, the event is replayed on the next sync cycle.
What happens when Coupa rate limits (429) or a token expires?
When Coupa returns 429, ml-connector backs off with exponential jitter, capped at 30 seconds, and retries up to 3 times. Epicor Kinetic bearer tokens expire in roughly one hour, so ml-connector refreshes the token before every API call if needed. Coupa OAuth2 tokens are cached and refreshed when an API call returns 401. If a token refresh fails, the sync is paused and surfaced as an alert so you can rotate the credential before it blocks transactions.

Related integrations

Connect Epicor Kinetic and Coupa

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

Get started