When a customer clicks "Place Order" on your WooCommerce store, a chain of events begins that either ends with a happy customer or a support ticket. The gap between those two outcomes is your fulfillment workflow. If you have not mapped every step from order creation to delivery confirmation, you are debugging problems one refund at a time. This article walks through the exact stages WooCommerce tracks, the data each stage requires, and the specific points where most stores lose visibility or fail to update customers.
The setup
WooCommerce > Orders shows every order and its current status, from Pending Payment to Completed. This status system is the backbone of fulfillment tracking, but it does not automatically update when you print a label, pack a box, or hand the package to a carrier. You are responsible for moving orders through those statuses, either manually or through a plugin that bridges WooCommerce to your shipping workflow.
How WooCommerce tracks order progress
WooCommerce ships with a fixed set of core order statuses, including Pending Payment, Processing, On Hold, Completed, Cancelled, Refunded, and Failed. When a customer pays successfully, the order moves to Processing. At that point, WooCommerce considers the order ready for fulfillment but does not track picking, packing, or shipping as separate stages. The order sits in Processing until you manually mark it Completed.
This works for a store shipping five orders a day from one location, but it falls apart when you need to know which orders are packed, which are waiting for a carrier pickup, or which items in a multi-product order have shipped. WooCommerce's fulfillment system lets you track which items have shipped and manage partial fulfillments, but you still need to create the fulfillment record and add tracking numbers yourself.

