Wo WooCommerce Beginner

Pre-order Manager — Complete guide

Installation, deposit pre-order configuration, automatic conversion, reminders and REST API.

Updated Module version 1.1.0

Overview

DataFirefly Pre-order Manager turns any WooCommerce product (simple or variable) into a professional pre-order. The customer pays a deposit or the full amount at order time; at the availability date (ETA), the plugin automatically converts the pre-order: full payments move to processing, deposits generate a balance order with a payment link. Automatic reminders, future stock cap, customizable badge and a full REST API complete the workflow.

Installation

  1. Download the dfpreorder.zip file from your DataFirefly account.
  2. In your WordPress admin, go to Plugins → Add New → Upload Plugin.
  3. Select the ZIP, click Install Now, then activate the plugin.
  4. A new WooCommerce → Pré-commandes submenu appears: this is the plugin control center.

Requirements: WordPress 6.0+, WooCommerce 7.0+ and PHP 7.4 minimum. The plugin declares HPOS and Cart & Checkout Blocks compatibility — no extra configuration needed.

Global settings

Open WooCommerce → Pré-commandes → Settings tab. Options are grouped into blocks:

  • Activation — global module switch, and mixed cart policy (allow or block mixing pre-orders and regular products in the same cart).
  • Automatic conversion — enables the daily conversion at ETA, sets a grace period (0 to 90 days) after the ETA, and restocking of reserved units on cancellation.
  • Badge display — text (default “Précommande”), background colour, text colour, and placements (shop listings and/or product page).
  • Labels — add-to-cart button text and the label preceding the ETA.
  • Customer emails — enable/disable the availability and balance-due emails.
  • Unpaid balance reminders — enable reminders and set comma-separated day thresholds (default 7,14,30).
  • Shipping — option to carry shipping fees over to the balance order (see dedicated section below).

Configuring a product as a pre-order

  1. Open the product in the WooCommerce editor and find the Pré-commande tab in the product data.
  2. Check Enable pre-order.
  3. Choose the payment mode: “Full payment” (customer pays everything at order time) or “Deposit” (percent or fixed amount, the balance being billed at availability).
  4. Set the ETA date (expected availability date). An optional text field displays a free-form label instead of the date (e.g. “Available early July”).
  5. Optionally set a future stock cap: the maximum number of pre-orderable units. The reserved units counter shows next to the field.
  6. If needed, customize the badge text for this product and the automatic conversion behaviour (inherit global setting, force yes, force no).
  7. Save: the badge and the ETA notice appear immediately on the product page.

For variable products, each variation can have its own ETA date and its own stock cap (in the variation options). The variation date takes precedence over the parent.

Pre-order lifecycle

Here is the complete workflow, step by step:

  1. Initial order — the customer adds the product to the cart. In deposit mode, the price shown in cart and checkout is the deposit amount, with the remaining balance mentioned. Payment goes through the usual gateway.
  2. Registration — on payment, the order moves to the wc-preorder status, a row is created in the plugin’s internal table, and the customer receives the pre-order confirmation email.
  3. Waiting — the pre-order shows in WooCommerce → Pré-commandes → List tab with its status, ETA date and amounts.
  4. Conversion at ETA — the daily cron (3:00 AM site time) detects pre-orders past their due date (ETA + optional grace period):
    • Full payment mode: the order moves to “Processing” and the customer receives the availability email.
    • Deposit mode: a balance order is generated automatically (status “Pending payment”) and the customer receives the “Balance due” email with a direct payment button.
  5. Balance payment — the customer pays via the email link (native WooCommerce payment URL, secured by order key, no login required) or from My Account. On payment, the pre-order is marked completed and the original order moves to “Processing” once all its pre-order lines are resolved.

Managing from the admin

The List tab shows all pre-orders with a status filter, order/product ID search and pagination. Four statuses exist: Pending (blue), Awaiting balance (amber), Completed (green) and Cancelled (grey). Each row has two actions:

  • Convert — forces immediate conversion without waiting for the ETA (useful when stock arrives early).
  • Cancel — cancels the pre-order, releases reserved units (if the restock option is enabled) and moves the order to “Cancelled” if it was still in pre-order status.

