Confirm Supply Chain Collaboration Orders with cXML Files

Coupa supports purchase orders for suppliers using SCC

Introduction

When the supplier record in Coupa is enabled with SCC, PO cXML DTD version will be sent as 1.2.056 and new SCC fields are added to the cXML payload. Any cXML supplier that is being enabled as part of SCC for a customer should support consuming the Coupa PO cXML with confirmation details in it so that they can eventually send us back the cXML Fulfill.dtd aka Order Confirmation which should be of cXML version 1.2.036 and above.

How It Works

Fields that are enabled as part of SCC in cXML PO payload are shown below:

  • <ControlKeys> <OCInstruction value="allowed"/> </ControlKeys>
  • <ItemOut quantity="21" lineNumber="1" confirmationDueDate="2023-06-15T11:04:47-07:00">

Supported values for OCInstruction in Coupa PO cXML Payload are allowed, notAllowed.

If a supplier is enabled with SCC in Coupa but customer chose the particular Req/external PO to be NOT part of SCC order confirmation process they can mention it in Requisition/External PO level itself and when the PO cXML payload is sent to supplier, it will mention it as:

<ControlKeys> <OCInstruction value="notAllowed"/> </ControlKeys>

This means customer is not expecting a confirmation for that specific PO

  • The “ControlKeys” section, if mentioned in “OrderRequestHeader” section of the cXML PO payload, means it is HEADER level confirmation where all suppliers can either accept the PO details or reject the PO details as part of SCC in the given PO. No changes are allowed for header level confirmations in SCC as the customer isn’t allowing any edits in this scenario.
  • The “ControlKeys” section, if mentioned at each “ItemOut” section of the cXML PO payload, means it is LINE level confirmation where suppliers can either accept/reject/propose changes (aka detail) as part of SCC.

cXML PO Payload starts with:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.056/cXML.dtd">

  • When the supplier record in Coupa is NOT enabled with SCC, PO cXML DTD version will be remaining as 1.2.014 and any supplier that is already enabled with it won't be affected and no SCC fields are added to the payload.

cXML PO Payload starts with:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.014/cXML.dtd">

To summarize:

  • When using cXML PO with SCC, cXML DTD 1.2.056 version is used.
  • When using cXML PO without SCC, cXML DTD 1.2.014 version is used

cXML Order Confirmation (Fulfill.dtd)

cXML DTD 1.2.036 or above should be used by suppliers.  A sample cXML Coupa Order Confirmation payload is shown below.

