WooCommerce order numbers skip because, by default, the order number is just the internal ID, and that ID comes from the same counter WordPress uses for products, pages, images, coupons and drafts. Every time something else is saved, the counter moves on, so your next order may be #1052 when the last one was #1037. Nothing is broken and no orders are missing: to get 1, 2, 3 you need a separate order number, which a numbering plugin adds without touching the ID.

Why it happens

  • One counter for everything. Orders take their ID from the wp_posts table, the same table that stores products, pages, media, coupons, menu items and revisions. With High-Performance Order Storage (HPOS) the orders live in their own table, but WooCommerce still reserves each order ID in wp_posts with a placeholder row, so the IDs stay shared.
  • Draft orders from the block checkout. When a shopper opens the Checkout block, WooCommerce creates an order with the status checkout-draft before they pay. If they leave, a daily clean-up task deletes the draft, and its number is gone for good.
  • Refunds are orders too. Each refund is saved as its own record and uses up an ID.
  • Deleted orders. Test orders, spam orders and failed orders that you delete leave gaps.
  • Auto-drafts. Clicking “Add new” on a product or a post creates an empty draft with an ID, even if you never save it.
  • Your database host. Some hosts set MySQL to count in steps of 2, 5 or 10 (auto_increment_increment). Then every new ID jumps by that step.
  • A numbering plugin that fails. If you already use a plugin and see the same number twice, the problem is in the plugin’s counter. A July 2026 support thread for one popular numbering plugin reports the same number given to three orders after an update.

How to check it yourself

  1. See whether your number is the ID. Go to WooCommerce > Orders and open an order. Look at the address bar: with HPOS it ends in &id=1052, with the classic storage it shows post=1052. If that number is the same as the order number on screen, you are not using any numbering plugin and the gaps are normal.

  2. Look for checkout drafts. Go to WooCommerce > Status > Scheduled Actions and search for woocommerce_cleanup_draft_orders. If it exists and runs every day, your block checkout is creating and deleting drafts. Many drafts between two real orders mean many abandoned checkouts.

  3. Count the refunds. If the gaps line up with days you issued refunds, that explains part of them.

  4. Check the MySQL step. In phpMyAdmin (or your host’s database tool), run:

    SHOW VARIABLES LIKE 'auto_increment_increment';

    If the value is not 1, every ID jumps by that amount. Only your host can change it.

  5. Look for duplicates. If you use a numbering plugin, export your orders to CSV and sort by order number. Two orders with the same number is a real problem; gaps are not.

How to fix it

Never try to change the order IDs themselves. Payment gateways, shipping plugins, emails and your accounting tool point to those IDs, and rewriting them breaks the links. The fix is to give orders a second, visible number.

If you want 1, 2, 3 with no gaps between orders:

  1. Make a full backup.
  2. Install a sequential order numbers plugin. The free “Sequential Order Numbers for WooCommerce” (by SkyVerge) on WordPress.org has no settings: it continues from your highest current order number. Prefixes, suffixes and a custom first number are in its paid Pro version or in other plugins.
  3. Place a test order and check that the new number shows on the thank-you page, in the email and in My Account.
  4. Tell your accountant or your ERP from which order the new numbering starts.

If you want a higher first number (so a new store doesn’t show order #12): you can raise the counter in the database. Make a backup, then run, with your own table prefix:

ALTER TABLE wp_posts AUTO_INCREMENT = 10000;

The next post, product or order will get ID 10000 or higher. You can only move it up, never below the highest ID that already exists, and it does not stop future gaps.

If you want to start again at 1 on a store with orders: you can’t do it with the ID, because products and pages already use the low numbers. Only a numbering plugin with its own counter can do it.

If you need invoices with no gaps for tax reasons: that is a job for invoice numbers, not order numbers. Unpaid and failed orders also get an order number, so the order sequence will never match your paid sales one to one.

How to stop it from happening again

The gaps come back with every product, refund and abandoned checkout, so the lasting fix is a separate number that only orders use. That’s what our plugin NumberCraft does: it gives each order the next number of its own sequence (with any prefix, suffix or date, such as INV-2026-00042), uses an atomic counter and a unique index so two orders never get the same number, and can give the number only when the order is paid, so failed payments leave no gaps. It can also start again every year, renumber old orders with a preview and undo, and import the numbers saved by another order-number plugin. It works with HPOS and the block checkout. It costs 25 USD a year for one site, or 49 USD for life, and you can try it in the demo. If the free plugin above covers what you need, use that.

FAQ

Are orders missing if the numbers skip? No. The missing numbers went to products, pages, drafts, refunds or deleted orders. Your real orders are all there.

Can I reset WooCommerce order numbers to 1? Not the order ID. You can start a new visible sequence at 1 with a numbering plugin, while the ID keeps counting in the background.

Does HPOS fix the gaps? No. With HPOS orders have their own table, but WooCommerce still reserves each order ID in wp_posts, so the IDs are still shared with other content.

Will a numbering plugin change my old orders? Most only number new orders. Some can also renumber old ones; make a backup first and check that your accounting tool doesn’t depend on the old numbers.

Why does my order number change after payment? Some plugins give the number when the order is created and others when it is paid. If a plugin is set to number on payment, the order gets its final number only when the payment goes through; check your plugin’s settings to see which one it uses.