Punchout explained
At some point a procurement lead at one of your large customers tells your Innendienst that from January, orders will come through Coupa, and asks whether you support punchout. The honest translation of that question is: can we keep buying from you without anyone having to leave our system? If the answer is no, the contract moves.
What punchout is
Punchout is a connection between your customer's procurement system and your shop. Look at it from the buyer's side, because that is the side that matters.
A buyer at a company with a few thousand employees does not open a browser and search for suppliers. They open SAP Ariba, Coupa, JAGGAER, Onventis or the purchasing module of their SAP ERP, because that is where their budget, their cost centres and their approval workflow live. There they see a list of approved suppliers, and they click yours.
At that moment the procurement system "punches out": it opens your shop, in a frame or a new window, and the buyer is already logged in. The identity came across in the call, so nobody types a password. They see the assortment their company negotiated, at their contract prices, with your live stock figures. They search, compare, and fill a cart the way they would in any shop.
Then, instead of checking out, they transfer the cart. It is handed back into the procurement system as a requisition, the BANF of the SAP world. Approval, cost-centre assignment, budget check and the purchase order all happen there. The order reaches you afterwards as a regular order.
The buyer never left their system. From their point of view, your catalog is a feature of Coupa.
Why large customers insist on it
Purchasing organisations above a certain size have one goal: see all spend in one place and steer it onto suppliers with negotiated contracts. They bought a procurement system to enforce that, and every order placed outside it is spend they cannot see, on terms they did not negotiate.
The consequence for you is hard. A supplier reachable from inside the system is on the standard path. A supplier who is not becomes an exception somebody handles by hand: a PDF quote, a manual requisition, an email to the Einkauf. Exceptions get cleaned up. Over one or two purchasing cycles a supplier without punchout is designed out, and it is rarely announced as a decision about you.
This is why most punchout projects are defensive ones, with a date attached.
The three standards
Three appear in practice. Your customer decides which one you need: it follows from the procurement system they already run.
| Standard | Origin | Mechanism | Where you meet it |
|---|---|---|---|
| OCI (Open Catalog Interface) | SAP | HTML form POST of NEW_ITEM-* fields back to the calling system | German SAP shops. By far the most common case in the Mittelstand. Versions 4.0 and 5.0 both still in the field |
| cXML | Ariba (now SAP Ariba); also used by Coupa | XML documents: PunchOutSetupRequest / PunchOutSetupResponse, then PunchOutOrderMessage | Ariba, Coupa, most international procurement platforms |
| openTRANS | BME (Bundesverband Materialwirtschaft, Einkauf und Logistik) | XML business documents: ORDER, ORDERRESPONSE, DISPATCHNOTIFICATION, INVOICE | German-speaking market, usually as the return leg that completes an OCI punchout |
OCI is deliberately simple. The catalog data comes back as ordinary HTML form
fields: NEW_ITEM-DESCRIPTION[1], NEW_ITEM-MATNR[1], NEW_ITEM-QUANTITY[1],
NEW_ITEM-UNIT[1], NEW_ITEM-PRICE[1], NEW_ITEM-CURRENCY[1],
NEW_ITEM-VENDORMAT[1], NEW_ITEM-MANUFACTMAT[1]. That simplicity is why it
spread, and also why nearly every SAP customer has their own small deviation
from it.
cXML carries more: supplier part numbers with an auxiliary ID, classification
codes, unit-of-measure codes from UN/CEFACT Recommendation 20 (C62 for piece,
EA for each, MTR for metre), and a BuyerCookie that ties the session
together.
openTRANS is the missing half of an OCI punchout rather than a competitor to it: OCI hands over a cart, openTRANS carries the order, order response and invoice that follow.
The round trip, step by step
- Setup request. The procurement system calls your punchout endpoint with
credentials: in OCI a URL with username and password parameters, in cXML a
PunchOutSetupRequestcarrying an identity and shared secret. - Session URL. You verify the credentials, resolve which customer this is,
create a session and answer with a URL. In cXML that is a
PunchOutSetupResponsecontaining abrowserFormPostaddress; in OCI you redirect straight into the shop. - The buyer shops. Inside your storefront, in their session: their assortment, their prices, your live availability. This is the part that looks like a normal shop and is the reason punchout is worth having.
- Cart transfer. The buyer transfers the cart. OCI posts the line items back
as form fields; cXML posts a
PunchOutOrderMessage. Either way, the cart crosses the boundary and your session ends. - Approval in their system. The lines become a requisition. Cost centres, budgets and approvers apply. Lines can be changed or deleted here, and often are.
- Order transmission. The approved requisition becomes a purchase order and
is sent to you as a cXML
OrderRequest, an openTRANSORDER, an EDI message or, more often than anyone admits, an email. This is a separate message from the punchout. Building steps 1–5 and forgetting step 6 leaves you with orders arriving as PDFs to be retyped, which was the problem you were solving.
Why punchout projects fail
Almost never on the protocol. The protocol is a week of work. These are the things that stop projects, roughly in order of how often they do it:
Prices. Customer-specific conditions live in the ERP, sometimes in a spreadsheet in the Vertrieb. If the shop cannot reach the same price the ERP would calculate, the punchout shows numbers that do not match the contract. Somebody notices on the first order, and it costs trust that took years to build. A punchout project starts at pricing, not at OCI.
Data quality. Procurement systems are stricter than a web page. Five fields cause most rejected lines:
| Field | What goes wrong | Consequence in their system |
|---|---|---|
| Unit of measure | Missing, or free text like Stk. where a code is expected | Line rejected, or quantity interpreted wrongly: 10 boxes ordered as 10 pieces |
| Manufacturer part number | Empty, or the same value as your own article number | The buyer's system cannot match the article to their material master |
| Tax indicator / rate | Missing or wrong per country | Requisition fails the tax check and stops in approval |
| Long description | HTML markup, or 4,000 characters where the field takes 200 | Truncated, or the transfer fails outright |
| Classification | eCl@ss or UNSPSC required by the customer and not maintained | Line cannot be assigned to a material group, so it fails their controlling |
These are catalog problems, not integration problems. Fix them in the catalog; see Measurements and units and Completeness and readiness.
Session and authentication handling. Credentials per customer, sessions that expire mid-basket, buyers who open two punchouts at once, a cart posted back to a system that has already timed out. Unglamorous and responsible for most of the support tickets in year one.
Testing against the real system. Your endpoint validating against your own test harness proves very little; every procurement installation is customised. Test against the customer's system, with their credentials and their buyer, before you call it live. That test needs a slot in their IT queue, which is a schedule risk you do not control. Do not promise a go-live date before the slot exists.
The assortment is customer-specific. A punchout is a contract, and the contract names a range. Showing your whole catalog to a punchout buyer breaks what was agreed, and it exposes articles and prices that were never negotiated for them.
What punchout replaces
The alternative is static catalog exchange: you export your range as a BMEcat file or an Excel sheet, the customer imports it into their system, and their buyers shop from that copy.
| Static catalog | Punchout | |
|---|---|---|
| Data age | As old as the last import | Live |
| Prices | Fixed at export time | Calculated per customer at display time |
| Availability | Not included, or already wrong | Real stock |
| New articles | Next exchange cycle | Immediately |
| Effort per customer | An export, an import, a correction round, repeatedly | Once, at setup |
| Cross-selling, accessories, search | None | Your shop |
Static catalogs are still normal for small ranges and for customers whose system cannot punch out. But every cycle is manual work on both sides, and between cycles the data is wrong. Punchout removes the cycle.
How this works in the Revenue Cloud
A punchout is modelled as a channel, and that is more than a label:
- In Configuration › Channels you create a channel with type PunchOut and
your own code —
punchout-acmefor one customer,punchout-konzern-xfor the next. One channel per punchout customer is the normal setup, because the assortment and the presentation differ per contract. - Each channel belongs to a market, which carries the currency, the locales and the tax classes that apply. See Languages and markets.
- Unassigned rows decides the visibility policy; in the channel detail the setting reads Products with no assignment to this channel are. Set it to Hidden until assigned (closed) on a punchout channel and only products explicitly assigned to it appear, which is what a punchout contract describes. Your storefront channel can stay open at the same time.
- Attributes that are scopable can hold a different value per channel, so the short, plain description a procurement system needs is not the marketing prose your shop shows. See Channels, locales and completeness.
- Completeness is calculated per channel, so you can ask the only question that matters before go-live: how many of the 2,400 articles in this punchout channel carry a unit of measure, a manufacturer part number and a tax class?
Next
- Set up a punchout — the connection, step by step.
- Field mapping — turning your fields into theirs.