> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stackone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect Coupa with OAuth 2.0 - Client Credentials – StackOne Hub

> Link a Coupa account in the StackOne Hub using OAuth 2.0 - Client Credentials. End-user guide to authorize the integration and start using Coupa actions.

<Warning>An integrations-enabled Coupa administrator is required to create an OAuth2/OpenID Connect client.</Warning>

<section data-guide-section data-guide-scopes="">
  <h2>Find your instance subdomain</h2>

  <p>Your Coupa instance subdomain is the first part of the address you sign in to.</p>

  <ul>
    <li>Format: `https://{instance}.coupahost.com`</li>
    <li>Example: if you sign in at `https://acme.coupahost.com`, your <strong>Instance Subdomain</strong> is `acme`.</li>
  </ul>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Create an OAuth2/OpenID Connect client</h2>

  <p>Create a Client Credentials OAuth2/OpenID Connect client in Coupa to obtain a Client ID and Client Secret.</p>

  <Steps>
    <Step title="Open OAuth2/OpenID Connect Clients">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to your Coupa instance as an integrations-enabled administrator and navigate to <strong>Setup</strong> > <strong>Integrations</strong> > <strong>OAuth2/OpenID Connect Clients</strong>.</p>
      </div>
    </Step>

    <Step title="Create the client">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>Create</strong> and configure the client.</p>

        <ul>
          <li>For <strong>Grant Type</strong>, select <strong>Client Credentials</strong>.</li>
          <li>Enter a <strong>Name</strong>, <strong>Login</strong>, <strong>Contact Info</strong>, and <strong>Contact Email</strong>.</li>
        </ul>
      </div>
    </Step>

    <Step title="Select the required scopes">
      <div data-guide-step data-guide-scopes="core.invoice.read,core.invoice.write,core.purchase_order.read,core.purchase_order.write,core.requisition.read,core.requisition.write,core.supplier.read,core.supplier.write,core.supplier_information.read,core.supplier_information.write,core.user.read,core.user.write,core.contract.read,core.contract.write,core.expense_report.read,core.expense_report.write,core.approval.read,core.approval.write,core.account_type.read,core.account_type.write,core.account_validation_rule.read,core.account_validation_rule.write,core.budget_line.read,core.budget_line.write,core.financial_counterparty.read,core.financial_counterparty.write,core.payment_term.read,core.payment_term.write,core.tax_registration.read,core.tax_registration.write,core.receipt_request.read,core.coupa_pay.payments.read" data-guide-display-scopes-list="core.invoice.read,core.invoice.write,core.purchase_order.read,core.purchase_order.write,core.requisition.read,core.requisition.write,core.supplier.read,core.supplier.write,core.supplier_information.read,core.supplier_information.write,core.user.read,core.user.write,core.contract.read,core.contract.write,core.expense_report.read,core.expense_report.write,core.approval.read,core.approval.write,core.account_type.read,core.account_type.write,core.account_validation_rule.read,core.account_validation_rule.write,core.budget_line.read,core.budget_line.write,core.financial_counterparty.read,core.financial_counterparty.write,core.payment_term.read,core.payment_term.write,core.tax_registration.read,core.tax_registration.write,core.receipt_request.read,core.coupa_pay.payments.read">
        <p>Under <strong>Scopes</strong>, select the permissions your integration needs. Scopes follow the pattern `core.<object>.read` / `core.<object>.write` (singular object name). Grant read scopes for resources you will read, and write scopes for those you will create or update. The full list for your instance is at `https://{instance}.coupahost.com/oauth2/scopes`.</p>

        <div style={{ marginTop: '8px' }} data-guide-display-scopes>
          <div className="connector-guide-scopes-container connector-guide-scopes-container--scrollable">
            <ul className="not-prose" style={{ listStyleType: "'- '", paddingLeft: '1em', margin: 0 }}>
              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.invoice.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.invoice.read" title="Copy scope" data-copy="core.invoice.read">
                  <span className="connector-guide-scope-copy__label">core.invoice.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.invoice.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.invoice.write" title="Copy scope" data-copy="core.invoice.write">
                  <span className="connector-guide-scope-copy__label">core.invoice.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.purchase_order.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.purchase_order.read" title="Copy scope" data-copy="core.purchase_order.read">
                  <span className="connector-guide-scope-copy__label">core.purchase\_order.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.purchase_order.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.purchase_order.write" title="Copy scope" data-copy="core.purchase_order.write">
                  <span className="connector-guide-scope-copy__label">core.purchase\_order.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.requisition.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.requisition.read" title="Copy scope" data-copy="core.requisition.read">
                  <span className="connector-guide-scope-copy__label">core.requisition.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.requisition.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.requisition.write" title="Copy scope" data-copy="core.requisition.write">
                  <span className="connector-guide-scope-copy__label">core.requisition.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.supplier.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.supplier.read" title="Copy scope" data-copy="core.supplier.read">
                  <span className="connector-guide-scope-copy__label">core.supplier.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.supplier.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.supplier.write" title="Copy scope" data-copy="core.supplier.write">
                  <span className="connector-guide-scope-copy__label">core.supplier.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.supplier_information.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.supplier_information.read" title="Copy scope" data-copy="core.supplier_information.read">
                  <span className="connector-guide-scope-copy__label">core.supplier\_information.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.supplier_information.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.supplier_information.write" title="Copy scope" data-copy="core.supplier_information.write">
                  <span className="connector-guide-scope-copy__label">core.supplier\_information.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.user.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.user.read" title="Copy scope" data-copy="core.user.read">
                  <span className="connector-guide-scope-copy__label">core.user.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.user.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.user.write" title="Copy scope" data-copy="core.user.write">
                  <span className="connector-guide-scope-copy__label">core.user.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.contract.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.contract.read" title="Copy scope" data-copy="core.contract.read">
                  <span className="connector-guide-scope-copy__label">core.contract.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.contract.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.contract.write" title="Copy scope" data-copy="core.contract.write">
                  <span className="connector-guide-scope-copy__label">core.contract.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.expense_report.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.expense_report.read" title="Copy scope" data-copy="core.expense_report.read">
                  <span className="connector-guide-scope-copy__label">core.expense\_report.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.expense_report.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.expense_report.write" title="Copy scope" data-copy="core.expense_report.write">
                  <span className="connector-guide-scope-copy__label">core.expense\_report.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.approval.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.approval.read" title="Copy scope" data-copy="core.approval.read">
                  <span className="connector-guide-scope-copy__label">core.approval.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.approval.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.approval.write" title="Copy scope" data-copy="core.approval.write">
                  <span className="connector-guide-scope-copy__label">core.approval.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.account_type.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.account_type.read" title="Copy scope" data-copy="core.account_type.read">
                  <span className="connector-guide-scope-copy__label">core.account\_type.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.account_type.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.account_type.write" title="Copy scope" data-copy="core.account_type.write">
                  <span className="connector-guide-scope-copy__label">core.account\_type.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.account_validation_rule.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.account_validation_rule.read" title="Copy scope" data-copy="core.account_validation_rule.read">
                  <span className="connector-guide-scope-copy__label">core.account\_validation\_rule.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.account_validation_rule.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.account_validation_rule.write" title="Copy scope" data-copy="core.account_validation_rule.write">
                  <span className="connector-guide-scope-copy__label">core.account\_validation\_rule.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.budget_line.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.budget_line.read" title="Copy scope" data-copy="core.budget_line.read">
                  <span className="connector-guide-scope-copy__label">core.budget\_line.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.budget_line.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.budget_line.write" title="Copy scope" data-copy="core.budget_line.write">
                  <span className="connector-guide-scope-copy__label">core.budget\_line.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.financial_counterparty.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.financial_counterparty.read" title="Copy scope" data-copy="core.financial_counterparty.read">
                  <span className="connector-guide-scope-copy__label">core.financial\_counterparty.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.financial_counterparty.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.financial_counterparty.write" title="Copy scope" data-copy="core.financial_counterparty.write">
                  <span className="connector-guide-scope-copy__label">core.financial\_counterparty.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.payment_term.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.payment_term.read" title="Copy scope" data-copy="core.payment_term.read">
                  <span className="connector-guide-scope-copy__label">core.payment\_term.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.payment_term.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.payment_term.write" title="Copy scope" data-copy="core.payment_term.write">
                  <span className="connector-guide-scope-copy__label">core.payment\_term.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.tax_registration.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.tax_registration.read" title="Copy scope" data-copy="core.tax_registration.read">
                  <span className="connector-guide-scope-copy__label">core.tax\_registration.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.tax_registration.write">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.tax_registration.write" title="Copy scope" data-copy="core.tax_registration.write">
                  <span className="connector-guide-scope-copy__label">core.tax\_registration.write</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.receipt_request.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.receipt_request.read" title="Copy scope" data-copy="core.receipt_request.read">
                  <span className="connector-guide-scope-copy__label">core.receipt\_request.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>

              <li style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }} data-guide-display-scope="core.coupa_pay.payments.read">
                <button type="button" className="connector-guide-scope-copy" aria-label="Copy core.coupa_pay.payments.read" title="Copy scope" data-copy="core.coupa_pay.payments.read">
                  <span className="connector-guide-scope-copy__label">core.coupa\_pay.payments.read</span>
                  <span className="connector-guide-scope-copy__icon" aria-hidden="true">⧉</span>
                </button>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Copy your credentials</h2>

  <p>After saving the client, copy the credentials needed to connect.</p>

  <Steps>
    <Step title="Copy the Client ID and Client Secret">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>From the client you just created, copy the <strong>Client ID</strong> and <strong>Client Secret</strong>.</p>

        <ul>
          <li>The <strong>Client Secret</strong> is shown only once — store it securely for use later.</li>
        </ul>
      </div>
    </Step>

    <Step title="Note the scopes you granted">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In StackOne, the <strong>Scopes</strong> field takes a space-separated list of the scopes you selected on the client (for example `core.invoice.read core.supplier.read core.purchase_order.read`). It must be a subset of the scopes granted to the client.</p>
      </div>
    </Step>
  </Steps>
</section>

<div data-whitelabel-hide>
  <h2>Linking the Account from the Hub</h2>

  <Steps>
    <Step title="Navigate to the Hub">
      Use one of the three <a href="/guides/accounts-section#linking-accounts">Linking Account Methods</a> to access the Hub.
    </Step>

    <Step title="Fill out the fields">
      Fill out the following fields using details from your provider:

      <ul>
        <li><strong>Instance Subdomain</strong></li>
        <li><strong>Client ID</strong></li>
        <li><strong>Client Secret</strong></li>
        <li><strong>Scopes</strong></li>
      </ul>
    </Step>

    <Step title="Connect">
      <ul>
        <li>Click <strong>Connect</strong></li>
        <li>If applicable, the provider will redirect you to a sign-in or authorization page. Complete the provider's authorization flow.</li>
        <li>Once authorization is successful, you will see a confirmation popup</li>
      </ul>
    </Step>
  </Steps>

  <p>If the account linking is successful, you will see the newly linked account in your <a href="/guides/accounts-section">Accounts</a> page.</p>
</div>
