LUCENTCOMMERCEGET A FREE STORE AUDITFREE AUDIT

OPS · TECHNICAL · METAFIELDS · 9 JUNE 2026 · 8 MIN READ

Modelling made-to-order and lead times in Shopify

The hard part is not taking the order. It is making one number — how long this will take — true on the product page, in checkout, in the confirmation email and on the phone.

A quarter of work on a board, the week in progress marked

Model the lead time as structured data on the product, not as a sentence in the description, and decide early whether you are selling stock you do not have yet or capacity you have to schedule. For most made-to-order catalogues the honest build is a metafield holding a number of days, a storefront that turns that into a date, and inventory either untracked or set to continue selling. Shopify's deferred purchase options exist for genuine pre-orders with deposits, and they carry restrictions that will decide the question for you.

IN SHORT

  • Lead time belongs in a metafield with a numeric type, because a number can be read by the storefront, checkout logic, the confirmation email and your ERP; a sentence in the description can only be read by a human.
  • Decide whether the constraint is stock or capacity — a workshop that can build four a week is not modelled by an inventory number, and pretending otherwise oversells the calendar rather than the shelf.
  • Shopify documents three selling plan categories for deferred purchase options: `SUBSCRIPTION`, `PRE_ORDER` and `TRY_BEFORE_YOU_BUY`, with `OTHER` available by request.
  • A pre-order selling plan can commit inventory either when the order is created or when it is fulfilled, which is the setting that decides whether a pre-order protects stock for the buyer.
  • Deferred purchase options are documented as incompatible with local payment methods, Shopify POS, draft orders, B2B and "Buy X get Y" discounts, and are limited to a short list of gateways — check those before designing around them.
  • A delivery customisation function can rename, reorder or hide checkout delivery options, with a documented maximum of 25 per store and the cheapest option required to stay first.
  • The mixed basket — one stocked item and one six-week item — is the case that breaks most implementations, and it has to be designed rather than discovered.

Three different businesses, one phrase

"Made to order" covers at least three arrangements that need different builds, and the first hour of any of these projects is spent establishing which one you have.

Built on receipt of order, from stocked components. A sofa in your choice of fabric, a bike built to a spec. The constraint is workshop capacity and the lead time is reasonably predictable — four weeks, plus or minus a few days.

Ordered in on demand. You do not hold it, your supplier does, and the lead time is theirs plus your handling. Predictable until it is not, and the failure mode is a supplier who stops answering.

Genuinely bespoke. Measured, quoted, scheduled. There is no meaningful lead time until somebody has looked at the job, and trying to display one is a promise you will break.

The third is not an ecommerce problem, and the most useful thing you can do with it is stop trying to sell it through a buy button. An enquiry form that captures enough to quote, followed by a draft order, is faster to build and more honest than a product page with a number on it that your workshop does not recognise. Several of the projects we are proudest of ended with fewer products on the storefront than they started with.

Put the lead time in a field, not in a paragraph

The most common starting point is a line in the product description: "Please allow 4–6 weeks for delivery." It is invisible to every system you own. The storefront cannot turn it into a date, checkout cannot reason about it, the confirmation email cannot repeat it, and your support team ends up being the integration layer.

The fix is a metafield definition on the product or variant, typed as a number of days rather than a piece of text. Type is the strongest commitment a definition makes: a numeric field can be compared, added to today's date, and sorted on; a text field holding "4–6 weeks" can only be printed. Where a range is genuinely the truth, hold two fields — a minimum and a maximum — and let the storefront decide how to say it, rather than storing the sentence.

Two more fields usually earn their place. A cut-off — the time of day after which today no longer counts — because the difference between ordering at 10am and at 6pm is a real day for the workshop and a real day for the customer. And a capacity or batch marker, where production runs in weekly slots rather than continuously.

With that in place the storefront can render a date rather than a duration, which is the thing that changes behaviour. "Ships by 14 July" is a different sentence from "4–6 weeks", even when they describe the same fact, because the shopper does not have to do arithmetic to find out whether it arrives before the birthday.

Getting the calendar right is where this stops being a template change: the date has to skip non-working days and honour whatever your workshop actually does in August. That logic belongs in one place, computed from the fields, and used by every surface — never re-implemented in the theme, the email template and the ERP separately, because those three will drift and only the customer will notice.

Stock, capacity, and which one you are actually selling

Shopify's inventory model counts units at locations. If what limits you is units, use it. If what limits you is throughput — four units a week, regardless of how many orders arrive — an inventory number is the wrong instrument, and stores that force the fit find out in a peak week.

The two workable positions for a made-to-order line are straightforward. Either stop tracking inventory on it, so the product is always buyable and the lead time is the only constraint communicated; or track it and enable "Continue selling when out of stock", which keeps it buyable while preserving a count you can read. The second is better if anything downstream — a report, an ERP, a 3PL feed — needs the number, and it needs a clear rule about what a negative available quantity means to the people who will see it.

What neither does is protect you from taking more orders than you can build. That is a capacity problem, and it is solved by scheduling rather than by stock: a weekly batch size, a queue depth, and a lead time that grows as the queue does. The version of this that works on Shopify is unglamorous — the lead-time field is maintained by whoever runs production, weekly, because the number is a commitment their team has to keep. Automating that from an ERP is possible and is usually the second project, not the first.

When Shopify's deferred purchase options are the right tool

