Shopify Subscriptions at Checkout: Selling Plans, Contracts, and the Limits That Bite

A merchant installs a subscription app, sets up a monthly plan at 15 percent off, and watches the first subscriber check out fine. The second subscriber picks local pickup for the subscription and shipping for the one time item in the same cart, and the checkout refuses the combination. Nobody warned them, because the warning lives in the developer docs, not in the app listing. Subscriptions on Shopify are four policies and a contract, and the checkout enforces limits the storefront never mentions.

Four policies, one contract

Everything starts with selling plan groups and selling plans. A group is a selling method, like subscribe and save or prepaid. A plan is one concrete way to buy: billed monthly, delivered monthly, 15 percent off. Each plan carries four policies. The billing policy says when to charge. The delivery policy says when to fulfill. The pricing policy says how to price. The inventory policy says when to reserve stock, at order creation or at fulfillment. When a customer buys through checkout, Shopify automatically creates a subscription contract from those policies, and from then on the contract is the thing: billing cycles determine when charges happen, billing attempts process the payment, and webhooks broadcast success, failure, and challenged states. Pausing, skipping, or modifying a subscription is an API call against the contract, and one-off changes go through a draft on the billing cycle. The storefront shows a friendly toggle. Underneath it is a contract with a lifecycle, and the lifecycle has rules.

Two purchase types dominate: pay per delivery, where a new order is created at regular intervals and the customer pays for each delivery, and prepaid, where one payment upfront covers a set cadence of deliveries. Both ride the same contract machinery. The difference that matters operationally is the failure mode: a pay per delivery subscription fails one billing attempt at a time, and a prepaid subscription fails once, upfront, before any delivery exists.

The limits that bite at checkout

The first limit is delivery. For subscription checkouts, when customers choose local delivery or pickup methods, the chosen method applies to the entire order, and mixed delivery methods are not supported. A cart that mixes a subscription with a one time item cannot ship one and pick up the other. The shopper picks one method for everything or the checkout will not cooperate, and the error message will not explain why. Stores that sell subscriptions next to one time products need to know this before they promise pickup at the product page. The second limit is access. Custom apps created in the Shopify admin cannot use subscriptions at all, because they cannot use extensions or request the protected scopes. A subscription app needs approval through the Partner Dashboard and the write_products, read_customer_payment_methods, and read and write own subscription contracts scopes. A merchant who commissions a custom app and discovers this at launch has a rebuild on their hands, not a configuration change. The third limit is geography: shipping a selling plan outside its shipping zone is not supported, because custom rates cannot be applied when calculating recurring shipping rates. Subscriptions also need Shopify Payments on POS, and managing contracts must happen through the online store, not the POS app. None of these limits is hidden. All of them are in the docs. The stores that get bitten are the ones that read the app listing instead.

The checkout extension surface is the bright spot. Checkout extensions let you tailor the subscription experience in Shopify checkout itself, and customer account extensions give subscribers self service in the customer account. That is where the work should go: the plan selection, the delivery method choice, and the contract management, all inside surfaces Shopify already owns, rather than a custom flow that fights the contract model.

What to check before you launch

Test the mixed cart first: subscription plus one time item, pickup plus shipping, and watch what the checkout actually allows. Test a failed billing attempt and read the webhook: success, failure, and challenged are three different states with three different customer emails. Confirm your app has the protected scopes before you promise a launch date, because Partner Dashboard approval is a queue, not a toggle. And decide the inventory policy deliberately: reserving stock at order creation protects the subscriber and starves the one time buyer, while reserving at fulfillment does the opposite. The policy is a business decision wearing a technical name, and it should be made by whoever owns the margin, not whoever installed the app.

Keep reading: Custom-App Functions Need Plus. Public-App Functions Do Not, Checkout UI Extensions: Three Per Target, 64 KB, No Exceptions, Discount Functions: When Two Discounts Stack and When They Cancel.

Frequently asked questions

What is a selling plan in Shopify?

A selling plan is one way a product can be bought, defined inside a selling plan group. Each plan carries four policies: billing policy for when to charge, delivery policy for when to fulfill, pricing policy for how to price, and inventory policy for when to reserve stock. A common example is a monthly subscription at a 15 percent discount.

What happens at checkout when a customer buys a subscription?

Shopify creates a subscription contract when the order is placed. The contract holds the billing cycles, the payment method, and the delivery schedule, and the Subscription Contract API manages its lifecycle afterward: pause, skip, modify, or cancel are API calls against that contract.

Can a subscription checkout mix shipping and local pickup?

No. For subscription checkouts, when customers choose local delivery or pickup, the chosen method applies to the entire order. Mixed delivery methods are not supported for subscription checkouts, which is a real constraint for stores that sell subscriptions alongside one time products.

Why can my custom app not create selling plans?

Custom apps created in the Shopify admin cannot use subscriptions, pre-order, or try before you buy, because they cannot use extensions or request access to protected scopes. A subscription app needs Partner Dashboard approval and the write_products, read_customer_payment_methods, and read and write own subscription contracts scopes.