Skip to content
SyncMyShop

PunchOut

Shopify PunchOut

Shopify has no PunchOut of its own: no endpoint for a setup request, no cXML or OCI cart and no order intake from a procurement system. The sign-in, the prices per company and the cart transfer have to be built around the store, and two of them depend on Shopify Plus. We build them on your existing Shopify store and run the connection.

What moves between the procurement system and Shopify

A PunchOut connection to a Shopify store has the same flows as on any store. The difference is how many of them Shopify can carry itself.

Flow Direction Where it runs
Setup request and response procurement system to the integration outside Shopify, in the integration
Sign-in as the buyer's company integration to the storefront Shopify customer accounts, through an identity provider on Plus
Shopping at contract prices in the storefront Shopify B2B catalogs
Cart transfer storefront to the procurement system, through the browser a theme button and the integration
Purchase order procurement system to the integration to Shopify Admin API, draft order with PO number
Confirmation, ship notice, invoice your ERP or Shopify to the procurement system the integration, as cXML

Everything on this page was checked against Shopify's developer and help documentation on October 3, 2026. The documents themselves are explained on cXML PunchOut and OCI PunchOut.

What is built around Shopify for a PunchOut connection The procurement system sends the setup request and later the purchase order to the integration. The integration signs the buyer in to the Shopify storefront as customer 10432 through an OpenID Connect identity provider on Shopify Plus. The cart goes from the storefront through the buyer's browser to the procurement system as cXML. The purchase order becomes a draft order in the Shopify Admin API with the PO number. Coupa or Ariba procurement system Integration endpoint and sign-in Shopify storefront theme, Plus plan Shopify Admin API orders setup request, OrderRequest sign-in as customer 10432 cart as cXML, via the browser draftOrderCreate, poNumber Below Plus there is no sign-in from outside Shopify and no catalog per company. The session then runs on a catalog the integration serves next to the store.
The integration holds the PunchOut side. Shopify keeps the products, the prices and the orders.

What Shopify offers and what is built around it

Need What Shopify has What is built
Endpoint for a setup request nothing the integration receives and answers it
Sign-in without a form an OpenID Connect identity provider, Plus only; Multipass, closed to new stores the integration signs the buyer in through the identity provider
Prices per buying organization B2B catalogs assigned to a company location, Plus only the company, its location and its catalog per buyer
Display in a frame refused: X-Frame-Options: DENY the procurement system opens the store by redirect
Cart data GET /cart.js, prices in cents a theme button that sends the cart to the integration
Cart in cXML or OCI nothing the integration builds the PunchOutOrderMessage or the NEW_ITEM form
Order with a PO number draftOrderCreate with poNumber the integration maps the OrderRequest to it

Signing the buyer in

A PunchOut session starts with the buyer already signed in as their company. Shopify's sign-in for new customer accounts sends a one-time 6-digit code to the customer's email. A buyer who lands on that page from a procurement system is asked for a code sent to an address they may not have access to.

Shopify has two ways to sign a customer in from outside. Multipass needs Plus, gives a token valid for 15 minutes that can be used once, and according to Shopify's documentation is no longer available to new stores. The current route is a third-party identity provider over OpenID Connect, also Plus only. Shopify identifies the customer by the email and sub claims of the ID token and creates the customer if none exists. Only one identity provider can be active on the online store, so it handles the sign-in of every customer, not just PunchOut buyers.

For a session that means: the setup request arrives at the integration, the integration opens a session for customer 10432, and the start URL leads through Shopify's sign-in to the identity provider, which recognizes the session and returns the buyer signed in, without a form. Regular customers signing in through the same provider get its normal sign-in page.

Prices per buying organization

Shopify B2B is on Basic, Grow, Advanced and Plus. Contract prices per customer depend on the plan:

Plan B2B catalogs Catalog per company location
Basic, Grow, Advanced 3 active catalogs across all B2B markets not available
Plus 10,000 per store yes, up to 25 per company location

Customer 10432 is a company in Shopify with one location, and that location gets a catalog with item 10482 at 9.60 USD where the list price is 12.50. On Plus that is a direct assignment. Below Plus, three catalogs shared over markets cannot hold a contract price per buyer, which is why the session then runs on a catalog the integration serves from the same products and the ERP's prices. Shopify's B2B plan overview has the full list.

From the Shopify cart to the PunchOut cart

