ediverse Explore the platform

Spotlight PEPPOL BIS Billing 3.0 The EU e-invoicing mandate is here — France Sept 2026, Belgium Jan 2026, Germany 2025.

PRICAT — Price/Sales Catalogue Message (D.96A)

The PRICAT message conveys price and catalogue details from a seller to a buyer for the goods and services on offer.

Purpose

Per the official UN/CEFACT definition, PRICAT is "a message to enable the transmission of information regarding pricing and catalogue details for goods and services offered by a seller to a buyer." The standard adds that sales and delivery conditions can apply to the entire catalogue, to a group of items, to a single item, or even to different price-basis occurrences within a single item.

PRICAT replaces PDF / Excel catalogues with a structured format directly actionable in the buyer's ERP. It is sized for real-world volumes: up to 999,999 item lines per message (SG33 loop).

Segment structure

PRICAT D.96A has two named sections: a Header (groups SG1 to SG15) and a Detail (groups SG16 to SG47 — products, prices, taxes, allowances, packaging). There is no formal Summary section in the UNECE spec: UNT comes right after the last item loop.

Mandatory header segments: UNH M , BGM M , and DTM M .

Conditional header segments: ALI C , and FTX C .

Then the header groups:

  • SG1 RFF+DTM — references (blanket contract, catalogue version number).
  • SG2 NAD+LOC — parties (mandatory in the spec, up to 99 occurrences) with SG3 RFF+DTM and SG4 CTA+COM.
  • SG5 TAX+MOA — header-level taxes.
  • SG6 CUX+DTM — currencies (mandatory to qualify the PRI segments).
  • SG7 PAT+DTM+PCD+MOA — payment terms.
  • SG8 TDT+LOC and SG9 TOD+LOC — transport and delivery terms.
  • SG10 ALC+ALI+DTM — header-level allowances/charges with sub-groups SG11 QTY+RNG, SG12 PCD+RNG, SG13 MOA+RNG, SG14 RTE+RNG, SG15 TAX+MOA.

Detail (catalogue lines)

The Detail section opens with the optional SG16 group PGI+DTM+QTY+ALI+FTX (Product Group Information, up to 1,000 occurrences) to bundle items logically, with SG17 CUX+DTM and a SG18 PRI+CUX+APR+RNG+DTM sub-loop for group prices, followed by SG19 TAX+MOA and SG20 ALC+ALI with its sub-groups (SG21 to SG25 — range-based quantities/percentages/amounts/rates/taxes).

The business core is the SG33 loop (up to 999,999 occurrences) built around LIN M . Each line carries the conditionals: PIA C , IMD C , MEA C , QTY C , HAN C , ALI C , DTM C , NAD C , RFF C , LOC C , DOC C , and FTX C .

Under each LIN nest the line-level groups:

  • SG34 CCI+CAV+MEA — classifications and characteristics (colour, size...).
  • SG35 TAX+MOA — item-specific taxes.
  • SG36 CUX+DTM — item-specific currency.
  • SG37 PRI+CUX+APR+RNG+DTM+PCDitem prices (up to 100 occurrences). This is where net price, list price, and promotional price live.
  • SG38 ALC+ALI+DTM — line-level allowances/charges, with sub-groups SG39 to SG43.
  • SG44 PAC+MEA+HAN — packaging.
  • SG45 PAT+DTM+PCD+MOA — payment terms.
  • SG46 TDT+LOC and SG47 TOD+LOC — transport and delivery.

Trailer

PRICAT has no formal Summary section: no UNS, no CNT. After the last SG33 loop comes directly UNT M .

Mandatory / conditional

Four structural items are strictly mandatory in every D.96A PRICAT:

  • UNH — opens the message.
  • BGM — gives the function code (9 = Original, 1 = Cancellation, 4 = Change, etc.) and the catalogue number.
  • DTM in the header — at least one date (typically DTM+137 issue plus DTM+194 / DTM+206 validity range).
  • SG2 with its NAD — at least one parties group (M in the spec).

On the business side you also need: NAD+SU (supplier), often NAD+BY (specific buyer recipient), a CUX (SG6), at least one LIN in SG33, and at least one PRI in SG37 per line — otherwise the catalogue carries no price.

Real-world example

A quarterly catalogue from a manufacturer to a retailer, for two items with their list price (AAB), negotiated net price (AAA), and applicable VAT.

