Merchant API: order line fulfillment via multiple systems
About this article
This article describes how to process multiline orders across multiple systems, e.g., your own merchant system and a 3PL solution such as Amazon Multi-Channel Fulfillment (Amazon MCF) or ZEOS Fulfillment.
Table of contents
How to backfill split orders with your 3PL provider
Example API response for a split order
Introduction
It is possible to split the fulfillment of a multiline order between a 3PL solution, like ZEOS Fulfillment, and your own warehouse management system via ChannelEngine. The 3PL solution manages order lines that it can fulfill, and your other warehouses backfill the remaining order lines.
However, this split-system setup is only possible if you fulfill those remaining order lines via the Merchant API. The 3PL provider manages order lines that it can fulfill, and your other warehouses backfill the remaining order lines.
Requirements
- Enable the advanced order management feature on ChannelEngine. For guidance, check out ChannelEngine: advanced order management [add-on].
- Via advanced order management, you manage your own stock locations and the stock locations of your 3PL provider on ChannelEngine.
- The integration between your 3PL provider's fulfillment system and ChannelEngine, e.g.: the Amazon MCF merchant plugin, is installed and active.
- The Merchant API integration between your warehouse management system and ChannelEngine is active.
Limitations
- Single-system acknowledgment - only one merchant system can send an acknowledgment to ChannelEngine, not both. The leading system acknowledges the order, and the lagging system backfills the remaining order lines.
- 3PL system leads acknowledgment - if you use a dedicated plugin for your 3PL provider, e.g.: Amazon MCF, do not acknowledge orders that contain order lines that the 3PL provider should fulfill. E.g.: if a ZEOS Fulfillment warehouse needs to fulfill order lines 1, 3, and 5, then leave the entire order unacknowledged.
- No order line acknowledgment - it is not possible to acknowledge specific order lines within an order.
- Backfill via the Merchant API - if your 3PL provider fulfills some order lines in an order, you backfill the remaining order lines via the Merchant API. You cannot backfill orders via the web interface.
How to backfill split orders with your 3PL provider
- Retrieve orders from ChannelEngine with statuses New and In progress. Check out the section Retrieve orders below to see how.
- Analyze New and In progress orders to check if they are split orders or merchant-fulfilled orders.
- Via the Merchant API, only acknowledge merchant-fulfilled orders whose order lines all belong to your own warehouses.
- Fulfill your own order lines via the Merchant API.
Retrieve orders
To retrieve orders that multiple systems fulfill, use the GET v2/orders endpoint with the following parameters:
Request parameters
| Parameter | Description |
statuses=NEW&statuses=IN_PROGRESS |
Filters for New and In progress orders. |
stockLocationIds=YOUR_WAREHOUSE_ID |
Filters on order lines that you must fulfill from your own warehouses. If there are remaining order lines on the order, do not acknowledge the order. |
fulfillmentType=ONLY_MERCHANT |
Filters for orders that you and your 3PL providers must fulfill. |
channelIds=X |
Designates the channels whose orders you want to import by their respective IDs (replace X with the actual ID).
|
fromUpdatedAtDate=YYYY-MM-DD%2000:00:00 |
Filters on the specific date and time from which the given orders were updated. |
Example query with GET /v2/orders/
statuses=NEW&statuses=IN_PROGRESS&stockLocationIds=YOUR_WAREHOUSE_ID&fulfillmentType=ONLY_MERCHANT&channelIds=X&fromUpdatedAtDate=2026-08-01%2000:00:00
Order acknowledgement
Only acknowledge orders that you fully handle yourself. Any orders that you acknowledge are not sent to the 3PL provider's system.
- In the API response, if all the order lines have the same stock location ID [
StockLocation,Id], and if the ID belongs to your warehouse, you should acknowledge the order. - If the order lines have different stock location IDs, do not acknowledge the order.
If any other source - including your own order management system - acknowledges an order that is wholly or partially fulfilled by a 3PL provider prior to ChannelEngine exporting it to the respective 3PL system, the order is not exported to the 3PL provider's system.
Example API response for a split order
{
"Content": [
{
"Id": 1503,
"ChannelName": "Bol.com Plaza NL (v3)",
"ChannelId": 6,
"GlobalChannelName": "Bol.com Plaza NL (v3)",
"GlobalChannelId": 567,
"ChannelOrderSupport": "SPLIT_ORDER_LINES",
"ChannelOrderNo": "CE-TEST-96293",
"CommercialOrderNo": "CE-TEST-96293",
"MerchantOrderNo": "ZEOS-1",
"Status": "IN_PROGRESS",
"IsBusinessOrder": false,
"IsTest": true,
"AcknowledgedDate": "2025-08-11T11:28:39.771072+02:00",
"CreatedAt": "2025-08-11T11:16:42.331124+02:00",
"UpdatedAt": "2025-08-11T11:28:40.168235+02:00",
"ClosedAt": null,
"MerchantComment": null,
"BillingAddress": {
"Line1": "Teststreet 22",
"Line2": null,
"Line3": null,
"Gender": "NOT_APPLICABLE",
"CompanyName": "",
"FirstName": "T.",
"LastName": "Tester",
"StreetName": "Teststreet",
"HouseNr": "22",
"HouseNrAddition": "",
"ZipCode": "1111 TT",
"City": "Testtown",
"Region": "",
"CountryIso": "NL",
"Original": "Teststreet 22"
},
"ShippingAddress": {
"Line1": "Teststreet 22",
"Line2": null,
"Line3": null,
"Gender": "NOT_APPLICABLE",
"CompanyName": "",
"FirstName": "T.",
"LastName": "Tester",
"StreetName": "Teststreet",
"HouseNr": "22",
"HouseNrAddition": "",
"ZipCode": "1111 TT",
"City": "Testtown",
"Region": "",
"CountryIso": "NL",
"Original": "Teststreet 22"
},
"SubTotalInclVat": 0,
"SubTotalVat": 0,
"ShippingCostsInclVat": 0,
"ShippingCostsVat": 0,
"TotalInclVat": 0,
"TotalVat": 0,
"OriginalSubTotalInclVat": 0,
"OriginalSubTotalVat": 0,
"OriginalShippingCostsInclVat": 0,
"OriginalShippingCostsVat": 0,
"OriginalTotalInclVat": 0,
"OriginalTotalVat": 0,
"SubTotalExclVat": 0,
"TotalExclVat": 0,
"ShippingCostsExclVat": 0,
"OriginalSubTotalExclVat": 0,
"OriginalShippingCostsExclVat": 0,
"OriginalTotalExclVat": 0,
"OriginalSubTotalFee": 0,
"SubTotalFee": 0,
"OriginalOrderFee": 0,
"OrderFee": 0,
"OriginalTotalFee": 0,
"TotalFee": 0,
"Lines": [
{
"Id": 6897,
"ChannelOrderLineNo": null,
"Status": "IN_PROGRESS",
"IsFulfillmentByMarketplace": false,
"Gtin": null,
"Description": "Nice Jacket 2.0 - XS",
"StockLocation": {
"Id": 1,
"Name": "Default Warehouse"
},
"UnitVat": 0,
"LineTotalInclVat": 0,
"LineVat": 0,
"OriginalUnitPriceInclVat": 0,
"OriginalUnitVat": 0,
"OriginalLineTotalInclVat": 0,
"OriginalLineVat": 0,
"OriginalFeeFixed": 0,
"BundleProductMerchantProductNo": null,
"BundleOrderLineId": null,
"JurisCode": null,
"JurisName": null,
"VatRate": 21,
"UnitPriceExclVat": 0,
"LineTotalExclVat": 0,
"OriginalUnitPriceExclVat": 0,
"OriginalLineTotalExclVat": 0,
"ExtraData": [],
"ChannelProductNo": "10577",
"MerchantProductNo": "A132206_444_100",
"Quantity": 1,
"CancellationRequestedQuantity": 0,
"UnitPriceInclVat": 0,
"FeeFixed": 0,
"FeeRate": 0,
"Condition": "UNKNOWN",
"ExactDeliveryDate": null,
"ExpectedDeliveryDate": null,
"LatestDeliveryDate": null,
"ExactShipmentDate": null,
"ExpectedShipmentDate": null,
"LatestShipmentDate": null
},
{
"Id": 6898,
"ChannelOrderLineNo": null,
"Status": "IN_PROGRESS",
"IsFulfillmentByMarketplace": false,
"Gtin": null,
"Description": "Nice Jacket 2.0 - XL",
"StockLocation": {
"Id": 20,
"Name": "ZEOS TEST - Warehouse 1 - Bol"
},
"UnitVat": 0,
"LineTotalInclVat": 0,
"LineVat": 0,
"OriginalUnitPriceInclVat": 0,
"OriginalUnitVat": 0,
"OriginalLineTotalInclVat": 0,
"OriginalLineVat": 0,
"OriginalFeeFixed": 0,
"BundleProductMerchantProductNo": null,
"BundleOrderLineId": null,
"JurisCode": null,
"JurisName": null,
"VatRate": 21,
"UnitPriceExclVat": 0,
"LineTotalExclVat": 0,
"OriginalUnitPriceExclVat": 0,
"OriginalLineTotalExclVat": 0,
"ExtraData": [],
"ChannelProductNo": "10367",
"MerchantProductNo": "A132206_444_103",
"Quantity": 1,
"CancellationRequestedQuantity": 0,
"UnitPriceInclVat": 0,
"FeeFixed": 0,
"FeeRate": 0,
"Condition": "UNKNOWN",
"ExactDeliveryDate": null,
"ExpectedDeliveryDate": null,
"LatestDeliveryDate": null,
"ExactShipmentDate": null,
"ExpectedShipmentDate": null,
"LatestShipmentDate": null
}
],
"BundleOrderLines": [],
"Phone": "+31711000000",
"Email": "test@channelengine.net",
"LanguageCode": null,
"CompanyRegistrationNo": null,
"VatNo": null,
"PaymentMethod": "iDEAL",
"PaymentReferenceNo": null,
"CurrencyCode": "EUR",
"OrderDate": "2025-08-11T11:16:42.322316+02:00",
"ChannelCustomerNo": null,
"ExtraData": {
"VAT_CALCULATION_METHOD_KEY": "FROM_PRICE_INCL"
}
}
],
"Count": 1,
"TotalCount": 1,
"ItemsPerPage": 100,
"StatusCode": 200,
"RequestId": null,
"LogId": null,
"Success": true,
"Message": null,
"ExceptionType": null,
"ValidationErrors": {}
}The first order line has the StockLocation set to your Default warehouse on ChannelEngine, with ID = 1. This means that the order line should be fulfilled by you. The second order line has the StockLocation set to ZEOS TEST - Warehouse 1 - Bol, with a different stock location ID. This means that the order line is fulfilled by ZEOS via its order fulfillment system.
Please keep in mind that these names and values are examples and may differ from real-life API responses.
Comments
0 comments
Article is closed for comments.