How to Set Up Pre-Orders on Shopify: Native Options, Apps, and What Breaks

Last updated
•
Expert reviewed
•
5 min read
Jacques Blom
Jacques Blom
CTO at Fudge.

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 modelPaid at checkoutWhat it needs
Pay in full nowThe full priceWorks with no app, or with a pre-order app
DepositPart of the priceA pre-order app using purchase options
Charge laterNothingA 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:

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:

  1. Trigger: Order created.
  2. Condition: order / lineItems / product / tags, at least one is equal to pre-order.
  3. 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.

Pre-order label, ship date and cart notice as native theme code? Describe it to Fudge.
Try Fudge for Free

No-app route vs pre-order app: which Shopify pre-order setup fits?

No-app routePurchase-options pre-order app
Payment timingFull amount at checkoutFull, deposit or nothing at checkout; balance collected later
Payment methodsEverything your checkout offersNo Shop Pay, Apple Pay or Google Pay accelerated checkout; no local payment methods
Order flaggingNone, unless you add a line item property and a Flow tagPre-order details on the product and in the Orders list
Quantity capsNone with continue selling; manual, or a fixed allocationDepends on the app; some let you reserve inventory at sale or at fulfilment
Mixed cartsOne order, one shipping charge; you hold or split itCheck out together; deposits are combined and the earliest due date applies
EffortTheme edits, a metafield, a Flow workflow, an email editApp setup, plus a theme that shows the pre-order details
CostNo app feeDepends 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

Can you do pre-orders on Shopify without an app?

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.

How do I change Add to cart to Pre-order on Shopify?

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.

Can customers pay a deposit for a pre-order on Shopify?

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.

Can customers use Shop Pay or Apple Pay for pre-orders?

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.

What happens if a pre-order ships late?

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.

How do I limit the number of pre-orders on Shopify?

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.

Jacques's signature
Describe the pre-order experience. Get theme code, not an app widget.

Footnotes

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. Shopify developer documentation, Liquid reference - the variant object defines inventory_policy (continue or deny), inventory_management (nil if inventory is not tracked) and inventory_quantity (number of items sold if not tracked); the json filter does not output inventory_quantity or inventory_policy; the line_item object documents properties[...] 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

  7. 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 presale using order / lineItems / product / tags. https://help.shopify.com/en/manual/shopify-flow and https://help.shopify.com/en/manual/shopify-flow/reference/conditions ↩ ↩2

  8. 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 ↩

You might also be interested in

Launch a Shopify Store in Germany (With Templates)
Launch a Shopify store in Germany: VAT and Impressum compliance, payment methods, shipping, language, and the template adjustments German buyers expect.
Sticky Add to Cart on Shopify PDPs (2026)
Sticky add to cart on Shopify keeps price, variant, and buy button visible as shoppers scroll. How to build it natively with no app.
Exit-Intent Pop-ups on Shopify That Convert (2026)
Build an exit intent Shopify popup that recovers leaving shoppers. Covers desktop mouseout triggers, mobile alternatives, frequency caps, Google's rules.