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 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:
- 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 forTotal. Check: 120 x 9.60 = 1,152.00. skubecomesSupplierPartID. A variant without an SKU has no part number for the buyer and is held back with an error in the log.titlebecomesDescription. In OCI it has to fit 40 characters; this one has 29.- Shopify has no unit code on a variant.
UnitOfMeasure(EA,PK) and the UNSPSCClassificationcome from metafields per product, filled once. - 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