Unable to Create Item Fulfillment with Serial Number Inventory Detail

Hi All,

I am stuck on this one. I am trying to create an item fulfillment for dropshipped lines of Sales Orders but with serialized items.

I keep getting this error even though the serial number should be set: "Failed to save record because Please enter value(s) for: Serial/Lot Number"

What am I missing?

Base Item Fulfillment Mapping:

Inventory Detail Subrecord Mapping:

Retry Data:

[
  {
    "id": "17771176",
    "order_number": "SO677778",
    "po_number": "PO57900",
    "date": "05/12/2025",
    "fulfillment_number": "IF735330",
    "fulfillment_id": "17771176",
    "tracking": [
      {
        "trackingNumber": "1Z9999991111",
        "weight": 31.04
      }
    ],
    "item": "IGNORETHIS",
    "item_uhs_sku": "EXAMPLESKU",
    "quantity": "1",
    "weight": "31.04",
    "serial_number": "test-serial-1"
  }
]

Request:

importing record {
    "index": 0,
    "retryCount": 0
}
{
    "nlobjRecordType": "itemfulfillment",
    "nlobjFieldIds": {
        "celigo_nlobjTransformId": 29208845,
        "custbody_intercompany_fulfillment": "IF735330",
        "custbody_intercompany_transaction": "SO677778",
        "shipstatus": "Shipped",
        "celigo_write_log": "true",
        "celigo_ignore_mandatory_fields": "true",
        "internalid": ""
    },
    "nlobjSublistIds": {
        "item": [
            {
                "itemname": "EXAMPLESKU",
                "quantity": "1",
                "itemreceive": "true",
                "celigo_inventorydetail": {
                    "nlobjRecordType": "inventorydetail",
                    "nlobjFieldIds": {
                        "celigo_write_log": "true",
                        "celigo_ignore_mandatory_fields": "true"
                    },
                    "nlobjSublistIds": {
                        "inventoryassignment": [
                            {
                                "issueinventorynumber": "test-serial-1",
                                "quantity": "1"
                            }
                        ]
                    }
                }
            }
        ],
        "package": [
            {
                "packagetrackingnumber": "1Z9999991111",
                "packageweight": 31.04
            }
        ]
    }
}
nlapi calls registered for $R:
r = NRecord.transform({
    "fromType": "salesorder",
    "fromId": 29208845,
    "toType": "itemfulfillment",
    "defaultValues": {}
});	
r.setValue({
    "fieldId": "custbody_intercompany_fulfillment",
    "value": "IF735330"
});	
r.setValue({
    "fieldId": "custbody_intercompany_transaction",
    "value": "SO677778"
});	
r.setText({
    "fieldId": "shipstatus",
    "text": "Shipped"
});	
r.selectLineItem({
    "sublistId": "item",
    "line": 0
});	
r.setSublistValue({
    "sublistId": "item",
    "fieldId": "itemname",
    "line": 0,
    "value": "EXAMPLESKU"
});	
r.setSublistValue({
    "sublistId": "item",
    "fieldId": "quantity",
    "line": 0,
    "value": "1"
});	
r.setSublistValue({
    "sublistId": "item",
    "fieldId": "itemreceive",
    "line": 0,
    "value": true
});	
sr = r.getSublistSubrecord({
    "sublistId": "item",
    "fieldId": "inventorydetail",
    "line": 0
});	
sr.insertLine({
    "sublistId": "inventoryassignment",
    "line": 0
});	
sr.setSublistValue({
    "sublistId": "inventoryassignment",
    "fieldId": "issueinventorynumber",
    "line": 0,
    "value": "test-serial-1"
});	
sr.setSublistValue({
    "sublistId": "inventoryassignment",
    "fieldId": "quantity",
    "line": 0,
    "value": "1"
});	
r.setSublistValue({
    "sublistId": "item",
    "fieldId": "line",
    "line": 0,
    "value": "1"
});	
r.insertLine({
    "sublistId": "package",
    "line": 0
});	
r.setSublistValue({
    "sublistId": "package",
    "fieldId": "packagetrackingnumber",
    "line": 0,
    "value": "1Z9999991111"
});	
r.setSublistValue({
    "sublistId": "package",
    "fieldId": "packageweight",
    "line": 0,
    "value": 31.04
});	
r.save({
    "enableSourcing": false,
    "ignoreMandatoryFields": true
});

I ended up just mapping to a custom column and made a UserEventScript that handles the inventory detail serial number assignment.

A solution without the UE Script would be ideal though.

I'm curious to see what happens if you transform the data prior to getting to this NetSuite step. I've seen strange behavior before when working with the rows structure.

{
  "id": "17771176",
  "order_number": "SO677778",
  "po_number": "PO57900",
  "date": "05/12/2025",
  "fulfillment_number": "IF735330",
  "fulfillment_id": "17771176",
  "items": [
    {
      "item": "IGNORETHIS",
      "item_uhs_sku": "EXAMPLESKU",
      "quantity": "1",
      "weight": "31.04",
      "inventory_detail": [
        {
          "quantity": "1",
          "serial_number": "test-serial-1"
        }
      ]
    }
  ],
  "packages": [
    {
      "trackingNumber": "1Z9999991111",
      "weight": 31.04
    }
  ]
}

I will test that and report back.

I initially wanted it this way anyways, but another issue had me revert back.

The same issue occurs.

