• Last edited on: 30 March 2023

Punchout Catalogs

Punchout catalogs use cXML and create a direct link between the customer's Coupa instance and the supplier's ecommerce website.

Introduction

With a punchout, Coupa users follow a link to the supplier’s ecommerce website, where they shop as normal. When a user goes to check out, they’re brought back to Coupa, with the items they chose in their Coupa cart. Users can then submit a requisition in Coupa, using the items, costs, and details from the supplier’s website.

Buyer Benefits

  • Low effort to set up and maintain
  • All items offered by the seller are available for purchase
  • Easy configuration/customization of items like laptops or business cards

Supplier Benefits

  • Immediate changes to catalog items
  • No need to maintain catalogs for different customers
Note

If you plan on implementing a punchout, you’ll want to fill out the Coupa cXML Supplier Questionnaire and give it to your customer.

How It Works

You’ll need to set up your punchout to recognize Coupa users. You’ll also need to be set up in Coupa, and have a contract with your customer. Before your customer can get you set up, you’ll need to provide your customer with the following information:

Item Description
Company logo The logo will act as a link to your punchout. It will appear on the Coupa home screen under the Shop Online section. The image should be a JPG or PNG that’s 150 x 50 pixels in size.
Punchout URL The full routing URL required to receive purchase orders in Coupa.
Customer domain and identity Usually a DUNS or NetworkID.
Supplier domain and identity Usually a DUNS or NetworkID.
Shared secret A password that validates the buyer with the supplier. This is a required credential.

Once you provide the punchout information, your customer can set up the punchout in Coupa.

Note

Normally, suppliers provide two sets of information: one set for testing, and one set for production.

The basic punchout sequence is as follows:

  1. When a Coupa user clicks the supplier’s punchout link, Coupa sends a PunchoutSetupRequest cXML document containing the buyer’s ID (From, Sender, and SharedSecret).
  2. The punchout authenticates the user and returns a PunchoutSetupResponse cXML document with the landing page URL.
  3. When the user checks out, the punchout sends a PunchoutOrderMessage cXML document to Coupa, with the items the user added to their shopping cart.
  4. Coupa creates a requisition from the information contained in the order message.

Diagram showing the punchout workflow.

Supported cXML

cXML Document Description
PunchOutSetupRequest

Include the following elements:

  • Punchout URL
  • To/Sender/From domain and identity
  • Shared secret
  • Company logo

We support create and inspect only.

PunchOutSetupResponse Post your cXML back to Coupa when you receive PunchOutSetupRequest. This document includes the landing page URL.
PunchOutOrderMessage Post your cXML back to the <BrowserFormPost> in PunchoutSetupRequest.
cXML Term Definition
<BuyerCookie> The first time a user punches out to a supplier's punchout site, Coupa creates a BuyerCookieID that is unique to each user and supplier punchout site combination. This value never changes. The BuyerCookieID is used to validate that when the user checks out of the supplier punchout site and returns to Coupa with the PunchOutOrderMessage, the BuyerCookieID matches what was sent as part of the PunchOutSetupRequest.

This field is not passed in the purchase order (aka: OrderRequest).
<cXML Payload ID>

A payloadID uniquely identifies any cXML document that Coupa sends out. It gets generated at punchout time in PunchoutSetupRequest and when we send out the purchase order in the OrderRequest.

Suppliers do not need to reference payloadID when they return PunchOutOrderMessage to Coupa containing the shopping cart items.

Suppliers do need to reference payloadID when they return StatusUpdateRequest to Coupa to acknowledge receipt of OrderRequest or PurchaseOrder.

PayloadID can be 180 characters max.

<SupplierPartAuxiliaryID>

This is an optional tag at the line item level in PunchOutOrderMessage to Coupa.

Suppliers can pass any value for SupplierPartAuxiliaryID and Coupa will pass the same value in OrderRequest to the Supplier.

SupplierPartAuxiliaryID can be 765 characters max.

Examples