{
	"info": {
		"_postman_id": "cd0f89dc-7789-4c89-82a6-941b1fa9fe1f",
		"name": "Coupa cXML Samples",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_exporter_id": "8515263"
	},
	"item": [
		{
			"name": "Order Confirmations",
			"item": [
				{
					"name": "Accept All Lines",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE cXML SYSTEM \"http://xml.cXML.org/schemas/cXML/1.2.036/Fulfill.dtd\">\n<cXML payloadID=\"i-am-a-payload-id\" xml:lang=\"en-US\" timestamp=\"2023-05-19T08:39:29-08:00\">\n    <Header>\n        <From>\n            <!-- domain attr is 'cxml_invoice_supplier_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_supplier_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </From>\n        <To>\n            <!-- domain attr is 'cxml_invoice_buyer_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_buyer_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </To>\n        <!-- The supplier -->\n        <Sender>\n            <!-- domain attr must match Header/From/Credential['domain'] attr -->\n            <Credential domain=\"test\">\n                <!-- Identity content is must match Header/From/Credential/Identity content -->\n                <Identity>test</Identity>\n                <!-- SharedSecret contents 'cxml_invoice_secret' -->\n                <SharedSecret>test</SharedSecret>\n            </Credential>\n            <!-- UserAgent can be anything -->\n            <UserAgent> HTTP Agent</UserAgent>\n        </Sender>\n    </Header>\n    <Request deploymentMode=\"production\">\n        <ConfirmationRequest>\n            <!-- operations and type is used by coupa -->\n            <!-- operations= update Coupa will error this out, given that we do not currently allow more than 1 back-and-forth -->\n            <ConfirmationHeader type=\"accept\"\n                          noticeDate=\"2023-05-19\"\n                          confirmID=\"15\"\n                          operation=\"new\">\n                <!-- These elements are not used by Coupa -->\n                <Comments xml:lang=\"en-US\">Look's great</Comments>\n            </ConfirmationHeader>\n            <!-- orderID attr is an OrderHeader number that will become associated to the OrderConfirmation::Line -->\n            <OrderReference orderID=\"3169\" orderDate=\"2023-05-19\">\n                <DocumentReference payloadID=\"3169\" />\n            </OrderReference>\n            <!-- ConfirmationItem elements should be present to provide status information for individual line items in the order -->\n            <ConfirmationItem lineNumber=\"1\" quantity=\"23\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"23\" type=\"accept\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">20.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n            <ConfirmationItem lineNumber=\"2\" quantity=\"23\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"23\" type=\"accept\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">20.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n        </ConfirmationRequest>\n    </Request>\n</cXML>",
							"options": {
								"raw": {
									"language": "xml"
								}
							}
						},
						"url": {
							"raw": "{{cXML_URL}}/order_confirmation_request",
							"host": [
								"{{cXML_URL}}"
							],
							"path": [
								"order_confirmation_request"
							]
						}
					},
					"response": []
				},
				{
					"name": "Reject All Lines",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE cXML SYSTEM \"http://xml.cXML.org/schemas/cXML/1.2.036/Fulfill.dtd\">\n<cXML payloadID=\"i-am-a-payload-id\" xml:lang=\"en-US\" timestamp=\"2023-05-19T08:39:29-08:00\">\n    <Header>\n        <From>\n            <!-- domain attr is 'cxml_invoice_supplier_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_supplier_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </From>\n        <To>\n            <!-- domain attr is 'cxml_invoice_buyer_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_buyer_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </To>\n        <!-- The supplier -->\n        <Sender>\n            <!-- domain attr must match Header/From/Credential['domain'] attr -->\n            <Credential domain=\"test\">\n                <!-- Identity content is must match Header/From/Credential/Identity content -->\n                <Identity>test</Identity>\n                <!-- SharedSecret contents 'cxml_invoice_secret' -->\n                <SharedSecret>test</SharedSecret>\n            </Credential>\n            <!-- This is not used by Coupa -->\n            <UserAgent> HTTP Agent</UserAgent>\n        </Sender>\n    </Header>\n    <Request deploymentMode=\"production\">\n        <ConfirmationRequest>\n            <!-- operations and type is used by coupa -->\n            <!-- operations= update Coupa will error this out, given that we do not currently allow more than 1 back-and-forth -->\n            <ConfirmationHeader type=\"reject\"\n                          noticeDate=\"2023-05-19\"\n                          confirmID=\"15\"\n                          operation=\"new\">\n                <!-- These elements are not used by Coupa -->\n                <Comments xml:lang=\"en-US\">Look's great</Comments>\n            </ConfirmationHeader>\n            <!-- orderID attr is an OrderHeader ID number that will become associated to the OrderConfirmation::Line -->\n            <OrderReference orderID=\"3168\" orderDate=\"2023-05-19\">\n                <DocumentReference payloadID=\"3168\" />\n            </OrderReference>\n            <!-- ConfirmationItem elements should be present to provide status information for individual line items in the order -->\n            <ConfirmationItem lineNumber=\"1\" quantity=\"123\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"123\" type=\"reject\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">230.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson considered other</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n            <ConfirmationItem lineNumber=\"2\" quantity=\"12\">\n                <UnitOfMeasure>BX</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"12\" type=\"reject\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>BX</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">120.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson considered other</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n        </ConfirmationRequest>\n    </Request>\n</cXML>",
							"options": {
								"raw": {
									"language": "xml"
								}
							}
						},
						"url": {
							"raw": "{{cXML_URL}}/order_confirmation_request",
							"host": [
								"{{cXML_URL}}"
							],
							"path": [
								"order_confirmation_request"
							]
						}
					},
					"response": []
				},
				{
					"name": "Mix of accept/reject lines",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE cXML SYSTEM \"http://xml.cXML.org/schemas/cXML/1.2.036/Fulfill.dtd\">\n<cXML payloadID=\"i-am-a-payload-id\" xml:lang=\"en-US\" timestamp=\"2023-05-19T08:39:29-08:00\">\n    <Header>\n        <From>\n            <!-- domain attr is 'cxml_invoice_supplier_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_supplier_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </From>\n        <To>\n            <!-- domain attr is 'cxml_invoice_buyer_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_buyer_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </To>\n        <!-- The supplier -->\n        <Sender>\n            <!-- domain attr must match Header/From/Credential['domain'] attr -->\n            <Credential domain=\"test\">\n                <!-- Identity content is must match Header/From/Credential/Identity content -->\n                <Identity>test</Identity>\n                <!-- SharedSecret contents 'cxml_invoice_secret' -->\n                <SharedSecret>test</SharedSecret>\n            </Credential>\n            <!-- This is not used by Coupa -->\n            <UserAgent> HTTP Agent</UserAgent>\n        </Sender>\n    </Header>\n    <Request deploymentMode=\"production\">\n        <ConfirmationRequest>\n            <!-- operations and type is used by coupa -->\n            <!-- operations= update Coupa will error this out, given that we do not currently allow more than 1 back-and-forth -->\n            <ConfirmationHeader type=\"detail\"\n                          noticeDate=\"2023-05-19\"\n                          confirmID=\"15\"\n                          operation=\"new\">\n                <!-- These elements are not used by Coupa -->\n                <Comments xml:lang=\"en-US\">Look's great</Comments>\n            </ConfirmationHeader>\n            <!-- orderID attr is an OrderHeader ID number that will become associated to the OrderConfirmation::Line -->\n            <OrderReference orderID=\"3171\" orderDate=\"2023-05-19\">\n                <DocumentReference payloadID=\"3171\" />\n            </OrderReference>\n            <!-- ConfirmationItem elements should be present to provide status information for individual line items in the order -->\n            <ConfirmationItem lineNumber=\"1\" quantity=\"23\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"23\" type=\"reject\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">20.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n            <ConfirmationItem lineNumber=\"2\" quantity=\"23\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"23\" type=\"accept\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">20.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n            <ConfirmationItem lineNumber=\"3\" quantity=\"23\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"23\" type=\"accept\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">20.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n        </ConfirmationRequest>\n    </Request>\n</cXML>",
							"options": {
								"raw": {
									"language": "xml"
								}
							}
						},
						"url": {
							"raw": "{{cXML_URL}}/order_confirmation_request",
							"host": [
								"{{cXML_URL}}"
							],
							"path": [
								"order_confirmation_request"
							]
						}
					},
					"response": []
				},
				{
					"name": "Mix of accept part of quantity/reject part of quantity",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE cXML SYSTEM \"http://xml.cXML.org/schemas/cXML/1.2.036/Fulfill.dtd\">\n<cXML payloadID=\"i-am-a-payload-id\" xml:lang=\"en-US\" timestamp=\"2023-05-19T08:39:29-08:00\">\n    <Header>\n        <From>\n            <!-- domain attr is 'cxml_invoice_supplier_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_supplier_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </From>\n        <To>\n            <!-- domain attr is 'cxml_invoice_buyer_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_buyer_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </To>\n        <!-- The supplier -->\n        <Sender>\n            <!-- domain attr must match Header/From/Credential['domain'] attr -->\n            <Credential domain=\"test\">\n                <!-- Identity content is must match Header/From/Credential/Identity content -->\n                <Identity>test</Identity>\n                <!-- SharedSecret contents 'cxml_invoice_secret' -->\n                <SharedSecret>test</SharedSecret>\n            </Credential>\n            <!-- This is not used by Coupa -->\n            <UserAgent> HTTP Agent</UserAgent>\n        </Sender>\n    </Header>\n    <Request deploymentMode=\"production\">\n        <ConfirmationRequest>\n            <!-- operations and type is used by coupa -->\n            <!-- operations= update Coupa will error this out, given that we do not currently allow more than 1 back-and-forth -->\n            <ConfirmationHeader type=\"detail\"\n                          noticeDate=\"2023-05-19\"\n                          confirmID=\"15\"\n                          operation=\"new\">\n                <!-- These elements are not used by Coupa -->\n                <Comments xml:lang=\"en-US\">Look's great</Comments>\n            </ConfirmationHeader>\n            <!-- orderID attr is an OrderHeader ID number that will become associated to the OrderConfirmation::Line -->\n            <OrderReference orderID=\"3172\" orderDate=\"2023-05-19\">\n                <DocumentReference payloadID=\"3172\" />\n            </OrderReference>\n            <!-- ConfirmationItem elements should be present to provide status information for individual line items in the order -->\n            <ConfirmationItem lineNumber=\"1\" quantity=\"123\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"100\" type=\"accept\" shipmentDate=\"2023-05-15\" deliveryDate=\"2023-05-28T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">230.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier accept</Comments>\n                </ConfirmationStatus>\n                <ConfirmationStatus quantity=\"23\" type=\"reject\" shipmentDate=\"2023-05-15\" deliveryDate=\"2023-05-28T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">230.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> Rejectig 23 because we only do this item in 100s</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n        </ConfirmationRequest>\n    </Request>\n</cXML>",
							"options": {
								"raw": {
									"language": "xml"
								}
							}
						},
						"url": {
							"raw": "{{cXML_URL}}/order_confirmation_request",
							"host": [
								"{{cXML_URL}}"
							],
							"path": [
								"order_confirmation_request"
							]
						}
					},
					"response": []
				},
				{
					"name": "Accept with multiple schedule lines",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE cXML SYSTEM \"http://xml.cXML.org/schemas/cXML/1.2.036/Fulfill.dtd\">\n<cXML payloadID=\"i-am-a-payload-id\" xml:lang=\"en-US\" timestamp=\"2023-05-19T08:39:29-08:00\">\n    <Header>\n        <From>\n            <!-- domain attr is 'cxml_invoice_supplier_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_supplier_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </From>\n        <To>\n            <!-- domain attr is 'cxml_invoice_buyer_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_buyer_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </To>\n        <!-- The supplier -->\n        <Sender>\n            <!-- domain attr must match Header/From/Credential['domain'] attr -->\n            <Credential domain=\"test\">\n                <!-- Identity content is must match Header/From/Credential/Identity content -->\n                <Identity>test</Identity>\n                <!-- SharedSecret contents 'cxml_invoice_secret' -->\n                <SharedSecret>test</SharedSecret>\n            </Credential>\n            <!-- This is not used by Coupa -->\n            <UserAgent> HTTP Agent</UserAgent>\n        </Sender>\n    </Header>\n    <Request deploymentMode=\"production\">\n        <ConfirmationRequest>\n            <!-- operations and type is used by coupa -->\n            <!-- operations= update Coupa will error this out, given that we do not currently allow more than 1 back-and-forth -->\n            <ConfirmationHeader type=\"detail\"\n                          noticeDate=\"2023-05-19\"\n                          confirmID=\"15\"\n                          operation=\"new\">\n                <!-- These elements are not used by Coupa -->\n                <Comments xml:lang=\"en-US\">Look's great</Comments>\n            </ConfirmationHeader>\n            <!-- orderID attr is an OrderHeader ID number that will become associated to the OrderConfirmation::Line -->\n            <OrderReference orderID=\"3176\" orderDate=\"2023-05-19\">\n                <DocumentReference payloadID=\"3176\" />\n            </OrderReference>\n            <!-- ConfirmationItem elements should be present to provide status information for individual line items in the order -->\n            <ConfirmationItem lineNumber=\"1\" quantity=\"123\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"23\" type=\"detail\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-28T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">230.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n                <ConfirmationStatus quantity=\"50\" type=\"detail\" shipmentDate=\"2023-05-25\" deliveryDate=\"2023-05-29T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">230.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n                <ConfirmationStatus quantity=\"50\" type=\"detail\" shipmentDate=\"2023-05-26\" deliveryDate=\"2023-05-30T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">230.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n        </ConfirmationRequest>\n    </Request>\n</cXML>",
							"options": {
								"raw": {
									"language": "xml"
								}
							}
						},
						"url": {
							"raw": "{{cXML_URL}}/order_confirmation_request",
							"host": [
								"{{cXML_URL}}"
							],
							"path": [
								"order_confirmation_request"
							]
						}
					},
					"response": []
				},
				{
					"name": "Changing Price or Qty or Promised Date",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE cXML SYSTEM \"http://xml.cXML.org/schemas/cXML/1.2.036/Fulfill.dtd\">\n<cXML payloadID=\"i-am-a-payload-id\" xml:lang=\"en-US\" timestamp=\"2023-05-19T08:39:29-08:00\">\n    <Header>\n        <From>\n            <!-- domain attr is 'cxml_invoice_supplier_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_supplier_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </From>\n        <To>\n           <!-- domain attr is 'cxml_invoice_buyer_domain' -->\n            <Credential domain=\"test\">\n                <!-- Identity content is 'cxml_invoice_buyer_identity' -->\n                <Identity>test</Identity>\n            </Credential>\n        </To>\n        <!-- The supplier -->\n        <Sender>\n            <!-- domain attr must match Header/From/Credential['domain'] attr -->\n            <Credential domain=\"test\">\n                <!-- Identity content is must match Header/From/Credential/Identity content -->\n                <Identity>test</Identity>\n                <!-- SharedSecret contents 'cxml_invoice_secret' -->\n                <SharedSecret>test</SharedSecret>\n            </Credential>\n            <!-- This is not used by Coupa -->\n            <UserAgent> HTTP Agent</UserAgent>\n        </Sender>\n    </Header>\n    <Request deploymentMode=\"production\">\n        <ConfirmationRequest>\n            <!-- operations and type is used by coupa -->\n            <!-- operations= update Coupa will error this out, given that we do not currently allow more than 1 back-and-forth -->\n            <ConfirmationHeader type=\"detail\"\n                          noticeDate=\"2023-05-19\"\n                          confirmID=\"15\"\n                          operation=\"new\">\n                <!-- These elements are not used by Coupa -->\n                <Comments xml:lang=\"en-US\">Look's great</Comments>\n            </ConfirmationHeader>\n            <!-- orderID attr is an OrderHeader ID number that will become associated to the OrderConfirmation::Line -->\n            <OrderReference orderID=\"3177\" orderDate=\"2023-05-19\">\n                <DocumentReference payloadID=\"3177\" />\n            </OrderReference>\n            <!-- ConfirmationItem elements should be present to provide status information for individual line items in the order -->\n            <ConfirmationItem lineNumber=\"1\" quantity=\"23\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"23\" type=\"detail\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">18.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n            <ConfirmationItem lineNumber=\"2\" quantity=\"23\">\n                <UnitOfMeasure>EA</UnitOfMeasure>\n                <ConfirmationStatus quantity=\"23\" type=\"detail\" shipmentDate=\"2023-05-23\" deliveryDate=\"2023-05-25T20:07:00-08:00\">\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <UnitPrice>\n                        <Money currency=\"USD\">25.00</Money>\n                    </UnitPrice>\n                    <Comments xml:lang=\"en-US\"> supplier reaoson consideredother</Comments>\n                </ConfirmationStatus>\n            </ConfirmationItem>\n        </ConfirmationRequest>\n    </Request>\n</cXML>",
							"options": {
								"raw": {
									"language": "xml"
								}
							}
						},
						"url": {
							"raw": "{{cXML_URL}}/order_confirmation_request",
							"host": [
								"{{cXML_URL}}"
							],
							"path": [
								"order_confirmation_request"
							]
						}
					},
					"response": []
				}
			]
		},
		{
			"name": "cXML PO payload with SCC samples",
			"item": [
				{
					"name": "Sample_cxml_PO_payload_with_line_level_confirmation",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE cXML SYSTEM \"http://xml.cxml.org/schemas/cXML/1.2.056/cXML.dtd\">\n<cXML xml:lang=\"en-US\" payloadID=\"1686167108.003194@dmo305utl2.int.coupahost.com\" timestamp=\"2023-06-07T12:45:09-07:00\">\n    <Header>\n        <From>\n            <Credential domain=\"test\">\n                <Identity>test</Identity>\n            </Credential>\n        </From>\n        <To>\n            <Credential domain=\"test\">\n                <Identity>sfs</Identity>\n            </Credential>\n        </To>\n        <Sender>\n            <Credential domain=\"test\">\n                <Identity>test</Identity>\n                <SharedSecret>test</SharedSecret>\n            </Credential>\n            <UserAgent>Coupa Procurement 1.0</UserAgent>\n        </Sender>\n    </Header>\n    <Request>\n        <OrderRequest>\n            <OrderRequestHeader orderID=\"3194\" orderDate=\"2023-06-07T12:45:09-07:00\" type=\"new\">\n                <Total>\n                    <Money currency=\"USD\">920.0</Money>\n                </Total>\n                <ShipTo>\n                    <Address isoCountryCode=\"IN\" addressID=\"3128\">\n                        <Name xml:lang=\"en\">CoupaNetsuite</Name>\n                        <PostalAddress name=\"default\">\n                            <DeliverTo>Eshwar Valluripalli</DeliverTo>\n                            <Street>Sector 19</Street>\n                            <City>Delhi</City>\n                            <State>Delhi</State>\n                            <PostalCode>100001</PostalCode>\n                            <Country isoCountryCode=\"IN\">India</Country>\n                        </PostalAddress>\n                        <Email name=\"default\">eshwar.chowdary@coupa.com</Email>\n                    </Address>\n                </ShipTo>\n                <BillTo>\n                    <Address isoCountryCode=\"IN\" addressID=\"3169\">\n                        <Name xml:lang=\"en\">CoupaNetsuite</Name>\n                        <PostalAddress name=\"default\">\n                            <DeliverTo>Eshwar Valluripalli</DeliverTo>\n                            <Street>test</Street>\n                            <City>test India</City>\n                            <State></State>\n                            <PostalCode>944031</PostalCode>\n                            <Country isoCountryCode=\"IN\">India</Country>\n                        </PostalAddress>\n                        <Email name=\"default\">eshwar.chowdary@coupa.com</Email>\n                    </Address>\n                </BillTo>\n                <Shipping>\n                    <Money currency=\"USD\">0.0</Money>\n                    <Description xml:lang=\"en-US\">Fedex - </Description>\n                </Shipping>\n                <PaymentTerm payInNumberOfDays=\"15\"/>\n                <Contact role=\"endUser\">\n                    <Name xml:lang=\"en\">Eshwar Valluripalli</Name>\n                    <Email name=\"default\">eshwar.chowdary@coupa.com</Email>\n                </Contact>\n            </OrderRequestHeader>\n            <ItemOut quantity=\"23\" lineNumber=\"1\" confirmationDueDate=\"2023-06-08T12:45:09-07:00\">\n                <ItemID>\n                    <SupplierPartID></SupplierPartID>\n                </ItemID>\n                <ItemDetail>\n                    <UnitPrice>\n                        <Money currency=\"USD\">20.0</Money>\n                    </UnitPrice>\n                    <Description xml:lang=\"en\">adfseq</Description>\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <Classification domain=\"UNSPSC\">unknown</Classification>\n                    <ManufacturerPartID></ManufacturerPartID>\n                    <ManufacturerName xml:lang=\"en\"></ManufacturerName>\n                    <Extrinsic name=\"LineType\">Quantity</Extrinsic>\n                </ItemDetail>\n                <Distribution>\n                    <Accounting name=\"Honeycomb Holdings Inc.\">\n                        <Segment type=\"Subsidiary\" id=\"3\" description=\"Subsid\"/>\n                    </Accounting>\n                    <Charge>\n                        <Money currency=\"USD\">460.0</Money>\n                    </Charge>\n                </Distribution>\n                <!-- When customer doesn't want a PO line to go through confirmation, value will be sent as notAllowed in the OCInstruction -->\n                <ControlKeys>\n                    <OCInstruction value=\"allowed\"/>\n                </ControlKeys>\n            </ItemOut>\n            <ItemOut quantity=\"23\" lineNumber=\"2\" confirmationDueDate=\"2023-06-08T12:45:09-07:00\">\n                <ItemID>\n                    <SupplierPartID></SupplierPartID>\n                </ItemID>\n                <ItemDetail>\n                    <UnitPrice>\n                        <Money currency=\"USD\">20.0</Money>\n                    </UnitPrice>\n                    <Description xml:lang=\"en\">adfseq</Description>\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <Classification domain=\"UNSPSC\">unknown</Classification>\n                    <ManufacturerPartID></ManufacturerPartID>\n                    <ManufacturerName xml:lang=\"en\"></ManufacturerName>\n                    <Extrinsic name=\"LineType\">Quantity</Extrinsic>\n                </ItemDetail>\n                <Distribution>\n                    <Accounting name=\"Honeycomb Holdings Inc.\">\n                        <Segment type=\"Subsidiary\" id=\"3\" description=\"Subsid\"/>\n                    </Accounting>\n                    <Charge>\n                        <Money currency=\"USD\">460.0</Money>\n                    </Charge>\n                </Distribution>\n                <!-- When customer doesn't want a PO line to go through confirmation, value will be sent as notAllowed in the OCInstruction -->\n                <ControlKeys>\n                    <OCInstruction value=\"allowed\"/>\n                </ControlKeys>\n            </ItemOut>\n        </OrderRequest>\n    </Request>\n</cXML>",
							"options": {
								"raw": {
									"language": "xml"
								}
							}
						},
						"url": {
							"raw": "REFER TO BODY SECTION TO SEE COUPA PO PAYLAOD SAMPLE",
							"host": [
								"REFER TO BODY SECTION TO SEE COUPA PO PAYLAOD SAMPLE"
							]
						}
					},
					"response": []
				},
				{
					"name": "Sample_cxml_PO_payload_with_header_level_confirmation",
					"request": {
						"method": "POST",
						"header": [],
						"body": {
							"mode": "raw",
							"raw": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE cXML SYSTEM \"http://xml.cxml.org/schemas/cXML/1.2.056/cXML.dtd\">\n<cXML xml:lang=\"en-US\" payloadID=\"1686168019.003195@dmo305utl1.int.coupahost.com\" timestamp=\"2023-06-07T13:00:19-07:00\">\n    <Header>\n        <From>\n            <Credential domain=\"test\">\n                <Identity>test</Identity>\n            </Credential>\n        </From>\n        <To>\n            <Credential domain=\"test\">\n                <Identity>sfs</Identity>\n            </Credential>\n        </To>\n        <Sender>\n            <Credential domain=\"test\">\n                <Identity>test</Identity>\n                <SharedSecret>test</SharedSecret>\n            </Credential>\n            <UserAgent>Coupa Procurement 1.0</UserAgent>\n        </Sender>\n    </Header>\n    <Request>\n        <OrderRequest>\n            <OrderRequestHeader orderID=\"3195\" orderDate=\"2023-06-07T13:00:19-07:00\" type=\"new\">\n                <Total>\n                    <Money currency=\"USD\">28290.0</Money>\n                </Total>\n                <ShipTo>\n                    <Address isoCountryCode=\"IN\" addressID=\"3128\">\n                        <Name xml:lang=\"en\">CoupaNetsuite</Name>\n                        <PostalAddress name=\"default\">\n                            <DeliverTo>Eshwar Valluripalli</DeliverTo>\n                            <Street>Sector 19</Street>\n                            <City>Delhi</City>\n                            <State>Delhi</State>\n                            <PostalCode>100001</PostalCode>\n                            <Country isoCountryCode=\"IN\">India</Country>\n                        </PostalAddress>\n                        <Email name=\"default\">eshwar.chowdary@coupa.com</Email>\n                    </Address>\n                </ShipTo>\n                <BillTo>\n                    <Address isoCountryCode=\"IN\" addressID=\"3169\">\n                        <Name xml:lang=\"en\">CoupaNetsuite</Name>\n                        <PostalAddress name=\"default\">\n                            <DeliverTo>Eshwar Valluripalli</DeliverTo>\n                            <Street>test</Street>\n                            <City>test India</City>\n                            <State></State>\n                            <PostalCode>944031</PostalCode>\n                            <Country isoCountryCode=\"IN\">India</Country>\n                        </PostalAddress>\n                        <Email name=\"default\">eshwar.chowdary@coupa.com</Email>\n                    </Address>\n                </BillTo>\n                <Shipping>\n                    <Money currency=\"USD\">0.0</Money>\n                    <Description xml:lang=\"en-US\">Fedex - </Description>\n                </Shipping>\n                <PaymentTerm payInNumberOfDays=\"15\"/>\n                <Contact role=\"endUser\">\n                    <Name xml:lang=\"en\">Eshwar Valluripalli</Name>\n                    <Email name=\"default\">eshwar.chowdary@coupa.com</Email>\n                </Contact>\n                <!-- When customer doesn't want a PO to go through confirmation, value will be sent as notAllowed in the OCInstruction -->\n                <ControlKeys>\n                    <OCInstruction value=\"allowed\"/>\n                </ControlKeys>\n            </OrderRequestHeader>\n            <ItemOut quantity=\"123\" lineNumber=\"1\" confirmationDueDate=\"2023-06-17T17:00:19-07:00\">\n                <ItemID>\n                    <SupplierPartID></SupplierPartID>\n                </ItemID>\n                <ItemDetail>\n                    <UnitPrice>\n                        <Money currency=\"USD\">230.0</Money>\n                    </UnitPrice>\n                    <Description xml:lang=\"en\">adfs</Description>\n                    <UnitOfMeasure>EA</UnitOfMeasure>\n                    <Classification domain=\"UNSPSC\">unknown</Classification>\n                    <ManufacturerPartID></ManufacturerPartID>\n                    <ManufacturerName xml:lang=\"en\"></ManufacturerName>\n                    <Extrinsic name=\"LineType\">Quantity</Extrinsic>\n                </ItemDetail>\n                <Distribution>\n                    <Accounting name=\"Honeycomb Holdings Inc.\">\n                        <Segment type=\"Subsidiary\" id=\"3\" description=\"Subsid\"/>\n                    </Accounting>\n                    <Charge>\n                        <Money currency=\"USD\">28290.0</Money>\n                    </Charge>\n                </Distribution>\n            </ItemOut>\n        </OrderRequest>\n    </Request>\n</cXML>",
							"options": {
								"raw": {
									"language": "xml"
								}
							}
						},
						"url": {
							"raw": "REFER TO BODY SECTION TO SEE COUPA PO PAYLAOD SAMPLE",
							"host": [
								"REFER TO BODY SECTION TO SEE COUPA PO PAYLAOD SAMPLE"
							]
						}
					},
					"response": []
				}
			]
		}
	]
}

