9 min read

How to Set Up WooCommerce Order Fulfillment Step by Step

Shashank Dubey
Content & Marketing, Wbcom Designs · Published Jul 31, 2024 · Updated Aug 21, 2026
WooCommerce Order Fulfillment A Step-by-Step Guide

Order fulfillment in WooCommerce is everything that happens between “Processing” and “Completed”: confirming payment, picking and packing, adding tracking, telling the customer, and handling whatever comes back. WooCommerce now covers most of that in core. Since version 10.2 (September 2025) it has a built-in Fulfillments feature for split shipments and tracking numbers, and 10.7 (April 2026) added custom shipping providers. Most stores no longer need a tracking plugin.

This guide walks through the setup in the order we do it for clients: inventory settings, order statuses, the Fulfillments feature, shipping and labels, customer notifications, and returns. It assumes WooCommerce 10.7 or newer (11.0 shipped in August 2026).

Step 1: Get inventory settings right first

Fulfillment goes wrong when stock is wrong, so start at WooCommerce → Settings → Products → Inventory.

  1. Manage stock: tick it. Without this, per-product stock tracking is unavailable.
  2. Hold stock (minutes): default 60. This is how long an unpaid Pending order keeps stock reserved before WooCommerce cancels it and releases the items. For flash sales we drop it to 15 to 20 minutes; for B2B stores with bank transfer payments we raise it or leave it blank (never cancel).
  3. Low stock threshold and Out of stock threshold: set per store, then override per product on the Inventory tab where needed. The low stock email goes to the address in the Notifications field.
  4. Out of stock visibility: decide whether sold-out products stay in the catalogue. Hiding them keeps the shop tidy but loses the SEO value of the product page; we usually leave them visible with “Out of stock” shown.

Then on each product, open the Inventory tab, enter a SKU, tick “Track stock quantity at product level”, and set the quantity. SKUs matter more than people think: they are what your shipping software, your packing slips and any later CSV import will key on.

Step 2: Understand the order statuses you are working with

WooCommerce ships with eight statuses, documented on the WooCommerce order statuses page. The ones that drive fulfillment:

StatusMeaningStockYour action
Pending paymentOrder placed, payment not yet receivedHeld for the Hold Stock windowNone; wait or cancel
On holdAwaiting manual payment confirmation (bank transfer, cheque)ReducedConfirm payment, move to Processing
ProcessingPaid, stock reduced, ready to shipReducedPick, pack, fulfill
CompletedShipped and doneReducedNone
CancelledCancelled by admin or customerRestoredRefund if paid
RefundedFully refundedRestored if you chose to restockNone
FailedPayment declinedRestoredContact customer if needed
DraftBlock checkout in progressHeld 10 minutesNone, auto-deleted daily

The normal path is Pending → Processing → Completed. Virtual and downloadable orders skip Processing and go straight to Completed because there is nothing to ship. For everything else, “Processing” is your pick list.

One habit that saves hours: keep Orders filtered to Processing, newest first. That view is your work queue. Since WooCommerce 8.2 the Orders screen runs on High-Performance Order Storage (HPOS) by default, which makes filtering and searching that queue fast even on stores with hundreds of thousands of orders.

Step 3: Turn on the Fulfillments feature

Before 10.2 you needed Shipment Tracking or Advanced Shipment Tracking to attach a tracking number to an order. Now it is in core, though still flagged as beta and off by default. Enable it with WP-CLI:

wp option update woocommerce_feature_fulfillments_enabled yes

If you do not have shell access, a one-line snippet in a must-use plugin does the same thing:

add_action( 'init', function () {
    if ( 'yes' !== get_option( 'woocommerce_feature_fulfillments_enabled' ) ) {
        update_option( 'woocommerce_feature_fulfillments_enabled', 'yes' );
    }
} );

Once enabled, a Fulfillment status column appears on the Orders screen with three values: No Fulfillments, Partially Fulfilled, and Fulfilled. Open any order and you get a Fulfillments panel where you can:

  1. Choose which line items and quantities go in this shipment.
  2. Pick a shipping provider (70+ carriers built in) and paste the tracking number. The tracking link is generated for you.
  3. Click Save as Draft to prepare the shipment without emailing anyone, or Fulfill to mark it shipped and notify the customer.

Partial shipments are first-class. If a customer orders three items and one is back-ordered, you fulfill two now, the order shows Partially Fulfilled, and you fulfill the third later with its own tracking number. Downloadable items auto-fulfill; virtual items can be set to auto-fulfill too, so mixed orders only leave the physical items pending.

The WooCommerce developer blog has the full feature description, including the REST endpoints at /wc/v3/orders/{id}/fulfillments, which is what you would point a warehouse system at.

Custom carriers

If your courier is not in the list, WooCommerce 10.7 added WooCommerce → Settings → Shipping → Shipping Providers. Add the carrier name and a tracking URL template with a placeholder for the number, and it appears in the provider dropdown and produces clickable links in emails. Developers can do the same with the woocommerce_fulfillment_shipping_providers filter.

Step 4: Set up shipping and labels

Fulfillment speed depends on how much you have to type per order. Two things cut that down.

Shipping zones and methods. Under WooCommerce → Settings → Shipping → Shipping zones, define where you ship and what you charge. Use shipping classes for heavy or oversized products so flat rate costs stay accurate. Getting this right at checkout means you are not refunding shipping differences later.

