---
title: "How to sell subscriptions and one-time products in one store"
description: "How to sell subscriptions and one-time products in one Medusa store: renewals, mixed carts, dunning, pause and skip, compared with Recharge and Stripe Billing."
url: https://medusajs.com/kb/subscriptions/subscriptions-and-one-time-products
last_updated: 2026-10-29T06:55:50Z
topic: "subscriptions"
type: "concept"
applies_to: "Medusa v2.x"
related:
  - "https://medusajs.com/kb/subscriptions/coffee-subscription-store.md"
  - "https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md"
  - "https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md"
  - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md"
  - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md"
sources:
  - "https://docs.medusajs.com/resources/recipes/subscriptions"
  - "https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard"
  - "https://github.com/medusajs/examples/tree/main/subscription"
  - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe"
  - "https://medusajs.com/pricing"
  - "https://apps.shopify.com/subscription-payments"
  - "https://getrecharge.com/pricing/"
  - "https://stripe.com/billing/pricing"
  - "https://docs.stripe.com/billing/subscriptions/pause-payment"
  - "https://docs.stripe.com/billing/subscriptions/prorations"
  - "https://medusajs.com/blog/reorder"
  - "https://docs.reorderjs.com/storefront/cart.md"
  - "https://apps.shopify.com/shopify-subscriptions"
  - "https://medusajs.com/blog/goodchef"
---

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

> 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](https://docs.medusajs.com/resources/recipes/subscriptions) and its [example guide](https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard) show one complete way to do it, with code in the [medusajs/examples repository](https://github.com/medusajs/examples/tree/main/subscription).

In the example, a custom Subscription Module stores each subscription's `status`, `interval` (monthly or yearly), `period`, `next_order_date`, and `expiration_date`. Module links connect each subscription to the cart, customer, and orders. A custom `/store/carts/{id}/subscribe` route completes the cart with `completeCartWorkflow` and creates the subscription in one workflow.

At checkout, the storefront passes `setup_future_usage: "off_session"` to Stripe, so the card is saved to the customer's [account holder](https://docs.medusajs.com/resources/commerce-modules/payment/account-holder) for later charges.

## How subscription renewals run in Medusa

Renewals in the example run from a [scheduled job](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs) that runs daily at midnight. It finds active subscriptions whose `next_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 `next_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

| Feature | Status | How |
| --- | --- | --- |
| Subscription data model and links | Official guide | Custom module plus module links to cart, customer, order |
| Automatic renewal orders | Official guide | Daily scheduled job and renewal workflow |
| Admin subscription pages | Official guide | Admin UI routes |
| Customer view and cancel | Official guide | Custom Store API routes |
| Product options such as size | Native | Product Module options and variants |
| Mixed cart checkout | Custom | Split carts or per-item subscriptions |
| Dunning (failed payment retries) | Custom | The example only logs a failed renewal |
| Pause, skip, swap | Custom | Clear, shift, or change next_order_date and the linked cart |
| Proration | Custom | Calculate in the renewal workflow |

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

[Reorder](https://medusajs.com/blog/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](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) 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.

|  | Medusa | Recharge on Shopify | Stripe Billing |
| --- | --- | --- | --- |
| Where renewals run | Your Medusa app | Recharge | Stripe |
| Subscription fees | None, Medusa Cloud from $29/month with 0% GMV fee | Starter $99/month plus 1.49% + 19¢ per transaction | 0.7% of Billing volume, pay as you go |
| Dunning | Custom | Failed payment recovery included | Smart Retries included |
| Skip, pause, swap | Custom | Customer portal with swap and reschedule | Pause payment collection, prorations |
| Payment providers | Any provider you integrate | Check vendor docs | Stripe 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](https://medusajs.com/blog/goodchef)).

## 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.

## Documentation

- [Subscriptions Recipe](https://docs.medusajs.com/resources/recipes/subscriptions)
- [Subscriptions example guide](https://docs.medusajs.com/resources/recipes/subscriptions/examples/standard)
- [Scheduled Jobs](https://docs.medusajs.com/learn/fundamentals/scheduled-jobs)
- [Account Holder](https://docs.medusajs.com/resources/commerce-modules/payment/account-holder)
- [Create a Payment Module Provider](https://docs.medusajs.com/resources/references/payment/provider)

## Related

- [Coffee subscriptions without Shopify app fees](https://medusajs.com/kb/subscriptions/coffee-subscription-store.md)
- [The true cost of Shopify apps vs owning your stack](https://medusajs.com/kb/build-vs-buy/shopify-app-costs-vs-owning-stack.md)
- [Stripe vs a commerce backend: what Stripe doesn't handle](https://medusajs.com/kb/headless-checkout/stripe-vs-commerce-backend.md)
- [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md)
- [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md)