The “Run conversion now” button at the top of the page triggers the daily check immediately without waiting for the 3:00 AM cron.

Customer side: My Account

On the My Account → Order details page:

  • The original order shows a “Pre-order balance” panel listing linked balance orders, their amount, status, and a “Pay balance” button for those still unpaid.
  • The balance order shows an “Original pre-order” panel linking back to the initial order.

Customer emails

Four transactional emails ship with the plugin, each in HTML and plain text versions, editable from WooCommerce → Settings → Emails:

  • Pre-order confirmation — sent when the pre-order is registered, with a deposit warning where applicable.
  • Pre-order available — sent on conversion in full payment mode.
  • Balance due — sent when the balance order is generated, with the amount highlighted and a direct payment button.
  • Balance reminder — reminders sent at the configured thresholds if the balance remains unpaid.

Automatic reminders

When enabled, the daily cron scans balance orders still unpaid (pending, on-hold or failed statuses) and sends a reminder at each configured threshold. The field accepts a comma-separated list of days — e.g. 7,14,30 to remind 7, 14 then 30 days after the balance order creation. Each threshold fires only once per order; tracking is stored in the balance order meta.

Shipping fees on the balance order

By default the balance order carries no shipping fees (they were paid on the original order). If your deposit only covers the product reservation and you bill shipping at fulfilment, enable the “Carry shipping fees to the balance” option: the shipping lines of the original order are duplicated onto the balance order, with method and taxes intact.

This option duplicates fees. Enable it only if the deposit order is billed with zero shipping — e.g. via a “Free shipping” method conditioned on pre-order products being in the cart. Otherwise the customer pays shipping twice.

Shortcodes

  • [dfpo_badge product_id="123"] — displays the Pre-order badge of the given product (or the current product if omitted).
  • [dfpo_eta product_id="123"] — displays the formatted availability date with its label.
  • [dfpo_remaining product_id="123"] — displays the number of units still pre-orderable when a cap is set.

REST API

All routes live under the dfpo/v1 namespace and require the manage_woocommerce capability (authenticate via WooCommerce API key or application password):

  • GET /wp-json/dfpo/v1/preorders — paginated list (params status, page, per_page).
  • GET /wp-json/dfpo/v1/preorders/{id} — single pre-order detail.
  • POST /wp-json/dfpo/v1/preorders/{id}/convert — forces conversion (boolean force param).
  • POST /wp-json/dfpo/v1/preorders/{id}/cancel — cancels and releases reserved stock.
  • POST /wp-json/dfpo/v1/run-conversion — triggers the conversion check immediately.

Developer hooks

  • dfpo_preorder_registered (action) — after a pre-order row is created.
  • dfpo_preorder_converted_full (action) — after a full-payment conversion.
  • dfpo_preorder_converted_deposit (action) — after the balance order is generated.
  • dfpo_preorder_balance_paid (action) — after the balance is collected.
  • dfpo_email_preorder_balance_reminder (action) — when a reminder fires (lets you plug in SMS or another channel).
  • dfpo_badge_html (filter) — to modify the badge HTML.

Troubleshooting

  • Conversion does not trigger — check that WP-Cron works on your host (some hosts disable it; use a system cron calling wp-cron.php instead). You can always convert manually from the List tab.
  • Cart price looks wrong after editing the product — empty the test cart and flush caches (object and page). The plugin reads the original price directly from the database to avoid cache artefacts.
  • The balance email doesn’t arrive — check that the “Balance due” email is enabled in WooCommerce → Settings → Emails, and test your site’s overall deliverability (SMTP recommended).
  • The badge doesn’t show — check the global module switch, the badge placements in the settings, and that your theme calls the standard WooCommerce hooks (woocommerce_single_product_summary, woocommerce_after_shop_loop_item_title).

Uninstall

Deactivating the plugin keeps all data. Deleting the plugin from Plugins permanently removes the internal tables, options and product meta. WooCommerce orders (original and balance) are never deleted.

Was this page helpful?

Still stuck? Contact support