Your cart permalink ignores the selling plan. Here's why, and the fix

You built a link for a subscription, opened it, and the cart says "one-time purchase" at the full price. Nothing is wrong with your link. A Shopify cart permalink simply has no way to carry a selling plan.

· 5 min read

Short answer

Shopify's documentation lists selling plans as a limitation of cart permalinks (/cart/variantID:quantity). Extra parameters such as selling_plan=… are not read, so the variant is added as a one-time purchase. The subscription has to be added through the storefront's /cart/add.js, where each line accepts a selling_plan, or through a tool that does that for you. Cartsella Studio's campaign links do exactly that: you pick the product's subscription option, share one short link, and the shopper lands on a cart or checkout that already holds the subscription.

What you're seeing

It usually looks like one of these:

Why it happens

A selling plan is Shopify's way of saying "this purchase repeats": deliver every 30 days, 10% off. Subscription apps built on selling plans, including Shopify Subscriptions, attach those plans to products, and the plan the shopper picks travels with the cart line.

A permalink, in contrast, is a short address that only knows variant IDs and quantities (plus a few extras such as a discount code). There is no slot in it for a plan. Shopify's own cart permalinks documentation lists selling plans among the things that don't work, and the same goes for pre-order and Try Before You Buy options. Adding selling_plan to the address doesn't produce an error; it is just not used.

Check it in 30 seconds

  1. Open yourstore.com/products/your-product.js. If selling_plan_groups has entries, the product has plans, and a plain permalink will always drop them.
  2. Open yourstore.com/cart.js after using your link. A line with a selling_plan_allocation is a subscription. If it's missing, the line is a one-time purchase.
  3. If the product has no plans at all, the cause is somewhere else (the plan isn't attached to that product in your subscription app).

Fix 1: Link to the product page with the plan chosen

Product pages understand a plan in the address:

https://yourstore.com/products/coffee-beans?variant=39897499729985&selling_plan=610435137

In themes that support it, the page opens with that subscription option selected. The catch: the shopper still taps "Add to cart" and goes through the cart, and it's one product per link. Good for a single refill, weak for kits or multi-product offers.

Fix 2: Add the line through the cart API

The storefront's POST /cart/add.js accepts a selling_plan on each line. A small script on a page of your store can add the lines and then send the shopper to checkout:

fetch("/cart/add.js", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ items: [
    { id: 39897499729985, quantity: 1, selling_plan: 610435137 }
  ] })
}).then(() => { location.href = "/checkout"; });

It works, but you now own a page, a script, the plan IDs and their upkeep. If a plan is deleted or re-created, the ID in your script is wrong and nothing tells you. Every new link means editing code.

Fix 3: A campaign link that does the cart add for you (the one that scales)

Cartsella Studio's campaign links use the same cart API from Fix 2, so you don't have to write or maintain it. This is what the problem in this post turns into:

A plain cart permalink

  • Variant and quantity only
  • The subscription is dropped: a one-time purchase at full price
  • The shopper has to find "Subscribe" again, or buys once by mistake

A campaign link

  • Each product with its subscription option already chosen
  • Subscription and one-time products in the same link
  • Discount code applied, and it opens the cart or straight at checkout
  1. Create a campaign link and add the product.
  2. Choose its subscription option from the plans Shopify has on file for that product.
  3. Optionally add a discount code you created in Shopify, and choose cart or checkout.
  4. Share the link on your own domain (/apps/go/refill) or download its QR code.
Building a campaign link with a subscription product, a discount code and checkout as the destination

You pick the plan from a list instead of copying IDs, so there is no script to edit when you add a product. A link with no subscription lines still opens through a normal permalink; the heavier route is used only when a plan needs it. You can change the products behind a link later without reprinting its QR code, and each link shows its clicks. Nothing is added to your theme or products. Campaign links are included on Duo, Pro and Agency. The full walkthrough is in How to create a Shopify cart link for subscription products.

Stop sending shoppers to a one-time purchase. Send them to the subscription.

Join the waitlist: 50% off your first year

Things that trip people up

Frequently asked questions

Why does my Shopify cart permalink add a one-time purchase instead of a subscription?

Cart permalinks only carry variant IDs, quantities and a few extras. Shopify's documentation lists selling plans as unsupported, so the variant is added without its plan.

Can I add selling_plan to a /cart/variant:quantity link?

You can write it, but Shopify ignores it. Use the storefront's /cart/add.js, where each line accepts selling_plan, or a tool that calls it for you.

How do I find the selling plan ID?

Open yourstore.com/products/handle.js. Each plan under selling_plan_groups has an id.

Does this affect Shopify Subscriptions and other subscription apps?

It affects any app that uses Shopify selling plans, Shopify Subscriptions included. The limit is in the permalink, not in the app.

Can one link hold a subscription and a one-time product?

Yes, with a campaign link: each product is either one-time or has its subscription option chosen, and the cart is filled in one step.

Read next: Subscription reorders in one scan · Cart links with a discount · Campaign links