Skip to content
ryeo

D2C / Food & Beverage

A subscription and one-off coffee store on one Medusa backend

A coffee roaster's subscriptions moved off a third-party app onto a custom Medusa module: recurring plans, prepaid gifts, and one-off orders on one backend, managed by customers themselves.

Roasthouse CoffeeUpdated 28 Aug 20263 min read

Results

fewer subscription support tickets
70%fewer subscription support tickets
backend for subs and one-off orders
1backend for subs and one-off orders
higher subscriber retention at 6 months
24%higher subscriber retention at 6 months
per-subscription app fee (was 1% + 20¢)
0%per-subscription app fee (was 1% + 20¢)

Roasthouse Coffee roasts and ships specialty coffee direct to consumers. About half its revenue is recurring, from customers on a weekly, fortnightly, or monthly plan, and the rest is one-off bags and gifts. The recurring side ran on a third-party subscriptions app that charged a fee on every renewal, kept its data in its own system, and gave customers a clumsy portal that generated a steady stream of "please skip my next box" emails.

The problem

  • Two sources of truth. Subscriptions lived in the app; everything else lived in the store. Reporting meant exporting from both and reconciling by hand.
  • A fee on every renewal. A percentage plus a flat charge on each recurring order, growing directly with the part of the business they most wanted to grow.
  • Customers could not self-serve. Swapping a blend, changing frequency, or skipping a delivery often meant emailing support, who made the change in the app's admin.
  • No room to build. Prepaid 3- and 6-month gift plans, a "try before you subscribe" flow, and roast-date-aware scheduling were all things the app could not express.

What we built

A subscription system as a first-class part of the store, on Medusa.

  • A subscriptions module: plans, frequencies, pause and skip, blend swaps, and proration, modelled in Medusa so a subscription order is just an order with a schedule attached. One data model, one admin, one set of reports.
  • A billing workflow: a scheduled Medusa workflow creates each renewal order, charges the saved Stripe payment method, and handles failures with a retry-and-dunning sequence instead of silently churning the customer.
  • A self-serve portal: built into the Next.js storefront, for changing frequency, skipping or rescheduling the next delivery, swapping the blend, updating the card, or cancelling, all without contacting anyone.
  • Prepaid gift plans: 3- and 6-month plans paid up front, with a gift recipient who manages delivery timing but never sees a price.
  • Roast-date scheduling: renewals are timed to the roasting calendar so coffee ships within days of roasting, not from a shelf.

How it went

We started with the billing workflow and ran it in parallel with the existing app for a full cycle (same customers, same charges), comparing every renewal before cutting over. Migration moved active subscriptions, saved payment methods (via Stripe), and next-delivery dates across in one scheduled job, tested against a copy of production first.

The storefront portal shipped next, and the support inbox told the story within a month: the "skip my box" emails mostly stopped because customers could just do it.

The result

Subscription support tickets dropped about 70%. Everything now runs on one Medusa backend, so a subscriber's history, one-off orders, and gift plans are all in one place and reporting is a single query. The per-renewal app fee is gone. Six-month retention on new subscribers is up 24%, which the team attributes to the smoother portal and roast-date-timed deliveries rather than any one feature.

The old subscription app was a black box bolted onto our store. Now it is part of the store: customers change their own plans, and we can actually see what is going on.

Liam Doyle, Founder, Roasthouse Coffee

Tell us what you're building.