edifact pricat-d96a-example.edi
UNB+UNOC:3+5410000000456:14+5410000000123:14+260513:0900+CTRL000040'
UNH+1+PRICAT:D:96A:UN:EAN008'
BGM+9+PRICAT-2026-Q3+9'
DTM+137:20260513:102'
DTM+194:20260701:102'
DTM+206:20260930:102'
NAD+SU+5410000000456::9'
NAD+BY+5410000000123::9'
CUX+2:EUR:4'
LIN+1++3520000001234:EN'
PIA+5+SUP-REF-AC-001:SA'
IMD+F++:::Acoustic guitar, mahogany finish'
QTY+52:1'
PRI+AAB:899.00'
PRI+AAA:849.00:CA::1'
TAX+7+VAT+++:::20'
LIN+2++3520000005678:EN'
PIA+5+SUP-REF-CP-001:SA'
IMD+F++:::Capo, spring loaded'
QTY+52:1'
PRI+AAB:24.90'
PRI+AAA:19.50:CA::1'
TAX+7+VAT+++:::20'
UNT+22+1'
UNZ+1+CTRL000040'
  • BGM+9+PRICAT-2026-Q3+9 — function 9 (Original), number PRICAT-2026-Q3, status 9.
  • DTM+137 — issue date. DTM+194 / DTM+206 — start and end of the validity range.
  • NAD+SU / NAD+BY — Supplier (sender) and Buyer (recipient).
  • CUX+2:EUR:4 — reference currency: EUR.
  • Two LIN with their PIA+5 (supplier reference), IMD+F (free description), QTY+52 (quantity per UoM = 1).
  • Each line carries two PRI: AAB (list price) and AAA (net calculated price).
  • TAX+7+VAT — applicable tax (qualifier 7 = tax) at 20%.
  • UNT+22+1 — 22 segments, reference "1" matching UNH.

Common errors

  • PRI without currency — every PRI must be qualified by a CUX (header SG6 or SG36 for item-specific scope). Without a currency, a price of "849.00" is ambiguous and will typically be rejected by the buyer's ERP.
  • AAA vs AAB swapPRI+AAA is the net price (calculation net), PRI+AAB is the list price (calculation gross/list). Swapping the two makes the item appear at a loss on the buyer's ERP.
  • Missing validity period — a PRICAT without DTM+194/206 or any explicit range is interpreted as "indefinite", which almost never matches business intent.
  • Missing GTIN — a LIN without :EN (qualifier 3055 = EAN International) in the C212 composite cannot be matched against the buyer's orders, which always reference the GTIN.
  • No UNS — PRICAT has no UNS in its spec. Do not insert one.
  • BGM function-code misuse — the BGM function code (9 Original, 1 Cancellation, 4 Change, 5 Replace, 31 Copy) must reflect the lifecycle. Always sending "9 Original" on deletion prevents the buyer from purging the old catalogue.

PRICAT sits at the upstream end of the cycle:

  • ORDERS D.96A — the order, which should reference the catalogue's GTINs.
  • ORDRSP D.96A — the order response may carry a different PRI (renegotiation).
  • INVOIC D.96A — the invoice, whose prices must match the PRICAT.
  • INVRPT D.96A — the inventory report the supplier may send in parallel.
  • CONTRL D.96A — the automatic syntactic acknowledgment.

JSON equivalent

JSON projection matching the example above. The mapping is not normative — it's an ediverse convention to ease integration in TypeScript / Python environments.

json pricat-d96a-equivalent.json
{
  "interchange": {
    "controlRef": "CTRL000040",
    "from": { "id": "5410000000456", "qualifier": "14" },
    "to": { "id": "5410000000123", "qualifier": "14" },
    "datetime": "2026-05-13T09:00:00Z",
    "syntax": { "id": "UNOC", "version": "3" }
  },
  "message": {
    "ref": "1",
    "type": "PRICAT",
    "version": { "syntax": "D", "release": "96A", "agency": "UN", "association": "EAN008" }
  },
  "priceCatalogue": {
    "number": "PRICAT-2026-Q3",
    "function": "9",
    "status": "9",
    "issueDate": "2026-05-13",
    "validity": { "from": "2026-07-01", "to": "2026-09-30" },
    "parties": {
      "supplier": { "gln": "5410000000456" },
      "buyer": { "gln": "5410000000123" }
    },
    "currency": "EUR",
    "items": [
      {
        "ref": 1,
        "gtin": "3520000001234",
        "supplierSku": "SUP-REF-AC-001",
        "description": "Acoustic guitar, mahogany finish",
        "uom": "EA",
        "priceList": 899.00,
        "priceNet": 849.00,
        "vat": { "category": "VAT", "rate": 20 }
      },
      {
        "ref": 2,
        "gtin": "3520000005678",
        "supplierSku": "SUP-REF-CP-001",
        "description": "Capo, spring loaded",
        "uom": "EA",
        "priceList": 24.90,
        "priceNet": 19.50,
        "vat": { "category": "VAT", "rate": 20 }
      }
    ]
  }
}