By default, WooCommerce knows what was ordered and what was paid. It does not know what is in your warehouse, what is in a box, or what is in transit unless you feed that data back into the system. The native inventory management features, suitable for stores with fewer than 500 SKUs, track stock quantity and send low-stock alerts. They do not forecast demand or manage multiple warehouse locations. If you have multiple fulfillment centers or drop-ship suppliers, the stock number at the product level tells you nothing about where the item actually is or which location should fulfill the order.
From click to carrier handoff
The moment an order moves to Processing, someone has to decide where it ships from, pull the items, pack them, generate a shipping label, and confirm the carrier received the package. WooCommerce does not automate any of these steps out of the box. You handle them manually or plug in a system that does.
WooCommerce Shipping is a free extension that buys and prints labels for USPS, UPS, DHL Express, and FedEx directly from the dashboard. It compares live rates, generates tracking numbers automatically, and marks shipments as carbon neutral. If you buy the label inside WooCommerce Shipping, the tracking number saves to the order automatically, and you skip the step of copying a tracking code from a carrier website into a custom field. That automation closes the loop between label creation and customer notification.
If you print labels outside WooCommerce, through a third-party fulfillment service or a carrier account, you need a shipment tracking extension to add the tracking number, carrier name, and tracking link to the order. The Shipment Tracking extension for WooCommerce lets you attach those details manually or bulk-import them via CSV. Once added, the tracking information appears in order emails, on the customer's My Account page, and on a dedicated tracking page. Some plugins update the order status to Shipped or Partially Shipped when tracking information is added, but this is not a WooCommerce default. You configure that behavior in the plugin settings.
Customers expect fast shipping. Research shows 78% of frequent online shoppers call it a significant factor in a positive experience, and 45% will not repurchase after a late order. That pressure means you need accurate fulfillment times on product pages and real-time updates once the order ships. WooCommerce Lead Time is a plugin that adds clear fulfillment-time information to product pages, setting realistic expectations before the customer clicks Buy.
Partial fulfillments and split shipments
A single order containing a backpack and a water bottle might ship from two warehouses on different days. WooCommerce's fulfillment system handles this by letting you create multiple fulfillment records for one order. Each fulfillment lists the items included, the tracking number, and the carrier. You can save a fulfillment as a draft until the items leave the warehouse, or fulfill it directly and send the customer an email immediately.
If you fulfill an order partially, the order status does not automatically change to Completed. It stays in Processing until every item ships, or you manually mark it Completed. Some plugins add a Partially Shipped status to make this clearer in the order list, but WooCommerce core does not include it. You either extend the status system with a plugin or rely on the fulfillment records to know what has left and what has not.
Partial fulfillments also expose inventory problems. If item A ships but item B is backordered, WooCommerce will not warn the customer unless you configure backorder settings at the product level. Under each product's inventory tab, you can enable backorders and choose whether to notify the customer. That setting is per-product, not per-order, so you need to audit your catalog before a stockout surprises someone.
What breaks
Tracking numbers added but customer sees nothing
You add a tracking number to an order and mark it Completed, but the customer never receives an email with tracking information. The cause is that you added the tracking number after changing the order status. WooCommerce sends the Completed email when the status changes. If the tracking number is not in the order yet, the email does not include it. The fix is to add the tracking information first, then change the status, or use a plugin that triggers a separate shipment notification email when tracking is added, independent of the Completed email.
Stock shows available but the order cannot fulfill
An order comes in for a product that shows five units in stock, but your warehouse has zero on the shelf. The product is managed by WooCommerce's built-in inventory, but you also sell on another channel that does not sync with WooCommerce in real time. By the time the WooCommerce order arrives, the stock is gone. The fix is either to sync inventory across all channels using a centralized inventory plugin that updates WooCommerce every time a sale happens elsewhere, or to manually reserve stock for WooCommerce orders before they are confirmed. If you cannot sync, reduce the displayed WooCommerce stock by a safety buffer to avoid overselling.
Order routes to the wrong fulfillment center
You have two warehouses, one on the East Coast and one on the West Coast, but every order emails the same picking team regardless of the customer's zip code. WooCommerce does not route orders by shipping address unless you add a plugin that parses the destination and sends the order email to the appropriate recipient. WooCommerce Multiple Email Recipients is a plugin that routes order-related emails to different recipients or fulfillment centers based on the products ordered. The alternative is a fulfillment platform that integrates with WooCommerce and assigns orders to locations automatically based on rules you define. Without one of these, you manually forward orders to the correct team or risk shipping from the wrong location.
FAQs
Can I automate the transition from Processing to Shipped without a plugin?
No. WooCommerce does not change order status when you add tracking information or print a label unless a plugin or custom code triggers that update. If you buy labels through WooCommerce Shipping, you still need to manually mark the order Completed or install a shipment tracking plugin that adds a Shipped status and changes it automatically when tracking is saved.
What happens if I mark an order Completed before it ships?
The customer receives a Completed email immediately, which typically says "Your order is complete." If the package has not shipped yet, the customer expects delivery soon and may contact support when nothing arrives. The order also drops out of the Processing filter, so your packing team might skip it. Always confirm the package is handed to the carrier before marking Completed, or use a Shipped status as an intermediate step.
How do I handle returns in the fulfillment map?
WooCommerce does not include a returns workflow. You need a plugin that creates return requests, generates return labels, and updates the order when the item is received back in your warehouse. Many shipment tracking plugins also offer return label management, letting you email a return label to the customer and track the return shipment the same way you track outbound shipments. Without a plugin, you handle returns manually by issuing a refund and updating the order notes.
Can I see which orders are packed but not yet picked up by the carrier?
Only if you use a fulfillment plugin that adds a custom status like Packed or Ready to Ship. WooCommerce core does not distinguish between an order that is printed, packed, and waiting for pickup versus one that is still on the shelf. You can work around this by adding a private order note when the package is packed, but you cannot filter the order list by note content. A custom status is the cleanest solution.
What is the fastest way to add tracking numbers for 50 orders at once?
Most shipment tracking plugins accept CSV uploads with columns for order ID, tracking number, carrier, and ship date. Export your orders from WooCommerce, match them to the tracking numbers from your carrier's batch print tool, format the data as CSV, and import it back. The plugin updates all the orders in seconds and sends tracking emails if configured to do so. Manual entry takes 30 seconds per order, so 50 orders is 25 minutes. CSV import brings that down to under five.
Verdict: Use WooCommerce Shipping if you buy all your labels through USPS, UPS, DHL, or FedEx and want tracking automation baked in. Use a shipment tracking plugin if you print labels elsewhere and need to import tracking numbers in bulk. Use a full fulfillment platform if you manage multiple warehouses, drop-ship suppliers, or need automated order routing by product or destination.