Skip to main content

Related Subscriptions

A single checkout often creates more than one subscription — a paid plan plus a free add-on, or a plan followed moments later by an upsell. Each of those is a subscription in its own right, with its own billing cycle and its own cancellation.

That independence is what makes a zero-amount subscription easy to lose track of. When the paid subscription is cancelled, the free one keeps renewing at $0.00 for as long as the customer exists, quietly producing recurring orders nobody is watching.

The Related subscriptions section on a subscription's detail page shows the whole group, so a free add-on is visible from the subscription it was bought with. Each row opens that subscription's own detail page, where you can cancel it.

note

Grouping is a read-only view. Odus never cancels a related subscription on your behalf; every cancellation is an explicit action you take, on that subscription's own page.

How subscriptions are grouped

Two subscriptions belong to the same group when they are held by the same customer and either of the following is true:

RuleAlways on?What it catches
They share the same setup paymentYesEverything bought in one checkout, including free items
They were created within N minutes of each otherOnly when you set a windowAn upsell, which is a second checkout and therefore a second payment

The window is measured from the subscription you are looking at, in both directions, and is never chained: a subscription 5 minutes after yours is in the group, but one 5 minutes after that is not, unless it also falls inside your own window.

Because the group is worked out when you open the page, changing the window re-groups your existing subscriptions straight away. Nothing is stored, and nothing needs backfilling.

Setting the grouping window

Go to Settings > General and set Subscription grouping window at the bottom of the Dashboard settings section. The value is a whole number of minutes between 0 and 1440 (24 hours).

  • 0 — the default. The time window is off; subscriptions are grouped only when they share a setup payment.
  • Any other value — subscriptions created that many minutes apart are grouped as well.

A few minutes is usually enough to catch a post-purchase upsell flow. A wide window on a customer who buys from you often will start grouping unrelated purchases, so start small.

The same value can be read and written through GET /merchant-configs and POST /merchant-configs/:id as relatedSubscriptionWindowMinutes.

Reading the section

Open any subscription from Subscriptions and scroll to Related subscriptions, at the bottom of the page below Invoices. Each row shows:

  • Subscription — the price and product the member bills on
  • Status — the same status chip used across the Dashboard. Cancelled members stay in the group, dimmed, so the history of the purchase is complete
  • Amount — the recurring charge each billing cycle. A free add-on shows as $0.00
  • Created — how far the member's creation sits from the subscription you are viewing, for example Same time for a bundled item or 7 min later for an upsell

Click any row to open that subscription's own detail page, where you can cancel it, change its price, or read its invoices. The section itself only shows the group — it changes nothing.

If nothing was bought alongside, the section says so. The message reads the same whether or not a grouping window is set — widen or enable the window under Settings → General if you expected a member that was created moments apart.

Through the API

GET /subscriptions/{id}/related returns the same group, along with the windowMinutes the lookup applied so you can tell an empty group from a disabled window:

{
"windowMinutes": 15,
"subscriptions": [
{
"id": "sub_2QC7PqoUeOxQEWscJJt6B3PkvyL",
"status": "active",
"cancelAtPeriodEnd": false,
"createdAt": "2026-03-01T10:00:00.000Z",
"createdAtDeltaSeconds": 0,
"amount": 0,
"currency": "usd",
"priceName": "Free bonus guide",
"productName": "Bonus guide",
"matchedOn": "setup_payment"
}
]
}

matchedOn tells you which rule put the subscription in the group — setup_payment for the exact match, creation_window for the time-based one. Members are returned oldest first, and the subscription you asked about is never one of them.