About Coupa
Coupa is a business spend management platform covering procurement, suppliers, invoices, and purchase orders. The Serval Coupa integration connects to a single Coupa instance and calls the Coupa REST API on demand from workflow steps - there are no background jobs or scheduled imports. Authentication: OAuth 2.0 client credentials. You create an OAuth client in your Coupa instance and enter its Instance URL, Client ID, Client Secret, and Scopes in Serval. This is a server-to-server connection - no user signs in, and there is no redirect URL to configure. Data sync: On demand only. Serval contacts your Coupa instance when a workflow step runs, exchanging the configured client credentials and scopes for an access token issued by your instance.What the Coupa integration enables
Get your credentials
Serval authenticates with an OAuth 2.0 / OpenID Connect client that you create in your Coupa instance with the Client Credentials grant. Coupa’s guides on OpenID Connect clients and setting up an OpenID Connect client cover this in full detail.Open the OAuth client setup page
Create a client with the Client Credentials grant
Select the scopes Serval should use
Save the client and copy its credentials
Connect in Serval
Open the Coupa connect form
Enter your Instance URL (required)
Enter the Client ID (required)
Enter the Client Secret (required)
Add Scopes (optional)
Save the connection
Verifying the connection
Serval runs three health checks against your instance, each requesting a single record to confirm authentication and the matching read scope:- List Coupa Users - confirms Serval can authenticate and list users. Requires the core.user.read scope.
- Success: “Successfully listed users from Coupa”
- Failure: “Unable to list users from Coupa. Please verify your OAuth client is valid and has the ‘core.user.read’ scope.”
- List Coupa Suppliers - confirms Serval can list supplier records. Requires the core.supplier.read scope.
- Success: “Successfully listed suppliers from Coupa”
- Failure: “Unable to list suppliers from Coupa. Please verify your OAuth client has the ‘core.supplier.read’ scope.”
- List Coupa Purchase Orders - confirms Serval can list purchase orders. Requires the core.purchase_order.read scope.
- Success: “Successfully listed purchase orders from Coupa”
- Failure: “Unable to list purchase orders from Coupa. Please verify your OAuth client has the ‘core.purchase_order.read’ scope.”
Gotchas and troubleshooting
Scopes must be granted on the Coupa client, not just listed in Serval
Scopes must be granted on the Coupa client, not just listed in Serval
Connection verification needs the core.user.read scope
Connection verification needs the core.user.read scope
Credentials are only attached for standard Coupa hostnames
Credentials are only attached for standard Coupa hostnames
Instance URL is normalized on save
Instance URL is normalized on save
Re-saving with a blank secret keeps the stored secret
Re-saving with a blank secret keeps the stored secret
Workflow API paths are relative to your instance's API base
Workflow API paths are relative to your instance's API base
Need help? Contact support@serval.com for assistance with your Coupa integration.

