PunchOut
BigCommerce PunchOut
BigCommerce has no PunchOut of its own, but it has the one piece most platforms lack: the Customer Login API signs a customer in from outside with a signed token. Contract prices come from price lists per customer group, and the PunchOut endpoint, the cart transfer and the order intake are built around the store. We build them on your existing BigCommerce store and run the connection.
What moves between the procurement system and BigCommerce
A PunchOut connection on BigCommerce has the same flows as on any store. BigCommerce keeps the catalog, the prices and the orders; the PunchOut documents run in the integration.
| Flow | Direction | Where it runs |
|---|---|---|
| Setup request and response | procurement system to the integration | outside BigCommerce, in the integration |
| Sign-in as the buyer | integration to the storefront | Customer Login API, a JWT at /login/token/{token} |
| Shopping at contract prices | in the storefront | price list of the buyer's customer group |
| Cart transfer | storefront to the procurement system, through the browser | a theme button and the integration |
| Purchase order | procurement system to the integration to BigCommerce | Orders API v2 |
| Confirmation, ship notice, invoice | BigCommerce or your ERP to the procurement system | the integration, as cXML |
Facts on this page were checked against BigCommerce's developer documentation and help center on October 3, 2026. The documents themselves are on cXML PunchOut and OCI PunchOut.
What BigCommerce offers and what is built around it
| Need | What BigCommerce has | What is built |
|---|---|---|
| Endpoint for a setup request | nothing | the integration receives and answers it |
| Sign-in without a form | Customer Login API with a signed JWT | the integration signs the token when the start URL is opened |
| Prices per buying organization | price lists per customer group (Performance plan); group discounts (Growth and up) | one group and price list per buyer, filled from the ERP |
| Cart data | Storefront Carts API GET /api/storefront/carts |
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 | poNumber in B2B Edition; staff_notes otherwise |
the integration maps the OrderRequest to it |
Signing the buyer in
The Customer Login API signs a customer in when the browser opens /login/token/{token}, where the token is a JWT signed with the API account's client secret. Its payload carries iss (the client ID), iat, a unique jti, operation customer_login, the store_hash, the customer_id and an optional redirect_to, the page to open after sign-in. Three rules from BigCommerce's documentation shape the PunchOut start:
- The
iatclaim is valid for 30 seconds. The token cannot be put in the setup response, because the procurement system may open the start URL minutes later. The start URL points to the integration, which signs the token at the moment the browser arrives and redirects at once. - The access point URL works once. A refresh of the page, or a second tab with the same URL, gets no session.
- BigCommerce keeps one active storefront session per customer account. A new sign-in, by any method, ends the other sessions of that customer.
The third rule decides the account structure. If the three buyers of Bakker Installatie B.V. share customer 57, a buyer who opens a PunchOut session at 09:03 is signed out when a colleague starts one at 09:10, and the first cart is no longer theirs. The integration creates one BigCommerce customer per person named in the setup request, all in the customer group of Bakker Installatie, so they share prices and keep their own sessions.
Prices per buying organization
| Plan | Customer groups | Price lists |
|---|---|---|
| Below Growth | no | no |
| Growth and Scale | yes, with category, product and storewide discounts | no |
| Performance | yes | yes, a price per variant for a group |
A customer belongs to one customer group. On the Performance plan the group of Bakker Installatie gets a price list with item 10482 at 9.60 USD where the catalog price is 12.50; a variant the price list leaves out falls back to the catalog price. Price lists and group discounts cannot be combined on one group.
The price list is filled from the ERP. The batch endpoint takes up to 1,000 price records per call, so 4,000 contract prices for one buyer is 4,000 / 1,000 = 4 calls. For 40 buyers that is 160 calls. BigCommerce's rate-limit page gives the Plus and Standard plans 150 requests per 30 seconds, shared by every app on the store, so 160 calls take two windows, about a minute. BigCommerce's help center notes that pricing changes can take up to 10 minutes to show on the storefront. Price changes are therefore scheduled outside the buyer's working hours, so a buyer in a session does not see one price in the catalog and another in the order.
From the BigCommerce cart to the PunchOut cart
The checkout button is replaced by a transfer button in a PunchOut session. The theme reads the cart from GET /api/storefront/carts, which returns the line items with decimal prices. The cart of Bakker Installatie B.V., first line shown:
{
"currency": { "code": "USD" },
"isTaxIncluded": false,
"cartAmount": 1468.75,
"lineItems": {
"physicalItems": [
{
"sku": "10482",
"name": "Duplex receptacle 20 A, white",
"quantity": 120,
"listPrice": 9.6,
"salePrice": 9.6,
"extendedSalePrice": 1152
}
]
}
}
What the integration does with it:
salePricebecomesUnitPrice: 9.6 is written as9.60.extendedSalePriceis the line value, 120 x 9.60 = 1,152.00.isTaxIncludedfalse means the amounts exclude tax, as the cXMLTotaldoes: 1,152.00 + 298.00 + 18.75 = 1,468.75.skubecomesSupplierPartIDorNEW_ITEM-VENDORMAT. For a product with variants it is the variant SKU, which is the part number the buyer has to receive.- BigCommerce has no unit field.
UnitOfMeasureand the classification come from product metafields, filled once per product.
The purchase order back into BigCommerce
The OrderRequest arrives at the integration, which answers it from its queue and creates the order with POST /v2/orders:
OrderRequest |
BigCommerce order |
|---|---|
orderID 4500001234 |
B2B Edition poNumber; otherwise staff_notes |
| procurement system | external_source, for example "PunchOut (Coupa)" |
buyer identity in From |
customer_id of a customer in the group of Bakker Installatie |
ItemOut lines |
products with the variant and the price from the cart |
ShipTo, BillTo |
shipping_addresses, billing_address |
| payment terms | payment_method, for example "Manual" |
Each order costs a few calls of the store's quota, 150 per 30 seconds on Standard and Plus, and the quota is shared with every other app. When the store answers 429, the integration reads X-Rate-Limit-Time-Reset-Ms and retries after that wait; the procurement system already has its answer, so it never sees the delay. How backoff works is in API throttling and backoff.
When it goes wrong
| What happens | Cause | Handling |
|---|---|---|
| Buyer lands on the login page | the JWT was older than 30 seconds, or the URL was opened twice | token signed at the moment of redirect |
| A buyer is signed out mid-session | a colleague signed in on the same customer | one customer per person in the setup request |
| Catalog price 12.50 in the cart | the customer is not in the group with the price list, or the store is below Performance | group and price list per buyer, plan checked first |
| Old price for 10 minutes after a change | storefront pricing delay | price changes published outside working hours |
| Order creation fails with 429 | quota of 150 per 30 seconds shared with other apps | queue, retry after X-Rate-Limit-Time-Reset-Ms |
| Cart refused for its unit | no unit metafield on the product | fixed unit code per product |
The same pieces on other platforms: Shopify, Magento and WooCommerce. What a store needs in full is on the PunchOut hub. Tell us which procurement system your customer uses.
Frequently asked questions
Which BigCommerce plan do I need for PunchOut?
The session and the cart work on any plan. Contract prices per buyer are the deciding part: customer groups need the Growth plan or higher, and price lists, which hold a price per variant for a group, need the Performance plan. Below that, prices per buyer come from customer group discounts, which are percentages on categories, products or the whole store.
Can several buyers at one customer share one BigCommerce account?
No. BigCommerce keeps one active storefront session per customer account, and every new sign-in ends the others. Two buyers at Bakker Installatie on the same account sign each other out. The integration links each person in the setup request to their own BigCommerce customer in the same customer group, so they share the prices and not the session.
Does B2B Edition add PunchOut?
B2B Edition adds company accounts, quotes, invoices on net terms and a buyer portal, and its Orders API can store a PO number on an order. The PunchOut session itself, the setup request, the cXML or OCI cart and the order intake from the procurement system, is not part of it and is built as on a store without B2B Edition.
Can the procurement system show my BigCommerce store in a frame?
On BigCommerce's Cornerstone demo storefront, checked on October 3, 2026, the pages carry no X-Frame-Options header and the session cookie is set with SameSite=None, so a frame can load and keep the session. A store can still add its own security headers; the integration checks the live headers of the PunchOut pages before the first test with the buyer.
Where does the PO number go on a BigCommerce order?
With B2B Edition, in the poNumber of the order through its Orders API. Without it, the integration creates the order through POST /v2/orders with the PO number in staff_notes and sets external_source to identify the procurement system, and the PO number travels to the ERP with the 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