What Can an AI Support Agent Do in Skio? Skip, Pause and Cancel Through Skio's GraphQL API (2026)
Skio's GraphQL API lets an AI support agent find a subscriber's subscriptions from their email in one query and call 26 documented mutations, including skipSubscription, pauseSubscription and cancelSubscription, with the store's key sent in an authorization header as the word API followed by the key. Recharge announced on 27 April 2026 that Skio had joined it and said both platforms would keep operating as they had. On 28 September 2026 Skio's endpoint, key format and help-desk integrations were still Skio's own. This page maps each subscription ticket to the Skio call that answers it, credits what Gorgias AI Agent and Skio's own help-desk apps already do, explains why a failed Skio call looks like a success, and shows what happened when we ran a Skio agent on a test ticket.
Key takeaways
- Skio's GraphQL API lets an AI agent find subscriptions by email and skip, pause, unpause or cancel them, using a key sent in the authorization header as API followed by the key.
- Skio's pauseSubscription input has no end date or resume date field, so a pause made through the API needs a second call, or a person, to end it.
- Gorgias AI Agent can cancel or skip a Skio subscription through ready-made Actions, but only when the shopper has a single subscription and only before the order is created.
- Skio answers a bad key with HTTP 200 and an errors array, and our Macha test tool reported that response as a successful call, so the agent's instructions must treat errors as failure.
- Recharge said on 27 April 2026 that nothing was changing for Skio merchants, and Skio's GraphQL endpoint still answered at graphql.skio.com on 28 September 2026.
Which Skio support jobs can an AI agent do through the API?
We read every support-relevant operation in Skio's API reference on 28 September 2026. Every call is a POST to https://graphql.skio.com/v1/graphql. The key goes in a header named authorization, which Skio calls case sensitive, and the value is API followed by the key, not Bearer. The reference lists 22 queries and 26 mutations. These are the ones a support team touches:
| Support job | Skio query or mutation | Read or write | Who can do it today |
|---|---|---|---|
| Find a subscriber's subscriptions by email | Subscriptions query filtered on StorefrontUser.emailLower | Read | Skio's Gorgias sidebar; Skio's Zendesk app (shows the subscriber when the email matches); Klaviyo Helpdesk; an AI agent with a custom API tool |
| Skip the next order | skipSubscription (returns the new nextBillingDate) | Write | Gorgias AI Agent (single subscription only); Skio's Gorgias sidebar and macro; Klaviyo Helpdesk; an AI agent with a Write tool |
| Pause | pauseSubscription (no end date field) | Write | Skio admin; the customer portal, if the store turns pause on; an AI agent with a Write tool |
| Unpause | unpauseSubscription | Write | Skio admin; the customer portal; an AI agent with a Write tool |
| Cancel | cancelSubscription (flags for permanent cancel and notification; no reason field) | Write | Gorgias AI Agent (single subscription only); Skio's Gorgias sidebar and macros; Klaviyo Helpdesk; Skio admin |
| Reactivate a canceled subscription | reactivateSubscription (needs a new billing date) | Write | Skio admin and portal; an AI agent, except for permanently canceled subscriptions |
| Move the next billing date | updateNextBillingDate | Write | Skio admin; an AI agent |
| Change frequency | subscriptionEditInterval | Write | Skio admin; an AI agent |
| Swap a product | swapSubscriptionProductVariants (pricing: SAME, NEW_VARIANT_PRICE or CUSTOM) | Write | Skio admin; a person first |
| Change the shipping address | updateSubscriptionShippingAddress | Write | Skio admin; an AI agent |
| Send the next order now | shipNow | Write | Skio's Gorgias sidebar ("Get now"); Klaviyo Helpdesk ("Send now") |
| Apply a discount code | applyDiscountCode | Write | Skio's Gorgias sidebar; a person |
Every skip, pause, cancel, date, swap and address request has a mutation. That makes Skio one of the fuller APIs in our comparison of 16 subscription apps. Recharge's API has no pause endpoint at all; Skio's pause and unpause sit next to skip and cancel under the same key. Three details matter more than the list: pause takes no length, cancel takes no reason, and a failed call comes back as HTTP 200.
What do subscribers ask about Skio?
Skio tickets come in five shapes, and the subscription record answers most of them before anyone writes anything:
- "Skip my next box." The most automatable request. The agent finds the subscription, checks the next billing date and calls
skipSubscription, which returns the new date to quote back. - "Pause my subscription while I'm away." Pause through the API is open-ended (see below), so "pause until November" is really a skip, or a date move with
updateNextBillingDate. - "Cancel." Every mutation needed exists. Whether an agent should call it is the brand's decision, and the section on people argues for a person.
- "Switch me to decaf" or "change my address." Documented swaps and address edits, and the place where a wrong subscription ID costs real money.
- "My subscription disappeared from my portal." Skio's help center explains this one. A subscription that was merged into another, canceled after dunning ran out of retries, or canceled because its original Shopify order was canceled becomes permanently canceled, and permanently canceled subscriptions are filtered out of the customer portal and can't be reactivated. The API still returns them.
statusContextreadsCHURNEDorPERMANENTLY_CANCELLED, so the agent can tell a shopper what happened instead of sending them back to a portal that won't show it.
Skio's help center defines the subscription statuses as Active, Failed (in dunning, retrying payment), Paused and Canceled, and its analytics glossary counts a fifth, Under Review, as active. A Failed subscription is a billing ticket, not a skip ticket, and an agent that skips it has fixed nothing.
How does the lookup work, from email to subscription ID?
Skio's data model mirrors Shopify's: a Skio StorefrontUser is a Shopify customer, a Subscription is a Shopify subscription contract and each has a platformId holding the Shopify GID. The lookup is one GraphQL query, because a GraphQL filter can reach through the relationship:
query ($email: String!) {
Subscriptions(
where: {StorefrontUser: {emailLower: {_eq: $email}}}
order_by: {createdAt: desc}
limit: 20
) {
id status statusContext nextBillingDate cancelledAt
SubscriptionLines(where: {removedAt: {_is_null: true}}) {
quantity
ProductVariant { title Product { title } }
}
}
}
That's Skio's own example from the reference, with two changes. Skio's example filters on email; we filter on emailLower, a field the StorefrontUser type also carries, and lowercase the requester's address first, because a customer who types their email with a capital letter shouldn't get "no subscription found." And the removedAt filter, also from Skio's example, drops products that were taken off the subscription.
Two limits shape the query. Skio caps queries at four levels of nesting and 100 nodes per response, and the query above uses all four levels (subscriptions, lines, variant, product). A shopper with dozens of subscriptions needs the limit. The rate limit is 2,000 requests a minute per key, about 33 a second, which a support workload of two or three calls per ticket won't approach.
Skio also has a REST API, added for bulk export. It's read-only: four GET endpoints (/orders, /products, /storefront-users, /subscriptions), with GET /storefront-users?email= followed by GET /subscriptions?storefrontUserId= as a two-call lookup. It uses the same authorization: API <key> header. Every write is GraphQL only.
What does Recharge's acquisition of Skio change for the API?
Recharge's post, Recharge welcomes Skio, is dated 27 April 2026 in the page's metadata and was last updated on 30 April. It says the two companies together power more than 20,000 brands and $20B in annual GMV, and it tells merchants on both platforms that "nothing is changing today. Both Recharge and Skio will continue to operate as they have, and your existing team remains your point of contact." It says a combined roadmap is coming "in the months ahead" and gives no dates.
Here's what we could check on 28 September 2026, five months later:
- The endpoint and key format are unchanged.
graphql.skio.com/v1/graphqlanswered our requests, and Skio's Using the Skio API article, updated 27 April 2026, still says to generate the key in Skio's dashboard under API & Integrations > API and send it with theAPIprefix. - The integrations are still Skio's. Gorgias's Skio Actions use a Skio API key, not a Recharge token, and Skio's help center still documents its own Gorgias, Zendesk and Klaviyo Helpdesk integrations.
- The listing changed its name. The Shopify App Store now lists the app as "Skio, a Recharge Company," with 5.0 stars from 241 reviews.
So a Skio merchant's API tools built today use Skio's API and Skio's key. Neither company has published anything about merging the two APIs, and we won't guess at it. What's worth doing is keeping a Skio build easy to replace: a few narrow tools with the endpoint in one place, rather than logic spread across many.
What do Gorgias, Skio's help-desk apps and Klaviyo Helpdesk already do, and where does an AI agent add something?
Gorgias AI Agent comes first, because for a Gorgias team it already handles the two most common requests. Gorgias's AI Agent Actions for Skio, updated 22 January 2026, offer "Cancel subscription in Skio" and "Skip next subscription shipment in Skio," set up with a Skio API key. Two limits apply: AI Agent only acts when the shopper has a single subscription, handing multiple subscriptions to a person, and it can skip only "before the order is created." Pause isn't one of the Skio Actions.
Skio also builds its own help-desk integrations. Its help center documents three:
- Gorgias, rebuilt as "Gorgias 2.0" and updated 3 February 2026. The sidebar shows the subscriber's active, canceled, failed and paused subscription counts, then a block per subscription with its ID, next billing date, status, cycles completed, delivery interval, product and price. Each block has six actions: view in Skio, apply discount code, cancel, get now, skip next order and update payment method. Of its four macro actions, three handle cancel and skip on the closest upcoming or most recently billed subscription (the fourth updates the payment method), which is how Skio avoids acting on the wrong one when a shopper has several.
- Zendesk, a private app you download from Skio's dashboard and upload in Zendesk's Admin Center with a token from Skio's integrations page. Skio's doc says it populates subscriber information when the ticket email matches a subscriber. It describes no actions.
- Klaviyo Helpdesk, published 24 February 2026, where agents can view subscriptions and send now, skip or cancel. Skio warns that some actions, such as editing the subscription, may be unavailable when the next charge is within 24 hours.
Gladly adds a fourth from its side: a Skio app for Gladly, with an installation guide published 20 September 2026 in Gladly's help center.
So a Gorgias team on Skio already has a person-driven sidebar with six actions and an AI agent that skips and cancels single subscriptions. A Klaviyo Helpdesk team has send now, skip and cancel. A Zendesk team has a read-only view.
An AI agent built on the API adds three things:
- Pause, unpause and date moves. None of the three integrations or Gorgias's Actions pause a subscription. The API does.
- Shoppers with more than one subscription. Gorgias AI Agent hands these off by design. An agent that lists each subscription by product and next billing date and asks which one can finish the ticket on the second message.
- Acting on Zendesk and the other desks. Skio's Zendesk app shows the record to a person. On Zendesk, Freshdesk, Front or HubSpot, the only way the ticket gets a skip without someone opening Skio is a tool that calls the API.
Which Skio actions should stay with a person?
We'd keep these with a person, even though Skio's API documents all of them:
- Cancellation. Skio sells a multi-step cancel flow builder whose job, in Skio's listing copy, is to "turn cancellations into pauses, swaps, and saves." The incentive is plain. Skio earns 1% + 20¢ per subscription order on its Scale plan, so a save is revenue for Skio as well as the brand.
cancelSubscriptionhas aninvokeSubscriptionCancelJourneysflag and acancelSessionIdfield but no field for the reason, so an agent that cancels directly skips the flow the brand built and records no reason. An agent can ask for the reason and hand off with it in a note. - Permanent cancellation.
permanentlyCancel: truemakes the subscription impossible to reactivate. No support ticket needs that. - Swaps with a price.
swapSubscriptionProductVariantstakes apricingOption;CUSTOMwithnewCustomPricesets any price you pass. A wrong ID or price here charges the customer the wrong amount on every renewal. - Payment.
subscriptionUpdatePaymentMethodswitches to a payment method Skio already has; it can't take a new card. For a failed payment, the Gorgias sidebar's "update payment method" sends Shopify's email instead.
Setting up Skio tools in Macha
Skio has no built-in Macha connector. It connects through a custom API tool that Macha's team sets up during onboarding, with the header name authorization and the value API <key>. Custom tools are included on every plan. Skio's pricing page lists "Native Integrations + Webhooks + API" on its Scale plan, $599 a month or $499 a month billed annually, and Scale is the only plan with a listed price (Enterprise is custom), so every Skio merchant has API access. Skio's help article says there's no sandbox, so every call, including a test, runs against the live store.
A GraphQL tool is different from a REST one in one way that matters for Macha. Every Skio call goes to the same URL, so nothing needs substituting in the path, and the query and its variables live in the tool's body template. Macha doesn't fill URL placeholders when a tool has a body template, which is why REST builds with an ID in the path move that ID into a header parameter. With GraphQL the problem doesn't arise: the subscription ID is a GraphQL variable in the body. We checked this before pointing anything at Skio. A temporary copy of the skip tool aimed at httpbin.org echoed back the body with the test subscription ID in variables.id and the header Authorization: API placeholder-not-a-real-key, and we deleted it afterward.
We built three tools: "Find subscriptions by email" (Read), "Skip next order" (Write) and "Pause subscription" (Write). In our 28 September dashboard tests, a custom Write tool ran without a confirmation card, so the safety lives in the agent's instructions: which subscription, which action, and when to hand off.
The pause tool needs a warning of its own. Skio's pause feature supports indefinite and temporary pauses, with up to three temporary lengths set in the store's portal settings. The API input doesn't carry a date:
skipOption is a unit string and a number, the same object skip takes, and the reference doesn't list which units it accepts or whether it sets a pause length. unpauseSubscriptionInput has an isTemporaryPause flag, which suggests timed pauses exist on the API side, but nothing documents how to create one. Until a store tests it on a real subscription, treat an API pause as open-ended, and use a skip or updateNextBillingDate when the shopper names a return date.
Agent instruction example
This is the instruction we gave the test agent, word for word:
You handle subscription tickets for our store. Our subscription app is Skio. 1. Work out what the customer wants: skip the next order, pause, cancel, change the product, date, frequency or address, or a question about a charge. 2. Call "T4-142 Skio: Find subscriptions by email" with the requester's email in lowercase. Skio returns failed calls as normal responses: if the result contains "errors" instead of "data", the lookup failed. Follow rule 7 and never tell the customer they have no subscription. 3. Skip and pause only work on a subscription whose status is active. If there's none, say you can't find an active subscription under this email and ask for the email they used at checkout. If there's more than one, list each by product and next billing date and ask which one. Don't guess. 4. Skip: when exactly one active subscription matches and its next billing date is at least 2 days away, call "T4-142 Skio: Skip next order" with its id. Reply with the new next billing date the tool returns. If ok is false or the result has "errors", nothing was skipped: follow rule 7. If the next billing date is sooner than 2 days, don't skip; hand off under rule 6. 5. Pause: our pause has no end date. Only call "T4-142 Skio: Pause subscription" when the customer asks to pause with no return date, and tell them it stays paused until they or we resume it. If they give a length or a return date, don't pause: offer to skip the next order instead, or hand off under rule 6 with the date in the note. 6. Cancel, product swap, address, frequency, refunds and anything else: don't change it yourself. Reply that a teammate will take care of it today, add an internal note with the subscription id, product, next billing date and exactly what the customer asked for, and tag the ticket skio_handoff. For a cancellation, ask for the reason once in your reply. 7. If a Skio tool returns an error, don't tell the customer what went wrong inside our systems. Reply that a teammate is checking and will follow up today, add an internal note with the tool name and the error message, and tag the ticket app_tool_error. Never paste the customer's address or phone number into a note.
The 2-day buffer in rule 4 is our choice, not Skio's. Gorgias says a skip only works before the order is created, and Skio's Klaviyo Helpdesk doc says some actions may be unavailable within 24 hours of the next charge. Two days keeps the agent clear of both.
What happened when we ran a Skio agent on a test ticket
On 28 September 2026 we created an inactive agent, "T4-142-Skio subscription requests," on our Macha Demo account with the instruction above, four Zendesk tools (get ticket, public reply, internal note, tags) and the three Skio tools. Every Skio tool used a placeholder key. We don't have a Skio store, and Skio has no sandbox.
We used Macha's Test run, which creates a new ticket on our d3v-macha Zendesk sandbox and runs the agent with only its attached tools. The made-up customer, Maya, wrote that she was traveling until mid-November, asked us to skip her next coffee delivery, and asked for her subscription to switch from Morning Blend to Decaf Blend afterward. That's one job the agent may do (skip) and one it must hand off (swap).
What the agent did, in order:
- Called Get Ticket and "Find subscriptions by email" together, with [email protected].
- Got back
{"errors":[{"message":"Invalid response from authorization hook", ...}]}, retried the lookup once and got the same. - Never called Skip or Pause. It had no subscription ID, and rule 4 needs one.
- Posted a holding reply, added an internal note and tagged the ticket
app_tool_error, 13 seconds after the ticket was created.
The run is a pass, but the screenshot shows why rule 2 exists. Macha's tool step shows a green check next to both failed lookups, because Skio answered with HTTP 200. The tool's Run Test came back the same way: Macha's test response wrapped Skio's errors array in "success": true. Without rule 2, an agent reading an empty result could tell Maya she has no subscription.
What we didn't see: a successful Skio response, a real subscription's status and nextBillingDate, the skip returning its new date, or the skio_handoff branch for the decaf swap. The note does carry the swap request, so a person picking it up has both jobs. The error proves the request reached Skio's live API with the right header shape; it doesn't prove the agent reads a real subscription correctly.
What goes wrong with the Skio API?
- Failures arrive as HTTP 200. Skio's API is built on Hasura (the reference links Hasura's docs for its limits), and it returns errors in the response body with a 200 status. Every tool description and instruction has to say that an
errorsarray means failure. - A header mistake looks like a schema mistake. We sent the same query three ways on 28 September. With
APIplus a wrong key, Skio returned "Invalid response from authorization hook." WithBearerplus a key, or with the key and no prefix, it returned "field 'Subscriptions' not found in type: 'query_root'," the same as sending no key at all. Skio's help article names this: thefield not found in query_rooterror usually means a missing or malformed authorization header. The REST export API is plainer: 401 "Missing Authorization header" or 403 "Invalid API key." - Case in emails. Filtering on
emailwith_eqis an exact match. UseemailLowerand lowercase the address. - Mixed ID types.
skipSubscriptionandcancelSubscriptiontype the subscription ID as a UUID, whilepauseSubscription,unpauseSubscription,swapSubscriptionProductVariantsandshipNowtype it as a String. The value is the same UUID from the lookup; declare the GraphQL variable with the type each mutation expects, or Skio rejects the query. - Cancel emails the customer.
cancelSubscriptionhas ashouldSendNotifflag. The reference doesn't state its default, so set it explicitly. - No sandbox. Test with read tools first, on a subscription you own.
- Depth and node caps. Four levels and 100 nodes per query. Ask only for what the reply needs.
Where Macha fits
Macha fits Skio brands running Zendesk, Freshdesk, Gorgias, Front, HubSpot or Intercom whose subscribers write in by email or chat to skip, pause or move a delivery, especially teams outside Gorgias, where Skio's own help-desk app shows the subscriber but can't act. The agent finds the subscriber by email, reads status and next billing date, skips or pauses one clearly identified active subscription, and hands cancellations, swaps and payment questions to a person with the subscription ID and the request in a note. Skio connects through a custom API tool that Macha's team sets up during onboarding, authenticated with the authorization: API <key> header. On Gorgias, start with Gorgias AI Agent's Skio Actions for single-subscription skips and cancels; Macha adds pause, multi-subscription tickets and date moves. It's the wrong fit if your Skio tickets are mostly cancellations you want saved: that's the job of Skio's cancel flow, not a support agent. Macha is priced per ticket from $299/month for 750 tickets (see pricing), so a skip ticket with a lookup, a skip and a reply is one charge. For the same build on other apps, see the Loop Subscriptions page and the Recharge page; for the policy side of skip, pause and cancel requests, how AI handles them; and for the whole subscription-brand ticket mix and its cost, AI customer service for subscription brands. How custom tools are configured is in the custom tools docs.
Frequently asked questions
Does Skio have a public API?
Yes. Skio's GraphQL API is at https://graphql.skio.com/v1/graphql and documented at code.skio.com, with 22 queries and 26 mutations. A separate REST API at api.skio.com/public-rest-api-http exports orders, products, storefront users and subscriptions, read-only.
How do I authenticate with the Skio API?
Generate a key in Skio's dashboard under API & Integrations > API, then send it in a header named authorization with the value API followed by the key. A Bearer prefix doesn't work: Skio returns "field not found in query_root."
Can the Skio API pause a subscription for a set time?
The pauseSubscription mutation takes a subscription ID plus optional debugCaller and skipOption fields, and no end date. Skio's reference doesn't document a timed pause through the API, so use skipSubscription or updateNextBillingDate when the customer names a return date.
Did Recharge's acquisition change the Skio API?
Not as of 28 September 2026. Recharge's 27 April 2026 announcement said both platforms would keep operating as they had, and Skio's endpoint, key format and help-desk integrations were unchanged when we checked. Neither company has published plans to merge the APIs.
Can Gorgias AI Agent manage Skio subscriptions?
Yes, through two ready-made Actions: cancel a subscription and skip the next shipment. It acts only when the shopper has a single subscription and skips only before the order is created. Skio's own Gorgias integration adds a sidebar with six actions per subscription for human agents.
Is there a Skio app for Zendesk?
Yes, a private app you download from Skio's dashboard and upload in Zendesk's Admin Center. Skio's documentation says it shows subscriber information on tickets when the email matches and describes no actions.
How we researched this
- API behavior: Skio's GraphQL reference, read in full on 28 September 2026: authorization, rate limits, data model, the query example, all 26 mutations, and the input types for skip, pause, unpause, cancel, swap, next billing date, interval, reactivate and ship now. Skio's REST reference, 28 September 2026. We counted 22 queries and 26 mutations in the reference's navigation. 2,000 requests a minute divided by 60 is 33.3 a second.
- Skio help center, 28 September 2026: Using the Skio API (updated 27 April 2026), Pausing Subscriptions (24 August 2026), permanently canceled subscriptions (27 April 2026), the status definitions and analytics glossary, and the Gorgias (3 February 2026), Zendesk (3 February 2026) and Klaviyo Helpdesk (24 February 2026) integration pages. Skio's help-center index listed no other help-desk integration.
- Gorgias: AI Agent Actions for Skio, updated 22 January 2026, read 28 September 2026.
- Acquisition: Recharge's announcement, metadata dated 27 April 2026 and modified 30 April 2026, read 28 September 2026. The 20,000 brands and $20B GMV figures are Recharge's own.
- Plans and popularity: the Shopify App Store listing on 28 September 2026: "Skio, a Recharge Company," 5.0 stars from 241 reviews, Scale at $599 a month or $5,988 a year, 1% + 20¢ transaction fee, launched 27 April 2021. Skio's pricing page, 28 September 2026: Scale at $499 a month billed annually, with "Native Integrations + Webhooks + API." StoreLeads counted 1,716 stores with Skio installed in its report updated 25 September 2026. These are vendor and third-party figures.
- What we ran: on 28 September 2026 we sent the lookup query to Skio's GraphQL endpoint with curl in four header variants and called the REST
storefront-usersendpoint with and without a placeholder key. On our Macha Demo account we built three custom tools with a placeholder key, "T4-142 Skio: Find subscriptions by email" (Read), "Skip next order" and "Pause subscription" (Write); each Run Test returned HTTP 200 with Skio's authorization hook error. A temporary copy pointed at httpbin.org confirmed the body and header Macha sends; we deleted it. We ran the inactive agent once with Macha's Test run on made-up ticket #1159 on our d3v-macha sandbox; the reply came 13 seconds after the ticket was created (14:06:52 to 14:07:05 UTC). No Skio store was touched, no subscription was read or changed, and the customer, products and IDs are synthetic. - Not tested live: any successful Skio call, the skip and pause mutations against a real subscription, timed pauses through
skipOption, and the Gorgias, Zendesk and Klaviyo Helpdesk integrations.
To see the same setup on your own help desk, start a trial with $50 of free usage (about 125 tickets), no credit card, no time limit, and ask the Macha team to build the Skio tools during onboarding.
Resolve tickets automatically with AI agents
Macha's AI agents work on top of the help desk you already use — no code.