{
  "id": "17778028",
  "order_number": "SO677695",
  "po_number": "PO57899",
  "date": "05/19/2025",
  "fulfillment_number": "IF735355",
  "fulfillment_id": "17778028",
  "tracking": [
    {
      "trackingNumber": "1Ztest456",
      "weight": 34.97
    },
    {
      "trackingNumber": "1Ztest123",
      "weight": 34.97
    }
  ],
  "items": [
    {
      "item": "XHO-EK-XP-005L-001",
      "item_uhs_sku": "XHS-XP005L",
      "quantity": "1",
      "weight": "38.9",
      "inventory_detail": [
        {
          "quantity": "1"
        }
      ]
    },
    {
      "item": "XHO-EK-XP-007-001",
      "item_uhs_sku": "XHS-DOLPHIN-XP-007",
      "quantity": "1",
      "weight": "31.04",
      "inventory_detail": [
        {
          "quantity": "1",
          "serial_number": "test-serial-1"
        }
      ]
    }
  ]
}
importing record {"index":0,"retryCount":0}
{"nlobjRecordType":"itemfulfillment","nlobjFieldIds":{"celigo_nlobjTransformId":29208340,"custbody_intercompany_fulfillment":"IF735355","custbody_intercompany_transaction":"SO677695","shipstatus":"Shipped","celigo_write_log":"true","celigo_ignore_mandatory_fields":"true","internalid":""},"nlobjSublistIds":{"item":[{"itemname":"XHS-XP005L","quantity":"1","itemreceive":"true","celigo_inventorydetail":{"nlobjRecordType":"inventorydetail","nlobjFieldIds":{"celigo_replaceAllLines_inventoryassignment":"true"},"nlobjSublistIds":{"inventoryassignment":[{"quantity":"1"}]}}},{"itemname":"XHS-DOLPHIN-XP-007","quantity":"1","custcol_serial_numbers":"test-serial-1","itemreceive":"true","celigo_inventorydetail":{"nlobjRecordType":"inventorydetail","nlobjFieldIds":{"celigo_replaceAllLines_inventoryassignment":"true"},"nlobjSublistIds":{"inventoryassignment":[{"issueinventorynumber":"test-serial-1","quantity":"1"}]}}}],"package":[{"packagetrackingnumber":"1Ztest456","packageweight":34.97},{"packagetrackingnumber":"1Ztest123","packageweight":34.97}]}}
nlapi calls registered for $R:
r = NRecord.transform({"fromType":"salesorder","fromId":29208340,"toType":"itemfulfillment","defaultValues":{}});	
r.setValue({"fieldId":"custbody_intercompany_fulfillment","value":"IF735355"});	
r.setValue({"fieldId":"custbody_intercompany_transaction","value":"SO677695"});	
r.setText({"fieldId":"shipstatus","text":"Shipped"});	
r.selectLineItem({"sublistId":"item","line":0});	
r.setSublistValue({"sublistId":"item","fieldId":"itemname","line":0,"value":"XHS-XP005L"});	
r.setSublistValue({"sublistId":"item","fieldId":"quantity","line":0,"value":"1"});	
r.setSublistValue({"sublistId":"item","fieldId":"itemreceive","line":0,"value":true});	
sr = r.getSublistSubrecord({"sublistId":"item","fieldId":"inventorydetail","line":0});	
sr.insertLine({"sublistId":"inventoryassignment","line":0});	
sr.setSublistValue({"sublistId":"inventoryassignment","fieldId":"quantity","line":0,"value":"1"});	
r.setSublistValue({"sublistId":"item","fieldId":"line","line":0,"value":"1"});	
r.selectLineItem({"sublistId":"item","line":1});	
r.setSublistValue({"sublistId":"item","fieldId":"itemname","line":1,"value":"XHS-DOLPHIN-XP-007"});	
r.setSublistValue({"sublistId":"item","fieldId":"quantity","line":1,"value":"1"});	
r.setSublistValue({"sublistId":"item","fieldId":"custcol_serial_numbers","line":1,"value":"test-serial-1"});	
r.setSublistValue({"sublistId":"item","fieldId":"itemreceive","line":1,"value":true});	
sr = r.getSublistSubrecord({"sublistId":"item","fieldId":"inventorydetail","line":1});	
sr.insertLine({"sublistId":"inventoryassignment","line":0});	
sr.setSublistValue({"sublistId":"inventoryassignment","fieldId":"issueinventorynumber","line":0,"value":"test-serial-1"});	
sr.setSublistValue({"sublistId":"inventoryassignment","fieldId":"quantity","line":0,"value":"1"});	
r.setSublistValue({"sublistId":"item","fieldId":"line","line":1,"value":"2"});	
r.insertLine({"sublistId":"package","line":0});	
r.setSublistValue({"sublistId":"package","fieldId":"packagetrackingnumber","line":0,"value":"1Ztest456"});	
r.setSublistValue({"sublistId":"package","fieldId":"packageweight","line":0,"value":34.97});	
r.insertLine({"sublistId":"package","line":1});	
r.setSublistValue({"sublistId":"package","fieldId":"packagetrackingnumber","line":1,"value":"1Ztest123"});	
r.setSublistValue({"sublistId":"package","fieldId":"packageweight","line":1,"value":34.97});	
r.save({"enableSourcing":false,"ignoreMandatoryFields":true});

I'd probably suggest a support ticket at this point and then hopefully you or support can update this thread with what the solution was.

I set up an "Ask an Expert" consultation, hopefully that can knock this out before I go to support.

It could also be that the serial number isn't in stock and available on the location you are fulfilling from.
NetSuite is very good in giving error messages that don't say why something is going wrong. :sweat_smile:

So what can happen is that Celigo tries to fill in the serial number, the value gets silently rejected by NS because it can't find the serial, and when saving it errors out because the field is empty.
My first try when I get these vague errors is to do the exact actions in the browser while logged in as the integration user, that often helps in figuring out what is going on exactly.

I’ve encountered this issue before and resolved it using the post-submit hook. Please try using the post-submit option, and let me know if you run into any issues — I’m happy to help.