Jaggaer Catalog and PunchOut Integration: A Practical Setup Guide
Hosted catalog versus PunchOut in Jaggaer, the supplier enablement steps for each, the cXML profile Jaggaer expects, and the validation errors that show up most often.
Jaggaer runs two genuinely different mechanisms for getting a supplier’s items in front of a buyer: a hosted catalog, where item data lives inside the buyer’s own Jaggaer instance as an uploaded file, and PunchOut, a live cXML session that hands the user off to the supplier’s own catalog the way it would on Ariba or Coupa. Which one a given supplier relationship uses is a business decision made during enablement, not a technical default, and the two paths have almost nothing in common mechanically once that decision is made. This guide covers both: how to choose between them, what supplier enablement looks like for each, the cXML profile Jaggaer’s PunchOut expects, what a hosted catalog file needs to pass validation, and the errors that come back most often when it doesn’t. The underlying concept of a procurement catalog, hosted or PunchOut, is covered in BoreaTech’s what is a procurement catalog primer; this guide stays at the Jaggaer-specific configuration layer.
Hosted catalog versus PunchOut in Jaggaer
A hosted catalog in Jaggaer is a structured file the supplier prepares and loads into the buyer’s own Jaggaer instance, where it’s stored and searched entirely within the buyer’s system. Once loaded, the buyer’s users see it exactly as of the last successful upload: pricing, availability, and item descriptions are static until the supplier submits a refreshed file, on whatever cadence the relationship calls for. This is the simpler of the two mechanisms to stand up: there’s no endpoint to build or maintain on the supplier’s side, and the integration surface is a file format rather than a live protocol.
PunchOut works the opposite way. Instead of item data living inside Jaggaer, a user clicking through to a PunchOut supplier is redirected (via the same PunchOutSetupRequest / PunchOutSetupResponse exchange used elsewhere in cXML) to a catalog session hosted and rendered by the supplier itself, in real time. Pricing, configuration options, and availability are exactly as current as the supplier’s own system, at the cost of the supplier needing to build and maintain the endpoints, session handling, and order-message construction a live PunchOut integration requires.
Neither approach is strictly better; they suit different catalogs. A hosted catalog fits a bounded, relatively stable item set well, since the cost of a validation failure is a rejected file rather than a broken live session, and the buyer isn’t dependent on the supplier’s uptime to browse. PunchOut fits a catalog where pricing or configuration changes frequently enough that a periodically refreshed file would routinely be stale, or where the item set is too large or too configurable to represent usefully as a flat file at all.
Supplier enablement steps
Getting connected, for either path, starts on the buyer’s side: their Jaggaer administrator (or, on larger implementations, a dedicated supplier enablement team) initiates the relationship and determines which of the two mechanisms applies. Jaggaer’s own supplier enablement documentation is the reliable reference for whatever portal or workflow name that process currently goes by: the platform has changed hands and consolidated its own product naming more than once, so a name that was current at one point is a common way to end up looking for the wrong thing today. For a hosted catalog, enablement is mostly about agreeing on the file template and delivery cadence (whether the supplier uploads manually, submits on a schedule, or delivers via an automated feed) and confirming which fields and commodity taxonomy the buyer’s instance expects. For PunchOut, enablement additionally requires exchanging the connection details any cXML integration needs: your PunchOutSetupOperation URL, the identity value the buyer’s admin has assigned for your relationship, and a shared secret, all agreed on directly with that buyer rather than issued by a central Jaggaer-wide registry.
Because Jaggaer doesn’t operate a single shared network the way Ariba does, identity and credentials are negotiated per buyer relationship, similar to how Coupa’s enablement works: a supplier connecting to multiple Jaggaer buyers should expect a distinct identity and shared secret configured for each one, not one reusable across all of them. Once those details are exchanged, enablement typically moves into a test cycle before the connection or the catalog file goes live, covered further below.
The cXML profile Jaggaer expects
Jaggaer’s PunchOut implementation is built on the same cXML foundation and the same four-document sequence as Ariba and Coupa: a PunchOutSetupRequest posted to your endpoint, your PunchOutSetupResponse returning a session-scoped StartPage URL, a PunchOutOrderMessage posted from the user’s browser once they check out, and a separate OrderRequest once the resulting cart clears the buyer’s own approval process.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.045/cXML.dtd">
<cXML payloadID="[email protected]" timestamp="2026-09-16T14:00:00-05:00">
<Header>
<From><Credential domain="NetworkId"><Identity>example-buyer</Identity></Credential></From>
<To><Credential domain="NetworkId"><Identity>example-supplier</Identity></Credential></To>
<Sender>
<Credential domain="NetworkId">
<Identity>example-buyer</Identity>
<SharedSecret>REPLACE_WITH_SHARED_SECRET</SharedSecret>
</Credential>
<UserAgent>Jaggaer</UserAgent>
</Sender>
</Header>
<Request deploymentMode="test">
<PunchOutSetupRequest operation="create">
<BuyerCookie>7f2e9d1c0b</BuyerCookie>
<BrowserFormPost>
<URL>https://procure.example-buyer.com/jaggaer/punchout/return</URL>
</BrowserFormPost>
</PunchOutSetupRequest>
</Request>
</cXML>
The header identity pattern here mirrors what you’d build for Coupa more than for Ariba: there’s no network-issued identifier equivalent to an ANID, so the Identity values in From, To, and Sender are whatever strings the buyer’s Jaggaer admin agreed with you during enablement, and your PunchOut handler needs to look up credentials per buyer relationship rather than assuming one fixed identity applies across every Jaggaer buyer you connect to. Beyond identity conventions, the item-level construction of PunchOutOrderMessage (escaping descriptions, including a commodity classification, matching quantities and units of measure) follows the same rules as any cXML integration, since Jaggaer parses the same schema everyone else building on cXML does. For where PunchOut sits relative to other integration paths a catalog needs to support, see SupplierForge’s approach to procurement system integration.
Catalog file requirements
A hosted catalog file is a structured spreadsheet or delimited file with a fixed set of required columns, not a free-form product export: Jaggaer’s own catalog file specification for the buyer’s instance is the definitive source for the exact template name and column set, since both vary by buyer configuration and have changed across Jaggaer product generations. At minimum, a buyer’s Jaggaer instance will expect a supplier part number, a description, a price, a unit of measure, and a commodity or category code per line, along with whatever additional fields that specific buyer’s configuration requires: manufacturer part number, lead time, and contract reference are common additions. The header row generally needs to match the buyer’s expected column names exactly, since validation is typically driven by column position or header text rather than by inferring field meaning from content, and a file built against a slightly different template than the one the buyer actually configured is a common first-attempt failure that has nothing to do with the item data itself being wrong.
Formatting details matter as much as field presence. A price column with currency symbols or thousand separators left in (“$1,250.00” instead of “1250.00”), a unit-of-measure abbreviation the buyer’s instance doesn’t recognize, or a commodity code that isn’t valid within the taxonomy that buyer has enabled will each cause a validation failure independent of whether the required columns are all present. Because validation commonly runs against the file as a whole before any row is loaded, a small number of malformed rows in an otherwise clean, several-thousand-line file is usually enough to reject the entire upload rather than just the affected rows, which is why a pre-submission validation pass against the same rules matters more here than it would for a system that loads rows independently.
Validation errors and what they mean
Header mismatch. The file’s column headers don’t match what the buyer’s template defines, often because of a stray extra column, a renamed header, or a template version mismatch. This tends to reject the file outright before any row-level validation even runs.
Missing required field. A required column (commonly price, unit of measure, or commodity code) is blank on one or more rows. Depending on how strict the buyer’s configuration is, this can reject just those rows or the whole file.
Unrecognized unit of measure. The UOM abbreviation on a row doesn’t match any value in the buyer’s configured unit list: “EA” versus “EACH,” or a unit that’s simply not in use for that buyer’s catalog. This is a common source of failures that look like a data problem but are really a mismatch between the supplier’s own UOM conventions and the specific list a buyer’s Jaggaer instance recognizes.
Invalid or unrecognized commodity code. The code isn’t a valid UNSPSC value, or it’s valid in general but falls in a segment the buyer hasn’t enabled in their taxonomy configuration. Because commodity codes can affect approval routing downstream in addition to search and categorization, a code that’s technically valid but not recognized by that buyer’s setup can cause problems even if the file itself loads successfully.
Price format error. A currency symbol, thousand separator, or non-numeric character left in a price field that Jaggaer expects as a plain number. This is one of the more mechanical failures to fix but also one of the more common, since it usually comes from exporting price data out of a system that formats currency for human readability rather than for machine parsing.
Where SupplierForge fits
Whether a supplier is running a hosted catalog, PunchOut, or both against the same Jaggaer buyer, the recurring theme is that most failures trace back to catalog data quality and mapping rather than the integration mechanism itself: a bad unit of measure, an unrecognized commodity code, or a formatting inconsistency that a schema can’t catch on its own. That’s the layer catalog ingestion, item mapping and categorization, and ongoing catalog health monitoring are built to address, independent of which specific buyer platform the data eventually reaches. SupplierForge’s feature set covers that ingestion and mapping work across CSV, Excel, and structured feed sources, and the PunchOut side specifically (cXML, OCI, and EDI translation) is handled by the PunchOut Gateway, a separately licensed component designed to serve exactly this kind of multi-platform, multi-format relationship rather than one built per buyer.
Frequently asked questions
- Should a supplier use a hosted catalog or PunchOut in Jaggaer?
- It depends mainly on how often pricing and availability change and how much catalog breadth needs to be exposed. A hosted catalog is simpler to stand up and works well for a stable, bounded item set, but it's only as current as the last file a supplier loaded. PunchOut is more work to build but shows live pricing, configuration, and availability at the moment a buyer is shopping, which matters more for suppliers with volatile pricing or a catalog too large to usefully upload as a flat file.
- Does Jaggaer use cXML for PunchOut like Ariba and Coupa?
- Yes. Jaggaer's PunchOut implementation follows the same cXML round trip (PunchOutSetupRequest, PunchOutSetupResponse, PunchOutOrderMessage, and OrderRequest) as other cXML-based procurement platforms. Identity is typically a value the buyer's Jaggaer administrator agrees on with the supplier directly rather than a portable network-wide identifier, similar to how Coupa handles it, so the same supplier can have different identity values configured across different Jaggaer buyers.
- Why did my hosted catalog file get rejected?
- The most common causes are a header row that doesn't exactly match the expected column names, a required field left blank on some rows, a unit-of-measure abbreviation the buyer's Jaggaer instance doesn't recognize, or a commodity code that doesn't resolve against the taxonomy the buyer has configured. Because validation typically runs against the whole file before any of it loads, a handful of bad rows in an otherwise clean file is usually enough to reject the entire upload rather than just those rows.
- Can the same catalog data be used for both a hosted catalog and PunchOut in Jaggaer?
- The underlying item data (descriptions, prices, units of measure, commodity codes) can be the same, but it needs to be delivered through two different mechanisms: a structured file upload for a hosted catalog, and a live PunchOut session serving the same items dynamically. Keeping both in sync manually is a common source of drift; suppliers running both usually generate each format from one underlying catalog source rather than maintaining two separately.
- What does a UNSPSC validation error in Jaggaer usually mean?
- It generally means the commodity code on one or more items either isn't a valid UNSPSC code at all, or is valid but belongs to a segment the buyer hasn't enabled in their taxonomy configuration. Since commodity codes on some Jaggaer implementations affect approval routing in addition to categorization, an item that clears catalog validation with a technically valid but buyer-unrecognized code can still cause downstream approval problems even after the file itself is accepted.