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 orders across multiple systems
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 channel 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, via the merchant plugin, 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.
- An integration between your 3PL provider's fulfillment system and ChannelEngine, e.g.: the Amazon MCF merchant plugin.
- An integration between your warehouse management system and ChannelEngine.
Limitations
- 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.
- 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.
- If you acknowledge an order that contains order lines that your 3PL provider fulfills, then the 3PL provider does not receive the order and cannot fulfill it.
- It is not possible to acknowledge specific order lines within an order.
- If your 3PL provider fulfills some order lines in an order, you can only backfill the remaining order lines via the Merchant API.
How to backfill orders across multiple systems
- Retrieve orders from ChannelEngine with statuses New and In progress.
- Analyze New and In progress orders to check if they are split orders or merchant-fulfilled orders.
- Only acknowledge merchant-fulfilled orders via the Merchant API.
- Fulfill the unfulfilled order lines on the split orders via the Merchant API.
Retrieve orders
To retrieve orders that multiple systems fulfill, use the GET v2/orders endpoint with specific filters to fetch orders with statuses:
- New - unacknowledged orders
-
In progress - acknowledged orders, which fall into two categories:
- Orders fulfilled via 3PL warehouses, e.g.: Amazon Multi-Channel Fulfillment
- Merchant-fulfilled orders that you manually acknowledge on the web interface at Orders, Order details.
You need to retrieve orders in both of these statuses to view orders that the channel might have partially shipped, but still have lines remaining to be shipped by you as well.
To retrieve orders:
- Use the
GET /v2/ordersendpoint in the Merchant API, with the following parameters:-
statuses=NEW&statuses=IN_PROGRESS- New and In progress orders. -
fulfillmentType=ONLY_MERCHANT- orders that are not fulfilled directly by a given marketplace but are imported to ChannelEngine for further processing by one of your connected systems. -
channelIds=X- designate the channels whose orders you want to import by their respective IDs . -
fromUpdatedAtDate=YYYY-MM-DD%2000:00:00- filter on the date and time from which the given orders were updated.
-
Order acknowledgement
Proper order acknowledgement on ChannelEngine is critical for enabling partial fulfillment across multiple connected systems. To ensure that you correctly route orders via the 3PL provider's plugin and your own warehouse management system, use the GET v2/orders response to decide if the order is either:
- Fully merchant-fulfilled
- Fully or partially fulfilled via the 3PL provider, e.g.: ZEOS Fulfillment
Then, make sure not to acknowledge orders where any order lines are processed via the 3PL provider - even if the 3PL provider only partially fulfills the order.
The 3PL provider only processes orders that are left fully unacknowledged on ChannelEngine.
If any other source - including your Merchant API integration - acknowledges an order that is fulfilled by a multichannel fulfillment service prior to ChannelEngine exporting it to the respective channel-fulfillment plugin, the order is not exported to the multichannel fulfillment service's system.
Merchant-fulfilled orders
Merchant-fulfilled orders are orders that you ship yourself instead of letting them be shipped by the channel.
Only acknowledge orders that you fully handle yourself. If you acknowledge a given order, it is not sent to the channel-fulfillment plugin.
- 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.
Orders fulfilled via multichannel fulfillment solutions
Orders that 3PL providers, such as a multichannel fulfillment solution, need to fulfill are orders that you generally do not ship yourself but do import into your order management system for financial purposes or further processing.
However, some order lines may need to be backfilled by you. Analyze these orders to check if there are order lines that you still need to fulfill from your own warehouse:
- Orders fulfilled via multichannel fulfillment solutions have different stock location IDs from your own stock location IDs.
- If any order lines have different stock location IDs from your own, do not acknowledge the order.
Split orders
Split orders have order lines that have different stock location IDs.
- If the order lines have different stock location IDs than your own, do not acknowledge the order.
- If one or more of the stock location IDs belong to your own warehouses, then fulfill the order lines that are linked to your warehouses.
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 channel-fulfillment plugin.
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.