Data & Customer Migration

How do subscription discount/pricing-lock contracts (grandfathered pricing) get preserved when migrating the underlying subscription data to Shopify?

Short answer

Grandfathered subscription pricing survives a migration to Shopify only when it is written onto each contract line at import, because the line, not the plan, holds the price. Shopify requires a current price on every subscription line and leaves the selling plan optional (shopify.dev, October 2026). Shopify Subscriptions' contract import has no discount column (Shopify Help Center, October 2026).

Price on a Shopify contract line
currentPrice, requiredShopify requires a current price on every subscription line and leaves the selling plan optional, so the line records what this subscriber pays (October 2026).Source: Shopify developer docs (SubscriptionLineInput)
Discounts in Shopify's contract CSV
No discount columnShopify Subscriptions imports a required line_current_price and an optional selling plan ID, and a CSV can't edit or overwrite existing contracts (October 2026).Source: Shopify Help Center (Importing and exporting a contract CSV)
Coupons in Recharge's Migr8 tool
Unsupported from every source into RechargeFor moves into Recharge from Bold, Stay.ai, Smartrr, WooCommerce, Appstle, Ordergroove and Skio, coupons are unsupported, and non-active subscriptions convert to cancelled (October 2026).Source: Recharge (Automating customer and subscription data migration to Recharge with Migr8)
Replacement subscriptions
Might not keep the priceIn its recovery steps for a changed PayPal account, Shopify warns that a new subscription "might not preserve its pricing, discounts, billing cadence, or currency" (October 2026).Source: Shopify Help Center (Migrating payment methods to your Shopify account)

Deploi’s call

Preserve grandfathered pricing by writing each subscriber's locked price onto the Shopify contract line at import, then decide about it separately. Bundling a repricing into a migration saves a conversation and costs the cohort that has been loyal longest.

CustomizeCarry each lock at import when

  • The legacy export holds each subscriber's current price, so it can fill the line price Shopify requires (shopify.dev, October 2026).
  • Each percentage lock is either converted to a fixed line price on purpose or carried as a manual line discount by a scripted import.
  • Someone owns the subscriber-by-subscriber check of next charge against last charge before billing moves.
  • Someone builds the import glue on top of the bought destination, as Deploi's subscription migration record recommends with its CUSTOMIZE score (October 2026).

WaitHold the cutover while

  • The locks live in coupons, which Recharge's Migr8 tool lists as unsupported from every platform it migrates into Recharge (Recharge, October 2026).
  • Paused subscribers hold locks, because Migr8 converts non-active subscriptions to cancelled.
  • Nobody can yet list the locks from the old platform's database.
  • A price change is being folded into the migration announcement.

Basis: Recharge Alternatives: Build or Buy the Subscription Migration?, our Build vs. Buy decision record, scored CUSTOMIZE.

Where does a grandfathered price live in Shopify's subscription model?

A grandfathered price lives on the subscription contract line in Shopify, not on the selling plan. Shopify requires a currentPrice on every line and leaves sellingPlanId optional (Shopify's subscription line reference, October 2026). The plan name even "defaults to using the selling plan's current name when not specified". So the plan describes the offer, and the line records what this subscriber pays. That distinction is easy to miss when you move an active subscription program during a replatform. Import a legacy subscriber at today's list price with a standard plan attached, and you have silently repriced them. The contract looks correct, and the next charge is not.

Which Shopify field carries each kind of price lock?

Each kind of price lock maps to a different Shopify field, and only a fixed line price fits Shopify Subscriptions' contract import, a comma-separated values (CSV) file.

Four kinds of legacy price lock map to four Shopify fields; only the line price fits the contract CSV
Legacy price lockShopify fieldContract CSV import
"Locked at $29 forever"currentPrice on the subscription lineYes, as line_current_price
"15% off for life"A manual discount on the line: percentage or fixed amount, with an optional cycle limitNo discount column; convert to a line price
A code the subscriber redeemeddiscountCodes on the new contractNo
Intro price for early cycles, then standardThe line's pricing policy: a base price plus cycle discounts, each with an afterCycleNo
Sources: Shopify developer docs (SubscriptionLineInput, SubscriptionAtomicManualDiscountInput, SubscriptionContractAtomicCreateInput, SubscriptionPricingPolicyCycleDiscountsInput, About subscription billing cycles); Shopify Help Center (Importing and exporting a contract CSV). Verified October 9, 2026.

The contract CSV carries a required line price and no discount (Shopify Help Center, October 2026). So a "15% off for life" subscriber imported by CSV becomes a fixed amount. If the percentage itself is the promise, carry it as a manual line discount through Shopify's subscription application programming interface (API). An intro price needs the billing app too: Shopify says a pricing policy "serves as a guide for apps" and "the price of the line item does not update automatically" (Shopify developer docs, October 2026).

What do subscription migration tools drop?

Subscription migration tools can drop the coupons and paused subscriptions that carry price locks, and Recharge's Migr8 tool documents both. Migr8's per-platform tables list coupons as unsupported for every platform it migrates into Recharge: Bold v1 and v2, Stay.ai, Smartrr, WooCommerce, Appstle, Ordergroove and Skio (Recharge Migr8 guide, October 2026). Migr8 also converts "any non-Active subscriptions on your legacy platform" to CANCELLED, so a paused subscriber with a locked price arrives cancelled. A promotional discount that has ridden on a subscription for three years is a coupon, and Migr8 does not carry it. So re-express each lock as a line price or a manual discount, deliberately, before import. Even Shopify's recovery steps for a changed PayPal account warn that a replacement subscription "might not preserve its pricing, discounts, billing cadence, or currency" (Shopify's payment migration page, October 2026).

