The activity log endpoints give you a tamper-evident audit trail for all subscription lifecycle events. You can query the global log for DataTable views, fetch the full state-diff payload for a single event, or retrieve the ordered timeline scoped to one subscription. All routes are read-only, require an authenticated Medusa Admin user, and default to created_at desc ordering.
All routes require an authenticated Medusa Admin user. Unauthenticated requests return 401.
Actor type values
Value Meaning userMedusa Admin user systemInternal system action schedulerScheduled job
Event type groups
Events are namespaced by domain: subscription.*, renewal.*, dunning.*, cancellation.*.
GET /admin/subscription-logs
Returns the paginated global activity log for Admin DataTable views.
Query parameters
Number of results per page.
Zero-based result offset for pagination.
Field to sort by. Database-backed: created_at, event_type, actor_type. In-memory: subscription_reference, customer_name, reason.
Sort direction. One of asc or desc. Defaults to desc.
Filter to events for a specific subscription.
Filter to events for a specific customer.
Filter by event type. Accepts a single value or an array.
Filter by actor type. Accepts a single value or an array.
ISO datetime lower bound for created_at.
ISO datetime upper bound for created_at.
Response
Array of activity log list items. ID of the linked subscription.
Namespaced event type (e.g. subscription.paused).
Type of actor that triggered the event.
Raw actor ID, or null for system/scheduler actors.
Enriched actor summary with type, id, email, name, and display.
Subscription summary with reference, customer name, product info, and variant title.
Reason recorded with the event, or null.
Comma-separated list of changed field names.
{
"subscription_logs" : [
{
"id" : "slog_123" ,
"subscription_id" : "sub_123" ,
"event_type" : "subscription.paused" ,
"actor_type" : "user" ,
"actor_id" : "user_123" ,
"actor" : {
"type" : "user" ,
"id" : "user_123" ,
"email" : "admin@example.com" ,
"name" : "Admin User" ,
"display" : "admin@example.com"
},
"subscription" : {
"subscription_id" : "sub_123" ,
"reference" : "SUB-001" ,
"customer_id" : "cus_123" ,
"customer_name" : "Jane Doe" ,
"product_title" : "Coffee Subscription" ,
"variant_title" : "1 kg"
},
"reason" : "customer requested pause" ,
"change_summary" : "status, paused_at" ,
"created_at" : "2026-04-15T10:00:00.000Z"
}
],
"count" : 1 ,
"limit" : 20 ,
"offset" : 0
}
Errors
Code Error Meaning 400invalid_dataInvalid query parameter shape or unsupported sort field
GET /admin/subscription-logs/:id
Returns the full detail payload for a single activity log event, including the previous state, new state, and a field-level diff.
Path parameters
Response
Returns a subscription_log object with all list fields plus:
Show additional detail fields
State snapshot before the event.
State snapshot after the event.
Field-level diff. Each entry has field, before, and after.
Event-specific metadata (e.g. linked renewal_cycle_id or order_id).
{
"subscription_log" : {
"id" : "slog_123" ,
"subscription_id" : "sub_123" ,
"event_type" : "renewal.succeeded" ,
"actor_type" : "scheduler" ,
"actor_id" : null ,
"actor" : {
"type" : "scheduler" ,
"id" : null ,
"email" : null ,
"name" : null ,
"display" : null
},
"subscription" : {
"subscription_id" : "sub_123" ,
"reference" : "SUB-001" ,
"customer_id" : "cus_123" ,
"customer_name" : "Jane Doe" ,
"product_title" : "Coffee Subscription" ,
"variant_title" : "1 kg"
},
"reason" : null ,
"change_summary" : "status, processed_at" ,
"created_at" : "2026-04-15T10:03:00.000Z" ,
"previous_state" : {
"status" : "scheduled"
},
"new_state" : {
"status" : "succeeded"
},
"changed_fields" : [
{
"field" : "status" ,
"before" : "scheduled" ,
"after" : "succeeded"
}
],
"metadata" : {
"renewal_cycle_id" : "re_123" ,
"order_id" : "order_123"
}
}
}
Errors
Code Error Meaning 404not_foundActivity log record does not exist
GET /admin/subscriptions/:id/logs
Returns the paginated activity log timeline scoped to a single subscription. Accepts the same query parameters as the global list and applies subscription_id = :id automatically.
Path parameters
Query parameters
Same as GET /admin/subscription-logs. Default sort is created_at desc.
Response
Same shape as GET /admin/subscription-logs.
{
"subscription_logs" : [
{
"id" : "slog_123" ,
"subscription_id" : "sub_123" ,
"event_type" : "subscription.paused" ,
"actor_type" : "user" ,
"actor_id" : "user_123" ,
"actor" : {
"type" : "user" ,
"id" : "user_123" ,
"email" : "admin@example.com" ,
"name" : "Admin User" ,
"display" : "admin@example.com"
},
"subscription" : {
"subscription_id" : "sub_123" ,
"reference" : "SUB-001" ,
"customer_id" : "cus_123" ,
"customer_name" : "Jane Doe" ,
"product_title" : "Coffee Subscription" ,
"variant_title" : "1 kg"
},
"reason" : "customer requested pause" ,
"change_summary" : "status, paused_at" ,
"created_at" : "2026-04-15T10:00:00.000Z"
}
],
"count" : 1 ,
"limit" : 20 ,
"offset" : 0
}