Key takeaways
- Shopify’s pre-order feature needs an app. Deposits and charge-later run on purchase options, set up through a pre-order app.1
- The no-app route is one checkbox plus theme work. “Continue selling when out of stock” lets a variant sell at zero stock, but the customer pays in full and nothing flags the order.2
- Purchase-option pre-orders remove payment methods. Shop Pay, Apple Pay and Google Pay accelerated checkouts and local methods such as Klarna are not available.3
- The button label has to follow the variant. Dawn resets it to “Add to cart” on every variant change, so a Liquid-only edit breaks.
- A ship date is a legal promise in the US. The FTC requires a reasonable basis for it, and a delay notice with a refund option if you miss it.4
A Shopify pre-order is an order for a product you cannot ship yet: a launch that has not landed, or a restock still in transit. This guide covers how to set up pre-order on Shopify both ways - the no-app route built on the “Continue selling when out of stock” setting, and the app route built on purchase options - and what breaks with each.
Why you can trust us
We have been in the Shopify space for over four years and have worked with hundreds of Shopify brands on their storefronts. Jacques has over 15 years of development experience. We build Fudge, an AI storefront editor with a 4.9 rating on the Shopify App Store and Built for Shopify status, and product page states like a pre-order button are the kind of theme code it writes. The Shopify rules quoted here were read from Shopify’s documentation on the day of writing.
What does pre-order mean on Shopify?
Shopify uses the word for two things that behave differently at checkout.
The documented pre-order feature is a purchase option. Shopify’s help center says you can “collect full, partial, or no payment” when the customer orders, and that you need a pre-order app from the Shopify App Store to set it up.1
The other kind is an ordinary order for an out-of-stock item, with no selling plan and no stored payment method. Shopify lists preorders as one reason to allow overselling on a variant.2
That gives three payment models:
| Payment model | Paid at checkout | What it needs |
|---|---|---|
| Pay in full now | The full price | Works with no app, or with a pre-order app |
| Deposit | Part of the price | A pre-order app using purchase options |
| Charge later | Nothing | A pre-order app using purchase options |
What do purchase-option pre-orders require?
A supported gateway. The help center says pre-orders are “currently only available to merchants using Shopify Payments or Paypal Express”.1 The developer documentation also lists Adyen on Shopify and, for some merchants, Stripe.5
Fewer payment methods. Customers cannot use the Shop Pay, Apple Pay or Google Pay accelerated checkouts, or local payment methods such as Klarna.3
The right channel and checkout. Pre-orders work only on the Online Store and Custom Storefront channels, and not with customized checkouts, Shop Promise, Buy X get Y discounts, Shopify POS, draft orders or B2B.35
Shopify stores the payment method; the app schedules the later charge and handles payment failures.5
Can you set up a Shopify pre-order without an app?
Yes, for pay-in-full only. The no-app route is the variant setting “Continue selling when out of stock”, plus theme edits that tell the customer when the item ships.
What the setting does not do:
- The customer is charged in full at checkout, like any other order.
- Nothing flags the order as a pre-order unless you add a line item property or a tag.
- There is no quantity cap. Customers can keep buying at zero or below, so stock counts down into negative numbers.2
- The storefront does not change. The button still says “Add to cart” and no ship date appears.
- Mixed carts become one order with one shipping charge.
How to set up pre-orders on Shopify without an app
The steps use Dawn file names. Other themes differ, but the logic is the same.
Step 1: Allow the variant to sell at zero stock
In your Shopify admin, open the product or variant. In the Inventory section, make sure Inventory tracked is on, then select Continue selling when out of stock.2
Step 2: Store the ship date in a metafield
Go to Settings → Metafields and metaobjects, choose Products, and add a definition with the Date type, the namespace custom and the key preorder_ship_date. Fill it in on each pre-order product.
For the full walkthrough, see how to add metafields to Shopify products.
Step 3: Show “Pre-order” and the ship date on the product page
Duplicate your theme first, then open Online Store → Themes → ⋯ → Edit code and find snippets/buy-buttons.liquid. Add this just above the submit button:
{%- liquid
assign current_variant = product.selected_or_first_available_variant
assign ship_date = product.metafields.custom.preorder_ship_date.value
assign is_preorder = false
if current_variant.inventory_management == 'shopify' and current_variant.inventory_policy == 'continue' and current_variant.inventory_quantity <= 0 and ship_date != blank
assign is_preorder = true
endif
-%}
Inside the button, add a branch before the final else that prints the add-to-cart text:
{%- elsif is_preorder -%}
Pre-order
Under the button, still inside the form, add the note:
<p id="PreorderNote-{{ section_id }}" class="preorder-note"{% unless is_preorder %} hidden{% endunless %}>
{%- if is_preorder -%}
{%- capture preorder_text -%}Ships by {{ ship_date | date: '%B %-d, %Y' }}{%- endcapture -%}
Pre-order. {{ preorder_text }}.
<input type="hidden" name="properties[Pre-order]" value="{{ preorder_text | escape }}">
{%- endif -%}
</p>
All three inventory checks are needed. Per Shopify’s Liquid reference, inventory_policy is continue or deny, inventory_management is nil when inventory is not tracked, and inventory_quantity returns the number of items sold when it is not tracked.6
No date, no label. The condition requires the metafield, so “Pre-order” never appears without a ship date.
The hidden input is the order flag. It adds a line item property named “Pre-order” that travels into the cart, checkout and the order. See also how to change button text in Shopify.
Step 4: Keep the label right when the variant changes
This is where Liquid-only snippets fail. When a shopper switches variant, Dawn fetches the section again, then sets the button text from a JavaScript string - “Add to cart” - whatever your Liquid rendered.
Reading stock from the variant JSON does not work either: Shopify’s json filter leaves out inventory_quantity and inventory_policy.6 Instead, copy the label and note from the HTML Dawn already fetched. Add this above the schema tag in sections/main-product.liquid:
<script>
document.addEventListener('DOMContentLoaded', function () {
if (typeof subscribe !== 'function') return;
subscribe(PUB_SUB_EVENTS.variantChange, function (event) {
var id = event.data.sectionId;
var fresh = event.data.html;
var newButton = fresh.getElementById('ProductSubmitButton-' + id);
var button = document.getElementById('ProductSubmitButton-' + id);
if (newButton && button) {
button.querySelector('span').textContent = newButton.querySelector('span').textContent.trim();
}
var newNote = fresh.getElementById('PreorderNote-' + id);
var note = document.getElementById('PreorderNote-' + id);
if (newNote && note) {
note.innerHTML = newNote.innerHTML;
note.hidden = newNote.hidden;
}
});
});
</script>
subscribe and PUB_SUB_EVENTS.variantChange are Dawn helpers. Other themes need their own variant-change hook.
The Fudge route. Fudge writes the Liquid and the variant-change script for the theme you run. Tell Fudge:
“On product pages, when a variant is out of stock but set to continue selling, change the Add to cart button to ‘Pre-order’, and show ‘Ships by’ plus the date from the product’s pre-order ship date metafield under the button. Update it when the customer switches variant.”
You get native theme code as a draft to review before publishing. The inventory setting and the metafield value stay in the Shopify admin.
Step 5: Tell the customer in the cart, at checkout and by email
Cart. Dawn’s cart page and cart drawer already print line item properties that do not start with an underscore, so “Pre-order: Ships by November 20, 2026” appears under the item.
Checkout. Shopify documents that a leading underscore hides a property from customers at checkout, so leave it off.6
Mixed carts. Add a warning above the footer in snippets/cart-drawer.liquid:
{%- liquid
assign preorder_count = 0
for item in cart.items
if item.properties['Pre-order'] != blank
assign preorder_count = preorder_count | plus: 1
endif
endfor
-%}
{%- if preorder_count > 0 and preorder_count < cart.items.size -%}
<p class="cart-preorder-warning">Your cart has pre-order and in-stock items. The whole order ships when the pre-order item is ready.</p>
{%- endif -%}
Change the sentence to match what you actually do. Related: shipping disclaimers in Shopify and updating cart drawer text.
The Fudge route. Fudge can write the same cart logic for your theme’s drawer. Tell Fudge:
“In the cart drawer, show a notice under any pre-order item with its expected ship date, and a warning when the cart mixes pre-order and in-stock items.”
It arrives as a draft in your theme, with no app widget or extra third-party script on the storefront.
Order confirmation email. Go to Settings → Notifications → Customer notifications → Order confirmation → Edit code. Shopify’s notification variables include line.properties, so this prints a line per pre-order item:
{% for line in subtotal_line_items %}
{% for property in line.properties %}
{% if property.first == 'Pre-order' %}
<p><strong>{{ line.title }}</strong> is a pre-order. {{ property.last }}. You have been charged in full today.</p>
{% endif %}
{% endfor %}
{% endfor %}
Use Preview and Send test email before saving. Notification templates live in the Shopify admin, not the theme, so this edit is yours.
Step 6: Tag pre-order orders for fulfilment
Shopify Flow is a free app on the Basic, Grow, Advanced and Plus plans.7 Build a three-step workflow:
- Trigger: Order created.
- Condition: order / lineItems / product / tags, at least one is equal to
pre-order. - Action: Add order tags, with the tag
pre-order.
Shopify’s Flow documentation uses a product tagged presale as its example of this condition.7 Tag the product while it is on pre-order and remove the tag when stock arrives. See also our Shopify Flow AI assistant prompts.
How do you cap pre-order quantity?
With “Continue selling when out of stock” there is no ceiling. You watch the negative stock number and clear the checkbox yourself.
For a hard cap, do the opposite. Leave the checkbox off and enter the units you are willing to pre-sell as the available quantity, so sales stop at zero. Stock is now positive, so drop the three inventory checks from Step 3 and let the ship date metafield alone drive the label. Clear the metafield when stock lands.
Optional: a pre-order badge on collection pages
Dawn’s product card shows only “Sold out” and “Sale” badges. A pre-order badge uses the Step 3 condition in snippets/card-product.liquid; see how to add product badges in Shopify.
The Fudge route. Fudge adds the badge to your theme’s product card. Tell Fudge:
“Add a ‘Pre-order’ badge to product cards on collection pages for products with zero inventory that are still purchasable.”
You get a draft to preview on a collection that mixes pre-order and in-stock products before publishing.
No-app route vs pre-order app: which Shopify pre-order setup fits?
| No-app route | Purchase-options pre-order app | |
|---|---|---|
| Payment timing | Full amount at checkout | Full, deposit or nothing at checkout; balance collected later |
| Payment methods | Everything your checkout offers | No Shop Pay, Apple Pay or Google Pay accelerated checkout; no local payment methods |
| Order flagging | None, unless you add a line item property and a Flow tag | Pre-order details on the product and in the Orders list |
| Quantity caps | None with continue selling; manual, or a fixed allocation | Depends on the app; some let you reserve inventory at sale or at fulfilment |
| Mixed carts | One order, one shipping charge; you hold or split it | Check out together; deposits are combined and the earliest due date applies |
| Effort | Theme edits, a metafield, a Flow workflow, an email edit | App setup, plus a theme that shows the pre-order details |
| Cost | No app fee | Depends on the app; check the live listing for current plans |
When comparing apps, check that the app uses Shopify’s purchase options, which payment models it supports, when it reserves inventory, and how it handles failed balance charges. If you uninstall a pre-order app, its pre-order data is deleted after 48 hours unless the app has a backup.1
What breaks with Shopify pre-orders?
Part-stock orders. With three units left and continue selling on, a customer can order five. The label says “Add to cart”, yet two of the five are effectively pre-orders.
Mixed carts and split fulfilment. On the no-app route it is one order with one shipping charge. You can hold the pre-order items with Mark as on hold and fulfil the rest, but the second shipment is at your cost.
Authorization expiry. Do not build charge-later yourself with manual payment capture. Shopify Payments gives an authorization period of 7 days; extended authorization is only for Shopify Plus stores on Shopify Payments, and capturing after the standard period adds a 1.75% charge.8 Purchase-option pre-orders store the payment method instead.
Accelerated checkout on the product page. On the no-app route, that button skips the cart and your cart notice. Consider clearing the Dynamic checkout buttons setting in Dawn’s Buy buttons block on pre-order products.
Discounts and tax. On the no-app route, both apply at checkout as on any order. Shopify’s pre-order pages do not spell out tax treatment for deposits, so confirm it with your app and your accountant.
Cancellations when the date slips. Shopify says that if a customer cancels a pre-order, you might still need to refund it manually.1
Legal duties. Under the FTC’s Mail, Internet, or Telephone Order Merchandise Rule, you need a reasonable basis for any shipment date you state, or for shipping within 30 days if you state none. If you cannot ship on time, you must seek the customer’s consent to the delay or refund them, with a notice that gives a revised date and the option to cancel for a full and prompt refund.4 Other countries have their own rules, so check those that apply to your customers.
Pre-order, back-in-stock alert or sold out?
Take money now when you have a confirmed delivery date, can state it on the page, and are prepared to refund if it slips.
Collect emails instead when the date is uncertain. A back-in-stock signup keeps the demand without a shipping promise. Shopify Flow’s “Product variant back in stock” trigger fires when a variant’s inventory goes from 0 or less to 1 or more.
Leave it sold out when the product is not coming back. That is the default: with continue selling off, Dawn disables the button and shows “Sold out”.
For the storefront side of all three, see the Shopify store editor page.
FAQ
Yes, for pay-in-full pre-orders. Select Continue selling when out of stock in the Inventory section of the product or variant, then edit the theme so the button says Pre-order and shows a ship date. The customer is charged in full at checkout, and the order is not marked as a pre-order unless you add a line item property or a tag.
Edit the buy buttons snippet so the label is Pre-order when the variant is tracked, has the continue inventory policy and has zero or negative stock. In Dawn you also need a small script on the variant change event, because the theme resets the button text to Add to cart when the shopper picks another variant.
Yes, with a pre-order app that uses purchase options. The deposit is charged at checkout, Shopify stores the payment method, and the balance is collected later. Shopify documents pre-orders as available to merchants using Shopify Payments or PayPal Express. The no-app route cannot take deposits.
Not for pre-orders set up as purchase options. Shopify states that customers cannot buy them with the Shop Pay, Apple Pay or Google Pay accelerated checkouts, or with local payment methods such as Klarna. A no-app pre-order is an ordinary order, so your normal payment methods apply.
In the US, the FTC Mail, Internet, or Telephone Order Merchandise Rule requires you to seek consent from the customer for the delay or refund them. The delay notice must give a revised shipment date and explain that the customer can cancel for a full and prompt refund. Other countries have their own rules.
Continue selling when out of stock has no limit, so stock goes negative. For a hard cap without an app, leave that setting off, enter the number of units you are willing to pre-sell as available inventory, and flag the product with a ship date metafield instead.
Footnotes
-
Shopify Help Center, “Pre-orders” and “Managing pre-orders” - you can “collect full, partial, or no payment at the time the customer places their order”; pre-orders are “currently only available to merchants using Shopify Payments or Paypal Express”; you need to install a pre-order app from the Shopify App Store; pre-order data is deleted 48 hours after the app is uninstalled; inventory is reserved at the time of sale or fulfilment, a choice offered in some apps; a cancelled order might still need a manual refund. https://help.shopify.com/en/manual/products/purchase-options/pre-orders and https://help.shopify.com/en/manual/products/purchase-options/pre-orders/manage-pre-orders ↩ ↩2 ↩3 ↩4 ↩5
-
Shopify Help Center, “Selling when out of stock” - lists offering products for preorder as a reason to allow overselling; the “Continue selling when out of stock” option is in the Inventory section of a product or variant and requires “Inventory tracked”. https://help.shopify.com/en/manual/products/inventory/getting-started-with-inventory/selling-when-out-of-stock ↩ ↩2 ↩3 ↩4
-
Shopify Help Center, “Setting up pre-orders” - lists the requirements and restrictions: a reasonable basis for the ship date, no customized checkouts, no Shop Pay, Apple Pay or Google Pay accelerated checkouts, no local payment methods such as Klarna, Online Store and Custom Storefront channels only, no Buy X get Y discounts, no Shop Promise; also the rules for combined deposits and earliest due dates. https://help.shopify.com/en/manual/products/purchase-options/pre-orders/setup ↩ ↩2 ↩3
-
Federal Trade Commission, “Business Guide to the FTC’s Mail, Internet, or Telephone Order Merchandise Rule” - a seller needs a reasonable basis for any shipment representation, or for shipping within 30 days if none is made; if it cannot ship on time it must seek the customer’s consent to the delay or refund, with a notice that gives a revised date and the option to cancel for a full and prompt refund. https://www.ftc.gov/business-guidance/resources/business-guide-ftcs-mail-internet-or-telephone-order-merchandise-rule ↩ ↩2
-
Shopify developer documentation, “About pre-order and Try Before You Buy (TBYB)” - supported gateways are Shopify Payments, PayPal Express, Adyen on Shopify, or Stripe for some merchants; not supported on Shopify POS, draft orders, B2B or checkout.liquid checkouts; the app is responsible for scheduling the charge and automating payment failure handling. https://shopify.dev/docs/apps/build/purchase-options/deferred ↩ ↩2 ↩3
-
Shopify developer documentation, Liquid reference - the
variantobject definesinventory_policy(continueordeny),inventory_management(nilif inventory is not tracked) andinventory_quantity(number of items sold if not tracked); thejsonfilter does not outputinventory_quantityorinventory_policy; theline_itemobject documentsproperties[...]inputs and the underscore prefix that hides a property at checkout. https://shopify.dev/docs/api/liquid/objects/variant, https://shopify.dev/docs/api/liquid/filters/json and https://shopify.dev/docs/api/liquid/objects/line_item ↩ ↩2 ↩3 -
Shopify Help Center, Shopify Flow - “Shopify Flow is a free app available on the Basic, Grow, Advanced, and Plus plans”; the conditions reference shows checking whether one of the products in an order has a tag of
presaleusing order / lineItems / product / tags. https://help.shopify.com/en/manual/shopify-flow and https://help.shopify.com/en/manual/shopify-flow/reference/conditions ↩ ↩2 -
Shopify Help Center, “Payment authorization” - “Shopify Payments provides an authorization period of 7 days”; extended authorization periods are available only to Shopify Plus stores that use Shopify Payments, and a 1.75% charge applies to payments captured after the standard period. https://help.shopify.com/en/manual/payments/payment-authorization ↩