The cXML credentials for the Order Confirmations is the same as for credentials for cXML invoicing or cXML ASNs. No custom fields are supported today as part of Order Confirmations.

Suppliers post the Order Confirmations cXML file to https://<customer_instance_name>.coupahost.com/cxml/order_confirmation_request

Helpful info on Order Confirmations can be found  here.

Suppliers can also upload a CSV file directly in the CSP portal to bulk confirm multiple orders and the details related to the fields is available here.

cXML Matrix for Confirmation Type

Below sample matrix depicts how the header level type flag in cXML payload should be based on line type combinations and if this is not followed, sample cXML error can be as:

ConfirmationItem should match ConfirmationHeader when ConfirmationHeader type is either Accept or Reject.

cXML Line 1 Type cXML Line 2 Type cXML Header Type
accept  accept  accept 
reject reject reject
accept  reject detail
detail accept detail
detail reject detail
detail detail detail

If the Need By date is blank on the current PO line provided by the customer, adding the promised date is considered as proposing a change so the type should be provided as detail.

Related Items


Supported cXML DTD Version Per Document Type

Coupa supports certain cXML DTD Versions per document type.

TLS/SSL Errors during PO Transmission

17 September 2018

Coupa does not support SSL client certificate authentication and requires the supplier to remove this restriction.

Add Tax Exemption Details to an Invoice

04 September 2020

Add an Encoded Attachment to a cXML Invoice

25 October 2024

Learn how to transmit invoice attachments as part of the invoice cXML.