The request usually arrives as one line in an email from your biggest customer’s procurement team: “Are you PunchOut-enabled?” Say no, and orders that used to come to your store start flowing through a distributor who said yes. Say yes without understanding what you just agreed to, and your team spends a quarter discovering what cXML session handling actually involves.
This guide is the implementation view: what PunchOut actually is, how the cXML and OCI handshakes work, and what it takes to ship it on Adobe Commerce (Magento) or Shopware without losing your mind. The vendors and procurement networks explain the concept well enough. What they do not show is how to build it on a real platform, with real customer-specific pricing, connected to a real ERP. That is the part that determines whether your PunchOut go-live is four weeks or four months.
What PunchOut actually is (Level 1 vs Level 2)
A PunchOut catalog is not a catalog file. It is a session: the buyer starts in their procurement system (Ariba, Coupa, SAP, Jaggaer), clicks your name in their supplier list, and “punches out” into your ecommerce storefront. They browse your live catalog with their negotiated pricing, build a cart, and then, instead of checking out, the cart travels back into their procurement system, where it becomes a requisition, works through their approval chain, and returns to you as a purchase order.
The buyer gets your live catalog, live inventory, and live contract pricing without you maintaining static catalog uploads for every customer. You keep control of the shopping experience. Their procurement team keeps control of approvals and spend. That is the whole point.
Two levels matter in practice:
- Level 1 PunchOut: the buyer clicks your supplier record and lands on your storefront homepage or a landing page, then navigates from there. Simpler, and where most first implementations start.
- Level 2 PunchOut: your items appear in the buyer’s procurement search results, and clicking one deep-links into that exact product page in your store. This requires publishing an index of your items to the procurement network, kept in sync as your catalog changes. Buyers love it; it is also where catalog governance becomes a real workstream.
cXML vs OCI: the two handshakes
Nearly every PunchOut conversation is one of two protocols, and which one you need is decided by your buyer’s procurement stack, not by you.
| cXML | OCI | |
|---|---|---|
| Who uses it | Ariba, Coupa, Jaggaer, most procurement networks | SAP SRM / ECC direct punchout |
| Handshake | PunchOutSetupRequest / PunchOutSetupResponse (XML POST) | HTML form post with HOOK_URL |
| Cart return | PunchOutOrderMessage (XML) | Form fields posted back to HOOK_URL |
| Authentication | Shared secret in credential headers | Credentials in the initial form post |
| Purchase order | Separate cXML OrderRequest document | Typically IDoc / other SAP channel |
| Complexity | More structure, more validation, better tooling | Simpler protocol, older assumptions |
The strategic mistake is building for one buyer’s protocol as a one-off. The second PunchOut request always comes. Build a session layer and a cart-return layer once, and treat cXML and OCI as thin adapters on top. On both Magento and Shopware this is the difference between “each new trading partner is a project” and “each new trading partner is configuration.”
The session flow, step by step
- Setup request. The buyer’s procurement system sends a PunchOutSetupRequest (cXML) or form post (OCI) to your PunchOut endpoint, carrying credentials, the buyer’s identity, and a return URL.
- Authentication and session creation. You validate the shared secret, resolve which customer account (and therefore which contract pricing) this session belongs to, and mint a short-lived session that logs the buyer into a scoped storefront context.
- Response with start URL. Your endpoint returns a URL; the procurement system opens it in the buyer’s browser. The buyer is now shopping your live store, as that company, at that company’s prices.
- Shopping. Catalog, search, inventory, and pricing are all your live storefront. Checkout is replaced by a single action: return cart.
- Cart return. The cart is transformed into a PunchOutOrderMessage (or OCI field set) and posted back to the buyer’s return URL: SKUs, quantities, UOM, price, currency, and any classification codes (UNSPSC) the buyer requires.
- Approval happens on their side. Days can pass. Nothing exists in your systems yet except an abandoned-looking cart. This surprises every operations team the first time.
- Purchase order arrives. The approved requisition returns as a cXML OrderRequest (or via the SAP channel), and now it must become a real order in your platform and your ERP, at the price quoted in the session, even if list prices changed in between. This is the PO-flip, and it is where the real engineering lives.
Implementing on Magento (Adobe Commerce) vs Shopware
We build B2B commerce on both platforms, and the PunchOut approach differs more in mechanics than in architecture.
Adobe Commerce / Magento
- The B2B module’s company accounts and shared catalogs give you the per-customer pricing scaffolding a PunchOut session needs; our honest review of the Adobe Commerce B2B module covers where it is strong and where it runs out.
- The cXML/OCI endpoint is custom or extension territory: a controller that handles setup requests, creates a scoped customer session, and suppresses normal checkout in favor of a cart-return action.
- Watch UOM and pack sizes. Magento thinks in units; procurement systems think in each/case/pallet with UNSPSC codes attached. The mapping table is boring and mandatory.
Shopware
- Shopware 6’s B2B components and rule builder handle account-scoped pricing cleanly, and its API-first architecture makes the session endpoint and cart transformation feel natural rather than bolted on.
- The store-API session flow maps well to PunchOut: mint a context token for the resolved company on setup, hand the buyer a storefront URL carrying it, intercept checkout with a cart-return route.
- The ecosystem has fewer off-the-shelf PunchOut extensions than Magento, so plan for the adapter layer to be custom. On our builds that has been an advantage: the custom layer is small, and you are not fighting an extension’s assumptions.
On either platform, the honest prerequisite is the same: if your customer-specific pricing is not already reliable, PunchOut will expose that to your buyer’s procurement team in the most visible way possible. Fix pricing and ERP sync first; the protocol work is the easy part.
The hard parts nobody puts in the demo
Customer-specific pricing inside the session
The session must resolve to the right company, the right contract, and the right price list before the first page loads, and the price returned in the cart must match the price on the eventual purchase order to the penny. If pricing lives in your ERP (it usually does for the customers big enough to demand PunchOut), your integration layer has to have it synced or be able to fetch it in-session. Buyers reconcile automatically; a one-cent mismatch can bounce an invoice.
UOM, tax, and classification codes
Procurement systems require the buyer’s unit of measure and often UNSPSC classification per line. Tax is usually calculated on their side, which means your cart return should not bake in tax the way a normal checkout would. Every one of these is a small mapping decision, and there are dozens.
The PO-flip
The purchase order that arrives after approval has to become an order in your platform and your ERP: matched to the original session’s pricing, tolerant of partial approvals and line edits, and idempotent, because procurement systems re-send documents. Teams that treat PunchOut as “a storefront feature” plan for the handshake and get blindsided by the order-ingestion pipeline. It is an ERP integration problem wearing a storefront costume (and it shares the same terms-and-credit plumbing as B2B checkout), and it deserves the same queue-and-reconciliation discipline as any other ERP flow. If your buyers also push quotes and RFQs through email today, the same plumbing powers a cleaner quoting and RFQ workflow.
What a go-live actually looks like
The pattern repeats across trading partners, so here is the honest shape of a first PunchOut enablement on an existing B2B store:
- Enablement kickoff (week 1). Your buyer opens a supplier-enablement ticket with their network (Ariba and Coupa both have formal programs). You get sandbox credentials, protocol documentation, and a test plan. Nothing is custom yet; do not skip reading their test plan, because it is the acceptance criteria.
- Session and pricing plumbing (weeks 2-4). The setup-request endpoint, account resolution, scoped session, and in-session contract pricing. This is most of the engineering, and almost all of it is reusable for the next partner.
- Cart return and PO-flip (weeks 3-6, overlapping). Cart transformation with the buyer’s UOM and classification codes, then order ingestion: PO to platform order to ERP, idempotent, price-locked to the session.
- Buyer-side testing (weeks 5-7). Their enablement team runs the scripted flows in sandbox: punch out, return cart, approve, transmit PO, confirm. Expect at least one round of mapping corrections; every buyer’s data dictionary has a surprise in it.
- Production cutover. Credentials swap, one supervised live requisition end to end, and then the channel quietly becomes infrastructure. The buyers who asked for it stop talking about it, which is what success sounds like.
The elapsed time is dominated by coordination with the buyer’s enablement process, not by code. That is also why the second and third trading partners onboard in a fraction of the time: your side is already built, and only the mapping and credentials are new.
Do you actually need it? (The revenue case)
PunchOut is not a growth tactic; it is an enterprise-customer retention and expansion requirement. The math is straightforward:
- You need it when named accounts that buy on contract through Ariba/Coupa/SAP ask for it, when your category’s large buyers mandate supplier enablement, or when a distributor with PunchOut is quietly intermediating orders that used to be yours.
- You do not need it yet when no buyer has asked and your revenue is card-and-terms checkout. Build the B2B fundamentals (account pricing, ERP sync, quoting) that PunchOut would sit on instead.
One caution from experience on the B2B commerce side: the deals where PunchOut appears are usually the largest accounts a supplier has. The integration is rarely justified by new revenue on day one. It is justified by not losing a seven-figure account to the supplier who said yes, and by the follow-on reality that once you are enabled for one network, the next enterprise conversation gets easier.
Frequently asked questions
A PunchOut catalog is a live connection between a buyer’s procurement system (Ariba, Coupa, SAP) and a supplier’s ecommerce store. Instead of browsing a static uploaded catalog, the buyer clicks your name inside their procurement tool, lands in your storefront with their contract pricing already applied, builds a cart, and sends that cart back into their procurement system for approval and purchase-order creation.
cXML is the XML-based protocol used by Ariba, Coupa, Jaggaer, and most procurement networks: the handshake is a PunchOutSetupRequest and the cart returns as a PunchOutOrderMessage. OCI is SAP’s simpler, form-post-based protocol used when buyers punch out directly from SAP SRM or ECC. Most suppliers eventually need both, so build the session and cart-return layer once and treat the protocol as an adapter.
A first PunchOut integration on an existing Magento or Shopware store is typically a 4-8 week project: the protocol handshake is days of work, and the rest is customer-specific pricing inside the session, cart mapping, UOM alignment, and testing against the buyer’s procurement sandbox. Each additional trading partner after the first is dramatically faster because the plumbing already exists.
Not out of the box. Adobe Commerce and Shopware both have the B2B foundations PunchOut needs (company accounts, shared catalogs or customer-specific pricing, quote objects), and both have extension and custom-integration paths for the cXML/OCI layer. The platform choice matters less than whether your customer-specific pricing and ERP integration are already solid, because PunchOut exposes both to your buyer’s procurement team.
A buyer asking for PunchOut? We scope these against your actual platform, pricing model, and ERP rather than a protocol checklist: what exists, what is missing, and what the realistic path to enablement looks like. Let’s talk.
