All routes require an authenticated Medusa Admin user. Unauthenticated requests return
401.Status values
Final outcome values:
retained, paused, canceled.
Offer decision status values: proposed, accepted, rejected, applied, expired.
Reason category values: price, product_fit, delivery, billing, temporary_pause, switched_competitor, other.
GET /admin/cancellations
Returns the paginated cancellation queue for Admin DataTable views.Query parameters
number
Number of results per page.
number
Zero-based result offset for pagination.
string
Free-text search across subscription reference, customer name, and product title.
string
Field to sort by. Database-backed:
created_at, updated_at, status, final_outcome, reason_category, finalized_at. In-memory: subscription_reference, customer_name, product_title.string
Sort direction. One of
asc or desc.string | string[]
Filter by case status. Accepts a single value or an array.
string | string[]
Filter by final outcome. Accepts a single value or an array.
string | string[]
Filter by churn reason category. Accepts a single value or an array.
string | string[]
Filter by retention offer type. Accepts a single value or an array.
string
Filter to cases for a specific subscription.
string
ISO datetime lower bound for
created_at.string
ISO datetime upper bound for
created_at.Response
object[]
required
Array of cancellation case list items.
number
required
Total matching records.
number
required
Page size used.
number
required
Result offset used.
Response example
Errors
GET /admin/cancellations/:id
Returns the full detail payload for a single cancellation case, including offer history, subscription context, and linked renewal or dunning summaries.Path parameters
string
required
Cancellation case ID.
Response
object
required
Response example
Errors
POST /admin/cancellations/:id/apply-offer
Applies a retention action to an open case. Creates aRetentionOfferEvent, updates the subscription, and closes the case as retained or paused. Returns the refreshed detail payload.
Path parameters
string
required
Cancellation case ID.
Body parameters
string
required
Type of retention offer. One of
pause_offer, discount_offer, or bonus_offer.object
required
Offer-specific configuration. Shape depends on
offer_type — see examples below.string
required
Actor ID of the admin user applying the offer.
string
Optional reason for applying the offer.
Pause offer example
Discount offer example
Bonus offer example
Validation rules:
pause_offer requires pause_cycles or resume_at; percentage discounts cannot exceed 50; discount_value must be positive; duration_cycles must be positive when provided; free_cycle and credit bonus types require value.Errors
POST /admin/cancellations/:id/reason
Updates the churn reason, normalized category, and operator notes for an open case. Returns the refreshed detail payload.Path parameters
string
required
Cancellation case ID.
Body parameters
string
Free-text churn reason.
string
Normalized reason category.
string
Operator notes.
string
Actor ID of the admin user making the update.
string
Reason for the classification change.
Request example
Errors
POST /admin/cancellations/:id/finalize
Finalizes a case ascanceled, updates the subscription lifecycle, computes cancel_effective_at, and clears renewal eligibility. Returns the refreshed detail payload.
Path parameters
string
required
Cancellation case ID.
Body parameters
string
Churn reason for the final cancellation. Required by domain rules; if omitted, the workflow falls back to the existing case reason.
string
Normalized reason category.
string
Operator notes.
string
Actor ID of the admin user finalizing the case.
string
When the cancellation takes effect. One of
immediately or end_of_cycle.Request example