Label printing. The free WooCommerce Shipping extension (by Woo) prints discounted USPS, UPS and DHL labels from the order screen in the US and writes the tracking number back to the order automatically. Outside the US, look at your carrier’s own WooCommerce integration (Royal Mail, Australia Post, Canada Post all have them) or a multi-carrier service such as Sendcloud or ShipStation. Whatever you pick, the test is simple: does it push tracking back into WooCommerce without you copying it by hand?

For multi-vendor marketplaces built on Dokan, WCFM or WC Vendors, fulfillment is delegated to each vendor from their own dashboard. Our StoreMate Dokan theme and its WCFM and WC Vendors siblings surface the vendor order list and shipment fields in the front-end dashboard so vendors never need wp-admin access.

Step 5: A daily fulfillment routine that works

Here is the routine we set up for a store shipping 40 to 80 orders a day. Adjust volumes to taste.

  1. Morning: clear the queue. WooCommerce → Orders, filter Processing. Check On hold too and confirm any bank transfers that have landed.
  2. Print pick lists. Select all Processing orders, Bulk actions → print (via your label or packing slip plugin). Use the Customer provided note column to catch special requests.
  3. Pack and label. Generate labels from the order screen or your shipping tool.
  4. Fulfill. In each order, create the fulfillment with the tracking number and click Fulfill. If your label tool writes tracking back automatically, you only need to confirm.
  5. Complete. Once every item on an order is fulfilled, change status to Completed. You can do this in bulk from the Orders list: tick, Bulk actions → Change status to completed. The customer receives the Completed order email.
  6. Afternoon: exceptions. Failed payments, address problems and back-orders. Add an order note (tick “Note to customer” if they need to see it) so the next person knows what happened.

Order notes are underrated. A private note saying “Called customer, confirmed flat number 4B” is worth more than any plugin when a dispute arrives three weeks later.

Step 6: Customer notifications

Go to WooCommerce → Settings → Emails. The emails that matter for fulfillment are Processing order (sent when payment is confirmed), Completed order (sent on completion), and, once Fulfillments is enabled, the fulfillment created, updated and cancelled emails carrying items and tracking links.

Two edits worth making. First, in the Completed order email, add a line about the expected delivery window and where to find tracking (the customer’s My Account → Orders page shows it). Second, turn off the Completed email for digital-only stores if the Processing email already delivers the download link; two emails seconds apart look like a mistake.

Step 7: Returns and refunds

WooCommerce has no built-in RMA workflow, but the refund side is solid. Open the order, click Refund, enter quantities or amounts per line item, and tick “Restock refunded items” if the goods came back in sellable condition. If the payment gateway supports it (Stripe, PayPal and WooPayments do), “Refund via gateway” pushes the money back automatically; otherwise choose manual refund and process it in the gateway dashboard yourself.

Partial refunds keep the order at Processing or Completed; only a full refund sets it to Refunded. Write the reason in the refund note, because WooCommerce Analytics reports refunds and you will want to know why later.

For a real returns portal (customer requests, approvals, return labels), you are into plugin territory. Before buying one, write your returns policy down and check the plugin supports it exactly; most stores need only a contact form plus the refund screen above.

Common problems and fixes

  • Orders stuck at Pending. The gateway never sent its payment confirmation. Check WooCommerce → Status → Logs for the gateway and make sure its webhook or IPN URL is reachable (some security plugins block it).
  • Stock going negative. “Manage stock” is on but the product-level tick box is off, or a plugin imported stock without syncing _stock_status. Re-save the product or run a stock import by SKU.
  • Fulfillment panel missing. The feature option is not set to yes, or you are on WooCommerce older than 10.2. Check WooCommerce → Status for the version.
  • Tracking link not clickable. The provider was typed manually without a URL template. Add the carrier under Shipping → Shipping Providers.
  • Customer did not get the shipped email. It was saved as Draft, not Fulfilled. Edit the fulfillment and click Fulfill.

FAQ

Do I still need a shipment tracking plugin?

For most stores, no. Core Fulfillments covers tracking numbers, partial shipments and customer emails. You still want a plugin or service for label printing and carrier rate quotes, and for branded tracking pages.

Should I mark orders Completed manually or automatically?

Manually, or triggered by your label tool when tracking is written. Auto-completing on payment (a common snippet) tells the customer the order is done before you have shipped it, and breaks the Processing queue you rely on.

Can a 3PL or warehouse system update WooCommerce directly?

Yes, through the REST API. Orders are read from /wc/v3/orders, and with Fulfillments enabled the warehouse can POST to /wc/v3/orders/{id}/fulfillments with items and tracking. Create a dedicated API key with Read/Write permission for it under WooCommerce → Settings → Advanced → REST API.

Is the Fulfillments feature safe to use in production?

It is labelled beta, but it has been in core for nearly a year and is maintained by the WooCommerce team. Test it on staging with a real order first, which you should do for anything that emails customers.

What we’d do

Fix inventory settings, enable Fulfillments, set up label printing that writes tracking back, then run the daily routine above for two weeks before adding anything else. Most stores find that is the whole system. If your fulfillment involves multiple warehouses, vendor payouts or a custom WMS integration, that is where custom WooCommerce development pays for itself quickly.

Shashank Dubey
Content & Marketing, Wbcom Designs

Shashank Dubey, a contributor of Wbcom Designs is a blogger and a digital marketer. He writes articles associated with different niches such as WordPress, SEO, Marketing, CMS, Web Design, and Development, and many more.

Related reading