This manual covers version 2.0.0. Settings and edition availability may differ in other releases.
1. Requirements
| Requirement | Minimum | Tested Up To |
|---|---|---|
| WordPress | 6.0 | 6.9 |
| WooCommerce | 7.0 | 10.6 |
| PHP | 7.4 | 8.4 |
WooCommerce must be installed and active before activating this plugin. If WooCommerce is missing, the plugin will display an admin notice and will not load.
2. Installation
2.1 Upload via WordPress Admin (Recommended)
- Log in to your WordPress admin panel.
- Go to Plugins → Add New Plugin.
- Click Upload Plugin at the top of the page.
- Click Choose File, select the
nextxen-pre-order-manager.zipfile, then click Install Now. - After installation completes, click Activate Plugin.
2.2 Upload via FTP
- Unzip the downloaded
nextxen-pre-order-manager.zipfile. - Connect to your server with an FTP client (e.g., FileZilla).
- Upload the
nextxen-pre-order-managerfolder to/wp-content/plugins/. - In WordPress admin, go to Plugins → Installed Plugins and click Activate.
2.3 Verify Installation
After activation confirm the plugin is running by checking:
- WooCommerce → Pre-Orders appears in the left admin menu.
- WooCommerce → Settings → Pre-Orders tab is visible.
- (Premium) The WordPress admin dashboard shows a Pre-Order Manager widget.
3. Global Settings
Navigate to WooCommerce → Settings → Pre-Orders to configure store-wide defaults.
3.1 Button Text Customization
| Setting | Default | Description |
|---|---|---|
| "Add to cart" button text | Pre-order now | Text on the product page button when pre-orders are active |
| "Place order" button text | Place pre-order now | Text on the checkout button when the cart contains a pre-order |
Keep labels action-oriented. Examples: "Reserve yours", "Claim your copy", "Pre-order today".
3.2 Message Customization
Messages appear on product pages and in product listings to inform customers about the release date.
Available Placeholders
| Placeholder | Output Example |
|---|---|
{availability_date} | January 15, 2026 |
{availability_time} | 09:00 AM |
| Setting | Default | Where It Appears |
|---|---|---|
| Product page message | This item will be released {availability_date}. | Below the price on single-product pages |
| Product list message | Available {availability_date}. | Under the product in shop/category pages |
Both fields accept basic HTML (<strong>, <a>, <em>). Leave either field empty to hide it entirely.
Example custom message:
Launching <strong>{availability_date}</strong> — secure yours before we sell out!
3.3 Cart & Checkout Text
Available Placeholders
| Placeholder | Output Example |
|---|---|
{order_total} | $49.00 |
{availability_date} | January 15, 2026 |
| Setting | Default | Purpose |
|---|---|---|
| Release date label | Available | Label shown next to the release date in the cart line item |
| Charged upon release text | {order_total} charged {availability_date} | Shown when payment timing is "upon release" |
| Charged upfront text | {order_total} charged upfront | Shown when payment timing is "upfront" |
3.4 Out-of-Stock Products
Setting: Enable pre-orders for out-of-stock products
When enabled, the plugin automatically enables pre-orders on compatible products (simple, variable, composite, bundle, booking, mix-and-match, subscription) when they go out of stock. The product is marked as "in stock" with stock management disabled, allowing customers to place pre-orders while inventory is unavailable.
For variable products, all variations must be out of stock before this triggers. This setting does not override explicit per-product pre-order configuration.
3.5 Test Site Settings
Setting: Disable automatic pre-order processing
Check this box on staging or development sites to prevent WP-Cron from automatically charging customers or completing orders when a release date passes. This lets you test the full pre-order flow without affecting real payments.
Always leave this unchecked on your live production store.
4. Setting Up a Pre-Order Product
Pre-order settings are configured per product. Each product can have completely independent pre-order behavior.
4.1 Enable Pre-Orders
- Go to Products → All Products and open the product you want to configure.
- Scroll down to the Product data panel.
- Click the Pre-Orders tab (alongside General, Inventory, Shipping, etc.).
- Check the Enable pre-orders checkbox.
Supported Product Types
- Simple
- Variable
- Composite (requires WooCommerce Composite Products)
- Bundle (requires WooCommerce Product Bundles)
- Booking (requires WooCommerce Bookings)
- Mix and Match (requires WooCommerce Mix and Match)
- Subscription / Variable Subscription (requires WooCommerce Subscriptions 6.2.0+)
If a product already has active pre-orders, the Pre-Orders tab will show a warning and lock the settings. You must complete or cancel all active pre-orders before changing the configuration.
4.2 Release Date
Field: Release date (optional) | Format: YYYY-MM-DD HH:MM
Enter the date and time when the product will become available. A date-time picker is provided for convenience.
- Dates are stored and evaluated in your store's timezone (WordPress → Settings → General → Timezone).
- If left blank, the product stays in pre-order status until you manually complete or cancel.
- Customers will see this date in availability messages, the cart, and order confirmations.
At release time, WP-Cron automatically completes all pre-orders for the product. See Section 10 for cron setup details.
4.3 Pre-Order Fee
Field: Pre-order fee (optional)
Enter a monetary amount to charge in addition to the product price as a reservation surcharge. Leave blank or set to 0 for no additional fee. This fee appears as a separate cart line item, clearly labeled.
4.4 Payment Timing
Choose when customers are charged:
| Option | Behavior |
|---|---|
| Upfront (pay now) | Full payment is collected at checkout. Order status is "Pre-ordered" until release, then transitions to "Processing" (physical) or "Completed" (virtual/downloadable). |
| Upon release (pay later) | No payment at checkout. Order stays "Pre-ordered" until release. On release, if a saved payment method exists it is charged automatically; otherwise the customer is emailed a payment link. |
"Upon release" requires a payment gateway that supports tokenized/saved payment methods (e.g., Stripe, PayPal). For gateways that don't support this, a "Pay Later" placeholder gateway is used and the customer receives a payment link email on release.
4.5 Deposit (Partial Payment)
Collect a partial payment now and charge the remaining balance automatically when the product releases.
Step 1 — Configure the deposit on the product
| Field | Options | Description |
|---|---|---|
| Deposit type | None / Fixed amount / Percentage | How the deposit amount is calculated |
| Deposit value | Any positive number | The fixed dollar amount (e.g. 20) or percentage (e.g. 25) |
Examples
- Fixed — $50: Customer pays $50 at checkout; remaining balance collected on release.
- Percentage — 30%: Customer pays 30% of the product price now; remaining 70% collected on release.
What happens on release
- A new WooCommerce order is automatically created for the remaining balance.
- The customer receives an email with the balance order details and a payment link.
- The original order is updated with a note linking to the balance order.
Where to see deposit data
- Order detail page (admin): A "Deposit Information" section shows deposit paid, remaining balance, and a link to the balance order.
- CSV export: "Deposit Paid" and "Remaining Balance" columns are included.
- Dashboard widget: Active revenue includes deposit amounts.
4.6 Quantity Limit
Field: Max pre-orders (optional) — Enter a whole number. Leave blank or enter 0 for unlimited.
| What It Does | Detail |
|---|---|
| Cart validation | When the cap is reached, adding the product to the cart is blocked with a clear error notice. |
| Low-stock notice | When fewer than 10 slots remain, a notice appears on the product page: "Only X pre-order slots remaining — order soon!" |
| Sold-out notice | When 0 slots remain: "Pre-orders are now closed for this product." |
| Concurrent safety | Enforced server-side — concurrent orders cannot exceed the limit. |
The count includes only orders with an active pre-order status. Completed and cancelled orders do not count toward the limit.
5. Managing Pre-Orders (Admin)
Navigate to WooCommerce → Pre-Orders to access the pre-order management screen. It has two tabs: Manage and Actions.
5.1 The Pre-Orders List (Manage Tab)
| Column | Description |
|---|---|
| Order | Order number and customer name (links to the full WooCommerce order) |
| Pre-Order Status | Active, Completed, or Cancelled |
| Product | Pre-ordered product (links to product edit page) |
| Release Date | Scheduled release date |
| When Charged | Upfront or Upon Release |
| Order Total | Total value of the order |
| Date | Order creation date |
5.2 Bulk Actions
Select one or more pre-orders using the checkboxes, then use the Bulk Actions dropdown to Complete or Cancel them in batch.
5.3 Filtering & Searching
- By product — Filter to show only pre-orders for a specific product.
- By status — Show Active, Completed, or Cancelled pre-orders.
- Search — Search by order number or customer name/email.
5.4 Completing Pre-Orders
You can complete pre-orders in three ways:
- Individually: Open the WooCommerce order, use the Order Actions box.
- Bulk: Select orders in the Manage tab → Bulk Actions → Complete.
- By product (Actions tab): Select the product, then click Complete Pre-Orders.
When completed: order status changes to Processing/Completed, "upon release" orders are charged or sent a payment link, deposit balance orders are created, and the customer receives a Pre-Order Available email.
5.5 Cancelling Pre-Orders
Via the Actions tab, select the product and click Cancel Pre-Orders. When cancelled: order status changes to Cancelled, the customer receives a Pre-Order Cancelled email, and the admin receives an Admin Pre-Order Cancelled email. Refunds for upfront payments must be processed manually.
6. CSV Export
Export all pre-order data to a spreadsheet with one click.
- Go to WooCommerce → Pre-Orders.
- Click the Export CSV button in the page header.
- Your browser downloads a file named
pre-orders-YYYY-MM-DD-HHmmss.csv.
CSV Columns
| Column | Description |
|---|---|
| Order ID | WooCommerce order number |
| Pre-Order Status | Active, Completed, or Cancelled |
| Order Status | WooCommerce order status (e.g., Processing) |
| Customer Name | Billing first name + last name |
| Customer Email | Billing email address |
| Product | Pre-ordered product name |
| Release Date | Product availability date |
| When Charged | "Upon release" or "Upfront" |
| Deposit Paid | Deposit amount paid (blank if no deposit) |
| Remaining Balance | Balance due on release (blank if no deposit) |
| Order Total | Full order total |
| Date Created | Order creation date and time |
The file is UTF-8 encoded with a BOM, ensuring correct character display when opened in Microsoft Excel. Export requires the manage_woocommerce capability (Shop Manager or Administrator role).
7. Dashboard Widget
The Pre-Order Manager widget appears on your WordPress admin dashboard (Dashboard → Home).
| Section | What It Shows |
|---|---|
| Active Pre-Orders | Total active order count + active revenue (deposits + upfront payments) |
| This Month | New, completed, and cancelled pre-orders for the current calendar month |
| Upcoming Releases | Up to 5 products releasing within 30 days, sorted by release date, each linking to the product edit page |
| Quick Actions | Manage Pre-Orders · Settings · Export CSV |
Stats are cached for 5 minutes using a WordPress transient. The cache clears automatically whenever a pre-order status changes, so numbers are always fresh after any activity.
8. Email Notifications
Configure all emails at WooCommerce → Settings → Emails.
| Recipient | Trigger | |
|---|---|---|
| New Pre-Order | Admin | A customer places a new pre-order |
| Pre-Ordered Confirmation | Customer | A pre-order is successfully placed |
| Pre-Order Available | Customer | A pre-order is completed/released |
| Pre-Order Cancelled | Customer | A pre-order is cancelled |
| Admin Pre-Order Cancelled | Admin | A pre-order is cancelled |
| Pre-Order Date Changed | Customer | The release date for a product is changed |
Manually Resend an Email
- Open the WooCommerce order.
- In the Order actions box (top right), select the email action from the dropdown.
- Click the send button (►) to dispatch the email immediately.
9. Customer Experience
9.1 Product Page
When a product has pre-orders enabled, customers see:
- Availability message below the price (customizable in Settings).
- "Pre-order now" button instead of "Add to cart".
- Slots remaining notice if a quantity limit is set and fewer than 10 slots remain.
- Sold-out notice if the quantity limit has been reached.
9.2 Cart & Checkout
- Pre-ordered items are labeled with their release date in the cart.
- Payment timing text is displayed (e.g., "$49.00 charged January 15, 2026").
- If a deposit is configured, the cart shows the deposit amount and remaining balance.
- The checkout button reads "Place pre-order now" (customizable).
- Only one pre-order product can be in the cart at a time.
9.3 My Account — Pre-Orders
- Customer logs in and goes to My Account.
- Clicks the Pre-Orders tab in the account menu.
- Sees a list of pre-orders with status, product, release date, and order total.
- Can click Cancel to cancel an active pre-order (if permitted).
9.4 Countdown Timer Shortcode
Embed a live countdown to the release date anywhere on your site:
[npom_countdown]
Works in pages, posts, sidebar widgets, and theme templates. If no release date is set, the shortcode outputs nothing.
10. Automated Release (WP-Cron)
The plugin uses WordPress's built-in scheduling system (WP-Cron) to automatically process pre-orders when a release date arrives.
What happens at release
- All active pre-orders for that product are marked as completed.
- "Upon release" orders are charged (saved payment method) or sent a payment link email.
- Follow-up balance orders are created for deposit-based pre-orders.
- Pre-Order Available emails are sent to all customers.
- Order statuses transition to "Processing" (physical) or "Completed" (virtual/downloadable).
WP-Cron relies on website traffic to trigger. On low-traffic sites, releases may be delayed. For reliable, time-critical releases, set up a real server cron job.
Set Up a Real Server Cron Job
Using cURL:
# Runs every 5 minutes
*/5 * * * * curl -s https://yourdomain.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Using WP-CLI:
*/5 * * * * cd /path/to/wordpress && wp cron event run --due-now > /dev/null 2>&1
11. WooCommerce Blocks Compatibility
| Block | Support |
|---|---|
| Cart Block | Pre-order items display correctly with availability messages and pricing |
| Checkout Block | Full pre-order checkout flow; payment timing text displayed |
| Product Block Editor | Pre-Orders product tab available in the block-based product editor |
No additional configuration is required. Block compatibility is auto-detected.
12. HPOS Compatibility
WooCommerce High-Performance Order Storage (HPOS / Custom Order Tables) is fully supported. The plugin:
- Declares HPOS compatibility via the official
FeaturesUtilAPI. - Stores all pre-order meta in both the classic
wp_postmetatable and the HPOSwc_orders_metatable. - All queries (quantity limit counts, dashboard stats, CSV export) use HPOS-aware SQL automatically.
You don't need to take any action — compatibility is automatic regardless of whether HPOS is enabled or disabled on your store.
13. WooCommerce Subscriptions Compatibility
Requires WooCommerce Subscriptions 6.2.0 or later. Supported types: subscription, variable-subscription.
- Customers place a pre-order for a subscription product.
- No subscription charge is taken at checkout (uses the "upon release" flow).
- When the product releases, the subscription begins and the first payment is collected.
Subscription products with synchronized billing or trial periods cannot have their pre-order settings changed while those features are active. A notice is shown on the product edit page when these conditions are detected.
14. For Developers — Hooks Reference
Action Hooks
| Hook | Arguments | Description |
|---|---|---|
npom_admin_page_actions | — | Fires in the Pre-Orders admin page header. Used to add buttons. |
npom_product_options_start | $post_id | Fires at the start of the Pre-Orders product tab panel. |
npom_product_options_end | — | Fires at the end of the Pre-Orders product tab panel. |
npom_save_product_options | $post_id, $is_enabled, $timestamp | Fires when a product with pre-order settings is saved. Use priority 10, 3. |
npom_pre_order_completed | $order | Fires when a pre-order is completed/released. |
npom_pre_order_cancelled | $order | Fires when a pre-order is cancelled. |
npom_pre_order_date_changed | $order, $message | Fires when a product's release date is changed. |
npom_pre_ordered | $order | Fires when a new pre-order is placed. |
npom_pre_order_available | $order | Fires when a pre-ordered product becomes available. |
wc_pre_order_status_new_to_active | $order | Fires when a pre-order moves from new to active status. |
wc_pre_order_status_active_to_cancelled | $order | Fires when a pre-order is cancelled. |
Filter Hooks
| Hook | Arguments | Description |
|---|---|---|
npom_settings | $settings | Filter the global settings array to add/remove settings fields. |
npom_supported_product_types | $types | Filter the list of supported product type slugs. |
npom_admin_script_data | $data, $hook_suffix | Filter the data passed to the admin JavaScript. |
Order Meta Keys
_npom_is_pre_order1 if the order is a pre-order
_npom_statusactive, completed, or cancelled
_npom_when_chargedupfront or upon_release
_npom_deposit_paidDeposit amount paid (empty string if no deposit)
_npom_remaining_balanceBalance due on release
_npom_original_priceOriginal product price before deposit reduction
Product Meta Keys
_npom_enabledyes if pre-orders are enabled
_npom_availability_datetimeUnix timestamp of the release date
_npom_when_to_chargeupfront or upon_release
_npom_feeOptional pre-order fee amount
_npom_max_quantityMaximum pre-orders allowed (0 = unlimited)
_npom_deposit_typenone, fixed, or percent
_npom_deposit_valueThe deposit amount or percentage
Code Examples
Add a custom field to the Pre-Orders product tab
// Render the field
add_action( 'npom_product_options_end', function() {
woocommerce_wp_text_input( array(
'id' => '_my_custom_preorder_field',
'label' => __( 'My Custom Field', 'my-plugin' ),
) );
} );
// Save the field (3 accepted args required)
add_action( 'npom_save_product_options', function( $post_id, $is_enabled, $timestamp ) {
if ( isset( $_POST['_my_custom_preorder_field'] ) ) {
update_post_meta(
$post_id,
'_my_custom_preorder_field',
sanitize_text_field( wp_unslash( $_POST['_my_custom_preorder_field'] ) )
);
}
}, 10, 3 );
Add a custom button to the Pre-Orders admin page
add_action( 'npom_admin_page_actions', function() {
$url = admin_url( 'admin.php?page=npom_manager&action=my_action' );
printf(
'<a href="%s" class="page-title-action">%s</a>',
esc_url( $url ),
esc_html__( 'My Action', 'my-plugin' )
);
} );
Run code when a pre-order is completed
add_action( 'npom_pre_order_completed', function( $order ) {
// $order is a WC_Order object
$product_id = NPOM_Order::get_pre_order_product( $order )->get_id();
// your logic here...
} );
15. Troubleshooting
Cause
WP-Cron is not running reliably, or automatic processing is disabled.
Fix
- Confirm the release date is in the past (in your store's timezone).
- Go to WooCommerce → Settings → Pre-Orders → Test site settings and confirm Disable automatic pre-order processing is unchecked.
- Set up a real server cron job (see Section 10).
- Use WP Crontrol plugin to manually trigger
npom_completion_checkand confirm it fires.
Cause
Unsupported product type, or stale cache.
Fix
- Confirm the product type is in the supported list (see Section 4.1).
- Clear any caching plugins and reload the product edit page.
- Confirm the plugin is active in Plugins → Installed Plugins.
Cause
The product has active pre-orders. Settings are locked to prevent inconsistencies.
Fix
Go to WooCommerce → Pre-Orders, filter by that product, then complete or cancel all active pre-orders. Once no active pre-orders remain, settings become editable.
Cause
Session or caching conflict.
Fix
- Confirm Deposit type is set to Fixed or Percentage (not "None") on the product.
- Clear your WooCommerce session (log out, clear cookies, log back in).
- Disable any page caching plugins temporarily and retest.
- Ensure no other plugin overrides
woocommerce_before_calculate_totalsat a very high priority.
Cause
No pre-orders exist, or a PHP output buffering conflict.
Fix
- Confirm at least one pre-order exists in WooCommerce → Pre-Orders.
- Deactivate caching plugins temporarily and retry.
- Check your server's PHP error log for any output before the CSV headers.
Cause
The email is disabled in WooCommerce settings, or SMTP is misconfigured.
Fix
- Go to WooCommerce → Settings → Emails and confirm the relevant email is enabled.
- Use a plugin like WP Mail SMTP to verify your outgoing mail configuration.
- Test with the Send test email feature in WooCommerce email settings.
Cause
HPOS configuration mismatch.
Fix
- Check HPOS status: WooCommerce → Settings → Advanced → Features → High-Performance Order Storage.
- If you recently switched between HPOS and classic storage, run WooCommerce → Status → Tools → Sync order data.
16. Frequently Asked Questions
Can customers pre-order multiple products at once?
What happens if a customer has a deposit order and the product is cancelled?
Can I change the release date after a pre-order is placed?
npom_pre_order_date_changed action and sends a Pre-Order Date Changed email to all customers with active pre-orders for that product.Does the quantity limit count cancelled pre-orders?
Is the plugin compatible with WooCommerce HPOS?
Will the plugin work if WooCommerce Subscriptions is not installed?
Can I translate the plugin into my language?
nextxen-pre-order-manager text domain. Place your .po/.mo files in /wp-content/languages/plugins/.Is the CSV export secure?
manage_woocommerce capability before streaming any data.What role is required to manage pre-orders?
manage_woocommerce capability, which is assigned to the Shop Manager and Administrator roles by default.