How do you prove every locked price survived the import?

You prove every locked price survived by reconciling amounts, subscriber by subscriber, before billing moves. Export the destination contracts and compare each next-charge amount with the source platform's last charge, for every subscriber rather than a sample. A subscriber whose amount moved is either a repricing you didn't intend or a lock you failed to carry. Correct each one before the first destination charge. Shopify's contract import requires the first billing date to fall at least 24 hours after the import (Shopify Help Center, October 2026). So leave room between the import and the first charge for this check. The billing anchor and payment token checks run in the same pass.

When should a migration change a legacy price?

A migration should never change a legacy price as a side effect, because in our judgment subscribers read an unannounced change at that moment as a bait and switch.

Deploi’s point of view

Our own position, from building on Shopify. Kept apart from the sourced facts above.

Where we disagree
Vendor migration templates treat price as an attribute of the plan, because that is how new subscribers are created. Shopify's data model does not agree: price is a required field on the line, and every subscriber who pays something other than list price depends on that distinction.
What we tell clients to do first
Build the reconciliation export before the import, not after. Legacy price locks are often documented nowhere but the old platform's database, so that export may be the only place the full set ever exists.
What this page adds
the field that holds a locked price (the required current price on each Shopify contract line), the missing discount column in Shopify Subscriptions' contract import, and Recharge's Migr8 tables that mark coupons unsupported and turn paused subscribers into cancelled ones.

Decision records behind this answer

When this answer changes

  • Shopify adds a discount column to the Shopify Subscriptions contract import, or makes the selling plan required on a line.
  • Recharge's Migr8 tool starts migrating coupons, or stops converting paused subscriptions to cancelled.
  • Shopify changes the subscription line inputs: current price, pricing policy or manual discounts.
  • Your legacy platform changes what its subscription export includes, such as each subscriber's current price.

Related questions

This follows from How do I migrate an active subscription program (Recharge, Skio, or a legacy platform's native subscriptions) during a full platform replatform?

More in Data & Customer Migration

Sources

Every figure on this page traces to one of these. Official and vendor pages are checked on the date shown; Deploi records are our own published decisions.

  1. Shopify developer docs, SubscriptionLineInputshopify.dev · checked October 9, 2026
  2. Shopify developer docs, SubscriptionAtomicManualDiscountInputshopify.dev · checked October 9, 2026
  3. Shopify developer docs, SubscriptionContractAtomicCreateInputshopify.dev · checked October 9, 2026
  4. Shopify developer docs, SubscriptionPricingPolicyCycleDiscountsInputshopify.dev · checked October 9, 2026
  5. Shopify Help Center, Importing and exporting a contract CSVhelp.shopify.com · checked October 9, 2026
  6. Recharge, Automating customer and subscription data migration to Recharge with Migr8support.getrecharge.com · checked October 9, 2026
  7. Shopify Help Center, Migrating payment methods to your Shopify accounthelp.shopify.com · checked October 9, 2026
  8. Shopify developer docs, About subscription billing cyclesshopify.dev · checked October 9, 2026
  9. Deploi Build vs. Buy, Recharge Alternatives: Build or Buy the Subscription Migration?deploi.ca · checked October 9, 2026 · Deploi research