How to Create an Item Fulfillment in NetSuite (Pick, Pack, Ship)
how to create an item fulfillment in NetSuite
Also searched as
- NetSuite pick pack ship setup
- NetSuite item fulfillment partial shipment
- NetSuite fulfill orders page
- NetSuite item fulfillment status picked packed shipped
Short answer
Open an approved sales order and click Fulfill, or use Transactions > Sales > Fulfill Orders to batch them, then set quantities and inventory detail and save. With the Pick, Pack and Ship feature on, the fulfillment moves through Picked, Packed and Shipped statuses, and inventory and cost of goods post when it reaches Shipped.
Applies to: NetSuite with Order Management; Pick, Pack and Ship and Advanced Bin / Numbered Inventory Management where inventory detail is required
Fulfill a sales order
- 1Confirm the sales order is approved (status Pending Fulfillment). If your account uses order approval, an unapproved order cannot be fulfilled.
- 2Open the order and click Fulfill. NetSuite creates an Item Fulfillment form with every line pre-filled for the open quantity.
- 3Set the Status. Without Pick, Pack and Ship the form is simply saved as shipped. With it enabled (Setup > Company > Enable Features > Transactions > Shipping), choose Picked, Packed or Shipped.
- 4On the Items subtab, tick Fulfill only on the lines going out now and edit Quantity for a partial shipment. Untick the rest; they stay open on the order.
- 5For lot, serial or bin items click the Inventory Detail icon on each line and assign the specific lots, serials and bins, with quantities that sum to the line quantity.
- 6On the Shipping subtab, set the ship method, packages and tracking numbers if you use integrated shipping.
- 7Save. Set the status to Shipped when the goods leave, then create the invoice from the order or, with fulfillment-based billing, from the fulfillment.
What posts when you fulfill
A fulfillment is a non-posting transaction until it is Shipped. When it reaches Shipped, NetSuite decrements on-hand and posts the cost: debit Cost of Goods Sold, credit Inventory Asset at the item's costing method value (average, FIFO, LIFO, standard or lot costing). Picked and Packed only record warehouse progress and do not touch the ledger.
That timing matters for month end. Fulfillments left in Picked or Packed at period close mean the inventory is still on hand in the books and no cost is recognized, even though the goods may be on a truck. Review fulfillments by status before closing.
Partial, multiple and batch fulfillment
A sales order can have many fulfillments. Each one consumes part of the open quantity, and the order status moves from Pending Fulfillment to Partially Fulfilled, then Pending Billing or Billed. This is how you ship from several locations: set Location on each fulfillment line and fulfill each location separately.
To work through a queue, use Transactions > Sales > Fulfill Orders, filter by location or ship date, tick the orders, and mark them. For warehouse flows you can print pick tickets and packing slips from the same menu, then update status in bulk with the Mark Packed and Mark Shipped list actions.
// SuiteScript 2.x: transform a sales order to an item fulfillment
const fulfill = record.transform({
fromType: record.Type.SALES_ORDER,
fromId: soId,
toType: record.Type.ITEM_FULFILLMENT,
isDynamic: true
});
fulfill.setValue({ fieldId: 'shipstatus', value: 'C' }); // C = Shipped
fulfill.save();Common blockers
If a line will not fulfill, the usual causes are insufficient available quantity at the line location, an item with a bin or lot requirement and no inventory detail, an inactive location, or a commitment problem where stock is committed to another order. Check Available vs On Hand on the item record's Inventory subtab for that location.
Backordered items need the Commit setting on the order line and the preference for Order Commitment (Setup > Accounting > Accounting Preferences > Items/Transactions). If you ship without committing, lines show as not available even when stock exists.
Common pitfalls
- !Leaving fulfillments at Picked or Packed through period close, so COGS and inventory relief are missed.
- !Entering inventory detail quantities that do not match the line quantity, which blocks saving.
- !Fulfilling from the wrong location because the order header location differs from the line location.
- !Deleting a Shipped fulfillment to fix a mistake instead of editing it, which breaks the audit trail and can reopen the order unexpectedly.
- !Assuming an invoice posts inventory. Inventory relief comes from the fulfillment, the invoice only recognizes revenue and receivable.
How an ERP-grounded AI assistant handles this
A grounded assistant can answer questions such as which approved orders are stuck in Pending Fulfillment, which fulfillments are still Packed at month end, or which lines lack inventory detail. ERPray shows the underlying query and works read-only by default, so warehouse and finance staff can see the list, while any change to a fulfillment stays an approved human action.
Frequently asked questions
Why is the Fulfill button missing on a sales order?
The order is probably not approved, is already fully fulfilled, or your role lacks the Fulfill Orders permission. Also check the order status and whether all lines are non-inventory service items, which are not fulfilled. Approval and status are the first two things to check.
Does an item fulfillment post to the general ledger?
Only when its status is Shipped. At that point NetSuite debits COGS and credits Inventory Asset at the item cost. Picked and Packed statuses are non-posting. Fulfillments of non-inventory items follow the item's own expense or COGS account setup.
How do I do a partial shipment?
On the item fulfillment, untick Fulfill for lines you are not shipping, or reduce the quantity. Save as Shipped. The sales order moves to Partially Fulfilled and the remainder stays open, so you can create another fulfillment later.
Can I bill before fulfillment?
Yes, if the Accounting preference does not require fulfillment before billing. By default, NetSuite can bill an order as soon as it is approved. Many companies enable the setting that requires fulfillment first so invoices only follow shipped goods.
Related
NetSuite Lot and Serial Traceability: Forward and Backward Trace
NetSuite stores lot and serial numbers as inventory number records linked to transactions through the Inventory Detail subrecord. A recall trace works by starting from the inventory number, finding every transaction line that touched it, and following work order issues and assembly builds to the finished lots they went into. It is fully possible with saved searches or SuiteQL, though it takes setup.
How-toHow to Set Up and Process Drop Ship Orders in NetSuite
Enable Drop Shipments and Special Orders, set Create PO to Drop Ship on the sales order line, and NetSuite generates a purchase order that ships straight to your customer. Receiving that purchase order records the vendor shipment and fulfills the sales order line, without moving inventory in your warehouse.
How-toHow to Set Up Approval Routing in NetSuite
NetSuite offers two approval routing paths: native transaction approval (Enable Features > Transaction approvals, then per-employee Approval Limit and Purchase Approval Limit fields) for simple single-approver chains, and SuiteFlow (Customization > Workflow > Workflows) for multi-step, condition-based, or parallel approval routing with escalation and notification logic.
How-toHow to create an assembly build or work order in NetSuite
For simple manufacturing with no routing or WIP tracking, use Transactions > Manufacturing > Build Assemblies (or Enter Assembly Build), select the assembly item, quantity, and location, and NetSuite consumes the BOM components and receives the finished item in one transaction. For multi-step production needing routing, WIP accounting or partial completions, create a Work Order (Transactions > Manufacturing > Work Orders) and process it through Work Order Completion, which requires the Advanced Manufacturing feature (SuiteSuccess Manufacturing or WMS add-on) or the Manufacturing bundle.
Error fixFix NetSuite SSS_USAGE_LIMIT_EXCEEDED Error
SSS_USAGE_LIMIT_EXCEEDED fires when a SuiteScript execution consumes all the governance units (usage points) allotted to its script type before it finishes. Fix it by checking runtime.getCurrentScript().getRemainingUsage() before expensive calls, yielding or rescheduling in Scheduled scripts, and moving heavy record-count work into Map/Reduce, which yields automatically across stages.
Error fixFix NetSuite INVALID_FLD_VALUE Error
INVALID_FLD_VALUE means NetSuite rejected a value you tried to set on a field because it does not match the field's expected type, list option, or reference record. Fix it by confirming the internal ID or text value actually exists on that field's source list and matches the field's value type (text versus list versus record reference) before setting it.
AI for ERPAI for NetSuite, Beyond the Built-In Text Tools
NetSuite's built-in AI covers text generation, not grounded answers on your own data. See how a private LLM over SuiteQL adds real Q&A and controls.
AI for ERPAI agents for NetSuite manufacturing operations
AI agents for NetSuite manufacturing: WIP tracking, routing exceptions, and work order status grounded in SuiteQL, with human approval on anything that writes back.
Stuck on Oracle NetSuite?
Talk to engineers who work inside Oracle NetSuite every week, and who build private AI that answers these questions from your own ERP data.