The problem in one sentence
You set "subscribe and save 15%" in Recharge. Six months later, you raise prices. Your existing subscribers' next renewal goes through at... the wrong number. Either Recharge re-quotes them at the new price (and they cancel), or it keeps the old price (and your margin compresses on every renewal).
Either outcome ends in a refund request, a screenshot in your support inbox, and an evening reading Recharge docs.
What Recharge actually locks (and what it doesn't)
Recharge stores the price on the subscription, not the product. When a customer subscribes, the line item gets a price that goes with the subscription record. On renewal, Recharge can:
- Re-quote at current product price (default for some plan types and historical setups), or
- Hold the price the customer originally signed up at (the more recent default, but depends on configuration)
Which behavior you get depends on:
- Your Recharge plan and the integration mode (Shopify Checkout Integration vs. legacy Recharge checkout)
- How the subscription was originally created (subscribe widget, dynamic checkout, manually-created)
- Whether you've enabled "Sync price changes" on the product
- Whether the upstream price changed via Shopify Admin, an app's discount, or a Function
This is the surface area most brands don't realize they have.
What goes wrong, in three flavors
Flavor 1: The retail-price renewal
Customer subscribed at $34 (your $40 product with a 15% subscriber discount). Six months in you raise the product to $42. The subscriber discount was a Shopify-level discount, not a Recharge one. Recharge sees the product price went from $40 → $42 and renews at $42 with no discount applied. Customer pays more than they signed up for, gets confused, opens a ticket.
Flavor 2: The locked-too-tight renewal
Same customer, but you locked the original $34 price into the subscription. Six months later your COGS went up 20%. Every renewal now costs you margin. You can't update Recharge subscriptions in bulk without breaking the customer's saved card flow. Your finance team starts asking why the gross margin slid 4 points.
Flavor 3: The discount-stack collision
Customer has a one-time promo discount on top of their subscription discount. The cart math worked at signup because both ran in the same Script. Recharge stored the resolved price. On renewal, only one discount fires (or both, or neither — depends on your Function order). Customer opens a ticket.
The pattern that actually works
Three rules. They're not glamorous, but they cover 95% of subscription brands:
Rule 1: Tag the customer the moment they subscribe
Don't rely on Recharge's internal "is_subscriber" flag for pricing. Apply a Shopify customer tag (e.g. recharge-monthly or subscriber-active) when the subscription becomes active. Remove the tag when it cancels.
Recharge supports this via webhook-driven tag automations, or you can do it from your backend listening to Recharge events.
Rule 2: Price by tag, in one place
Use a tag-driven pricing app (or a custom Function) that maps the subscriber tag to the subscriber price. The price is resolved at order line creation time, not stored on the subscription.
This means: when you change the underlying tier price in your pricing tool, every active subscriber's next renewal re-quotes against the new tier price. You have one source of truth — the pricing rule — instead of N subscriptions each holding their own snapshot.
Rule 3: Be deliberate about price changes
If you raise a tier price, communicate to subscribers before their next renewal cycle. The standard pattern: "Your next order on the 15th will be $42 instead of $38. Reply STOP to pause." Recharge has notification primitives for this; use them.
The point: the price the subscriber sees is intentional, not an artifact of which tool stored which number when.
The migration path off the old pattern
If you're already in trouble (subscribers at mismatched prices, support queue full of refund requests), here's the recovery sequence:
- Pull a report from Recharge of every active subscription, with current price and current product price. Identify the mismatches.
- Decide your "true" tier price. Usually this is the most recent intended subscriber price — not the current product price, not the original signup price.
- Communicate to mismatched subscribers with a 30-day notice. Offer a one-month grace if you raised prices on them.
- Bulk-update via Recharge's CSV or API to set every active subscription to the true tier price.
- Switch the active pricing logic to a tag-based Function (so future renewals use the rule, not stored prices).
- Disable the legacy Script or app that was setting subscriber prices. Don't delete for 30 days.
Common gotchas
"Recharge sometimes shows a different price than my PDP"
Almost always means the PDP is rendering a price from a different source than what Recharge sends to checkout. Audit: PDP price → cart price → checkout price → order line price → subscription price. The pattern above unifies all five against a single Function output.
"Shop Pay is showing the wrong subscriber price"
Shop Pay reads the line item price, not your theme's PDP price. If your subscriber discount is a Shopify-Functions output, Shop Pay sees it correctly. If it's theme-injected JavaScript, Shop Pay does not. This is one of the biggest reasons to do subscriber pricing as a Function rather than as a theme override.
"Bulk update broke saved cards"
If you change the price on a subscription via the Recharge API in a way that triggers a re-authorization of the payment method, customers may need to re-confirm in Shop Pay or via email. Test this on a sandbox subscription before doing it to your book. The right Recharge endpoint and parameters matter — read their migration docs.
"Subscribers are pausing more than usual since the migration"
Expected, briefly. Any change in renewal pricing — even one that should net out positive — triggers a pause uptick for ~2 weeks. The fix is the communication step (Rule 3), not pulling back the change.
What this looks like in TagTier
If you're using TagTier with Recharge, the setup is:
- Add a Recharge tag-automation: when subscription becomes active, tag customer
recharge-monthly. When canceled, remove the tag. - In TagTier, create a rule:
#recharge-monthly→ tier price (e.g. 15% off your retail tier). - Publish. Renewals re-quote against the live rule.
When you raise the underlying tier (or change the discount %), TagTier's audit log shows the change, and you can roll back if you misjudged customer reaction. We documented this end-to-end in the Help Center recipe.
Try TagTier on your dev store →