View Categories

Launching soon on the Shopify App StoreAbout Subscriptions & MembershipsJoin the waitlist

GraphQL API reference: Subscriptions & Memberships

12 min read

The GraphQL operations of SI Subscriptions & Memberships. They use the same address, keys and rules as all our apps: see GraphQL API reference: Rentals & Bookings for how to send a request, and the API overview for keys, limits and errors. The same operations are in REST: REST API reference: Subscriptions & Memberships.

Needs the SI Subscriptions & Memberships app. On a store without it, its operations are refused before anything runs, with errors[].extensions.code: "app_not_installed" and data.app: "subscriptions". Every operation needs a secret key; mutations need Allow changes (write). The Subscriptions app has no API page of its own: make the key in another of our apps on the store (Rentals & Bookings: Settings › API; the other apps: API access). Keys belong to the store, so that key works here.

  • Ids are global: gid://sirentals/SubsSubscription/42, SubsPlan, SubsMembership, SubsTier, SubsQueueItem, SubsLoan, SubsGift, SubsOneOff, SubsStaffRequest. Every id argument also takes the bare number. A subscription also takes Shopify’s contract gid (gid://shopify/SubscriptionContract/…) or the contract’s number.
  • Amounts are decimal strings with a currency. from and to of the reports are days (YYYY-MM-DD) in the store’s time zone.
  • Mutations answer userErrors { field message code data } when a change is refused: invalid, not_allowed, terminal, conflict, min_cycles, one_off_pending, contract_membership, plan_required, disabled, shopify_error and so on. The REST errors table explains each.
curl -s "https://YOUR-API-ADDRESS/graphql/2026-10" -H "Authorization: Bearer sirb_your_secret_key" -H "Content-Type: application/json" \
  -d '{"query": "{ subsSubscriptions(first: 20, filter: {status: [ACTIVE, PAST_DUE]}) { totalCount nodes { id status amount currency nextBillingAt } } }"}'

Subscriptions #

OperationArgumentsWhat it does
subsSubscriptions
query · secret key
returns SubsSubscriptionConnection!
filter: SubsSubscriptionFilterInput
first: Int
after: String
last: Int
before: String
The store’s subscriptions, newest first, by status, customer, plan or a search.
subsSubscription
query · secret key
returns SubsSubscription
id: ID!One subscription by our id, Shopify’s contract gid or the contract’s number, with its lines, delivery, next cycle, changes and billing cycles; null when there is none.
subsPauseSubscription
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!
cycles: Int
Pause an active subscription. cycles (1 to 12) moves the next charge that many cycles on; without it, it stays paused until resumed.
subsResumeSubscription
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!Resume a paused subscription (a next charge date already past moves to now).
subsCancelSubscription
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!
when: SubsCancelTiming = PERIOD_END
reason: String
Cancel at the end of the paid period (PERIOD_END, the default) or now (NOW).
subsSkipCycle
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!Skip the next charge; the cycle after it is billed as usual.
subsBillNow
mutation · secret key
returns SubsBillNowPayload!
id: ID!Charge the next cycle now with the card on file. The answer may still be pending.
subsCreateSubscription
mutation · secret key
returns SubsCreateSubscriptionPayload!
input: SubsCreateSubscriptionInput!Start a subscription for a customer. Made at once when the customer has a card that can be charged; otherwise a request waits for the card (Shopify emails the customer, or you send checkoutUrl). Rental plans are refused (rental_staff).
query Active {
  subsSubscriptions(first: 20, filter: {status: [ACTIVE, PAST_DUE]}) {
    totalCount
    pageInfo { hasNextPage endCursor }
    nodes { id legacyResourceId status kind customerId amount currency nextBillingAt lines { title variantTitle quantity price } }
  }
}
mutation PauseTwoCycles {
  subsPauseSubscription(id: "gid://sirentals/SubsSubscription/1", cycles: 2) {
    subsSubscription { id status nextBillingAt }
    userErrors { field code message }
  }
}

SubsSubscriptionFilterInput

