Fix NetSuite Ship Date for Out of Stock Items
NetSuite will not tie a ship date to an expected receipt on its own. Here is how to drive sales order dates from supplier receipt dates.

On this page
Managing ship dates on sales orders when items aren't in stock is one of the most frustrating gaps in NetSuite's standard functionality. You're not missing a hidden "best practice" button. The platform gives you the building blocks, but tying supplier receipt dates to customer commitments requires a deliberate design.
Here's what actually works, what doesn't, and where you'll need to build your own control.
Why Available to Promise Falls Short
NetSuite's Available to Promise (ATP) feature sounds like the answer. It isn't. ATP relies on the Expected Receipt Date field on purchase order lines to calculate availability. If that date is wrong, ATP is wrong. And the interface gives you a tiny icon that's nearly indistinguishable from the inventory detail icon, making it impractical for daily order management.
The core problem: ATP doesn't automate anything. It shows you a calculated date, but your sales team still has to manually update the ship date on each sales order line. For a team processing dozens of orders daily, that's not a workflow improvement.
NetSuite's Inventory Management Guide confirms ATP checks item availability based on outstanding transfer orders, purchase orders, work orders, and sales orders. The projected ship date is only as reliable as the underlying purchase order data feeding it.
Set Up Drop Shipments and Special Orders Correctly
Before you build anything custom, confirm your feature configuration. Go to Setup > Company > Enable Features, click the Items & Inventory subtab, and verify Drop Shipments & Special Orders is checked. If you're selling items you don't stock, this feature must be active.
For items you order only after receiving a customer order, set the item record's Supply Type field to Special Order or Drop Shipment. This changes how NetSuite generates purchase orders:
- Drop Shipment: The vendor ships directly to your customer. The item never touches your warehouse. When you approve the sales order, NetSuite automatically generates a purchase order showing the preferred vendor and the customer's shipping address.
- Special Order: You receive the item into inventory, then fulfill the sales order. This is a just-in-time purchasing model.
For either type, NetSuite uses the item's Preferred Vendor and Lead Time fields to calculate the expected receipt date when you create the purchase order. As the documentation on drop shipping notes, lead time is the difference between the purchase order date and the expected receipt date on the purchase order line.
The Real Issue: Ship Date Is Doing Too Much
Your ship date field is being asked to represent three different things at once:
- Customer expectation, when you promised the goods would ship
- Inventory availability, when the items will actually be on hand
- Fulfillment trigger, when your warehouse should start picking
Using one date for all three creates the exact conflict you're experiencing. If you set ship date to match supplier receipt, the order sits unpicked even when stock arrives early. If you set it to "next day" as a default, you lose visibility into which orders are actually late.
A Practical Two-Date Approach
Separate the customer-facing commitment from the operational trigger. Here's a configuration that works:
Keep Native Ship Date as the Operational Trigger
Leave the sales order Ship Date field set to your default (next day). Your picking process continues to work as it does now. The picking ticket prints when items are allocated to the order, not before.
Add a Custom "Customer Promise Date" Field
Create a custom date field on the sales order line. This is the date you've communicated to the customer. Your sales team sets this manually when the order is taken, based on the item's lead time and current supplier information.
Go to Customization > Lists, Records, & Fields > Transaction Line Fields > New:
- Label: Customer Promise Date
- ID:
custcol_customer_promise_date - Applies To: Sale
- Display Type: Date
- Store Value: Checked
Track Supplier Commitments on the Purchase Order
Your custom field for the supplier's confirmed receipt date is the right idea. The key is how you use it alongside NetSuite's native fields.
Keep the native Expected Receipt Date field updated with the supplier's latest confirmed date. This is what drives supply planning and any downstream processes. Add a separate custom field for the original promise date, the date from the initial order confirmation. This gives you supplier performance tracking without losing the operational date.
Automating Customer Notifications
When a supplier delays a shipment, you need to know which sales orders are affected. This is where a small SuiteScript workflow saves hours of manual checking.
Here's a SuiteScript 2.1 user event script that checks sales orders linked to a purchase order when the expected receipt date changes:
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define(['N/record', 'N/search'], function(record, search) {
function afterSubmit(context) {
if (context.type !== context.UserEventType.EDIT) return;
var poRecord = context.newRecord;
var newReceiptDate = poRecord.getValue({
fieldId: 'expectedreceiptdate'
});
var oldReceiptDate = context.oldRecord.getValue({
fieldId: 'expectedreceiptdate'
});
if (newReceiptDate === oldReceiptDate) return;
// Find sales orders linked to this PO
var linkedSOTotals = poRecord.getLineCount({
sublistId: 'item'
});
for (var i = 0; i < linkedSOTotals; i++) {
var soId = poRecord.getSublistValue({
sublistId: 'item',
fieldId: 'createdfrom',
line: i
});
if (!soId) continue;
// Log the SO for the sales team to review
log.audit({
title: 'PO Date Change Affects Sales Order',
details: 'PO ' + poRecord.id + ' new receipt date: ' +
newReceiptDate + '. Review SO ' + soId
});
}
}
return {
afterSubmit: afterSubmit
};
});This script only logs affected orders. You can extend it to send an email to the sales rep assigned to each order, or create a saved search that feeds a daily review queue.
The Control That Actually Matters
From an audit perspective, the control here is segregation of dates. The operational ship date drives fulfillment. The customer promise date drives communication. The supplier receipt date drives purchasing.
When these three dates are separate fields, you can run a simple saved search to flag orders where the customer promise date is earlier than the expected receipt date. That report becomes your daily "at risk" list. Your sales team calls those customers proactively instead of discovering delays at the picking stage.
What to Check Next
Before you build this out, review your Accounting Preferences > Order Management settings. NetSuite lets you set a default lead time for items without one, which affects your purchase order date calculations. Verify your item records have accurate lead times, since this drives everything downstream.
Also confirm your fulfillment workflow doesn't filter by ship date in a way that blocks early picking. Set the Fulfillment Request to allow early fulfillment when items are available, even if the ship date hasn't arrived.
The frustration you're feeling is legitimate. NetSuite gives you the pieces but not the assembly instructions. Separate the dates, keep the native fields updated, and build a simple notification path for your sales team. Your auditors will thank you for the clear audit trail, and your team will stop fighting the system.


