PS PrestaShop Beginner

PrestaShop Pre-Order module documentation (dfpreorder)

Install and configure dfpreorder: pre-order rules, product page display, allocation of incoming stock, delay handling and the cron task.

Updated Module version 1.0.0

<p>The <strong>DataFirefly Pre-Orders</strong> module (dfpreorder) lets you sell products before they reach your warehouse on PrestaShop 8 and 9. This page covers installation, settings, rules, incoming stock and troubleshooting.</p>

<h2>Installation</h2>
<ol>
<li>Download the ZIP from your DataFirefly customer account.</li>
<li>In the back office, go to <em>Modules > Module Manager > Upload a module</em> and send the ZIP.</li>
<li>On installation the module creates its tables, its two order statuses and two menu tabs: <em>Catalog > Pre-orders</em> for the rules and <em>Orders > Pre-orders</em> for the follow-up.</li>
<li>Open the module configuration to review the general settings and copy the cron URL.</li>
</ol>
<p>The module runs on PrestaShop 8.0 to 9.x from the same ZIP, in multistore and multilingual setups. Strings ship in English, French, Spanish, German, Italian, Dutch, Polish and Portuguese.</p>

<h2>General settings</h2>
<ul>
<li><strong>Default button label</strong> and <strong>badge label</strong>, per language. Each rule can override them.</li>
<li><strong>Carts mixing pre-order and in-stock items</strong>: allow silently, allow with a warning saying the order ships in one go, or forbid the mix.</li>
<li><strong>Consent checkbox at checkout</strong>: adds a mandatory checkbox when the cart holds a pre-order. The text accepts the <code>%date%</code> token, replaced by the latest estimated shipping date of the cart. The consent timestamp is stored on every pre-ordered line.</li>
<li><strong>E-mails</strong> for confirmation and availability, each switchable.</li>
<li><strong>Automatic allocation</strong> of incoming stock and the <strong>order status</strong> to apply once every line is allocated.</li>
<li><strong>Notify me form</strong> on products that cannot be ordered.</li>
<li><strong>PreOrder structured data</strong>, off by default: only turn it on when your theme or SEO module does not already output product JSON-LD.</li>
</ul>

<h2>Creating a pre-order rule</h2>
<p>Go to <em>Catalog > Pre-orders</em> then <em>Add a rule</em>. A rule targets a product, or one specific combination.</p>

<h3>The three modes</h3>
<ul>
<li><strong>When out of stock</strong>: pre-orders start when stock reaches zero and stop when stock is back. This is the mode for supplier shortages.</li>
<li><strong>Forced</strong>: the product stays in pre-order while the rule is active, even with stock. This is the product launch mode.</li>
<li><strong>Date window</strong>: pre-orders open and close at the dates you set. Closing is applied by the cron task and, as a fallback, whenever the product page is viewed.</li>
</ul>

<h3>The other fields</h3>
<ul>
<li><strong>Estimated shipping date</strong>: shown on the product page, in the cart, in the customer account, on the invoice and in e-mails.</li>
<li><strong>Maximum quantity</strong> and <strong>maximum per customer</strong>: 0 means unlimited. Limits are enforced server side on every cart save.</li>
<li><strong>Pre-order discount</strong> as a percentage or an amount: available in forced and date window modes, where the period is known in advance. It creates a specific price removed when the rule ends.</li>
<li><strong>Button label</strong> and <strong>message</strong> per language, specific to the rule.</li>
<li><strong>Countdown</strong> (to the closing date or to the release) and the <strong>reserved units bar</strong>, which needs a maximum quantity.</li>
</ul>

<h3>Creating many rules at once</h3>
<p>The <em>Bulk assignment and CSV import</em> button opens two forms. The first creates one rule per product matching a category, a brand or a supplier, criteria being combined. The second imports a CSV whose columns are <code>product</code> (ID or reference), <code>combination</code> (optional), <code>mode</code>, <code>release_date</code>, <code>max_qty</code>, <code>max_per_customer</code>, <code>date_start</code>, <code>date_end</code>. Existing rules are updated.</p>

<h2>What the customer sees</h2>
<p>On a pre-order product the add-to-cart button takes the chosen label, a badge appears on listing and product images, and a panel shows the estimated date, your message, the countdown and the reserved units bar. The panel refreshes when the combination changes.</p>
<p>In the cart, each affected line is flagged with the estimated date. At checkout the consent checkbox repeats the date. After the order, customers follow their pre-orders in <em>My account > My pre-orders</em> and can request cancellation of the lines still waiting.</p>

<h2>Follow-up and stock allocation</h2>
<p><em>Orders > Pre-orders</em> gathers the follow-up.</p>
<h3>Dashboard</h3>
<p>The indicators show the units waiting, the number of orders involved, the reserved revenue tax included, the units already allocated and the cancellation requests. The per-product table shows, for each product or combination, the units waiting, the PrestaShop stock, the units that can be allocated right now and the quantity to order from the supplier. The CSV export button uses the same columns.</p>
<h3>Allocating a delivery</h3>
<p>A pre-order lowers the stock when the order is placed, pushing it below zero. The units physically available for pre-orders are therefore: units waiting + current stock. After a restock, the <em>Allocate (oldest first)</em> button serves orders by order date, or <em>Choose orders</em> opens the allocation screen where the suggested lines are ticked and editable.</p>
<p>When every pre-ordered line of an order is allocated, the order moves to the configured status (by default <em>Pre-order: ready to ship</em>) and the customer gets an e-mail. You then prepare the order as usual.</p>
<div class=”df-callout note”><p>Automatic allocation serves pre-orders without manual validation, but never before the announced date of a forced or date window rule.</p></div>

<h2>Handling a delay</h2>
<p>Open the rule, change the estimated shipping date and leave <em>Notify customers if the date changes</em> on. Waiting pre-orders are updated and every affected customer receives an e-mail with the new date and a link to request cancellation. The number of notified customers is shown after saving, and the history of announced dates appears under the form.</p>
<p>Cancellation requests land in the dashboard. <em>Confirm cancellation</em> frees the reserved units; the refund is still made from the order page with your payment method. <em>Keep the pre-order</em> puts the lines back to waiting.</p>

<h2>Cron task</h2>
<p>The module configuration shows a token URL. Schedule it every 15 minutes at your host. It opens and closes date windows on time and, when automatic allocation is on, serves the pre-orders whose stock has arrived.</p>

<h2>Frequently asked questions</h2>
<h3>Does the customer pay in full?</h3>
<p>Yes in version 1.0. A deposit followed by a balance payment on availability is planned for version 1.1.</p>
<h3>Why does an order move to Pre-order: awaiting stock?</h3>
<p>The module moves the order to that status as soon as it is paid and contains at least one pre-ordered line. The status is paid and not shippable, which keeps an incomplete order out of preparation.</p>
<h3>Does a rule on one combination affect the others?</h3>
<p>PrestaShop only handles the allow-orders-when-out-of-stock setting at product level. The module therefore sets it on the product, then blocks out-of-stock combinations without a rule on the front office and in the cart, so the original shop behaviour is preserved.</p>
<h3>The countdown does not show</h3>
<p>It only shows when the closing date (window mode) or the estimated shipping date is in the future, and when the option is enabled on the rule.</p>
<h3>The button keeps its original label</h3>
<p>The module replaces the add-to-cart label on standard themes. On a heavily customised theme, contact support with the product URL: the button selector can be adapted.</p>

Was this page helpful?

Still stuck? Contact support