Native Subscription Commerce on Shopify Selling Plans API
A UK food brand was paying £800/month for a third-party subscription app that had become a liability — broken billing retries, no customer portal, and an integration that kept failing. We replaced it with a native Selling Plans API implementation.
The problem
The brand's subscription app had no customer-facing portal — subscribers had to email to skip, pause, or cancel. Failed payments weren't being retried intelligently. The app's webhook integration with the brand's fulfilment system kept silently failing, resulting in boxes being shipped to subscribers who had cancelled. The £800/month cost was a secondary concern to the operational damage.
Technical challenge
Shopify's Selling Plans API requires careful design of the subscription contract — frequency options, billing cycles, and discount rules are all defined upfront and affect how orders are generated. The customer portal needed to handle mid-cycle changes (skipping, changing frequency, swapping products) without corrupting the subscription state. Dunning logic for failed payments needed to sequence retry attempts across 7, 14, and 21 days before cancellation.
Architecture
Selling Plans setup
Configured Selling Plans for 3 subscription frequencies (weekly, fortnightly, monthly). Discount rules applied at the plan level — Subscribe & Save percentages configured without any custom discount logic.
Customer account portal
Built a Customer Account UI Extension for the subscription management portal — skip, pause, cancel, frequency change, and product swap. All state changes go through the Subscriptions API with optimistic UI updates.
Dunning and retry logic
A Remix app handles failed payment webhooks. Failed billing triggers a retry sequence at 7, 14, and 21 days with customer email notifications at each step. After 21 days without payment, the subscription cancels and the fulfilment system is notified.
Fulfilment sync
Replaced the unreliable webhook integration with a polling-based sync that cross-checks subscription status against fulfilment records daily. Any mismatch generates an alert before product ships.
Results
Churn dropped 34% in the first quarter after launch — primarily from the dunning sequence recovering previously lost subscribers. The customer portal eliminated 90% of subscription-related support tickets. LTV growth of 2.1× over 12 months came from both reduced churn and increased average subscription frequency. The £800/month SaaS cost was eliminated on day one of go-live.
Have a project
like this?
Tell me what you're building. I'll tell you exactly how I'd approach it.