FieldTypeNotes
status[SubsSubscriptionStatus!]
customerIdIDgid://shopify/Customer/… or the number.
planIdIDgid://sirentals/SubsPlan/… or the number.
searchStringA contract or order number (#1001), a customer’s name or email.
updatedSinceStringOnly subscriptions changed at or after this moment (ISO 8601).

SubsCreateSubscriptionInput

FieldTypeNotes
customerIdID!gid://shopify/Customer/… or the number.
sellingPlanIdID!gid://shopify/SellingPlan/… or the number (one of our live plans, not a rental).
variantIdID!gid://shopify/ProductVariant/… or the number (a product of the plan).
quantityInt = 1
firstBillingDateStringYYYY-MM-DD in the store’s time zone, today up to a year ahead (default today).
deliveryAddressJSONShopify’s MailingAddress fields (firstName, address1, city, provinceCode, countryCode, zip, …); default: the customer’s default address.
EnumValues
SubsSubscriptionStatusPENDING
TRIAL
ACTIVE
PAST_DUE
PAUSED
PENDING_CANCEL – Cancels at the end of the paid period (cancelAt).
CANCELLED
EXPIRED
FAILED
SubsCancelTimingPERIOD_END
NOW
TypeFields
SubsSubscription
A customer’s subscription: one Shopify subscription contract and what this app knows about it.
id: ID!, legacyResourceId: Int!, contractId: ID!, status: SubsSubscriptionStatus!, kind: String!, customerId: ID, originOrderId: ID, paymentMethodId: ID, plan: SubsSubscriptionPlan, billing: SubsFrequency!, nextBillingAt: String, cyclesBilled: Int!, maxCycles: Int, trialEndsAt: String, pauseUntil: String, cancelAt: String, cancelReason: String, currency: String, amount: String, lines: [SubsLine!]!, delivery: SubsDelivery, nextCycle: SubsCycle, cycles(first): [SubsCycle!]!, createdAt: String, updatedAt: String, oneOffs: [SubsOneOff!]!, skippedCycle: SubsSkippedCycle, minCycles: SubsMinCycles, prepaid: SubsPrepaid, billingDay: SubsBillingDay, gift: SubsSubscriptionGift
SubsSubscriptionPlanname: String, planId: ID, sellingPlanId: ID
SubsFrequencyinterval: String, count: Int
SubsLineid: ID, productId: ID, variantId: ID, title: String, variantTitle: String, quantity: Int!, price: String, sellingPlanId: ID, oneTime: Boolean!
SubsDeliverytype: String, title: String, price: String, address: JSON
SubsCycleindex: Int!, dueAt: String, status: String!, amount: String, orderId: ID, attempts: Int!, nextRetryAt: String
SubsOneOffid: ID!, cycle: Int!, productId: ID, variantId: ID, title: String, variantTitle: String, quantity: Int!, price: String
SubsSkippedCycleindex: Int!, dueAt: String
SubsMinCyclesmin: Int!, billed: Int!, left: Int!
SubsPrepaid
A prepaid subscription: one charge pays for several deliveries.
deliveries: Int!, perDelivery: String, ends: Boolean!
SubsBillingDay
A set billing day: WEEKDAY (day 1–7, Monday = 1), MONTHDAY (day 1–31) or YEARDAY (day and month).
type: String!, day: Int!, month: Int, label: String
SubsSubscriptionGiftid: ID!, status: SubsGiftStatus!, sendOn: String, sentAt: String, renews: Boolean!, endsAt: String, recipientName: String
SubsSubscriptionPayloadsubsSubscription: SubsSubscription, userErrors: [RentalUserError!]!
SubsBillNowPayloadsubsSubscription: SubsSubscription, result: SubsBillNowResult, userErrors: [RentalUserError!]!
SubsBillNowResultstate: String!, code: String, message: String, cycle: SubsBillNowCycle, attempt: SubsBillNowAttempt
SubsBillNowCycleindex: Int, status: String, dueAt: String
SubsBillNowAttemptstate: String, try: Int, errorCode: String
SubsCreateSubscriptionPayloadsubsSubscription: SubsSubscription, request: SubsStaffRequest, checkoutUrl: String, emailSent: Boolean!, userErrors: [RentalUserError!]!
SubsStaffRequestid: ID!, status: String!, customerId: ID, sellingPlanId: ID, variantId: ID, quantity: Int!, firstBillingDate: String, expiresAt: String, createdAt: String
EnumValues
SubsGiftStatusSCHEDULED
SENT
ENDED
CANCELLED

Self-service changes #

The changes customers make in their account, made for them: other plans and products, skipped charges and one-off items. subsSubscriptionOptions lists what a subscription can change to.

OperationArgumentsWhat it does
subsSubscriptionOptions
query · secret key
returns SubsEditOptions
id: ID!
lineId: ID
What a subscription can change to: the other plans (frequencies), the products to swap to and the one-off items.
subsUnskipCycle
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!Bring back a skipped next charge.
subsChangePlan
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!
sellingPlanId: ID!
lineId: ID
Move a line to another plan (frequency); the price and the next charge date follow it.
subsSwapProduct
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!
variantId: ID!
lineId: ID
Swap a line’s variant for another one the plan allows, priced by the plan.
subsAddOneOff
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!
variantId: ID!
quantity: Int = 1
Add an item to the next order only (quantity 1 to 10; up to 5 items an order).
subsRemoveOneOff
mutation · secret key
returns SubsSubscriptionPayload!
id: ID!
oneOffId: ID!
Take an added item off the next order.
mutation AddToNextBox {
  subsAddOneOff(id: "1", variantId: "gid://shopify/ProductVariant/49280000003", quantity: 1) {
    subsSubscription { id oneOffs { id title quantity cycle } }
    userErrors { code message }          # not_allowed when the order already has 5 added items
  }
}
TypeFields
SubsEditOptionslineId: ID, plans: [SubsPlanOption!]!, variants: [SubsVariantOption!]!, oneOffs: [SubsOneOffProduct!]!
SubsPlanOptionsellingPlanId: ID!, name: String!, interval: String!, count: Int!, price: String, perMonth: String, current: Boolean!
SubsVariantOptionvariantId: ID!, productTitle: String, title: String, price: String, current: Boolean!
SubsOneOffProductproductId: ID!, title: String, variants: [SubsOneOffVariant!]!
SubsOneOffVariantvariantId: ID!, title: String, price: String

Plans #

OperationArgumentsWhat it does
subsPlans
query · secret key
returns [SubsPlan!]!
status: SubsPlanStatusFilter = ACTIVE
kind: String
The plans (subscribe and save, memberships, rentals), in your order. Active ones unless status says otherwise.
subsPlan
query · secret key
returns SubsPlan
id: ID!One plan, or null.
EnumValues
SubsPlanStatusFilterACTIVE
ARCHIVED
ALL
TypeFields
SubsPlan
A plan the merchant sells (a selling plan group in Shopify).
id: ID!, legacyResourceId: Int!, name: String!, kind: String!, status: String!, position: Int!, description: String, frequencies: [SubsFrequency!]!, billing: SubsFrequency!, pricing: SubsPricing!, trialDays: Int!, signupFee: String, minCycles: Int, maxCycles: Int, subscriptionOnly: Boolean!, sellingPlans: [SubsSellingPlan!]!, createdAt: String, updatedAt: String, prepaidDeliveries: Int, prepaidRenews: Boolean!, billingDay: SubsBillingDay, gifting: Boolean!
SubsPricingtype: String!, value: String
SubsSellingPlanid: ID, legacyResourceId: Int, name: String!, interval: String, count: Int!

Memberships and store credit #

OperationArgumentsWhat it does
subsMemberships
query · secret key
returns SubsMembershipConnection!
filter: SubsMembershipFilterInput
first: Int
after: String
last: Int
before: String
Memberships, newest first: open ones unless filter.status says otherwise.
subsMembership
query · secret key
returns SubsMembership
id: ID!One membership with the member’s store credit balance, or null.
subsCreateMembership
mutation · secret key
returns SubsMembershipPayload!
input: SubsCreateMembershipInput!Make a customer a member of a tier now, until endsAt or with no end (source API).
subsEndMembership
mutation · secret key
returns SubsMembershipPayload!
id: ID!
reason: String
End a membership made by an order, your team or the API, now. A subscription’s membership ends with its subscription.
subsAdjustCredit
mutation · secret key
returns SubsAdjustCreditPayload!
id: ID!
amount: String!
note: String
expiresAt: String
requestKey: String
Add store credit (a positive amount) or take it back (negative), recorded on the membership. The same requestKey returns the same entry, so a retry adds nothing.
subsTiers
query · secret key
returns [SubsTier!]!
status: SubsTierStatusFilter = ACTIVEThe membership tiers, highest rank first.
subsTier
query · secret key
returns SubsTier
id: ID!One tier, or null.
mutation Credit {
  subsAdjustCredit(id: "gid://sirentals/SubsMembership/1", amount: "10.00", note: "Sorry about the late box", requestKey: "ticket-4821") {
    entry { amount kind }
    credit { balance currency }
    userErrors { field code message }
  }
}

SubsMembershipFilterInput

FieldTypeNotes
status[SubsMembershipStatus!]Default: ACTIVE, GRACE and SUSPENDED (every open membership).
customerIdIDgid://shopify/Customer/… or the number.
tierIdIDgid://sirentals/SubsTier/… or the number.
sourceStringcontract, order, staff or api.

SubsCreateMembershipInput

FieldTypeNotes
customerIdID!gid://shopify/Customer/… or the number.
tierIdID!gid://sirentals/SubsTier/… or the number.
endsAtStringWhen it ends (ISO 8601; a bare date = the end of that day in the store’s time zone). None: no end.
EnumValues
SubsMembershipStatusACTIVE
GRACE – Payment is overdue: benefits continue until graceUntil.
SUSPENDED – Benefits are off (the subscription is paused, or grace ran out).
ENDED
SubsTierStatusFilterACTIVE
DELETED
ALL
TypeFields
SubsMembership
A customer’s membership of a tier: started by a membership subscription, a one-time product, staff or the API.
id: ID!, legacyResourceId: Int!, status: SubsMembershipStatus!, statusReason: String, source: String!, tier: SubsMembershipTier, customerId: ID, subscriptionId: ID, contractId: ID, sourceOrderId: ID, startsAt: String, endsAt: String, graceUntil: String, endedAt: String, benefits: Boolean!, credit: SubsMembershipCredit!, queue: SubsMembershipQueue!, createdAt: String
SubsMembershipTierid: ID!, name: String!, handle: String
SubsMembershipCreditperPeriod: String, currency: String, balance: String
SubsMembershipQueueslots: Int!, out: Int!
SubsMembershipPayloadsubsMembership: SubsMembership, userErrors: [RentalUserError!]!
SubsAdjustCreditPayloadsubsMembership: SubsMembership, entry: SubsCreditEntry, credit: SubsCreditSummary, userErrors: [RentalUserError!]!
SubsCreditEntrylegacyResourceId: Int!, kind: String!, amount: String!, currency: String!, state: String!, cycle: Int, expiresAt: String, transactionId: ID, balanceAfter: String, note: String, createdAt: String
SubsCreditSummarybalance: String, currency: String!, perPeriod: String, lastGrant: SubsCreditGrant, failed: Int!
SubsCreditGrantamount: String!, at: String, expiresAt: String
SubsTier
A membership tier: what members get.
id: ID!, legacyResourceId: Int!, name: String!, handle: String!, status: String!, position: Int!, slots: Int!, swapsPerPeriod: Int, credit: SubsTierCredit!, discount: SubsTierDiscount, shipping: SubsTierShipping, memberTag: String!, access: SubsTierAccess!, oneTime: JSON, priced: Boolean!, members: SubsTierMembers!, createdAt: String, updatedAt: String
SubsTierCreditamount: String, expiryDays: Int, rolloverCap: String
SubsTierDiscounttype: String!, value: String, scope: String, collections: [ID!], tags: [String!]
SubsTierShippingtype: String!, value: String
SubsTierAccessproducts: [ID!]!, collections: [ID!]!, pages: [String!]!
SubsTierMembersactive: Int!, grace: Int!, suspended: Int!

Rental queue and loans #

OperationArgumentsWhat it does
subsQueue
query · secret key
returns SubsQueue!
customerId: ID!A member’s rental queue in send order, with what they may borrow now.
subsQueueItem
query · secret key
returns SubsQueueItem
id: ID!One queue item, live or removed, or null.
subsAddToQueue
mutation · secret key
returns SubsQueueItemPayload!
input: SubsAddToQueueInput!Add a product (any option) or one option to a member’s queue. Already queued: that item.
subsRemoveFromQueue
mutation · secret key
returns SubsQueuePayload!
id: ID!Take an item out of its queue. Answers the queue.
subsMoveQueueItem
mutation · secret key
returns SubsQueuePayload!
id: ID!
position: Int!
Move an item to a position (1 = next; a starred item stays among the starred ones). Answers the queue.
subsSendQueueItem
mutation · secret key
returns SubsLoanPayload!
id: ID!
input: SubsSendInput
Send one queued item now. The loan is PICKING until its loan order is fulfilled, or OUT with handover (handed over in person).
subsSendNext
mutation · secret key
returns SubsLoanPayload!
customerId: ID!
handover: Boolean
Send the member’s next item that is in stock, as the pick list would.
subsLoans
query · secret key
returns SubsLoanConnection!
filter: SubsLoanFilterInput
first: Int
after: String
last: Int
before: String
The rental queue’s loans, newest first.
subsLoan
query · secret key
returns SubsLoan
id: ID!One loan, or null.
subsReturnLoan
mutation · secret key
returns SubsLoanPayload!
id: ID!
at: String
A loan came back (at: ISO 8601, default now).
subsReturnLoans
mutation · secret key
returns SubsReturnLoansPayload!
input: SubsReturnLoansInput!Several loans back at once, by loan ids, serial numbers (as scanned) or the loan order’s name. One result each.
subsMarkLoanLost
mutation · secret key
returns SubsLoanPayload!
id: ID!
amount: String
note: String
A loan that won’t come back. The member’s slot is free again; the replacement invoice follows your queue settings, and amount overrides it (0 = no invoice).
query Queue {
  subsQueue(customerId: "gid://shopify/Customer/7001234") {
    slots out free canSend reason
    items { id position starred productTitle variantTitle }
  }
}

SubsAddToQueueInput

FieldTypeNotes
customerIdID!gid://shopify/Customer/… or the number.
productIdID!gid://shopify/Product/… or the number.
variantIdIDgid://shopify/ProductVariant/… or the number. None: any option of the product.
starredBooleanStarred items go out first.

SubsSendInput

FieldTypeNotes
variantIdIDThe option to send for a product-level item (gid://shopify/ProductVariant/… or the number).
serialStringThe unit’s serial number (with the rentals app).
handoverBooleanHanded over in person: the loan is OUT at once.

SubsLoanFilterInput

FieldTypeNotes
statusSubsLoanStatusFilterDefault: ALL.
customerIdIDgid://shopify/Customer/… or the number.
productIdIDgid://shopify/Product/… or the number.
membershipIdIDgid://sirentals/SubsMembership/… or the number.

SubsReturnLoansInput

FieldTypeNotes
loanIds[ID!]gid://sirentals/SubsLoan/… or the numbers (at most 500).
serials[String!]Serial numbers, as scanned.
orderNameStringThe loan order’s name, for example #1042.
EnumValues
SubsLoanStatusFilterOPEN – PICKING and OUT.
CLOSED – RETURNED, LOST and CANCELLED.
ALL
PICKING
OUT
RETURNED
LOST
CANCELLED
TypeFields
SubsQueue
A member’s rental queue and what they may borrow now.
customerId: ID!, slots: Int!, out: Int!, free: Int!, canSend: Boolean!, reason: String, items: [SubsQueueItem!]!
SubsQueueItemid: ID!, legacyResourceId: Int!, position: Int!, starred: Boolean!, customerId: ID!, productId: ID!, productTitle: String, variantId: ID, variantTitle: String, membershipId: ID, mode: String, addedAt: String, removedAt: String, removedReason: String
SubsQueueItemPayloadsubsQueueItem: SubsQueueItem, userErrors: [RentalUserError!]!
SubsQueuePayloadsubsQueue: SubsQueue, userErrors: [RentalUserError!]!
SubsLoanPayloadsubsLoan: SubsLoan, userErrors: [RentalUserError!]!
SubsLoan
One item borrowed from a member’s rental queue.
id: ID!, legacyResourceId: Int!, status: SubsLoanStatus!, statusReason: String, mode: String!, customerId: ID, membershipId: ID, queueItemId: ID, productId: ID!, productTitle: String, variantId: ID!, variantTitle: String, sku: String, serial: String, bookingId: ID, order: SubsLoanOrder, invoice: SubsLoanInvoice, sentAt: String, dueBackAt: String, returnedAt: String, lostAt: String, cancelledAt: String, createdAt: String
SubsLoanOrderstate: String!, id: ID, name: String, error: String
SubsLoanInvoicestate: String!, draftOrderId: ID, name: String, url: String, amount: String, currency: String, sentAt: String, error: String
SubsReturnLoansPayloadresults: [SubsReturnResult!]!, userErrors: [RentalUserError!]!
SubsReturnResult
One loan or serial of subsReturnLoans.
loanId: ID, serial: String, ok: Boolean!, code: String, message: String, loan: SubsLoan
EnumValues
SubsLoanStatusPICKING – Being picked: its loan order is not fulfilled yet.
OUT
RETURNED
LOST
CANCELLED – Cancelled before it went out (the item went back to the queue).

Gift subscriptions #

OperationArgumentsWhat it does
subsGifts
query · secret key
returns SubsGiftConnection!
filter: SubsGiftFilterInput
first: Int
after: String
last: Int
before: String
Gift subscriptions, newest first.
subsGift
query · secret key
returns SubsGift
id: ID!One gift subscription with its recipient, or null.
subsGiftSetRenewal
mutation · secret key
returns SubsGiftPayload!
id: ID!
renews: Boolean!
Keep a gift going after its prepaid deliveries (renews: true: the giver is charged from then on) or let it end after them (false).

SubsGiftFilterInput

FieldTypeNotes
status[SubsGiftStatus!]
subscriptionIdIDgid://sirentals/SubsSubscription/… or its id.
TypeFields
SubsGiftid: ID!, legacyResourceId: Int!, subscriptionId: ID!, contractId: String, status: SubsGiftStatus!, sendOn: String, sentAt: String, prepaidDeliveries: Int!, renews: Boolean!, endsAt: String, recipient: SubsGiftRecipient, createdAt: String
SubsGiftRecipientname: String, email: String, message: String
SubsGiftPayloadsubsGift: SubsGift, userErrors: [RentalUserError!]!

Analytics and the cancel flow report #

OperationArgumentsWhat it does
subsAnalytics
query · secret key
returns SubsAnalytics!
from: String
to: String
Analytics for a range of days (default: the last 30, at most 366): recurring revenue per currency, active, new and ended subscriptions, churn, failed payment recovery, store credit owed, the rental queue, per day and by plan.
subsRetentionReport
query · secret key
returns SubsRetentionReport!
from: String
to: String
The cancel flow’s report for a range of days (default: the last 30, at most 366): why customers cancelled and which offers kept them.
query Last30Days {
  subsAnalytics { range { from to } tiles { active new churned churnRate mrr { currency amount } } }
  subsRetentionReport { totals { started cancelled saved left } reasons { label cancelled saved } }
}
TypeFields
SubsAnalyticsrange: SubsAnalyticsRange!, tiles: SubsAnalyticsTiles!, days: [SubsAnalyticsDay!]!, byPlan: [SubsAnalyticsPlan!]!, computedAt: String
SubsAnalyticsRangefrom: String!, to: String!, days: Int!, timezone: String!
SubsAnalyticsTilesmrr: [SubsMoney!]!, mrrStart: [SubsMoney!]!, active: Int!, paused: Int!, new: Int!, churned: Int!, churnRate: Float, dunning: SubsAnalyticsDunning!, credit: [SubsMoney!]!, queue: SubsAnalyticsQueue!, rentals: SubsAnalyticsRentals!
SubsMoneycurrency: String!, amount: String!
SubsAnalyticsDunning
Failed payments of the 30 days up to the day: recovered later, lost (cancelled, waived or skipped), rate in percent.
failed: Int!, recovered: Int!, lost: Int!, rate: Float
SubsAnalyticsQueueout: Int!, overdue: Int!, returned: Int!, medianDaysOut: Float
SubsAnalyticsRentalsactive: Int!, overdue: Int!
SubsAnalyticsDayday: String!, active: Int!, paused: Int!, new: Int!, churned: Int!, mrr: [SubsMoney!]!, dunning: SubsAnalyticsDunning!, credit: [SubsMoney!]!, queue: SubsAnalyticsQueue!, rentals: SubsAnalyticsRentals!
SubsAnalyticsPlanplanId: ID, legacyResourceId: Int, name: String, active: Int!
SubsRetentionReportfrom: String!, to: String!, totals: SubsRetentionCounts!, reasons: [SubsRetentionReason!]!, offers: [SubsRetentionOffer!]!, notes: [SubsRetentionNote!]!
SubsRetentionCountsstarted: Int!, cancelled: Int!, saved: Int!, left: Int!
SubsRetentionReasonkey: String!, label: String!, started: Int!, cancelled: Int!, saved: Int!, left: Int!
SubsRetentionOffertype: String!, label: String!, shown: Int!, accepted: Int!, rate: Float
SubsRetentionNoteat: String!, reason: String!, note: String!