Amazon B2B — the 850, the 940, and what we send Cirro¶
Proof exercise — real prod order, nothing wired
PO 89GQASZX · OMS ORD225299 · Amazon (Vendor Central US) · pulled 2026-06-02. POs and SKUs are real — this is an internal page. Part of CI-240 (XB → Cirro B2B migration). Raw 850/940 archived in the camel repo at reference/cirro/edi-samples/. See the Overview for the cross-vendor structure, the three data gaps, and the open questions for Cirro.
The 850 — Purchase Order¶
Header verbatim; 137 line items, all the identical shape, so the middle is elided (full file in
edi-samples/).
<?xml version="1.0" encoding="UTF-8"?>
<PurchaseOrders ...><PurchaseOrder>
<Header>
<OrderHeader>
<TradingPartnerId>080ALLPOPSOCKET</TradingPartnerId>
<PurchaseOrderNumber>89GQASZX</PurchaseOrderNumber>
<TsetPurposeCode>00</TsetPurposeCode>
<PurchaseOrderTypeCode>NE</PurchaseOrderTypeCode>
<PurchaseOrderDate>2026-05-28</PurchaseOrderDate>
<ShipCompleteCode>N</ShipCompleteCode>
</OrderHeader>
<Date><DateTimeQualifier1>064</DateTimeQualifier1><Date1>2026-05-29</Date1></Date>
<Date><DateTimeQualifier1>063</DateTimeQualifier1><Date1>2026-06-03</Date1></Date>
<Address>
<AddressTypeCode>ST</AddressTypeCode>
<LocationCodeQualifier>15</LocationCodeQualifier>
<AddressLocationNumber>9914900</AddressLocationNumber>
</Address>
<Reference><ReferenceQual>CR</ReferenceQual><ReferenceID>POQIT</ReferenceID></Reference>
<Miscellaneous><Description1>INTERCHANGE</Description1><Description2>000040091</Description2></Miscellaneous>
<Miscellaneous><Description1>FUNCTIONALGROUP</Description1><Description2>40091</Description2></Miscellaneous>
<Miscellaneous><Description1>TRANSACTION</Description1><Description2>0001</Description2></Miscellaneous>
</Header>
<LineItems>
<LineItem><OrderLine>
<LineSequenceNumber>1</LineSequenceNumber>
<VendorPartNumber>801330</VendorPartNumber>
<OrderQty>8</OrderQty>
<OrderQtyUOM>EA</OrderQtyUOM>
<UnitPrice>0.93</UnitPrice>
<UnitPriceBasis>PE</UnitPriceBasis>
</OrderLine></LineItem>
<LineItem><OrderLine>
<LineSequenceNumber>2</LineSequenceNumber>
<VendorPartNumber>801937</VendorPartNumber>
<OrderQty>8</OrderQty>
<OrderQtyUOM>EA</OrderQtyUOM>
<UnitPrice>18.74</UnitPrice>
<UnitPriceBasis>PE</UnitPriceBasis>
</OrderLine></LineItem>
<LineItem><OrderLine>
<LineSequenceNumber>3</LineSequenceNumber>
<VendorPartNumber>801570</VendorPartNumber>
<OrderQty>12</OrderQty>
<OrderQtyUOM>EA</OrderQtyUOM>
<UnitPrice>14.51</UnitPrice>
<UnitPriceBasis>PE</UnitPriceBasis>
</OrderLine></LineItem>
<!-- ... lines 4–136 omitted, identical shape ... -->
<LineItem><OrderLine>
<LineSequenceNumber>137</LineSequenceNumber>
<VendorPartNumber>704001</VendorPartNumber>
<OrderQty>1</OrderQty>
<OrderQtyUOM>EA</OrderQtyUOM>
<UnitPrice>30</UnitPrice>
<UnitPriceBasis>PE</UnitPriceBasis>
</OrderLine></LineItem>
</LineItems>
<Summary>
<TotalLineItemNumber>137</TotalLineItemNumber>
<TotalQuantity>717</TotalQuantity>
</Summary>
</PurchaseOrder>
</PurchaseOrders>
The 940 — Warehouse Shipping Order¶
Complete (pretty-printed for reading; raw single-line file in edi-samples/). 29 line items.
<WarehouseShippingOrders ...><WarehouseShippingOrder>
<Header>
<OrderHeader>
<TradingPartnerId>CIRRO-AMZ</TradingPartnerId>
<DepositorOrderNumber>ORD225299</DepositorOrderNumber>
<RecordType>HO</RecordType>
<DepositorPurchaseOrderNumber>89GQASZX</DepositorPurchaseOrderNumber>
<OrderStatusCode>N</OrderStatusCode>
<PurchaseOrderTypeCode>NE</PurchaseOrderTypeCode>
<ShipmentMethodOfPayment>0</ShipmentMethodOfPayment>
<CarrierTransMethodCode>L</CarrierTransMethodCode>
<CarrierRouting>ROUTEGUIDE</CarrierRouting>
<CarrierAlphaCode>AMAZ</CarrierAlphaCode>
</OrderHeader>
<Reference><ReferenceQual>L1</ReferenceQual><ReferenceID>MARKET</ReferenceID></Reference>
<Reference><ReferenceQual>PD</ReferenceQual></Reference>
<Reference><ReferenceQual>SE</ReferenceQual></Reference>
<Reference><ReferenceQual>IA</ReferenceQual></Reference>
<Reference><ReferenceQual>PH</ReferenceQual><ReferenceID>C00206</ReferenceID></Reference>
<Reference><ReferenceQual>CO</ReferenceQual><ReferenceID>89GQASZX</ReferenceID></Reference>
<Reference><ReferenceQual>SI</ReferenceQual><ReferenceID>ORD225299</ReferenceID></Reference>
<Reference><ReferenceQual>LU</ReferenceQual><ReferenceID>080ALLPOPSOCKET</ReferenceID></Reference>
<Reference><ReferenceQual>ST</ReferenceQual><ReferenceID>9914900</ReferenceID></Reference>
<Reference><ReferenceQual>CR</ReferenceQual><ReferenceID>POQIT</ReferenceID></Reference>
<Date><DateTimeQualifier1>02</DateTimeQualifier1><Date1>20260529</Date1></Date>
<Date><DateTimeQualifier1>04</DateTimeQualifier1><Date1>20260528</Date1></Date>
<Date><DateTimeQualifier1>10</DateTimeQualifier1><Date1>20260603</Date1></Date>
<Date><DateTimeQualifier1>68</DateTimeQualifier1><Date1>20260529</Date1></Date>
<Contact><ContactTypeCode>IC</ContactTypeCode></Contact>
<Address>
<AddressTypeCode>ST</AddressTypeCode>
<LocationCodeQualifier>15</LocationCodeQualifier>
<AddressLocationNumber>9914900</AddressLocationNumber>
<AddressName>Amazon.com Services LLC-TEB9</AddressName>
<Address1>601 Randolph Road</Address1>
<City>SOMERSET</City><State>NJ</State><PostalCode>08873</PostalCode><Country>US</Country>
</Address>
<Address>
<AddressTypeCode>SF</AddressTypeCode>
<AddressName>CIRRO-Amazon Virtual Fulfilment</AddressName>
<Address1>171 Marcellin Dr.</Address1>
<City>City of Industry</City><State>CA</State><PostalCode>91789</PostalCode><Country>US</Country>
</Address>
<Address>
<AddressTypeCode>VN</AddressTypeCode>
<AddressName>PopSockets LLC</AddressName>
<Address1>100 Technology Drive</Address1><Address2>Ste 250</Address2>
<City>BROOMFIELD</City><State>CO</State><PostalCode>80021</PostalCode><Country>US</Country>
</Address>
<Address>
<AddressTypeCode>BY</AddressTypeCode>
<AddressName>Amazon Vendor Central US</AddressName>
<Address1>PO Box 84394</Address1>
<City>Seattle</City><State>WA</State><PostalCode>98124-5694</PostalCode><Country>US</Country>
</Address>
</Header>
<LineItems>
<LineItem><OrderLine>
<LineSequenceNumber>1</LineSequenceNumber>
<VendorPartNumber>801330</VendorPartNumber>
<PartDescription1>PT-Aviary-BK</PartDescription1>
<OrderQty>8.00</OrderQty><OrderQtyUOM>EA</OrderQtyUOM>
<UnitWeight>0.00</UnitWeight><Amount1>0.93</Amount1>
</OrderLine></LineItem>
<LineItem><OrderLine>
<LineSequenceNumber>2</LineSequenceNumber>
<VendorPartNumber>801937</VendorPartNumber>
<PartDescription1>PW+-Black-BK BK</PartDescription1>
<OrderQty>8.00</OrderQty><OrderQtyUOM>EA</OrderQtyUOM>
<UnitWeight>0.00</UnitWeight><Amount1>18.74</Amount1>
</OrderLine></LineItem>
<!-- ... 27 more line items, identical shape ... -->
<LineItem><OrderLine>
<LineSequenceNumber>120</LineSequenceNumber>
<VendorPartNumber>809440</VendorPartNumber>
<PartDescription1>PWKO+ MS-Nightshade-TBK</PartDescription1>
<OrderQty>8.00</OrderQty><OrderQtyUOM>EA</OrderQtyUOM>
<UnitWeight>0.00</UnitWeight><Amount1>37.50</Amount1>
</OrderLine></LineItem>
</LineItems>
<Summary><TotalOrders>118.00</TotalOrders></Summary>
</WarehouseShippingOrder></WarehouseShippingOrders>
What we send Cirro today (real payload)¶
This is the actual create-b2b payload we sent for this order, pulled from prod
(fulfillment_tracking id 567, integration_int_service_sys_prod). Amazon is
packing_type: 2 (prepack), so the order ships as Cirro-planned cartons — items is
empty and the SKUs live inside carton_list[].product_list.
{
"request_id": "b2b-ORD225299-1748xxxxxx",
"request_time": "1748xxxxxx",
"request_data": {
"verify": 0,
"reference_no": "89GQASZX",
"order_desc": "ORD225299",
"warehouse_code": "USWE",
"shipping_method": "PPS_PENDING_ROUTING",
"packing_type": 2,
"consignee_info": {
"name": "Amazon.com Services LLC-TEB9",
"company": "Amazon.com Services LLC-TEB9",
"address1": "601 Randolph Road",
"city": "SOMERSET", "province": "NJ", "zipcode": "08873", "country": "US",
"locationNumber": "9914900", "doorplate": "9914900",
"buyer_id": "amazonvendorcentralus"
},
"carton_info": {
"box_mark_num": 1,
"is_change_label": 0,
"change_label_qty_piece": 0,
"labelling_requirement": 0,
"is_ukca_gpsr_label": 0
},
"carton_list": [
{
"carton_no": "JH-EL601-20260530-0017-1",
"product_list": [
{ "product_sku": "806922", "quantity": 2 },
{ "product_sku": "804844", "quantity": 4 },
{ "product_sku": "801330", "quantity": 8 }
/* … 29 SKUs in this one (mixed) carton … */
]
}
],
"items": null
}
}
Source of every field¶
Where each value comes from. Legend — 940: a tag on the 940 XML above · Config:
Spring Config Server key · Cirro: comes back from Cirro's prepack plan_order response ·
Generated: built by cm-edi-prc at send time · Constant: hard-coded · Derived:
computed from order data.
| Field | This order | Source |
|---|---|---|
request_id |
b2b-ORD225299-… |
Generated — "b2b-" + orderId + "-" + epoch |
request_time |
epoch secs | Generated |
verify |
0 |
Constant (0 = create, no pre-validate) |
reference_no |
89GQASZX |
940 DepositorPurchaseOrderNumber (the PO; = 850 PurchaseOrderNumber). CI-341: PO is the canonical Cirro id |
order_desc |
ORD225299 |
940 DepositorOrderNumber (OMS order id; rides along for traceability) |
warehouse_code |
USWE |
Config cirro.warehouse-code |
shipping_method |
PPS_PENDING_ROUTING |
Config cirro.shipping-method |
packing_type |
2 |
Constant per fulfillment path (2 = prepack carton) |
consignee_info.name |
Amazon…TEB9 | 940 ST-address AddressName |
consignee_info.company |
Amazon…TEB9 | 940 ST-address AddressName (same value, duplicated) |
consignee_info.address1 |
601 Randolph Road | 940 ST-address Address1 |
consignee_info.city |
SOMERSET | 940 ST-address City |
consignee_info.province |
NJ | 940 ST-address State |
consignee_info.zipcode |
08873 | 940 ST-address PostalCode |
consignee_info.country |
US | 940 ST-address Country (UK→GB normalized) |
consignee_info.locationNumber |
9914900 | 940 ST-address AddressLocationNumber |
consignee_info.doorplate |
9914900 | 940 ST-address AddressLocationNumber (same value, duplicated) |
consignee_info.buyer_id |
amazonvendorcentralus | Derived — sanitizeBuyerId(customerName) (trading-partner name, lower-cased, stripped) |
carton_info.box_mark_num |
1 |
Derived — cartonList.size() ⚠️ see open item below |
carton_info.is_change_label |
0 |
Constant |
carton_info.change_label_qty_piece |
0 |
Constant |
carton_info.labelling_requirement |
0 |
Constant |
carton_info.is_ukca_gpsr_label |
0 |
Constant |
carton_list[].carton_no |
JH-EL601-… | Cirro — box_no from the prepack box_list |
carton_list[].product_list[].product_sku |
806922 … | Cirro prepack box contents (our SKU) |
carton_list[].product_list[].quantity |
2 … | Cirro prepack box contents |
items |
null |
Constant — null for prepack (Cirro rejects items when packing_type=2) |
What we'd add for labels (CI-433) — and what's missing¶
Two new pieces from the Cirro B2B API adjustment (b2b-api-adjustment.md): a
label_template block, and a label_list[] inside each carton. Below is what we'd add,
with each item marked ✅ (we can populate) / ⚠️ (decision needed) / ❌ (data we don't have).
Amazon uses two labels per the spec (label-detail.md): UCC + Pallet.
"label_template": { // ❌ not built today (0% populated)
"ucc_label": {
"items": [
{
"product_sku": "806922", // ✅ our SKU — from carton_list / 940
"upc": "<from 940 ConsumerPackageCode>" // ⚠️ ours — Cirro can't supply; NAV to populate it on the 940 (see below)
}
// … one entry per SKU …
]
},
"pallet_label": { "items": [] } // ✅ empty for Amazon (carries PO# only)
},
"carton_list": [
{
"carton_no": "JH-EL601-20260530-0017-1",
"product_list": [ /* … 29 SKUs … */ ],
"label_list": [ // ❌ not on our Carton DTO today
{
"label_type": 1, // ✅ 1 = UCC
"label_source": 2, // ✅ always 2 (Cirro system-generates; we never upload files)
"box_mark_num": 1 // ⚠️ value unclear — see below
}
// Pallet label → ❌ no label_type code exists (enum only 1=UCC, 2=Gtin14)
]
}
]
What's missing / to confirm with Cirro¶
-
box_mark_num— what does it actually mean, and do we send it per-carton now? We already sendbox_mark_num: 1oncarton_infotoday, set tocartonList.size()(number of cartons). But the spec defines it as "total number of labels applied on the order — 1, 2, 4," and our own code comment (in the customized-packing path, which dropscarton_infoentirely) says it's really "Labels Per Carton, not number of cartons." Three different meanings, and nothing on the 850/940 carries it — it's a retailer routing-guide rule. We need Cirro to define it, tell us whether the adjustment wants it insidecarton_list[].label_list[]too, and give the right value per retailer (or confirm they set it themselves). -
UPC — resolved: it's ours (2026-06-08). Cirro cannot supply Amazon's UPC (they hold multiple UPCs per item and can't pick the right one), so despite the spec marking it auto-gen, the UPC is ours to push. It's on neither the 850 nor the 940 today — the plan is for NAV to populate
<ConsumerPackageCode>on the Amazon 940 (the Walmart pattern, whose 940 already carries UPC), or a product-master lookup. No longer a Cirro question; now a sourcing/plumbing item. -
label_typeenum is incomplete. Only1 = UCCand2 = Gtin14are defined. Amazon needs a Pallet label too — there's no code for it, so it can't be expressed inlabel_list[]. (Affects every vendor with pallet / packing-slip labels.)
Related¶
- Cirro B2B by Vendor — Overview —
label_templatestructure, the cross-vendor gap summary, and the open questions for Cirro. - Sibling vendors: Walmart · Best Buy · Target · Superior
- Design: Cirro B2B
label_template— config-driven build (CI-433) — the send-side build design for these label payloads. - Cirro B2B API — Proposed Fields · EDI Pipeline
Built from real prod EDI pulled 2026-06-02. Raw 850/940 archived in the camel repo at reference/cirro/edi-samples/.