The transfer button replaces the checkout button in the theme and is shown only in a PunchOut session. It reads the cart from /cart.js and hands it to the integration, which renders the form that the browser posts to the procurement system. A line of the cart of Bakker Installatie B.V., shortened:

{
  "currency": "USD",
  "total_price": 146875,
  "items": [
    {
      "sku": "10482",
      "title": "Duplex receptacle 20 A, white",
      "quantity": 120,
      "price": 960,
      "line_price": 115200
    }
  ]
}

What the integration does with it:

  1. Prices are in cents. 960 / 100 = 9.60 for UnitPrice, 115200 / 100 = 1,152.00 for the line, and the total 146875 / 100 = 1,468.75 for Total. Check: 120 x 9.60 = 1,152.00.
  2. sku becomes SupplierPartID. A variant without an SKU has no part number for the buyer and is held back with an error in the log.
  3. title becomes Description. In OCI it has to fit 40 characters; this one has 29.
  4. Shopify has no unit code on a variant. UnitOfMeasure (EA, PK) and the UNSPSC Classification come from metafields per product, filled once.
  5. The integration stores the cart under its own reference and sends that reference as SupplierPartAuxiliaryID, so the purchase order can be matched to it.

The purchase order back into Shopify

The OrderRequest arrives at the integration, which answers it and creates a draft order through the Admin API. DraftOrderInput carries what the order needs:

OrderRequest Shopify DraftOrderInput
orderID 4500001234 poNumber
buyer identity in From purchasingEntity, the company location of customer 10432
ItemOut lines line items by variant, at the price from the cart
ShipTo shipping address
reservation rule for this buyer reserveInventoryUntil

The draft is completed into an order when its lines match the cart that was transferred. A price that differs from the cart is not completed silently; it stays as a draft and shows in the log. The Admin GraphQL API restores 100 points a second on the standard plans, 200 on Advanced and 1,000 on Plus, which is far more than one purchase order needs, but a bulk change of catalogs during the day shares the same budget. How those limits work is in Shopify API rate limits.

When it goes wrong

What happens Cause Handling
Blank screen in the procurement system the store is opened in a frame switch the PunchOut to redirect
Buyer asked for a 6-digit code the session reached Shopify's own sign-in sign-in through the identity provider
List price 12.50 in the cart the buyer is not linked to the company location with its catalog link per buying organization
Cart refused for its unit no unit metafield on the product, "each" sent fixed unit code per product
Order with no PO number in Shopify the order was created from a checkout, not from the OrderRequest orders only from the OrderRequest, checkout hidden in the session

The same pieces on other platforms: Magento, WooCommerce and BigCommerce. What a store needs in full is on the PunchOut hub. Tell us which procurement system your customer uses.

Frequently asked questions

Do I need Shopify Plus for PunchOut?

For a session in the Shopify storefront itself, yes. Signing a buyer in from outside Shopify needs an OpenID Connect identity provider, which is Plus only, and prices per company need a catalog assigned directly to the company location, also Plus only. On Basic, Grow and Advanced the session runs on a catalog the integration serves next to the store, with the same items and prices.

Can I still use Multipass?

Only if your store already uses it. Shopify's developer documentation says Multipass is no longer available to new stores; stores that use it keep access, also after moving to new customer accounts. For a new connection Shopify points to a third-party identity provider.

Can the procurement system show my Shopify store in a frame?

No. A Shopify storefront answers with X-Frame-Options: DENY and frame-ancestors 'none', so a framed store stays blank. The buyer's administrator configures the PunchOut to open the store by browser redirect instead; SAP Ariba, for example, supports both modes.

Do my regular customers notice anything?

The transfer button only appears in a session that started from a procurement system; everyone else sees the normal checkout. One thing changes for all customers when an identity provider is connected: Shopify allows one active identity provider on the online store, so regular sign-in also runs through it.

How does the purchase order get into Shopify?

As a draft order created through the Admin API. DraftOrderInput has a poNumber field for the buyer's PO number, a purchasingEntity for the company location and reserveInventoryUntil to hold stock. The integration completes the draft into an order once the lines match the cart.

Tell us what you need

Tell us which systems you use and what needs to work better. We reply personally within one working day. We help you define the work, then agree the price and timing before you commit.

  • You know the price and the timeline before you commit to anything
  • We work out the connection that takes the work off your hands
  • We handle the build, hosting, monitoring and maintenance
  • Your team has less information to retype and fewer discrepancies to chase

Suppliers, products, orders per day, a rough estimate is fine.

Or email directly: carsten@syncmyshop.com