Sample Punchout Setup Request

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd">
<cXML xml:lang="en-US" payloadID="1591126611.9325364@stg1302app4.int.coupahost.com" timestamp="2020-06-02T14:36:51-05:00">
  <Header>
    <From>
      <Credential domain="DUNS">
        <Identity>COUPA1</Identity>
      </Credential>
    </From>
    <To>
      <Credential domain="DUNS">
        <Identity>079928354</Identity>
      </Credential>
    </To>
    <Sender>
      <Credential domain="DUNS">
        <Identity>COUPA1</Identity>
        <SharedSecret>ALD</SharedSecret>
      </Credential>
      <UserAgent>Coupa Procurement 1.0</UserAgent>
    </Sender>
  </Header>
  <Request>
    <PunchOutSetupRequest operation="create">
      <BuyerCookie>99ea3c4c8cf9f6dc905a6b6772daa0d1</BuyerCookie>
      <Extrinsic name="FirstName">Mary Anne</Extrinsic>
      <Extrinsic name="LastName">Krzeminski</Extrinsic>
      <Extrinsic name="UniqueName">maryanne.krzeminski@coupa.com</Extrinsic>
      <Extrinsic name="UserEmail">maryanne.krzeminski@coupa.com</Extrinsic>
      <Extrinsic name="User">maryanne.krzeminski@coupa.com</Extrinsic>
      <Extrinsic name="BusinessUnit">COUPA</Extrinsic>
      <BrowserFormPost>
        <URL>https://mwilczek-demo.coupacloud.com/punchout/checkout?id=2</URL>
      </BrowserFormPost>
      <Contact role="endUser">
        <Name xml:lang="en-US">maryanne.krzeminski@coupa.com</Name>
        <Email>maryanne.krzeminski@coupa.com</Email>
      </Contact>
      <SupplierSetup>
        <URL>https://uttest.free.beeceptor.com</URL>
      </SupplierSetup>
    </PunchOutSetupRequest>
  </Request>
</cXML>

Sample Punchout Setup Response

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.1.010/cXML.dtd">
<cXML version="1.1.007" xml:lang="en-US" payloadID="200303450803006749@b2b.euro.com" timestamp="2020-06-02T14:36:53-05:00">
  <Response>
    <Status code="200" text="OK" />
    <PunchOutSetupResponse>
      <StartPage>
        <URL>https://mygreatpunchoutsite.com/punchoutLogin.asp</URL>
      </StartPage>
    </PunchOutSetupResponse>
  </Response>
</cXML>

Sample Punchout Order Message

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd">
<cXML payloadID="9949494@cxml.Comergent.com" xml:lang="en-US" timestamp="--T+00:00" version="1.2.0.14">
  <Header>
    <From>
      <Credential domain="NetworkID">
        <Identity />
      </Credential>
    </From>
    <To>
      <Credential domain="NetworkId">
        <Identity>user@coupa.com</Identity>
      </Credential>
    </To>
    <Sender>
      <Credential domain="NetworkID">
        <Identity />
      </Credential>
      <UserAgent />
    </Sender>
  </Header>
  <Message deploymentMode="production">
    <PunchOutOrderMessage>
      <BuyerCookie>f5d75ddbc9e75b6346b36ee5c28c5e8b</BuyerCookie>
      <PunchOutOrderMessageHeader operationAllowed="edit" quoteStatus="final">
        <Total>
          <Money currency="USD">271.88</Money>
        </Total>
        <Shipping>
          <Money currency="USD">0.00</Money>
          <Description xml:lang="en-US">Unknown</Description>
        </Shipping>
        <Tax>
          <Money currency="USD">21.88</Money>
          <Description xml:lang="en-US">Unknown</Description>
        </Tax>
      </PunchOutOrderMessageHeader>
      <ItemIn quantity="1">
        <ItemID>
          <SupplierPartID>AM2692</SupplierPartID>
          <SupplierPartAuxiliaryID>A_B:5008937A_B:</SupplierPartAuxiliaryID>
        </ItemID>
        <ItemDetail>
          <UnitPrice>
            <Money currency="USD">250.00</Money>
          </UnitPrice>
          <Description xml:lang="en-US">ANTI-RNase (15-30 U/ul)</Description>
          <UnitOfMeasure>EA</UnitOfMeasure>
          <Classification domain="UNSPSC">41106104</Classification>
          <ManufacturerPartID>AM2692</ManufacturerPartID>
          <ManufacturerName xml:lang="en">Acme Inc.</ManufacturerName>
          <ManufacturerName />
          <LeadTime>0</LeadTime>
        </ItemDetail>
      </ItemIn>
    </PunchOutOrderMessage>
  </Message>
</cXML>