Home>Migrations & Replatforming>Data & Customer Migration>Keeping Grandfathered Subscription Pricing

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

Grandfathered subscription pricing survives a migration only when it is written onto each contract line at import. Shopify's SubscriptionLineInput carries a required currentPrice field, set independently of the selling plan, plus an optional pricingPolicy that "describes expected price changes of the subscription line over time" (per Shopify's docs, September 2026). Selling-plan pricing otherwise applies.

The mechanism: price lives on the line, not on the plan

This is the detail that decides the outcome, and it is not obvious from the merchant-facing UI. A Shopify subscription contract line takes its own currentPrice as a required, non-null decimal. The sellingPlanId is optional on that same line, and sellingPlanName "defaults to using the selling plan's current name when not specified" (per Shopify's GraphQL Admin API reference, September 2026). So the plan describes the offer; the line records what this particular subscriber actually pays.

Import a legacy subscriber at the current list price with a standard selling plan attached, and you have silently repriced them. The contract will look correct. The next charge will not be.

Three ways a price lock is expressed, and where each one lands

Legacy constructDestination on ShopifyField
"Locked at $29 forever"Line-level pricecurrentPrice on SubscriptionLineInput
"15% off for life"Per-contract manual discountSubscriptionAtomicManualDiscountInput on the line
A redeemable code the subscriber holdsContract-level discount codesdiscountCodes array on subscriptionContractAtomicCreate
"Intro price for cycle one, then standard"Selling plan pricing policySellingPlanFixedPricingPolicy, then recurring after afterCycle

Per Shopify's GraphQL Admin API reference, verified September 2026.

What the migration tools will not carry

Recharge's Migr8 tool "does not support migrating bundles, coupons, prepaid subscriptions (on most platforms), paused subscriptions, memberships, or early adopter program features" (per Recharge's help docs, September 2026). Coupons in that list is the one that catches people: a promotional discount that has been riding on a subscription for three years is a coupon, and it does not come across. The price lock has to be re-expressed as line pricing or as a manual discount on the new contract, by you, deliberately.

The reconciliation step that is not optional

Before you switch billing over, export the destination contracts and compare next-charge amount against the source platform's last-charge amount, subscriber by subscriber. Not a sample. Any subscriber whose amount moved is either a repricing you did not intend or a legacy discount you failed to carry, and both are discoverable in a spreadsheet and unrecoverable in a support queue.

The commercial question underneath. A migration is the one moment where repricing a legacy cohort is technically trivial. It is still a repricing, and subscribers read an unannounced price change at exactly the moment their subscription "moved" as a bait and switch. If the legacy pricing genuinely has to end, end it as its own announced decision on its own timeline, not as a side effect of a platform project.

The Deploi point of view

Our own position, from building on Shopify. Separate from the facts above.

  • Our take: Carry the grandfathered price, then decide about it separately. Bundling a repricing into a migration saves a conversation and costs the cohort that has been loyal longest.
  • What we’ve seen: Legacy price locks are rarely documented anywhere except the old platform's database. Nobody on the team can list them from memory, which means the reconciliation export is the only place the full set ever exists. Build it before the import, not after.
  • 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 this page adds: the exact field that holds a locked price (currentPrice on the subscription line), and the named exclusion list on Recharge's own tooling that makes coupons the highest-risk item in a price-lock migration.

Reviewed by Martin Dejnicki, Director of SEO & AI Search. Facts verified 2026-09-13.