How to sell subscriptions and one-time products in one store

Type
Concept
Applies to
Medusa v2.x
Updated

Short answer

Medusa has no built-in Subscription Module, but its official Subscriptions guide shows how to add one: a custom module, a daily scheduled job that creates and charges renewal orders, and admin pages. One-time products use the standard checkout. Mixing both in one cart, dunning, and pause, skip, or swap are custom work.

How subscriptions work in Medusa

Medusa core has no Subscription Module. Subscriptions are built with the Medusa Framework, and the Subscriptions recipe and its example guide show one complete way to do it, with code in the medusajs/examples repository.

In the example, a custom Subscription Module stores each subscription's Copy to clipboardstatus, Copy to clipboardinterval (monthly or yearly), Copy to clipboardperiod, Copy to clipboardnext_order_date, and Copy to clipboardexpiration_date. Module links connect each subscription to the cart, customer, and orders. A custom Copy to clipboard/store/carts/{id}/subscribe route completes the cart with Copy to clipboardcompleteCartWorkflow and creates the subscription in one workflow.

At checkout, the storefront passes Copy to clipboardsetup_future_usage: "off_session" to Stripe, so the card is saved to the customer's account holder for later charges.

How subscription renewals run in Medusa

Renewals in the example run from a scheduled job that runs daily at midnight. It finds active subscriptions whose Copy to clipboardnext_order_date is today and runs a workflow for each one.

The workflow creates a payment collection, authorizes the saved payment method, creates a new order from the subscription's linked cart, captures the payment, and moves Copy to clipboardnext_order_date forward. A second daily job marks subscriptions as expired. The example also adds Medusa Admin pages that list subscriptions and their orders, and Store API routes where customers view and cancel their own subscriptions.

Can one Medusa cart mix subscription and one-time items?

Not in the official example. It stores the interval and period on the cart's metadata, so the whole cart becomes the subscription, and each renewal re-creates the order from that cart. The Reorder plugin listed below also blocks mixed carts in its current release and asks customers to check out twice.

Mixing them in one checkout is Custom work. Two patterns fit Medusa's model:

  • Mark subscription items in line item metadata, then split the cart into two carts at checkout: one completed normally, one through the subscribe route.
  • Complete one order, create a subscription record per subscribed line item, and have the renewal workflow build orders from those items only.

Subscription features in Medusa by status

FeatureStatusHow
Subscription data model and linksOfficial guideCustom module plus module links to cart, customer, order
Automatic renewal ordersOfficial guideDaily scheduled job and renewal workflow
Admin subscription pagesOfficial guideAdmin UI routes
Customer view and cancelOfficial guideCustom Store API routes
Product options such as sizeNativeProduct Module options and variants
Mixed cart checkoutCustomSplit carts or per-item subscriptions
Dunning (failed payment retries)CustomThe example only logs a failed renewal
Pause, skip, swapCustomClear, shift, or change next_order_date and the linked cart
ProrationCustomCalculate in the renewal workflow

Dunning means retrying failed renewal payments and emailing the customer. A common pattern sets the subscription's Copy to clipboardfailed status, then a second scheduled job retries on a backoff schedule.

Reorder is an MIT-licensed community plugin for Medusa 2.3+ that adds pause, resume, skip, cancel, and dunning with retries. Medusa doesn't maintain it, so review it like any dependency.

Custom logic or Stripe Billing as the subscription engine

The recipe describes two approaches. With custom logic, renewals live in your Medusa app and work with any payment provider. With Stripe Billing, Stripe runs the schedule and retries, but you are tied to Stripe. Medusa's Stripe provider doesn't handle subscriptions, so you write a custom payment provider.

Medusa vs Recharge on Shopify vs Stripe Billing

Prices are list prices as of October 2026.

MedusaRecharge on ShopifyStripe Billing
Where renewals runYour Medusa appRechargeStripe
Subscription feesNone, Medusa Cloud from $29/month with 0% GMV feeStarter $99/month plus 1.49% + 19¢ per transaction0.7% of Billing volume, pay as you go
DunningCustomFailed payment recovery includedSmart Retries included
Skip, pause, swapCustomCustomer portal with swap and reschedulePause payment collection, prorations
Payment providersAny provider you integrateCheck vendor docsStripe only

Card processing fees apply on top in every column.

When Medusa is not the right choice for subscriptions

  • You run on Shopify and need standard subscribe-and-save. Shopify's free Shopify Subscriptions app supports pause, skip, and cancel.
  • You have no developer. Every subscription feature beyond the guide is code you maintain.
  • You bill software or digital plans that need invoices and prorations. Stripe Billing alone fits better.

Good Chef, a meal subscription brand, built its subscriptions in Medusa with a custom data model and a nightly renewal job, and chose not to use Stripe Billing so customers could pay with their preferred method (case study).

Common questions

Does Medusa have a built-in subscription feature?

No. Medusa core has no Subscription Module. The official Subscriptions recipe and example guide show how to build one with a custom module, workflows, and scheduled jobs.

Can I use Stripe Billing for subscriptions with Medusa?

Yes, but not through Medusa's Stripe payment provider, which doesn't handle subscriptions. The Subscriptions recipe says to create a custom Stripe subscription payment provider, which limits you to Stripe.

How does Medusa charge a subscription renewal?

In the official example, a scheduled job runs daily, finds active subscriptions due today, and runs a workflow that authorizes the customer's saved payment method, creates the order, and captures the payment.

Is there a subscription plugin for Medusa?

Reorder is an MIT-licensed community plugin for Medusa 2.3+ that adds pause, skip, dunning, and a customer portal API. Medusa doesn't maintain it, and its current release doesn't support mixed carts.