Go to WooCommerce > Orders right now and filter by “Pending payment.” If you’ve had your store running for more than a few months, that list is probably longer than you expect, and probably older than you expect too.

Pending payment orders sit in a strange spot. Some of them are real customers who are about to come back and finish paying. Most of them never will. The trick is telling the two apart before you delete anything.

Why Orders Get Stuck in Pending Payment

WooCommerce creates an order and marks it “Pending payment” the moment a customer clicks Place Order, before payment actually clears. That’s by design, it’s how the order can be created at all. The order only moves to Processing or Completed once the gateway confirms payment. If that confirmation never arrives, the order just sits there.

The usual reasons:

  • The customer closed the tab or lost connection between clicking Place Order and the payment gateway redirecting back
  • A card was declined and the customer never retried
  • The gateway timed out or returned an error the customer didn’t understand
  • The order used a manual method, bank transfer or check, and the customer never actually sent payment
  • A bot or scraper submitted a test order that was never meant to be real

None of these are your fault, and none of them mean your checkout is broken. Every store running any payment gateway accumulates these. The question is what to do with them once they pile up.

Why a Pile of Pending Orders Is a Problem

A handful of pending orders is normal. Hundreds of them cause real issues:

ProblemWhy it happens
Cluttered orders screenReal, active orders get buried in a list mostly made of orders that will never complete
Inflated abandoned-cart emailsRecovery automations often trigger off pending orders, so old dead ones generate noise instead of real recovery attempts
Skewed conversion reportingPending orders inflate your total order count without ever becoming revenue, making your actual conversion rate look worse than it is
Database bloatEach order writes rows to wp_posts, wp_postmeta, wp_woocommerce_order_items, and related tables. Thousands of dead orders slow down admin queries
Stock holds that never releaseSome inventory plugins reserve stock on order creation. Pending orders that never resolve can hold phantom inventory

None of these are catastrophic on their own. Together, on a store that’s been live for a year or two, they add up to a genuinely slower, messier admin.

Which Pending Orders Are Actually Safe to Remove

Not all pending orders are the same age or the same risk. Use age as your main filter, not just status.

Order ageRecommendation
Under 24 hoursLeave it. The customer may still complete payment, especially bank transfers
1 to 7 daysLeave it, but this is a good window for an automated “complete your order” reminder email
7 to 30 daysSafe to review individually. Most will never convert
30+ daysSafe to bulk clean, in almost every case

The one exception: if you accept manual bank transfer or check payments, extend that window. Those can legitimately take a week or two to arrive, and cancelling one the day after it’s placed will cost you a real sale.

Method 1: Manual Review and Cancel (Small Stores)

If you’ve got fewer than 50 pending orders total, review them by hand:

  1. Go to WooCommerce > Orders, filter by Pending Payment
  2. Sort by date, oldest first
  3. Open orders older than your cutoff (30 days is a reasonable default)
  4. Check the customer email and order total. High-value orders are worth a manual follow-up email before you cancel
  5. Change the status to Cancelled, don’t delete outright yet, in case the customer does come back

This works fine at small scale. It does not scale to hundreds of orders, and most stores that have this problem have hundreds of orders.

Method 2: WooCommerce’s Built-in Auto-Cancel

WooCommerce has a setting that automatically cancels unpaid orders after a set number of minutes, found at WooCommerce > Settings > Products > Inventory, under “Hold Stock.” This only handles orders that never reached a payment gateway confirmation attempt, and the default hold time is short, meant for stock reservation, not general order hygiene. It won’t clean up your existing backlog, and it won’t touch orders where the gateway attempt itself is what stalled.

Method 3: SQL for Existing Backlogs (Advanced)

If you’re comfortable in phpMyAdmin or a database client, you can find and cancel old pending orders directly. Always back up your database before running any bulk update.

-- Find pending orders older than 30 days
SELECT ID, post_date FROM wp_posts
WHERE post_type = 'shop_order'
  AND post_status = 'wc-pending'
  AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Review that list before touching anything. To cancel rather than delete, so the record stays for your own reporting history:

UPDATE wp_posts
SET post_status = 'wc-cancelled'
WHERE post_type = 'shop_order'
  AND post_status = 'wc-pending'
  AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

If your store uses WooCommerce’s High-Performance Order Storage (HPOS), orders live in wp_wc_orders instead of wp_posts, and this query needs adjusting to match. Check WooCommerce > Settings > Advanced > Features to see which storage mode you’re on before running anything.

Method 4: A Plugin That Does the Filtering For You

Manually deciding which pending orders are safe requires checking status and age for every single order, which is exactly the kind of repetitive task a plugin should handle instead of a person clicking through pages of the orders screen.

The Stale Order Cleaner for WooCommerce plugin adds a screen under WooCommerce > Order Cleaner that shows a live count of pending, failed, cancelled, draft, and trashed orders, lets you filter by status and a minimum age (7 to 365 days), and previews exactly which orders will be affected before you confirm anything. Nothing gets deleted until you’ve seen the list and clicked confirm.

It’s free, works with both legacy post-based storage and HPOS, and doesn’t touch orders in Processing, On Hold, or Completed regardless of age, so there’s no risk of it catching a real sale by mistake.

After You Clean Up: Prevent the Backlog From Coming Back

A one-time cleanup buys you a tidier orders screen for a few months, then the pile starts growing again unless you address the habit, not just the backlog:

  • Set a recurring reminder, monthly for smaller stores, weekly for high-volume ones, to review and clear pending orders older than your cutoff
  • If you accept manual payment methods, add a note in the confirmation email telling customers exactly how long you’ll hold the order before cancelling
  • Consider an abandoned-cart recovery email at the 24-hour mark for pending orders, which recovers some of them before they become cleanup work at all

Also reviewing storefront accessibility? The free AP Accessibility Fixer for WooCommerce has nine targeted fixes. Test product pages and checkout with your own theme and payment gateway.

Pending payment orders aren’t a sign something’s broken. They’re a normal side effect of running a checkout. The only mistake is letting them sit untouched for a year, because at that point cleaning them up by hand is a much bigger job than it needed to be.