Import partial shipments and tracking numbers from a CSV or XML file into WooCommerce with WP All Import: set up the Shipment Imports type, map the columns and control customer emails.
Contents9 sections
To import partial shipments and tracking numbers from a CSV or XML file, install Advance Partial Shipment Extension for WP All Import, start a new import in WP All Import, choose Shipment Imports as the item type and map your columns. Each row is one product line of a shipment, and rows with the same order ID and tracking number form one shipment. One limit to know before you start: the extension writes into the paid Advance Partial Shipment for WooCommerce plugin, so it does not work with the free Partial Shipment plugin, and it only adds shipments to orders that already exist.
Why import shipments instead of typing them in
Advance records a shipment with its tracking number one order at a time, in the Partial Shipment box on the order screen. If your warehouse or carrier sends a spreadsheet of tracking numbers, or you want to load past shipments, typing each one is slow. The free plugin and the paid upgrade are covered in the tutorial onsplitting a WooCommerce order into partial shipments.
Every shipment goes through Advance’s own functions, so quantity checks, order status changes, customer emails and webhooks work as they do for a shipment created by hand. The import itself never edits your orders or products. It does not:
- create orders or products, so every order ID in the file must belong to an existing WooCommerce order;
- ship a whole order from one row, because every row needs a product (SKU or order item ID) and a quantity;
- contact carriers or check that a tracking number is real.
What you need
- WordPress 6.5 or later, PHP 7.4 or later and WooCommerce 8.4 or later (tested up to 11.1).
- Advance Partial Shipment for WooCommerce, active and installed in the folder
wphub-partial-shipment. The readme names 3.3.0 as the minimum and recommends 3.4.0 or later, so that a silent re-import updates a shipment in place. The code only checks that Advance is active. - WP All Import. The code accepts Pro or the free version, and its notice recommends Pro. The readme says it was tested with Pro 5.1, and no minimum version is enforced. WP All Import’s own WooCommerce add-on is not needed.
- Orders that already exist and are not Pending payment, Cancelled, Refunded or Failed.
Prepare your file
One row is one product line of one shipment. A shipment with three products takes three rows that share the same order ID and tracking number. The mapping screen shows this example:
order_id,tracking,provider,status,date,sku,qty
1042,1Z999AA10123456784,UPS,dispatched,2026-10-05,TSHIRT-RED,2
1042,1Z999AA10123456784,UPS,dispatched,2026-10-05,MUG-BLUE,1
1043,RM123456789GB,Royal Mail,delivered,2026-10-04,MUG-BLUE,3The first row of a shipment supplies its provider, tracking URL, status, dates and notes. An XML file works the same way: each record is a row, read from its top-level elements.
- Order ID: the WooCommerce order ID, the number in the order’s edit address. The box says “order number”, but the value is used as the ID, so do not use a custom order number from another plugin.
- Tracking number: strongly advised. Without one, use a Shipment Reference. With neither, all rows of an order form one shipment stored as IMP- followed by the order ID. Customers see the stored value as the tracking number.
- Product: the product’s SKU exactly as in WooCommerce (case matters; a variation without its own SKU has its parent’s, and the first matching line wins), or the order item ID, which wins over the SKU.
- Quantity: whole units. A decimal comma such as 2,5 is rounded to 3, but a number such as 2.500, with a point or comma and exactly three digits after it, is read as 2500. Zero, negative and non-numeric values are skipped and logged. Advance lowers a quantity to what is still unshipped (ordered, minus refunded, minus other shipments) without logging it.
Step-by-step setup
- Install and activate WooCommerce, Advance Partial Shipment for WooCommerce and WP All Import.
- Download the extension zip from your account on wpexpertshub.com. Open Plugins → Add Plugin (Add New Plugin in older versions) → Upload Plugin, choose the zip, click Install Now, then Activate.
- Open All Import → New Import and upload your file.
- Under “Create or modify…”, choose Shipment Imports.
- Continue to the step titled “Drag & Drop” (WP All Import Pro 5.1.0) and click the header of Advance Partial Shipment Fields. It starts collapsed and appears only for this item type.
- Fill in the boxes (see below). A useful import needs Order ID, a product (Product SKU or Order Item ID) and Quantity Shipped.
- At the bottom, choose Customer shipment emails and Default shipment status.
- Continue through WP All Import’s steps. It asks for a Unique Identifier. The extension does not read it, but WP All Import counts records with the same identifier as duplicates, so pick a value that differs on every row, such as the order ID with the SKU.
- Test it: on a few rows or a staging copy, set Customer shipment emails to “Never send emails (silent import)” and click Confirm & Run Import. Read the log, then open an order: the shipment is in its Partial Shipment box. WP All Import’s preview never creates shipments.
For the example file, type or drag these into the boxes:
Order ID: {order_id[1]}
Tracking Number: {tracking[1]}
Shipping Provider: {provider[1]}
Shipment Status: {status[1]}
Shipment Date: {date[1]}
Product SKU: {sku[1]}
Quantity Shipped: {qty[1]}The fields and how values are read
Each box takes a column of your file, a fixed text such as Royal Mail or delivered, or both, for example Order {order_id[1]} shipped. The boxes come in five groups:
- Which shipment: Order ID (required), Tracking Number, Shipment Reference.
- What was shipped: Product SKU, Order Item ID, Quantity Shipped (required).
- Carrier: Shipping Provider, Tracking URL.
- Status and dates: Shipment Status, Shipment Date, Estimated Delivery Date.
- Notes: Customer Note, which customers see, and Internal Note, for admins only.
Status, dates and carrier
- Status: ready (also ordered, prepared), picked (packed), dispatched (shipped, ship, sent, dispatch) or delivered (complete, completed, done), in any letter case. Anything else, including an empty cell, becomes the Default shipment status, which is Ready unless you change it.
- Dates: Y-m-d is the safest format. 05/10/2026 is read day first, but 5/10/2026 (slashes, no leading zeros) is read month first, and 13/5/2026 cannot be read. An empty Shipment Date means the current time on a new shipment. An unreadable one also becomes the current time, even replacing the stored date on an existing shipment. An unreadable Estimated Delivery Date stays empty.
- Carrier: a Tracking URL wins and may use
%1$swhere the tracking number goes. Otherwise the provider name is matched, without regard to case, against Advance’s providers for the order’s country plus your custom providers (WooCommerce → Settings → Partial Shipment → Shipping Providers), then against every country’s providers. An unknown name still creates the shipment, without a link, and the log warns you.
Creating, updating and re-importing
After reading the whole file, the extension looks for a shipment on the same order with the same tracking number, whether it came from a file or the order screen. It updates that shipment or else creates a new one, so running a file twice does not duplicate anything. Three updates need care:
- Items: the shipment keeps exactly the items in the file for that order and tracking number. An item missing from the file is removed from it.
- Provider link: a row with neither a Tracking URL nor a recognised provider clears the stored link. Map a provider or URL column on every import that updates shipments.
- Status: an empty or unrecognised status sets the shipment to the Default shipment status, so a Delivered shipment can go back to Ready. Map a status column that is filled on every row.
Empty date and note cells keep the stored values. For a Delivered row, Advance records the delivery date when the import runs, not the Shipment Date in your file.
Customer emails and order statuses
- Follow the Shipment Email Trigger setting (default): the import acts as if you had created the shipments by hand, following WooCommerce → Settings → Partial Shipment → Shipment Email Trigger. With “Immediately when shipment is created”, each new shipment sends the New Partial Shipment email, and an updated one sends Partial Shipment Update if something the customer can see changed (moving a shipment to Picked, Dispatched or Delivered does not count). With “When shipment is marked as Picked”, an email goes out only for a row whose status is Picked, once per shipment.
- Never send emails (silent import): no Advance shipment email, but see the order statuses below.
Decide this before the first real run: with emails on, a large import sends one email per shipment.
The import does not change order statuses itself, but Advance recalculates the status after every created or updated shipment, silent ones included. An order can become Partially Shipped or Completed according to Advance’s Add Status “Partially Shipped” and Mark auto “completed” settings, both on by default. When an order becomes Completed, WooCommerce sends its Completed order email if that email is enabled, even for a silent import. Customers see imported shipments on My Account → Orders → View, in sections headed Shipment #1, #2 and so on.
Good to know and troubleshooting
The extension writes one line per event into WP All Import’s log, ending with “SHIPMENT IMPORT COMPLETE: C created, U updated, S skipped.”
- Shipment Imports or the fields section is missing: the extension is not active, or it deactivated itself because Advance or WP All Import is not active.
- The import ran but the log has no shipment lines: none of Order ID, Tracking Number, Product SKU, Order Item ID or Quantity Shipped was mapped, the run was a preview, or the import uses another item type.
- “ROW SKIPPED: no valid Order ID” or “SHIPMENT SKIPPED: order #N not found”: the Order ID is empty, zero or not a number, or no WooCommerce order has that ID.
- “SHIPMENT SKIPPED: order #N is …”: the order is Pending payment, Cancelled, Refunded or Failed. This also applies to rows that would only update a shipment. Usually drop the row. If the status is wrong, fix it first (a status change can trigger WooCommerce emails and stock changes), then import again.
- “SHIPMENT ITEM SKIPPED”: either no product on the order matched the SKU or Order Item ID (the Order Item ID wins over the SKU), or the quantity is not above zero.
- Created, updated and skipped do not add up to your shipments: Advance refused a shipment without telling the extension, for example because everything was already shipped, the product is virtual, the Order Item ID belongs to another order, or the order’s lock could not be taken within 15 seconds. Check what is left to ship on the order.
- Imported shipments disappeared later: if Delete old shipment data is set in Advance, its daily job removes shipments with a Shipment Date older than the chosen period, imported ones included.
- Very large files: creating the shipments, the last step, continues if you close the tab and lifts PHP’s time limit, but your host may still stop it. Running the same file again does not duplicate shipments.
The full documentation covers privacy, the developer reference and the changelog.
Links
Plugin pages: Advance Partial Shipment Extension for WP All Import and Advance Partial Shipment for WooCommerce. Settings reference: extension documentation and Advance documentation. More tools: Browse all plugins.