There's a sublist on the Item Fulfillment record that a lot of NetSuite users scroll right past. The Packages sublist captures physical shipping package details for the shipment: the individual boxes, cartons, or parcels that make up the fulfillment.
It's not glamorous. But if you're integrating with a carrier, troubleshooting tracking number issues, or building fulfillment automation in SuiteScript, understanding this sublist saves time.
What It Records
When you fulfill an order, the items may ship in one or more physical packages. The Packages sublist lets you record:
- How many packages the shipment consists of.
- The weight of each package, used for shipping cost calculation and carrier compliance.
- Tracking numbers for each individual package, entered manually or populated automatically via a shipping integration (ShipStation, FedEx, UPS, etc.).
- Package dimensions (length, width, height), required by some carriers for dimensional weight rating.
The exact fields available depend on which shipping integrations you have enabled. Accounts without an integrated shipping solution may see a reduced field set.
What It Feeds Into
The data on this sublist isn't just for record-keeping. It drives several downstream processes:
- Shipping label generation via NetSuite's native shipping integrations.
- Customer-facing tracking. Tracking numbers flow to the Sales Order and into shipment confirmation emails.
- Carrier manifests required for end-of-day carrier pickups when using integrated shipping.
- Landed cost allocation. Package weights can influence how freight is allocated across lines.
How It Gets Populated
Two paths, depending on your setup.
Manually: A warehouse user adds a package line for each box, enters the weight and tracking number, and saves the fulfillment. Straightforward but only practical at low volumes.
Automatically via shipping integration: When using NetSuite's native integrations with carriers like FedEx or UPS, or third-party connectors like ShipStation or EasyPost, the integration sends package weight and dimensions to the carrier, receives back a tracking number and label, and writes the tracking number back to the Packages sublist automatically.
What It Is Not For
This is an important distinction. The Packages sublist is separate from the Items sublist on the fulfillment. It does not track which specific items are in which package. It's purely a physical shipment logistics record.
NetSuite does not natively support item-to-package assignment ("item A is in box 1, item B is in box 2") without customization. If your warehouse needs that level of detail, you're looking at custom fields or a WMS integration.
Working with Packages in SuiteScript
If you're automating fulfillment creation or need to read package data programmatically, here's what reading from the Packages sublist looks like:
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define(['N/record', 'N/log'], (record, log) => {
const afterSubmit = (context) => {
try {
if (context.type !== context.UserEventType.CREATE) return;
const fulfillment = context.newRecord;
// VERIFY: 'package' is the sublist ID for the Packages sublist —
// confirm in the Records Browser under itemfulfillment
const lineCount = fulfillment.getLineCount({ sublistId: 'package' });
log.debug({
title: 'Package lines on fulfillment',
details: lineCount
});
// Reading a tracking number from an existing package line
const trackingNumber = fulfillment.getSublistValue({
sublistId: 'package', // VERIFY this sublist ID
fieldId: 'packagetrackingnumber', // VERIFY this field ID
line: 0
});
log.debug({ title: 'Tracking number line 0', details: trackingNumber });
} catch (e) {
log.error({ title: e.name, details: `${e.message} — ${e.stack}` });
}
};
return { afterSubmit };
});
A note on the field IDs: the sublist ID package and field ID packagetrackingnumber are based on naming conventions. Confirm both in the Records Browser under the itemfulfillment record type before using in production. A wrong sublist or field ID won't throw a helpful error. It will just return null or zero, which is harder to debug than it should be.
When It Matters Most
The role of the Packages sublist depends on your fulfillment approach:
- Integrated shipping (FedEx, UPS, ShipStation): Central to the workflow. Tracking numbers are written back automatically and flow to the customer.
- Manual fulfillment, no carrier integration: Optional but useful for tracking and landed cost purposes.
- High-volume warehouse with SuiteScript automation: You may need to script the population of package lines as part of fulfillment creation.
It's a small sublist. But when tracking numbers aren't showing up on customer emails, or shipping costs aren't calculating correctly, this is usually where the trail leads.