Advance Partial Shipment Extension for WP All Import
Import partial shipments from a CSV or XML file with WP All Import: tracking numbers, providers, statuses, dates and quantities, added to existing orders through Advance Partial Shipment for WooCommerce.
Version 1.5.0 WooCommerce plugin Paid plugin Requires WordPress 6.5 Requires PHP 7.4 Tested up to 7.1 Updated 6 Oct 2026
1. Overview
Advance Partial Shipment Extension for WP All Import adds a new item type, Shipment Imports, to WP All Import. With it you import parcels from a CSV or XML file into Advance Partial Shipment for WooCommerce: tracking numbers, providers, statuses, dates, notes and shipped quantities for orders that already exist. You no longer create each shipment by hand.
Each row of your file is one product line of a shipment. Rows with the same Order ID and Tracking Number are grouped into one shipment with several items. The add-on creates and updates the shipments through Advance's own functions, so Advance's quantity checks, order status automation, emails and webhooks apply as they do for shipments created by hand. The import itself never edits your WooCommerce orders or products.
The plugin is listed on the Plugins screen as "Advance Partial Shipment — WP All Import Add-On". This page describes version 1.5.0.
How it works
- You start a new import in WP All Import, upload your file and choose Shipment Imports as the item type.
- On the mapping step you drag columns of your file into the boxes of the Advance Partial Shipment Fields section (or type fixed text), and choose the email behaviour and the default status.
- While the import runs, WP All Import creates a temporary post for each row. The add-on copies the mapped values into a buffer and deletes that post at once, so nothing is left behind.
- When the last row has been read, the add-on groups the buffered rows into shipments and asks Advance to create them, or to update a shipment that already has the same order and tracking number.
- The WP All Import log lists every shipment created, updated or skipped, with the reason, and ends with a summary.
At a glance
A separate import type
WP All Import's order engine is never used, so your order line items and products are not overwritten.
One row, one product line
Rows with the same Order ID and Tracking Number (or Shipment Reference) become one shipment with several items.
Flexible mapping
Each box takes a column of your file, a fixed text such as Royal Mail, or both mixed. Column names are matched without regard to case, spaces or punctuation.
Re-import safe
Importing a file again updates the shipments that have the same order and tracking number instead of creating duplicates. Empty date and note columns keep the stored values.
Silent or notified
Follow Advance's Shipment Email Trigger, or never send customer emails, which suits historical data.
A log that explains
Every skipped row, order and item is listed with its reason, also for imports run from cron or WP-CLI.
How the three plugins fit together
Three WpExperts Hub plugins work with the same shipment data. Each of the three documentation pages carries this same section, so you can read it on whichever page you start from.
| Plugin | Plugin folder | Needs | What it does on its own |
|---|---|---|---|
| Partial Shipment for WooCommerce (the free plugin) | wc-partial-shipment | WooCommerce | Records how many units of each order item have shipped. It has no tracking numbers, providers or shipment statuses. It adds item badges, the optional "Partially Shipped" order status, automatic completion and one email that you send by hand. |
| Advance Partial Shipment for WooCommerce (Advance, paid) | wphub-partial-shipment | WooCommerce | Splits an order into parcels. Each parcel has its own items, provider, tracking number, status, dates and notes, and its own customer emails. It also adds a tracking page, a Fulfillment Report, a REST endpoint and webhooks. |
| Advance Partial Shipment Extension for WP All Import (the add-on, paid) | wpai-shipment | Advance, WP All Import | Nothing without Advance. With Advance it imports parcels from a CSV or XML file through WP All Import. The Plugins screen lists it as "Advance Partial Shipment — WP All Import Add-On". |
Shared data
The free plugin and Advance keep their records in the same two database tables, partial_shipment and partial_shipment_items (each with your WordPress table prefix, for example wp_partial_shipment). They also share the order status wc-partial-shipped ("Partially Shipped"), the WooCommerce settings tab wxp_partial_shipping_settings (shown as Partial Shipment) and three option keys: partially_shipped_status, partially_auto_complete and partially_enable_status_popup. A value you save with one of the two plugins is the value the other one reads.
| Data | Free plugin | Advance | Add-on |
|---|---|---|---|
Rows in partial_shipment | One row per order, always with shipment_id 1 and no tracking number. | One row per parcel. shipment_id counts 1, 2, 3 within the order. Tracking number, provider link, status, dates and notes belong to the parcel. | None of its own. It asks Advance to create or update parcels. |
Rows in partial_shipment_items | One row per order item, holding the total quantity shipped. | One row per item in each parcel. | None of its own. |
| Creating the tables | Creates both tables with a unique key on order_id, so one row per order. | Creates them when missing. On upgrade it removes that unique key and adds the columns for status, dates, notes and email tracking. | Creates no tables. |
Only one of the free plugin and Advance runs at a time
If both are active, the free plugin does nothing. When its file loads, the free plugin checks whether Advance (wphub-partial-shipment/wphub-partial-shipment.php) is active, on the current site or network-wide. If it is, the free plugin registers none of its screens, settings or hooks. Advance also switches the free plugin off. On the next request to wp-admin it silently deactivates wc-partial-shipment/woocommerce-partial-shipment.php and shows a one-time notice. On multisite, WordPress 7.1.2 deactivates it this way only when it is network-activated. A copy that is activated on a single site stays active but idle, and Advance still shows its "was deactivated" notice on each wp-admin page of that site until you deactivate the free plugin yourself. Neither step deletes shipment data. Deactivating Advance later does not switch the free plugin back on; activate it yourself on the Plugins screen.
Switching between the two
From the free plugin to Advance. Activate Advance. It keeps the existing rows, so every order the free plugin recorded now has one parcel, Shipment #1, with no provider and no tracking number. The free plugin stores no shipment status, so that parcel shows as Ready (as "Ordered" on the customer's order page) until you change it. On activation Advance also changes the tables: it removes the unique key on order_id so an order can have several parcels, removes the old shipment_primary_id column and adds the new columns. Advance can also create Delivered parcels for older Completed orders in the background; that one-time run is on by default in Advance.
From Advance back to the free plugin. Deactivate Advance, then activate the free plugin. It adds up each item's quantity over all parcels and shows that total in its Shipment popup and badges. It ignores tracking numbers, providers, statuses and notes, and leaves them in the table. When you save new quantities in the free plugin's popup, the difference is applied to the order's first parcel. When a total is lowered, the most recent parcels are reduced first.
What the add-on needs
The add-on works only together with Advance and WP All Import. It does not work with the free plugin, because it creates and updates parcels through Advance, and the free plugin has no parcels, tracking numbers or statuses. The add-on names Advance in its Requires Plugins header, so WordPress 7.1.2 refuses to activate it while Advance is missing or inactive. An add-on that is already active switches itself off on the next request to wp-admin and shows a notice.
What it does not do
- It does not create orders or products. Every Order ID in the file must be an existing WooCommerce order.
- It has no settings screen of its own. Its options live inside WP All Import's mapping step and are saved with each import.
- It does not work with the free Partial Shipment plugin, only with Advance.
- It cannot ship "the whole order" from a single row: every row needs a product (SKU or Order Item ID) and a quantity.
- It cannot delete shipments or remove items that are not in the file from other shipments. It only creates shipments and updates the ones it finds by order and tracking number.
- It does not contact carriers and does not check tracking numbers.
- It does not use WP All Import's other sections for the Shipment type (title, content, images, custom fields). Leave them empty.
- It does not change order statuses itself. Advance does that after each shipment, so an import can move orders to Partially Shipped or Completed.
2. Requirements
| Item | Requirement | Notes |
|---|---|---|
| WordPress | 6.5 or later | From the Requires at least header. The readme says tested up to 7.1. |
| PHP | 7.4 or later | From the Requires PHP header. |
| WooCommerce | 8.4 or later, tested up to 11.1 | From WC requires at least and WC tested up to. The header says Requires Plugins: woocommerce, wphub-partial-shipment. |
| Advance Partial Shipment for WooCommerce | Required and active, 3.3.0 or later; 3.4.0 or later recommended | The add-on looks for the plugin file wphub-partial-shipment/wphub-partial-shipment.php, so Advance must be installed in the folder wphub-partial-shipment. With 3.4.0 or later a silent re-import updates a shipment in place; with an earlier version it deletes and recreates the shipment (see Grouping, creating and updating). The 3.3.0 minimum comes from the readme; the code checks only that Advance is active. |
| WP All Import | Required and active: Pro or the free version | The add-on looks for wp-all-import-pro/wp-all-import-pro.php or wp-all-import/plugin.php. The readme says it was tested with WP All Import Pro 5.1; the hooks described on this page were checked in WP All Import Pro 5.1.0. WP All Import's WooCommerce add-on is not needed. |
| Order storage | High-Performance Order Storage or legacy storage | The add-on declares compatibility with custom_order_tables. It reads orders only through the WooCommerce order API. |
| Existing orders | Required | Shipments are added to orders that already exist. |
| Outbound HTTPS | Needed for licence and updates only | Optional. The add-on works without it. |
The two requirement checks (Advance, WP All Import) run only in wp-admin. WordPress 7.1.2 additionally refuses to activate the add-on while WooCommerce or Advance is missing or inactive, because both are named in its Requires Plugins header and are matched by plugin folder name. If a requirement disappears later, the add-on deactivates itself on the next wp-admin request and shows one of these notices: "Advance Partial Shipment WPAI Add-On requires the Advance Partial Shipment for WooCommerce plugin. The add-on has been deactivated." or "Advance Partial Shipment WPAI Add-On requires WP All Import (Pro recommended). The add-on has been deactivated."
3. Installation
- Install and activate WooCommerce, Advance Partial Shipment for WooCommerce and WP All Import.
- Download the add-on zip from your account on wpexpertshub.com, then open Plugins → Add New Plugin → Upload Plugin, choose the zip, click Install Now and Activate.
- Optional but needed for updates: open Plugins → WpExperts Hub Licences, paste your licence key and click Activate licence. See Licence and updates.
- In WP All Import start a new import (All Import → New Import) and follow the Quick start.
Licence and updates
The add-on bundles the WpExperts Hub licence and update client (licence/class-wpxh-licence-client.php, version 2.0.0). Advance bundles an identical copy; the two differ only in the text domain of their messages. Whichever plugin loads first defines the client, and it then serves both.
- The screen. Plugins → WpExperts Hub Licences lists every WpExperts Hub plugin that bundles the client, one card each, with an Active or Not active label and the installed version. You need
manage_options. The add-on also adds a Licence link under its name on the Plugins screen. - Activate. Paste the key from your purchase email (also shown in My Account → Downloads on wpexpertshub.com) and click Activate licence. Only letters, digits and hyphens are kept. The key and an "active" status are stored on your site only when the licence server says yes.
- Deactivate. Click Deactivate licence on the card (the key is shown masked). Do this before moving the plugin to another live site. The key is removed from your site even when the licence server cannot be reached.
- Lost your key. On a card without an active licence open Can't find your key? Email it to me, enter the email address used for the purchase and click Send licence key.
- Updates. New versions arrive through the normal Dashboard → Updates and Plugins screens. The update information is requested in one batched request and cached for 12 hours (one hour after a failed request). The client installs whatever package address the licence server returns; according to the client's own documentation it returns one only for sites with an active licence. Without a licence WordPress shows "Automatic update is unavailable for this plugin. Activate your licence to enable updates."
- The add-on works without a licence. No feature of the add-on checks the licence. The key only unlocks update packages.
- Reminder. On the Plugins screen administrators see "Activate your WpExperts Hub licence to receive updates for: ..." with a Manage licences link while any plugin using the client has no active licence. It cannot be dismissed.
What is sent to wpexpertshub.com, and when, is in Privacy.
What activation creates
Nothing. The add-on has no activation routine: no tables, no options, no roles, no scheduled events. It registers a temporary post type, wphub_shipment, every time WordPress loads. Options appear only when you activate a licence, and temporary buffer options appear only while an import is running (see What the add-on stores).
Updating
Update through the normal WordPress screens. The add-on has no upgrade routine. Saved imports keep their mapping, because WP All Import stores it. Imports saved before version 1.4, which only had the old "send emails" checkbox, now follow Advance's Shipment Email Trigger (see Customer emails).
Multisite
The add-on has no multisite-specific code. It writes to the shipment tables of the site it runs on (Advance uses each site's table prefix), and WP All Import runs per site. The licence is stored per site.
Deactivating and deleting
Deactivating removes the "Shipment Imports" type from the list of item types. Shipments already imported stay in Advance. Saved imports keep their stored mapping inside WP All Import. The add-on has no uninstall routine, so deleting it removes only its files; any licence options stay in the database.
4. Quick start
- Prepare a CSV or XML file with one row per shipped product line: the WooCommerce order ID, the product SKU (or order item ID), the quantity and, normally, a tracking number. Optional columns: provider or tracking URL, status, dates, notes.
- Open All Import → New Import and upload the file. Under "Create or modify..." choose Shipment Imports from the list of item types.
- Continue to the step where you drag elements (titled "Drag & Drop" in WP All Import Pro 5.1.0). Open the Advance Partial Shipment Fields section, which starts collapsed, by clicking its header.
- Drag a column into each box you need, or type a value. Order ID, a product (Product SKU or Order Item ID) and Quantity Shipped are required in practice.
- At the bottom choose Customer shipment emails (default "Follow the Shipment Email Trigger setting"; choose "Never send emails (silent import)" for historical data) and the Default shipment status (default Ready).
- Continue through WP All Import's steps. It asks for a unique identifier; the add-on does not read it, so pick any value that differs for every row, for example the order ID with the SKU.
- Run the import. Read the log: each shipment is listed as created, updated or skipped, and the last line summarises the run.
5. Features
This add-on only prepares data. Everything that happens to a shipment afterwards (quantity limits, order status changes, emails, webhooks) is done by Advance. Where this page describes that, it was checked in Advance 3.4.0.
The Shipment Imports type
The add-on registers a custom post type named wphub_shipment with the label "Shipment Imports". The type is registered with an admin interface but without a menu entry, and WP All Import lists such types among the item types under "Create or modify..." on the first step of a new import.
- Why a separate type. Importing shipments as an Order import would let WP All Import's order engine rewrite the real order (clear line items, reset status). The Shipment type avoids that: WP All Import creates one temporary post of this type per row, the add-on copies the row's data and deletes the post immediately, and the real shipments are created at the end of the import. Orders and products are not touched by the import itself.
- No title needed. The add-on tells WP All Import that this type does not need a title, so you do not have to map one.
- Where the mapping is. On the step where you drag elements, a section named Advance Partial Shipment Fields is added for this type only. It starts collapsed. It has a short "How it works" help box, an example file you can open, the mapping boxes in five groups, and the two import options.
- Previews. WP All Import's preview runs never create shipments. The add-on ignores them and clears whatever they buffered.
- Imports from cron and WP-CLI. They work like imports started in the browser. The add-on's log lines appear in those runs too.
Laying out the 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.
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,3
With a CSV like this, map Order ID to {order_id[1]}, Tracking Number to {tracking[1]}, Shipping Provider to {provider[1]}, Shipment Status to {status[1]}, Shipment Date to {date[1]}, Product SKU to {sku[1]} and Quantity Shipped to {qty[1]}. The first two rows become one shipment of two items, the third row a second shipment on another order. XML files work the same way: each record is a row, and values are read from the record's top-level elements.
- Order ID is the WooCommerce order ID, the number in the order's edit address. On a standard WooCommerce site it equals the order number. If a plugin gives your orders other order numbers, use the ID, not that number.
- Which fields are needed. The add-on reads rows only when at least one of Order ID, Tracking Number, Product SKU, Order Item ID or Quantity Shipped is mapped; with none mapped the import creates nothing. For a useful import you need Order ID, a product (SKU or Order Item ID) and Quantity Shipped; Tracking Number is strongly advised.
- Header names. You do not have to rename your columns. A header such as "Tracking Number" is read as
trackingnumberby WP All Import and the add-on finds it either way.
How mapped values are read
Every box accepts three kinds of value.
- A column.
{Column}or{Column[1]}, which you get by dragging the element from the right-hand panel. The name is matched exactly first, then without regard to case and ignoring everything except letters and digits. If the name is not found but the token has a position, such as{something[3]}, the third value of the row is used. If neither works the value is empty. - Fixed text.
Royal Mailordelivered. Text without braces is used exactly as typed. - Both mixed.
Order {order_id[1]} shippedgives "Order 1042 shipped" (useful for notes).
Quantity Shipped
Whole units. The reader trims spaces (including non-breaking spaces) and accepts: 3, 3.0 (3), 2,5 (decimal comma, rounded to 3), 2.4 (2), 1,200 and 1.200 (thousands separators, 1200), 1 200 (1200). A value with a point or comma followed by exactly three digits is read as a thousands separator, so 2.500 is 2500, not two and a half. Zero, negative, empty and non-numeric values, and anything that rounds to 0 (0.4), skip that row's item and are reported in the log. A quantity larger than what is still unshipped is reduced by Advance to the available amount, without a log message.
Shipment Status
The text is trimmed and compared without regard to case.
| Becomes | Words understood |
|---|---|
| Ready | ready, ordered, prepared |
| Picked | picked, packed |
| Dispatched | dispatched, dispatch, shipped, ship, sent |
| Delivered | delivered, complete, completed, done |
Anything else, including an empty cell or an empty box, becomes the Default shipment status chosen at the bottom of the section (Ready unless you change it).
Dates
Shipment Date and Estimated Delivery Date use the same reader. It accepts a Unix timestamp (a number with at least 9 digits, used as it is) or one of these formats, tried in this order: Y-m-d (2026-10-05), d.m.Y (05.10.2026), d/m/Y (05/10/2026), m/d/Y (10/25/2026), d-m-Y (05-10-2026), j.n.Y (5.10.2026), d.m.y (05.10.26) and Y/m/d (2026/10/05). Anything else is tried with PHP's general date reader (for example "October 5, 2026").
- A slash date is read day first:
05/10/2026is 5 October 2026. Only a date that cannot be day first, such as10/25/2026, is read month first. If your file uses month-first dates that can be read both ways, convert them toY-m-dbefore importing. - Dates are read at midnight UTC so they show as the same calendar day in the order. The Shipment Date is stored as a timestamp; the Estimated Delivery Date is stored as
Y-m-d. - Empty Shipment Date: a new shipment gets today's date and time; an existing shipment keeps its stored date. A non-empty date the reader cannot understand is replaced by the current time.
- Empty or unreadable Estimated Delivery Date: left empty on a new shipment, and the stored value is kept on an existing one.
Provider and tracking URL
- A Tracking URL wins. It is used as typed (cleaned as a web address). Use
%1$swhere the tracking number goes. - Otherwise the Shipping Provider name is looked up, without regard to case, in the providers Advance offers for that order's country, then in the lists of every country, then in your custom providers. The provider's tracking address is stored, which is how Advance shows the provider's name. A web address typed in the provider box is used as it is.
- If the name is not found, the shipment is still created, without a link, and the log says:
WARNING: shipping provider "X" is not in the provider list (order #N); add it under Settings → Partial Shipment → Shipping Providers.
Matching orders and products
- The order. The Order ID is turned into a whole number and loaded with WooCommerce. If no such order exists the shipment is skipped (log: "SHIPMENT SKIPPED: order #N not found.").
- The order status. Advance does not allow new shipments on Pending payment, Cancelled, Refunded or Failed orders. The add-on applies the same rule to every group of rows for such an order, including a row that would only update an existing shipment, and skips it with the log line "SHIPMENT SKIPPED: order #N is "Pending payment" - shipments cannot be added to orders with this status."
- The product line. The Order Item ID is tried first: when it is a number and WooCommerce finds an order item with that id, that line is used. WooCommerce 11.1.2 looks the id up across the whole database, not only in this order, so an id from another order, or of a shipping or fee line, is accepted at this point. Advance then drops any line that does not belong to the order or is not a physical product line, and if nothing is left it refuses the shipment without a log line. Otherwise the Product SKU is compared with the SKU of each product line of the order, exactly as typed (case matters, variations use their own SKU), and the first match is used. A row that matches no line is reported ("SHIPMENT ITEM SKIPPED: could not match product for order #N (SKU: X).") and the other rows of the shipment continue.
- Quantity limits. Advance reduces each quantity to what is still unshipped (ordered minus refunded minus other shipments) and ignores virtual items and lines of other orders.
Grouping, creating and updating shipments
Rows are grouped when the import has read all of them, using the Order ID plus the Tracking Number. When there is no tracking number the Shipment Reference is used instead. When there is neither, all rows of that order form one group.
- One shipment per group. The first row of the group supplies the provider, tracking URL, status, dates and notes. The items of all rows are added together: the same product on two rows of one group gets its quantities added, and the log says "NOTICE: order #N lists SKU X more than once in this shipment: the quantities were added up."
- The number stored in the shipment. The tracking number; otherwise the Shipment Reference (it is stored in the shipment's tracking number field); otherwise
IMP-followed by the order ID (for exampleIMP-1042). - Finding an existing shipment. The add-on looks for a shipment of the same order whose tracking number equals that stored number. It does not matter whether that shipment came from a file or was created by hand. If one is found it is updated; otherwise a new one is created.
- What an update changes. The tracking number and tracking address, the status (see the warning above), the shipment date, estimated delivery date and notes when the cell is not empty, and the item list: the shipment ends up with exactly the items in the file for that group, so an item of that shipment that is missing from the file is removed from it. Quantities are checked against what is still available once the shipment's own quantities are set aside.
- Silent re-imports and Advance versions. With Advance 3.4.0 or later, a re-import set to "Never send emails" updates the shipment in place, so it keeps its number and id. With an earlier Advance version the add-on deletes the shipment and creates it again, which gives it a new number and id and sends a
deletedand acreatedwebhook if you use webhooks. - Status and delivery date. A status of Picked, Dispatched or Delivered is applied to the shipment after it is saved, through Advance's own status change. For Delivered, Advance records the delivery date at that moment, which is the time of the import, not the Shipment Date in your file. The customer sees that date next to "Delivered".
Customer emails and webhooks
The box Customer shipment emails has two choices. The default is Follow the Shipment Email Trigger setting (auto). The other is Never send emails (silent import) (silent). In the default mode the import behaves as if you had created or edited the shipments by hand, following WooCommerce → Settings → Partial Shipment → Shipment Email Trigger of Advance.
| Mode | New shipment | Existing shipment updated |
|---|---|---|
| Follow the trigger, trigger set to "Immediately when shipment is created" | The New Partial Shipment email is sent when the shipment is created, whatever its status. | The Partial Shipment Update email is sent when the update changes something the customer can see (items, provider link, tracking number, dates, customer note, or a status set back to Ready, which is written with the update itself). A status moved to Picked, Dispatched or Delivered is applied in a separate step and does not send an email by itself. |
| Follow the trigger, trigger set to "When shipment is marked as Picked" | An email is sent only when the row's status is Picked, and only once: the shipment is created as Ready and then moved to Picked. A new shipment imported as Dispatched or Delivered never emails. | No update email. If the row moves the shipment to Picked and its New email was never sent, the New email is sent once. |
| Never send emails (silent import) | No email. | No email. |
- Imports saved before version 1.4 have no value for this box, so they use the default mode. They used to be silent because of an old checkbox that was off. Open each such import and choose "Never send emails (silent import)" if you want to keep importing silently.
- Webhooks. If you use Advance's outgoing webhook, a non-silent new shipment sends
created. In silent mode nocreatedevent is sent. A shipment whose status is Picked, Dispatched or Delivered still sends anupdatedevent in every mode, because the status is applied as a separate step.
What Advance does after the import
- Order statuses. After each created or updated shipment, even a silent one, Advance recalculates the order status. A fully shipped order can become Completed (and WooCommerce then sends its usual Completed order email), and a partly shipped order Partially Shipped, according to Advance's settings.
- Shipment dates and data retention. If Advance's Delete old shipment data is set, shipments whose Shipment Date is older than the chosen period are deleted by its daily job, including shipments you imported with an old date.
- Quantities. The import cannot ship more than ordered: Advance reduces quantities to what is available.
The import log
The add-on writes one line per event into WP All Import's log, with a time in brackets in front, whether the import runs in the browser, from a cron address or from WP-CLI.
| Line | Meaning |
|---|---|
SHIPMENT CREATED: shipment #N for order #ID (tracking X). | A new shipment was created. N is its number within the order. |
SHIPMENT UPDATED: shipment for order #ID (tracking X). | An existing shipment with that order and tracking number was updated. |
SHIPMENT IMPORT COMPLETE: C created, U updated, S skipped. | The summary at the end of the run. |
ROW SKIPPED: no valid Order ID in this row (map a column with the WooCommerce order number to "Order ID"). | The row has no usable Order ID, so it is not even grouped. The wording says "order number", but the value is read as the order ID. |
SHIPMENT SKIPPED: order #ID not found. | No WooCommerce order has that ID. |
SHIPMENT SKIPPED: order #ID is "Status" - shipments cannot be added to orders with this status. | The order is Pending payment, Cancelled, Refunded or Failed. |
SHIPMENT ITEM SKIPPED: could not match product for order #ID (SKU: X). | Neither the Order Item ID nor the SKU matched a product line of the order. |
SHIPMENT ITEM SKIPPED: order #ID, SKU X: "Q" is not a quantity above zero. | The quantity cell is zero, negative, empty or not a number. |
NOTICE: order #ID lists SKU X more than once in this shipment: the quantities were added up. | Two rows of one group had the same product. |
WARNING: shipping provider "X" is not in the provider list (order #ID); add it under Settings → Partial Shipment → Shipping Providers. | The provider name matched nothing and no Tracking URL was given. |
Two cases leave no line. When a group has no usable item, its item lines are logged and the group counts as skipped. When Advance itself refuses a shipment (for example everything on the order is already shipped, or the order's lock could not be taken within 15 seconds), nothing is logged for that group and it is not counted as created, updated or skipped. If the totals do not add up to the number of groups in your file, look for those.
When WP_DEBUG is on, the add-on also writes lines starting with [WPAI Shipment] to the PHP error log.
Large files
- Rows are stored in the database in chunks of 200 rows (one option per chunk), so adding a row touches only the last small chunk. The readme says this makes a file of 8,000 rows take about ten seconds; that figure was not measured for this page.
- Creating the shipments is the last step of the import. It continues if you close the browser tab, and PHP's execution time limit is lifted for it.
- Memory use is kept flat by clearing WordPress's in-memory object cache every 200 groups where WordPress supports it.
- Whatever Advance does for each shipment (the order lock, status calculation, emails and webhooks) still happens one shipment at a time, so a very large import with emails switched on sends one email per shipment.
6. Settings
The add-on has no settings screen under WooCommerce or Settings. Everything it offers is in the Advance Partial Shipment Fields section of WP All Import's mapping step, and is saved with each import (WP All Import keeps it in the import's options under the key wphub_shipment). Every import has its own values. A new import starts with the defaults below.
Each mapping box is a one-row text area named wphub_shipment[key]. It takes a column, fixed text or both (see How mapped values are read). A box left empty means "nothing in the file for this field". The section's help text says Order ID, a product (Product SKU or Order Item ID) and the quantity are required; Order ID and Quantity Shipped carry a red asterisk.
Which shipment
| Field | Key | Default | What it does |
|---|---|---|---|
| Order ID required | order_id | Empty | The WooCommerce order the shipment belongs to. The box says "order number"; the value is used as the order ID (see Laying out the file). Rows without a usable ID are skipped. |
| Tracking Number | tracking_number | Empty | Rows with the same Order ID and Tracking Number form one shipment. Importing the same number again updates that shipment. The stored value is the text trimmed of surrounding spaces and cleaned as plain text. |
| Shipment Reference | shipment_ref | Empty | Optional. Used instead of the tracking number to tell shipments apart when there is no tracking number. It is then stored in the shipment's tracking number field. Ignored when a tracking number is present. |
What was shipped
| Field | Key | Default | What it does |
|---|---|---|---|
| Product SKU | product_sku | Empty | Matches a product line of the order by SKU, exactly as typed. Variations use their own SKU. |
| Order Item ID | order_item_id | Empty | Optional. The order line item ID. It picks the line directly and wins over the SKU. Used only when it is a number. |
| Quantity Shipped required | quantity | Empty | Whole units in this shipment. More than is still left to ship is reduced automatically; zero or negative rows are skipped. See How mapped values are read for the accepted number formats. |
Carrier
| Field | Key | Default | What it does |
|---|---|---|---|
| Shipping Provider | provider | Empty | A name from Advance's provider list, for example "Royal Mail", or one of your own providers from Advance's settings. Matched without regard to case. Used only when the Tracking URL is empty. |
| Tracking URL | tracking_url | Empty | Optional. A full link; use %1$s where the tracking number goes. It wins over the provider. |
Status and dates
| Field | Key | Default | What it does |
|---|---|---|---|
| Shipment Status | status | Empty | ready, picked, dispatched or delivered, and the words listed under Shipment Status. Anything else uses the default status below. |
| Shipment Date | date | Empty | For example 2026-10-05, 05.10.2026, 05/10/2026 or a Unix timestamp. Empty means today for a new shipment; a re-import keeps the stored date. |
| Estimated Delivery Date | eta | Empty | The same date formats. An empty cell keeps the stored value on a re-import. |
Notes
| Field | Key | Default | What it does |
|---|---|---|---|
| Customer Note | customer_note | Empty | Shown to the customer in the shipment email, on the order page and on the delivery note. An empty cell keeps the stored note on a re-import. |
| Internal Note | internal_note | Empty | Admin only. An empty cell keeps the stored note on a re-import. |
Import behaviour
| Option | Key | Default | What it does |
|---|---|---|---|
| Customer shipment emails | email_mode | auto | Two values. auto ("Follow the Shipment Email Trigger setting"): send the same emails as when a shipment is created or edited by hand, according to Advance's Shipment Email Trigger. silent ("Never send emails (silent import)"): never send customer emails, which suits bulk or historical imports. Any value other than silent counts as auto. |
| Default shipment status | default_status | ready | Allowed values ready, picked, dispatched, delivered (shown as Ready, Picked, Dispatched, Delivered). Used when the status box is empty or the cell is not a recognised status, including on an update of an existing shipment. Any other value counts as Ready. |
7. Developer reference
Everything here was taken from the add-on's code (version 1.5.0). The add-on defines no actions or filters of its own, no shortcodes, no REST routes, no AJAX actions and no WP-CLI commands. It adds no capabilities or roles.
WP All Import hooks it uses
| Hook | Priority | What the add-on does |
|---|---|---|
pmxi_addons (filter) | 10 | Registers the class WPHUB_Shipment_WPAI_Addon so that WP All Import treats the shipment fields as known import options. Without it WP All Import would drop the mapped values. |
pmxi_types_current_type_supports_title (filter) | 10 | Returns false for wphub_shipment, so no title mapping is demanded. |
pmxi_extend_options_main (action) | 99 | Prints the mapping section (template.php), only for the wphub_shipment type. |
pmxi_before_xml_import (action, $import_id) | 10 | Remembers the import id and empties that import's buffer. Does nothing for a preview run. |
pmxi_saved_post (action, $pid, $node, $is_update) | 10 | For a post of type wphub_shipment: buffers the row and deletes the post (wp_delete_post( $pid, true )). |
wp_all_import_post_skipped (action, $pid, $import_id, $node) | 10 | Buffers rows that WP All Import skipped, for posts of that type. |
pmxi_after_xml_import (action, $import_id, $import) | 10 | Groups the buffered rows and creates or updates the shipments. Clears the buffer. For a preview it only clears the buffer. |
wp_all_import_logger (filter, applied) | - | The add-on builds its log writer and passes it through this WP All Import filter, the way WP All Import does. |
init | 1, 20 | Loads the text domain (1) and registers the post type (20). |
before_woocommerce_init | 10 | Declares HPOS compatibility. |
What the add-on stores
| Name | Kind | Purpose |
|---|---|---|
wphub_shipment | Post type | A temporary container, one post per row, deleted at once. Registered public, with an admin interface (show_ui) but no menu, not publicly queryable, excluded from search, no rewrite rules, supporting only a title, not exportable. Labels "Shipment Imports" and "Shipment Import". |
wphub_shipment key inside the import's options | Import setting | The mapping and the two behaviour options. WP All Import saves it in the options column of its pmxi_imports table (with your table prefix). The add-on reads that column directly and falls back to the option _wpallimport_session_{import id}_ that WP All Import uses while an import is being set up. |
wphub_shipment_import_{import id} | Option, not autoloaded | While an import runs: the number of row chunks stored. (Buffers written by versions 1.0 to 1.4 held every row in this one option and are still read.) |
wphub_shipment_import_{import id}_c{n} | Option, not autoloaded | Chunk number n of buffered rows, up to 200 rows each (the group key and the parsed row values). |
wphub_shipment_current_import | Transient, one week | The id of the import that is running, so later requests of a chunked import find their buffer. Deleted at the end of an import. |
WPHUB_SHIPMENT_CHUNK | Constant | Rows per chunk, default 200. Defined only if it is not already defined, so you can define it earlier (for example in wp-config.php). |
_wpai-shipment_licence_key, _wpai-shipment_key_status | Options | The licence key and its status (active, inactive or absent). Written by the licence client. |
wpxh_licence_check_v2, wpxh_licence_msg_{user id} | Site transient (12 hours), transient (120 seconds) | Cached update and licence data, and the message shown after a licence action. The constant WPXH_LICENCE_SERVER and the filters wpxh_licence_server and wpxh_licence_sslverify belong to the licence client. |
The buffer options are deleted when the import finishes. They can remain if an import dies half way; the next run of the same import empties that import's buffer when it starts. The add-on creates no tables of its own. It writes shipments into Advance's tables partial_shipment and partial_shipment_items only through Advance's functions, and reads partial_shipment directly in one place: to find an existing shipment by order and tracking number.
What it calls in Advance
The add-on uses Advance's backend object (Wphub_Partial_Shipment::instance()->partial_shipment; when Advance has not built it on this request, the add-on loads the backend class file from the wphub-partial-shipment folder and builds one itself).
| Advance method | Used for |
|---|---|
show_button( $order ) | Skips orders on which Advance does not allow new shipments. |
create_shipment( $order_id, $url, $num, $items, $args ) | New shipments; $args carries shipment_status (except when applied later), shipment_date, shipment_eta, the notes and silent. |
update_shipment( $pk, $order_id, $url, $num, $items, $meta ) | Existing shipments; $meta may carry silent (Advance 3.4.0 or later). |
remove_shipment( $pk, $order_id ) | Only for a silent re-import on Advance older than 3.4.0. |
set_shipment_status( $pk, $order_id, $status ) | Applies Picked, Dispatched and Delivered as a real transition, so email, delivery date and webhook rules of Advance apply. |
get_provider_url_by_name( $name, $order ), get_tracking_list( $order ) | Provider lookup. |
shipment_email_trigger() | Reads whether the trigger is on_picked. |
It also reads the constant WPHUB_PARTIAL_SHIPMENT_VERSION to decide whether Advance can update silently (3.4.0 or later).
Functions
| Function | Purpose |
|---|---|
wphub_get_shipment_mapping( $import_id ) | The saved wphub_shipment options of an import. |
wphub_resolve_node_value( $token, $node ), wphub_node_column( $name, $node ) | Read a mapped value from a row (see the rules above). |
wphub_parse_shipment_row( $mapping, $node ) | The 13 mapped fields of one row. |
wphub_parse_shipment_date( $value, $fallback_now ), wphub_parse_shipment_eta( $value ) | The date readers. |
wphub_normalize_shipment_status( $value, $default ) | The status words. |
wphub_parse_quantity( $raw ) | The quantity reader. |
wphub_resolve_item_id( $order, $row ) | Order item id from the Order Item ID or the SKU. |
wphub_shipment_resolve_tracking_url( $backend, $order, $row ) | The tracking address from the Tracking URL or the provider. |
wphub_find_shipment_pk( $order_id, $num ) | The id of an existing shipment of the order with that tracking number. |
wphub_shipment_process_row( $import_id, $node ), wphub_shipment_flush( $import_id, $mapping ) | Buffer a row; turn the buffer into shipments. |
wphub_shipment_is_preview_import( $import_id, $import ) | Whether the import is a WP All Import preview run (the is_preview column of pmxi_imports). |
wphub_shipment_supports_silent_update() | True when Advance is 3.4.0 or later. |
wphub_shipment_logger(), wphub_shipment_debug( $message ) | The log writer; a WP_DEBUG-only error log line. |
File layout
wpai-shipment.php: plugin header, dependency checks, the post type, the registered add-on class, all helper functions and the import hooks.template.php: the mapping section printed on the WP All Import step.licence/class-wpxh-licence-client.php: the bundled licence and update client.languages/wpai-shipment.pot: the translation template (text domainwpai-shipment).
8. Privacy
What is stored and where
- Shipments. The data of your file ends up in Advance's tables
partial_shipmentandpartial_shipment_items: order id, item ids and quantities, tracking number and address, status, dates and the two notes. See Advance's page for the full list. The notes are free text from your file, so they can contain personal data. - The mapping. WP All Import stores your mapping and the two options in its own import record. The add-on adds nothing to it except the
wphub_shipmentsettings. - A temporary copy while an import runs. The rows of the file (order id, tracking number, provider, status, dates, notes, SKU and quantity) are kept in database options named
wphub_shipment_import_...until the shipments have been created, and are then deleted. If an import dies half way they can stay until the same import runs again or you delete them. - The file itself is handled by WP All Import, which keeps uploaded files in its own upload folder according to its settings. The add-on does not store the file.
- Licence options once you activate a licence: the key and its status.
Cookies
The add-on sets no cookies.
Data sent to other servers
The add-on itself makes no outside request except through its bundled licence client. It sends nothing for analytics and loads no external scripts, fonts or images. Customer emails, webhooks and the QR image in shipment emails are Advance's, not the add-on's; they are described on Advance's page, and an import triggers them in the same way as a shipment created by hand (unless you choose "Never send emails (silent import)", which stops the emails; webhooks follow the rules in Customer emails and webhooks).
| To | When | What is sent |
|---|---|---|
https://wpexpertshub.com/wp-json/wphub-licence/v1/activate and /deactivate | When you click Activate licence or Deactivate licence. | The plugin slug (wpai-shipment), the licence key, and your site address (site_url()). |
.../send-key | When you use Send licence key. | The plugin slug and the email address you typed. |
.../check | When WordPress builds its plugin update list (its regular update check, or Check again on the Updates screen) or someone opens the plugin's "View details" popup, and the cached answer is missing, older than 12 hours (one hour after a failed request) or no longer matches the keys and versions installed. | Your site address and, for every plugin on the site that bundles the WpExperts Hub licence client (Advance and this add-on, if both are installed), its slug, its stored licence key (empty when none) and its installed version. One request covers all of them. |
The requests also carry the standard headers WordPress adds to every HTTP request, including a User-Agent of the form WordPress/7.1.2; https://your-site (WordPress 7.1.2 shown), and are sent over HTTPS with certificate checking on. No order, customer, shipment or import data goes to wpexpertshub.com.
Retention, deactivation and deletion
- Imported shipments follow Advance's rules: they stay until you delete them or Advance's Delete old shipment data removes them by shipment date.
- Deactivating or deleting the add-on leaves all imported shipments in place. It has no uninstall routine; only its files are removed, and the licence options stay in the database.
- The add-on registers no personal data exporter or eraser, and no suggested privacy policy text.
9. Troubleshooting
| Problem | Likely cause and fix |
|---|---|
| The add-on switched itself off and shows "Advance Partial Shipment WPAI Add-On requires the Advance Partial Shipment for WooCommerce plugin." | Advance is not active, or it is installed in a folder with another name (the add-on looks for wphub-partial-shipment/wphub-partial-shipment.php). Activate Advance (or rename the folder), then activate the add-on again. |
| The add-on switched itself off and shows "...requires WP All Import (Pro recommended)." | Neither wp-all-import-pro/wp-all-import-pro.php nor wp-all-import/plugin.php is active. Activate WP All Import and the add-on again. |
| WordPress will not let me activate the add-on. | It names WooCommerce and Advance in its Requires Plugins header. Install and activate both first. |
| "Shipment Imports" is missing from the item types. | The add-on is not active. The type is registered every time WordPress loads, so it appears as soon as the add-on is active. Look under "Create or modify..." on the first step of a new import. |
| I cannot find the Advance Partial Shipment Fields section. | It appears only for the Shipment Imports type, on the step where you drag elements, and it starts collapsed: click its header to open it. |
| The import ran but created nothing and the log has no shipment lines. | None of Order ID, Tracking Number, Product SKU, Order Item ID or Quantity Shipped was mapped, so the add-on read no rows. Or the run was a preview (previews never create shipments). Or the import was created with another item type, for example Orders. |
| "ROW SKIPPED: no valid Order ID in this row..." | The Order ID box is empty for that row, not a number, or zero. Check the mapping and the file. |
| "SHIPMENT SKIPPED: order #N not found." | No WooCommerce order has that ID. The add-on uses the order ID, not an order number produced by a sequential-order-number plugin. Export the real order IDs. |
| "SHIPMENT SKIPPED: order #N is "Pending payment" - shipments cannot be added to orders with this status." | Advance does not allow shipments on Pending payment, Cancelled, Refunded or Failed orders. Change the order status first and import again. |
| "SHIPMENT ITEM SKIPPED: could not match product for order #N (SKU: X)." | The SKU does not equal the SKU of any product line of that order (case matters; variations use their own SKU), or the Order Item ID was not found. Compare with the order, or map the Order Item ID, which wins over the SKU. |
| "SHIPMENT ITEM SKIPPED: ... is not a quantity above zero." | The quantity cell is zero, negative, empty or text. See the accepted formats under How mapped values are read. |
| "WARNING: shipping provider "X" is not in the provider list..." | The shipment was created without a tracking link. Add the provider under WooCommerce → Settings → Partial Shipment → Shipping Providers in Advance, map a Tracking URL, or fix the spelling. |
| The created, updated and skipped numbers do not add up to the shipments in my file, or a shipment is missing without a log line. | Advance refused it without telling the add-on: everything on the order was already shipped, the quantities were all reduced to zero, the Order Item ID belonged to another order, or the order's lock could not be taken within 15 seconds. Open the order and check what is left to ship. |
| Quantities in the shipment are lower than in the file. | Advance reduces quantities to what is still unshipped (ordered, minus refunded, minus other shipments). The log does not mention it. |
| Dates are wrong, or off by a month. | A slash date such as 05/10/2026 is read day first. Use Y-m-d. A Shipment Date that cannot be read becomes the current time; an Estimated Delivery Date that cannot be read stays empty. |
| A re-import removed the provider link from existing shipments. | When a row has neither a Tracking URL nor a recognised Shipping Provider, the update sends an empty link and clears the stored one. Map a provider or URL column on every import. |
| A re-import set shipments back to Ready. | An empty or unrecognised status uses the Default shipment status, also for existing shipments. Map a status column that is filled on every row, or set the default to what you want. |
| A re-import removed an item from a shipment. | An update gives the shipment exactly the items that are in the file for that Order ID and tracking number. Include every item of the shipment. |
| Customers got emails (or did not) during the import. | Check Customer shipment emails in the import and Advance's Shipment Email Trigger, and the table under Customer emails and webhooks. Imports saved before 1.4 follow the trigger unless you set them to "Never". |
| Shipment numbers changed after a silent re-import. | Advance is older than 3.4.0, so a silent re-import deletes and recreates the shipment. Update Advance to 3.4.0 or later. |
| Order statuses changed after the import. | Advance recalculates the order status after every shipment, even silent ones (for example to Completed when everything has shipped). See Advance's Mark auto "completed" setting. |
| The delivery date shown to customers is the day of the import. | By design: when a shipment becomes Delivered, Advance records that moment as the delivery date. The Shipment Date in your file is stored as the shipment date only. |
| Imported shipments disappeared later. | Advance's data retention deletes shipments whose Shipment Date is older than the chosen period, including shipments imported with an old date. Switch the retention off or import newer dates. |
| Very large files stop or run out of time. | The last step (creating the shipments) continues after you close the browser tab and lifts PHP's time limit, but your host may still stop it. Re-running the same file is safe: shipments with the same order and tracking number are updated, not duplicated. Check the summary line to see how far it got. |
Options called wphub_shipment_import_... are in my database. | An import died before it finished. They are the buffered rows; running the same import again empties them, or you can delete them. |
| "Automatic update is unavailable for this plugin. Activate your licence to enable updates." | No active licence on this site. Open Plugins → WpExperts Hub Licences and activate the key. If activation says "The licence server returned an unexpected response", try again later and make sure your server can reach wpexpertshub.com over HTTPS. |
10. FAQ
Which plugins do I need?
WooCommerce, Advance Partial Shipment for WooCommerce (active, in the folder wphub-partial-shipment; 3.3.0 or later, 3.4.0 or later recommended) and WP All Import (Pro or free; tested with Pro 5.1). WP All Import's own WooCommerce add-on is not needed. The add-on deactivates itself with a notice if Advance or WP All Import is not active.
Will importing change my WooCommerce orders or products?
The import itself does not: it uses its own item type, so order line items and products are not overwritten. Adding a shipment can change an order's status through Advance's normal rules, just as when you create a shipment by hand.
How should my file be laid out?
One row per product line of a shipment, with the WooCommerce order ID, the product SKU or order item ID, the quantity and, normally, a tracking number; optionally a provider or tracking URL, a status, dates and notes. Rows with the same order ID and tracking number (or shipment reference) become one multi-item shipment. See Laying out the file.
What happens if I import the same file twice?
The add-on looks for a shipment of the same order with the same tracking number. If it finds one it updates it, so no duplicate is created. With Advance 3.4.0 or later this is done in place, also for silent imports. With an earlier Advance version a silent import deletes and recreates the shipment. Empty date and note columns keep the stored values, but an empty provider or status does not (see the warnings under Grouping, creating and updating).
Will customers be emailed during the import?
By default the import behaves like a shipment created by hand and follows Advance's Shipment Email Trigger, so customers can be emailed. Choose "Never send emails (silent import)" under Customer shipment emails to stop that, which suits historical data.
What if a row's order or product cannot be found?
The row is skipped and the import log says why, for example that the order does not exist, is Pending payment, Cancelled, Refunded or Failed, or that the SKU matches no product on the order.
Can I import without tracking numbers?
Yes. Use the Shipment Reference to tell shipments apart. With neither, all rows of an order form one shipment whose tracking number is stored as IMP- followed by the order ID.
Can I type fixed text in a mapping box?
Yes. Use a column, a fixed text such as Royal Mail or delivered, or both, for example Order {order_id[1]} shipped.
Can I import shipments for past orders without emailing customers?
Yes: choose "Never send emails (silent import)", map the statuses (for example delivered) and the shipment dates, and run the import. Keep in mind that Advance still recalculates order statuses, and that data retention can delete shipments with old dates.
Does it work with the free Partial Shipment for WooCommerce plugin?
No. It needs Advance, which has the parcels, tracking numbers and statuses that the add-on fills in. See How the three plugins fit together.
Does the add-on work without a licence?
Yes. Every feature works as soon as the add-on is active. The licence key only unlocks update packages through the normal WordPress updates screen.
How do I activate my licence and get updates?
Open Plugins → WpExperts Hub Licences, paste the key from your purchase email (also shown under My Account → Downloads) and click Activate licence. New versions then appear under Dashboard → Updates. How many sites a key covers is decided by the licence server, not by the plugin. Deactivate the licence on this screen before moving the plugin to another live site. If you lost the key, use Can't find your key? Email it to me.
Does the add-on contact any outside server?
Only the licence and update check described under Data sent to other servers. Nothing about orders, shipments or your import file is sent.
Is the add-on translation ready?
Yes. The text domain is wpai-shipment and the plugin ships a template file, languages/wpai-shipment.pot. It ships no translation files.
11. Changelog
Reproduced from the plugin's readme.txt.
1.5.0 - 2026-10-06
- Fix - Large files: collecting the rows of the file was quadratic (4,000 rows took over a minute, 8,000 rows five minutes, and the single option outgrew
max_allowed_packet). Rows are now stored in small chunks: 8,000 rows take about ten seconds. The last step of the import also keeps running when the browser tab is closed and does not stop at the web server's time limit. - Fix - A negative quantity (for example -3) shipped that many units. Zero, negative or non-numeric quantities are now skipped and reported in the log; "2,5" and "1,200" are read as numbers.
- Fix - Fixed text in a mapping box (for example Royal Mail, delivered) was ignored; only a lone {column} worked. Fixed text and text mixed with columns now work, and column names are matched without regard to case, spaces or punctuation.
- Fix - A silent re-import ("Never send emails") deleted and recreated the shipment, giving it a new shipment number. With Advance Partial Shipment 3.4.0 it now updates in place.
- Fix - Orders that are Pending, Cancelled, Refunded or Failed are skipped (as on the order screen) instead of receiving shipments; the log says why.
- Fix - The import log of imports run from cron or WP-CLI contained no shipment messages; they now appear in every kind of run. Rows without an Order ID are reported.
- Tweak - The mapping screen is grouped (which shipment / what was shipped / carrier / status and dates / notes), marks the required fields, explains every box, shows an example file and works on small screens. A repeated product line in one shipment is added up and the log says so.
1.4.1 - 2026-10-05
- Fix – WooCommerce listed the add-on as incompatible with High-Performance Order Storage (HPOS) because it did not declare support. It now declares HPOS compatibility (it only reads orders through the WooCommerce order API).
1.4 - 2026-10-03
- Fix – Customers received no "New Partial Shipment" email from imported shipments: the old "Send customer shipment emails" checkbox was off by default, so every import ran silently. The import now behaves like a shipment created by hand and follows Settings → Partial Shipment → Shipment Email Trigger. The option is now "Customer shipment emails" with "Follow the Shipment Email Trigger setting" (default) or "Never send emails (silent import)". Saved imports that never had the checkbox ticked now send emails too — set them to "Never" to keep importing silently.
- Fix – With the trigger "When shipment is marked as Picked", importing a shipment with status picked never sent the email because the status was written straight into the row; it is now applied as a real transition (email once per shipment).
1.3 - 2026-09-27
- Enhancement - Licence activation and automatic updates (Plugins → WpExperts Hub Licences).
- Fix – The Shipping Provider column was saved with the import but never applied: shipments now get the provider's tracking URL (case-insensitive match on the order country, all countries and custom providers). An explicit Tracking URL column still wins.
- Fix – Estimated delivery dates were stored as timestamps, which the plugin showed as a wrong date (1970) and could not edit; they are now stored as Y-m-d. Unparseable ETAs are left empty instead of becoming "today", and dates are read at midnight so they show the day in the file.
- Fix – Re-importing a file with empty columns wiped the stored date / notes of existing shipments.
- Fix – WP All Import preview runs could create real shipments; they are now ignored.
- Fix – The row buffer used a non-expiring transient (autoloaded, and evictable by object caches in the middle of an import); it now uses a non-autoloaded option.
- Tweak – Only WP All Import (Pro or free) is required; the WooCommerce add-on is optional. Declared plugin dependencies, own text domain, translator comments, readme added.
1.2
- Dedicated "Shipment Imports" type; shipments grouped by order + tracking number.
12. Support
Email support@wpexpertshub.com. Please include:
- Your order ID from wpexpertshub.com.
- The add-on version (1.5.0 on this page), the Advance Partial Shipment version, the WP All Import version, and your WordPress, PHP and WooCommerce versions.
- A small sample of your import file (a few rows, with personal data removed) and a description or screenshot of your mapping.
- The WP All Import log of the run, which shows every skipped row and the reason.
- What you expected and what happened.