Shopify has first-class support for purchases that are paid for now and fulfilled later. The selling plan categories it documents are SUBSCRIPTION, PRE_ORDER and TRY_BEFORE_YOU_BUY, with OTHER available by request. For made-to-order work the relevant one is PRE_ORDER, and it brings a few decisions with it.

A delivery policy sets when fulfilment is expected: as soon as possible, at an exact time, or unknown where the timeline depends on other conditions. That last option is a more honest model than most stores admit to needing. Delivery and billing policies have to be consistently fixed or recurring, and the documentation is direct that pre-orders use fixed policies.

The setting that matters most operationally is the inventory policy: inventory can be committed when the order is created, or when it is fulfilled. Committing on sale means a pre-order reserves a unit for that buyer. Committing on fulfilment means it does not, and a later customer can take the slot. Neither is wrong; picking without deciding is.

If you are taking a deposit and charging the balance later, the remaining balance is charged through orderCreateMandatePayment, which is idempotent and requires a unique idempotency key. The documentation is explicit that scheduling the charge at the right time and automating the process around payment failures is the app's responsibility, not Shopify's. That is the sentence to read twice before scoping a deposit model — the hard part is not taking the second payment, it is what happens on the ones that fail.

And read the incompatibilities before designing anything around this. Deferred purchase options are documented as incompatible with local payment methods, Shopify POS, draft orders, B2B and "Buy X get Y" discounts, and supported on a short list of gateways. If you sell B2B, or your best market runs on a local payment method, the decision has been made for you.

What checkout will and will not let you say

Checkout is where a lead time gets contradicted. The product page says six weeks; checkout offers "Express — 1 to 2 business days", and the shopper reasonably concludes one of the two is wrong.

The lever is a delivery customisation function, which can rename a delivery option, reorder the list, or hide an option entirely. Renaming "Express" to something that describes dispatch rather than transit removes most of the confusion on its own. Hiding an option is the right move where a courier speed is meaningless for a product that has not been built yet.

Three documented constraints shape what you can do. Carrier names are prepended automatically and cannot be removed. When reordering, the cheapest option has to stay first. And there is a maximum of 25 delivery customisation functions per store — generous, but worth knowing before somebody proposes one per product line. The function also applies to checkout only, so the cart and any draft order route need their own answer.

The mixed basket, and the thing that breaks after launch

One stocked item, one six-week item, one order. Every made-to-order build meets this, most meet it after launch, and there are only three defensible answers: ship it all when the slow item is ready, split the shipment, or stop the combination from happening at the cart. Pick one deliberately and say so on the product page and in the cart, because the default — silence, then a customer service conversation — is the expensive option.

Splitting is usually right for the customer and usually the most work: two fulfilments, two tracking numbers, a shipping cost you have decided who pays for, and an order status page that has to explain it. Holding everything is cheap to build and produces the worst emails. Preventing the combination is honest and loses baskets.

The part nobody budgets for is that this model needs maintaining. Lead times move. A supplier slips, a machine goes down, August happens. A store where the number on the product page is corrected every week is telling the truth; a store where it was set at launch is publishing a promise nobody has checked in eight months, and the cost lands on your support inbox before it lands on your reviews. That ongoing correction is most of what [ongoing Shopify support](/services/support) is for on a made-to-order catalogue — less building, more keeping one number true.

Questions this raises

How do you sell made-to-order products on Shopify?

Store the lead time as a numeric metafield on the product or variant, either stop tracking inventory on those lines or enable "Continue selling when out of stock", and have the storefront turn the lead time into a dispatch date rather than printing a duration. Use a delivery customisation function so checkout shipping names do not contradict the product page. Reach for Shopify's pre-order selling plans only when you genuinely need deferred payment or committed inventory.

Should lead times be a metafield or part of the product description?

A metafield, with a numeric type. A number can be added to today's date, compared, sorted on and read by checkout logic, the confirmation email and your ERP. A sentence in the description can only be read by a person, which means every other system that needs the lead time either guesses or asks your support team.

What are Shopify deferred purchase options?

They are selling plans that let a customer buy now and receive later. Shopify documents the categories `SUBSCRIPTION`, `PRE_ORDER` and `TRY_BEFORE_YOU_BUY`, with `OTHER` available by request. A pre-order plan sets a fixed delivery policy — as soon as possible, at an exact time, or unknown — and chooses whether inventory is committed when the order is created or when it is fulfilled.

Can you take a deposit and charge the balance later on Shopify?

Yes, through deferred purchase options, with the remaining balance charged via the `orderCreateMandatePayment` mutation using a unique idempotency key. Shopify documents that scheduling that charge and handling payment failures is the app's responsibility rather than the platform's, so budget the work for failed second payments — that, not the happy path, is where deposit models get expensive.

How do you stop checkout contradicting a long lead time?

With a delivery customisation function, which can rename, reorder or hide delivery options at checkout. Renaming options so they describe dispatch rather than transit removes most of the confusion. Carrier names are prepended automatically and cannot be removed, the cheapest option has to remain first when reordering, and a store is limited to 25 of these functions.

How do you handle an order with both stocked and made-to-order items?

Choose one of three behaviours and state it before checkout: ship everything when the slow item is ready, split the shipment, or prevent the combination in the cart. Splitting is usually best for the customer and costs the most to build, because it means two fulfilments, a shipping cost policy and an order status page that explains what is happening. The default of saying nothing turns into support tickets.

NEXT STEP

Free store audit

A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.