Fulfillment Creation Failure for NetSuite

The typical use case is - order is pulled from a selling channel, a 3PL fulfills it and sends fulfillments back to Pipe17, then we want to send fulfillments back to NetSuite (by creating Item Fulfillment on the order in NetSuite).

However, there are some use cases where fulfillments fail to flow to NetSuite and normally Fulfillment Creation Failure exceptions will be fired for such cases. I’ll put the most common ones as below, explain what these exceptions stand for and how to get them resolved.

When we see an item internalId shows up in the error message

Example exception detail message:

"sync fulfillment to NetSuite error:'108872'"

This issue is usually due to certain manual SKU changes on at least one of the line items when it’s in flight. For example, order 6945 got created in NetSuite with item 76659 first - 76659 refers to NetSuite internalId which is uniqueness in NetSuite, assume the SKU for the item is TEST123; then the order got fulfilled in Pipe17 by a 3PL, we were going to send fulfillments back to NetSuite. However, someone manually edited item 76659 before that point of time by updating the SKU from TEST123 to TEST123-1, at the same time another item in NetSuite that has internalId 108872 got updated in terms of SKU and now item 108872 owns SKU TEST123. After that we tried to send fulfillments back to NetSuite, we first looked up SKU TEST123 in NetSuite, found the item and tried to created Item Fulfillment for it, however it would error out because that specific item (that as SKU TEST123, internalId 108872) cannot be found in the original order (that used to have SKU TEST123 as a line item which had been updated to TEST123-1, internalId 76659) This is exactly where the exception got fired.

We should be aware that internalId is the unique identifier in NetSuite, so we just can’t fulfill an item if it’s never placed in the order. To avoid this exception, we have to make sure of not making in-flight SKU changes otherwise NetSuite would reject the API request.

When we see an order line mismatch

Example exception detail message:

An error occurred in a add request: Unable to find a matching line for sublist item with key: [orderLine] and value: [1]

There are a couple of common use cases where we see such an error:

  1. Items got fulfilled cannot be found in the order. Occasionally, 3PL would fulfill an item that doesn’t come from the original order, Pipe17 allows it whereas NetSuite doesn’t. Or, SKU gets updated or deleted then re-created with a different product ID in NetSuite after Sales Order is created but before Item Fulfillment is created in NetSuite. The in-flight changes will cause fulfillment creation failures so we need try to avoid it.

  2. A portion of the line items have already been fulfilled manually or by another automation in NetSuite. There is no way to anticipate whether/when that would happen so we should at least be aware of this orderLine mismatch failure could occur in such case. To send it through we have to remove/delete the Item Fulfillment that has been created ahead of our automation and rerun the failed fulfillment event in Pipe17.

  3. If some line items are back ordered(out of stock at the fulfillment location), we might encounter such exception as well. To get over it we need to either skip the back ordered line or replenish the back-ordered items and rerun the failed fulfillment event. To skip it, you can refer to the setting “Skip back-ordered line tem when it’s partial fulfillment“ in NetSuite Ecommerce connector settings and make sure it’s enabled.

  4. The line item shows zero comitted in the order in NetSuite. For this use case sometimes NetSuite will ask for a full line items list for Item Fulfillment creation, sometimes it doesn’t allow us to submit the full line items list and only allows us to submit the line item that has non-zero comitted quanitity. Now there is a controllable setting called “Skip 0 committed order line when submitting IF in NetSuite“ as you can see in NetSuite Ecommerce connector which is disabled by default, but you can turn it on if you see some order lines have 0 comitted number in the order when it comes to fulfillment creation failures.

When an empty line item list is submitted

Example exception detail message:

An error occurred in an add request: You must enter at least one line item for this transaction.

Basically there are are two possible use cases for this issue:

  1. NetSuite doesn’t allow the order to be fulfilled, most of the time there would be no Fulfill button/entry on the order transaction in UI NetSuite in this case. This has something to do with certain NetSuite setups so needs to be resolved on NetSuite side.

  2. Items got ignored on purpose:

    1. The item is not a fulfillable item in NetSuite. For example a virtual item that cannot be fulfilled in NetSuite but somehow gets fulfilled in Pipe17. To avoid this we need to make sure the item fulfilled in Pipe17 can be fulfilled in NetSuite as well.

    2. The item has Null committed in NetSuite. We have such logic to skip Null committed SKU for fulfillment when creating Item Fulfillment in NetSuite. The idea is we notice items that have Null committed normally refers to non-fulfillable items. However there are chances where all line items that are placed in the order are skipped.

  3. If all line items are back ordered(out of stock at the fulfillment location), or all comitted with 0 quantities we might encounter such exception as well. The solution is put in the above section about order line mismatch, please take a look.

Other common use cases

There are also other scenarios where we can’t fulfill the order in NetSuite, for example the order transaction is closed/canceled in NetSuite, or a specific line is closed, or probably in a closed/invalid period. Or inventory detail configuration is required for fulfillments where it’s not supported at NetSuite API. But most of the time, the first thing that we can try is to look at NetSuite UI and see if we can do it through the UI, if UI doesn’t allow it, nine out of ten API would reject the request too.