Published at: 2025-10-30

Shipping Order


1. Business Use Case Examples

As part of the standard sales process, after a product is sold, it needs to be shipped to the designated customer. In this scenario, sales personnel must locate the corresponding Sales Order, create a Shipping Order under it, select the products to be shipped from the sales product list, specify the quantity and amount for each product, and generate the Shipping Order. Similar to Sales Orders, shipping may require a strict approval process before fulfillment.

A Shipping Order can handle partial shipments for a single Sales Order or consolidate shipments for multiple Sales Orders.

Shipping Order management helps administrators track product shipments, logistics, and delivery confirmations.

2. Creating a Shipping Order & Partial Shipments

2.1 Creating a Shipping Order

picture coming soon:

  • Navigate to the CRM and click on “Shipping Order” to access the Shipping Order list page.
  • Click the “New” button in the upper-right corner to create a Shipping Order with preset or custom Record Types.

picture coming soon:

picture coming soon:

  • When creating a Shipping Order, first select the Account, then choose the Sales Order associated with that Account.
  • If Inventory Management is enabled, the Shipping Order must also specify the Warehouse for shipment.
  • Products in the Shipping Order can only be added from the selected Sales Order’s product list.
  • Click “Add from Order Products” to open a list of order products. Select the products to be shipped and enter the shipment quantity. For products with batch or serial number tracking, specify the corresponding batch or serial numbers.
  • Upon submission, the system validates that the shipment quantity does not exceed the remaining shippable quantity of the order products.
  • The system also checks Warehouse Inventory levels; insufficient stock will prevent submission.
  • Once confirmed, the Shipping Order deducts the actual inventory from the designated Warehouse.
  • The system automatically updates the shipped quantity and amount for the order products.

2.2 Partial Shipments

When handling large customer orders, factories often produce goods in batches, leading to partial shipments. Creating multiple Shipping Orders simplifies Sales Order and line-item management, displaying delivery statuses such as total order value, quantity, delivered quantity, and pending quantity. This enhances Sales Order, production, and shipping management.

  • Each time a Shipping Order is created, the system calculates the maximum shippable quantity based on Warehouse Inventory, reducing manual calculations and improving efficiency.
  • For partial shipments, the system validates both inventory availability and the remaining shippable quantity to prevent over-shipment.
  • Once all partial shipments are completed, the system updates the order status to “Shipped.”

3. Tracking Shipping Order Logistics

picture coming soon:

  • Logistics tracking is an advanced feature requiring a purchased logistics query resource package.
  • Logistics information includes the courier company and tracking number, both of which must be accurate for successful queries.
  • Supports major courier companies such as SF Express, EMS, YTO, STO, ZTO, and Yunda.
  • Note: If customers have their own Kuaidi100 account, contact the product manager for integration via “APL+PWC Components” to enable smart tracking number recognition and real-time logistics updates.

4. Delivery Confirmation

Shipping Orders support three delivery confirmation methods: manual confirmation, timeout-based auto-confirmation, and auto-confirmation upon logistics delivery.

4.1 Manual Confirmation

picture coming soon:

  • After receiving the goods, the recipient can manually confirm delivery on the Shipping Order, optionally uploading Images and specifying the actual received quantity.

4.2 Auto-Confirmation

picture coming soon:

  • Configure auto-confirmation in Inventory Management > Plugin Management.
  • Options include timeout-based auto-confirmation or logistics delivery auto-confirmation.
  • For timeout-based confirmation, the system auto-confirms after a set number of days post-shipment.
  • For logistics-based confirmation, enable logistics delivery reminders when creating the Shipping Order. The system auto-confirms upon delivery.

5. Shipping Orders in Decoupled Mode

The above logic applies to Shipping Orders in tightly coupled mode. For integration with ERP or third-party systems, decoupled mode is recommended.

When using Integration Edition (Type B) Inventory Management or when Inventory Management is disabled, switch to decoupled mode via the order coupling parameter.

picture coming soon:

  • Decoupled Shipping Orders offer flexibility equivalent to custom objects, with no validation logic but support for custom functions.
  • Retains core features like partial shipments, multi-order consolidation, logistics tracking, and auto-confirmation.

6. Shipping Order Function Configuration Guide

Configure custom functions as pre-approval validation to prevent invalid Shipping Orders due to insufficient inventory.

1) Navigate to the Custom Function Management page.

picture coming soon:

2) Click “New Function” in the upper-right corner and enter configuration details:

picture coming soon:

  • Customize the function name and API Name.
  • Select “Validation Function” for the namespace, “ValidateResult” for the return type, and “Shipping Order” for the bound object.
  • Copy and paste the following script into the function input field, then save:

Map requestParam = [ //"deliveryNoteDataId":"600a934cf08093000131f31c" // "deliveryNoteDataId":"600a962ff080930001321b74" "deliveryNoteDataId":context.data._id ]; Fx.log.info("requsetParam=" + requestParam) def ret = Fx.proxy.callAPI("stock.checkDeliveryRealStock", null, requestParam) Fx.log.info("ret=" + ret); HttpResult data = ret.data as HttpResult if(null == data) { return ValidateResult.build{ success = false errorMessage = "Network timeout" } } String json = data.content Fx.log.info("data.content:" + json) Map resultData = Fx.json.parse(json) String realRetStr = resultData.result Fx.log.info("realRetStr:" + realRetStr) Map realRetMap = Fx.json.parse(realRetStr) boolean passCheck = realRetMap.passCheck String retMessage = "Inventory validation passed"; if (passCheck == false) { retMessage = "Inventory validation failed:" String shortageProductStr = realRetMap.shortageProducts Fx.log.info("shortageProducts:" + shortageProductStr) Map shortageProductMap = Fx.json.parse(shortageProductStr) shortageProductMap.each { key, value -> String name = (String)key BigDecimal substact = (BigDecimal)value retMessage = retMessage + name + " shortage: " + substact + ";" } } def result = ValidateResult.build{ success = passCheck errorMessage = retMessage } return result

3) Configure the custom function as a pre-approval condition in the workflow.

picture coming soon:

picture coming soon:

Select “Based on Custom Function” for the pre-approval condition and choose the configured function.

Submit Feedback