PunchOut
PunchOut catalog for SAP
SAP SRM, SAP ERP purchasing and SAP S/4HANA open a supplier's catalog over OCI: the buyer's browser calls your store with the parameters the SAP administrator entered, and the cart comes back as NEW_ITEM form fields. SAP SRM checks every unit against its own ISO code table and drops a line it cannot match. We build the OCI login, the cart and the order route on your existing store and run them.
What moves between SAP and your store
SAP has several products that open a supplier's catalog, and they do not all speak the same protocol. Facts on this page were checked against SAP's help portal on October 3, 2026.
| SAP product | Where the buyer opens the catalog | Protocol | Where the cart lands |
|---|---|---|---|
| SAP SRM | the shopping cart | OCI | an SRM shopping cart for approval |
| SAP ERP and S/4HANA purchasing | the Catalog button in ME51N and ME21N | OCI | purchase requisition or purchase order items |
| SAP S/4HANA self-service requisitioning | the Fiori requisition apps | OCI 4.0, OCI 5.0 for imported catalogs | a draft item of a self-service requisition |
| SAP Ariba | the catalog in SAP Ariba Buying | cXML | a requisition in SAP Ariba |
The first three run the OCI session described on OCI PunchOut: the browser calls your store with login parameters and a return address, and posts the cart back as NEW_ITEM-<field>[n] form fields. SAP Ariba has its own page, PunchOut for Ariba. Neither OCI flow carries the purchase order; that follows on a separate route.
What the SAP administrator enters: the call structure
In SAP ERP and S/4HANA the catalog is a web service, set up in Customizing under Materials Management, Purchasing, Environment Data, "Web Services: ID and Description", or in S/4HANA in the Fiori app Settings for Web Services. In S/4HANA Cloud the communication scenario is SAP_COM_0046, OCI Integration. Each row of the call structure has a sequence number, a parameter name, a value and a type:
| Type | Use | Example row |
|---|---|---|
| 0, URL | the catalog URL; several URL rows are joined | empty name, https://store.example.com/oci/login |
| 1, SAP Field | a value SAP fills at runtime from a system field | USERNAME = SY-UNAME |
| 2, Fixed Value | sent exactly as entered | CUSTOMER = 10432 |
| 4, Return URL | only for the return address | HOOK_URL, value left empty |
SAP's notes on the configuration add rules that change what your store receives. Parameters needed for login come before HOOK_URL in the sequence. The "Use HTTP GET" flag is set only when the catalog does not support POST. A web service with an empty description in the user's logon language opens a blank page. A buyer calling from Fiori needs a specific HOOK_URL value, described in SAP Note 2375333.
A call for customer 10432, decoded:
USERNAME=JDEVRIES
CUSTOMER=10432
HOOK_URL=https://s4.bakker.example/sap/bc/gui/sap/its/oci?sap-client=100
USERNAME here is the SAP user name of the person at the buyer, filled from SY-UNAME. Your store has never seen that name, so it identifies the company by the fixed CUSTOMER value and keeps the user name for the cart. SAP's own security guidance for S/4HANA advises against a catalog password stored in Customizing and recommends authentication per user through single sign-on or certificates; S/4HANA also supports OAuth 2.0 for OCI 4.0 catalogs.
Which system owns what
| Data | System of record | Direction | When |
|---|---|---|---|
| Items, descriptions, contract prices | your store or ERP | to SAP in the cart | per session |
| Unit of measure codes | the buyer's SAP, table T006 | your cart has to match it | agreed per buyer, before go-live |
| Material group | the buyer's SAP | your cart sends a value from their list | agreed per buyer |
| Purchase requisition, approval | the buyer's SAP | stays there | after the cart |
| Purchase order | the buyer's SAP | to you over EDI, IDoc, XML or email | after approval |
| Confirmation, ship notice, invoice | your ERP | to the buyer | per order |
Units: the ISO code has to exist in SAP
The OCI specification defines NEW_ITEM-UNIT as an ISO code maintained in the buyer's system, and SAP SRM enforces it on arrival. The function UNIT_OF_MEASURE_ISO_TO_SAP takes the value of NEW_ITEM-UNIT as an ISO code and looks for a row in table T006 with that ISO code marked as primary. When it finds none, the buyer sees two messages: "Unit of Measure XX sent from catalog is not an ISO Code" and "Incomplete items in catalog. Only complete items were transferred". The line is deleted from the cart and the rest goes through.
The cart of Bakker Installatie B.V. has three lines: 120 receptacles at 9.60, 2 panelboards at 149.00 and 5 packs of cable ties at 3.75. The cable ties go out with unit PK. In this buyer's SAP system no unit has PK as its ISO code, so line 3 is dropped:
| Line | NEW_ITEM-UNIT |
Found in T006 | Line value |
|---|---|---|---|
| 1 | EA |
yes | 120 x 9.60 = 1,152.00 |
| 2 | EA |
yes | 2 x 149.00 = 298.00 |
| 3 | PK |
no | 5 x 3.75 = 18.75, dropped |
The shopping cart holds 1,152.00 + 298.00 = 1,450.00 USD instead of 1,468.75. The buyer orders without the cable ties, and the missing 18.75 never reaches you as an error. Two fixes work: the store sends a code the buyer's system knows, or the buyer's administrator assigns the ISO code in transaction CUNI or converts it in the BAdI BBP_CATALOG_TRANSFER. SAP's support notes describe the usual mistake: an ISO code created in CUNI and never assigned to a unit. Which code a buyer's SAP accepts for a piece differs per system, so the integration keeps a unit table per buyer. The general problem is on Units of measure.
Material groups and field mapping
NEW_ITEM-MATGROUP is 10 characters and refers to a product category in the buyer's system. In SAP SRM it has to match a unique entry in table COMM_CATEGORY. If it does not, SRM silently assigns the user's default category, and the item lands on the wrong approval path or G/L account. The alternative is NEW_ITEM-EXT_CATEGORY with a code from a standard schema such as UNSPSC or eCl@ss, together with NEW_ITEM-EXT_SCHEMA_TYPE; SRM then maps it through its own Customizing.
In SAP ERP and S/4HANA purchasing, the standard program LMEGUICK3 maps the OCI fields to the requisition and order tables EBAN and EKPO. The five fields NEW_ITEM-CUST_FIELD1 to CUST_FIELD5 have no fixed meaning; the buyer maps them in the BAdI ME_CATALOG_INTERFACE_CUST. In S/4HANA Cloud a key user does the same in Custom Logic with the business context "OCI, Purchasing catalogs". Whatever the buyer maps there is what your cart has to fill, so the field list is agreed per buyer and kept in the integration's mapping.
Price validation in S/4HANA
Settings for Web Services has three price validation options for self-service requisitions:
| Option | When the price in your catalog has changed |
|---|---|
| Disable price validation | the draft is saved with the latest catalog price |
| Enable price validation | the draft cannot be saved; the user sees a pop-up |
| Update price from catalog | the draft is saved and keeps the old price |
With validation enabled, a price change between the session and the save blocks the requisition. A price change in your ERP at 10:00 on a cart from 09:40 shows up at the buyer as a requisition that will not save. The integration publishes price changes to the catalog at a fixed moment agreed with the buyer, so a running session is not hit by one.
When it goes wrong
| What the buyer sees | Cause | Handling |
|---|---|---|
| A blank page instead of the catalog | no description for the web service in the logon language, or the store refuses to load in a frame | description per language at the buyer; the store allows SAP's host as a frame ancestor |
| "Incomplete items in catalog" | a unit with no ISO code assignment in T006 | unit table per buyer, checked before go-live |
| Item on the wrong approval path | MATGROUP not in COMM_CATEGORY, default category used |
material group list per buyer |
| An empty cart in SAP | parameters of the return URL left in the form action |
strip them into hidden fields |
| Colleagues see each other's items | one login for all users in the call structure | one cart per call-up |
| No purchase order arrives | the order goes out by email or IDoc to an address nobody reads | the order route agreed and tested with the first order |
The full OCI field list and its lengths are on OCI PunchOut, the store-side items on the supplier checklist. The PunchOut set-up for other buyers, such as Coupa, is cXML and is compared in cXML vs OCI. What the whole flow looks like with your ERP is on the PunchOut hub. Tell us which SAP system your customer runs.
Frequently asked questions
Does SAP use OCI or cXML for PunchOut?
SAP SRM, purchasing in SAP ERP and SAP S/4HANA use OCI. SAP Ariba uses cXML through SAP Business Network. When an S/4HANA buyer runs its catalogs through SAP Ariba, the session is cXML and the rules on PunchOut for Ariba apply.
Which OCI version does SAP S/4HANA support?
The app Settings for Web Services gives access to catalogs on OCI 4.0, with OAuth 2.0 as an option, and imports catalog data from catalogs on OCI 5.0. Plant maintenance and project systems that call the catalog through their own Customizing route support OCI 3.0 and below; they can also use a web service defined in Settings for Web Services.
What does the SAP administrator need from me?
The catalog URL, the names and values of the login parameters, the name of the return parameter if it is not HOOK_URL, and whether your login accepts POST. SAP sets GET only when the catalog does not support POST. Add the list of unit codes and material groups your cart sends, so the administrator can check them against their system before the first test.
Can every buyer at the customer log in with their own name?
Yes, if your store supports it. SAP's security guidance for S/4HANA advises against storing the catalog login in Customizing, because every user sends the same name and password, and recommends individual authentication through single sign-on, certificates or a login per user. With one shared login, the store has to keep the cart per call, not per account.
How does the purchase order reach me?
Not through OCI. SAP S/4HANA sends purchase order output over EDI, email, IDoc, print or XML, set per supplier by the buyer's output determination. For an order that arrives as a PDF by email, the integration reads it and matches it to the cart; for an IDoc or EDI order it maps the message to a sales order.
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