Shopify Plus · Food & Beverage Brand

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.

Role
Architecture and full-stack development
Stack
Shopify Plus, Selling Plans API, Storefront API, Remix, Node.js, Shopify Functions
shopify-subscription-commerce — project screenshot
Reduction in churn
34%
Monthly SaaS cost eliminated
£800
Subscriber LTV growth
2.1×

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 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 without corrupting subscription state. Dunning logic for failed payments needed to sequence retry attempts across 7, 14, and 21 days before cancellation.

How it was built

  1. 01

    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.

  2. 02

    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.

  3. 03

    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.

  4. 04

    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.

B2B & wholesaleB2B Wholesale Portal with Company-Specific Pricing
MigrationWooCommerce → Shopify — Zero SEO Drop

Have a project like this?

Tell me what you're building and I'll tell you exactly how I'd approach it.

Discuss a Project →