# Our approach to AI
Source: https://docs.supercycle.com/ai/approach
How Supercycle thinks about and implements AI across the platform
Circular is complex. Every merchant has different relationship with how circular fits into their operation.
We want to keep you at the edge of what is possible with AI, with a network of elegantly embedded partners and open integrations that give you the best possible foundation for the workflows and tools *you* want to build.
***
## What we believe
**AI should meet merchants where they work**
Most merchants already have a preferred AI assistant, an internal dashboard, or an automation stack they rely on. We don't want to compete with those tools, we want Supercycle to work seamlessly inside them. That means exposing our data and actions through open standards.
**Answers should arrive at the point of decision**
Whether you're configuring a rental plan, reviewing a trade-in, or assessing a secondhand listing, the moment you need information is when you're looking at the thing itself. We're building towards AI that surfaces the right insight, inline, exactly when it matters.
**We'd rather partner than pretend**
There are companies with years of data on secondhand pricing, product authentication, and condition grading. We're not going to build that from scratch. Instead, we're building a network of elegantly embedded partners, specialist providers whose intelligence surfaces directly inside Supercycle at the point of decision, so you get better answers than we could ever provide alone. You can either waterfall or compare and automate data from multiple providers.
***
## How it works in practice
### Build your own tools on top of Supercycle
If you or your team want to build custom dashboards, internal tools, or automated workflows on top of Supercycle data, the **[Builders MCP](/ai/builders-mcp/overview)** is your starting point.
Powered by the [Model Context Protocol](https://modelcontextprotocol.io), it gives AI coding tools like Claude, Cursor, and Windsurf direct, structured access to Supercycle's documentation. This means you can describe what you want to build in natural language, a Retool dashboard showing cycle performance by SKU, a Lovable app for your warehouse team, a custom automation in Make or Zapier and your AI tool will understand Supercycle's data model well enough to help you build it accurately.
Learn more about [AI for Building](/ai/building/overview).
***
### Access and automate Supercycle actions from your AI of choice
The **[Operators MCP](/ai/operators-mcp/overview)** lets you connect Supercycle to your preferred AI assistant, Claude, ChatGPT, or any MCP-compatible client and interact with your live customer data directly.
Ask questions, trigger actions, and automate workflows without leaving your AI chat:
* *"Show me all cycles that are overdue for return this week"*
* *"What's the average cycle duration for our camera lens listings?"*
* *"Flag all trade-ins received in the last 7 days that haven't been graded"*
This is particularly useful for operators managing Supercycle day-to-day, or for teams building lightweight internal automations without a full development cycle.
Learn more about [AI for Operations](/ai/operations/overview).
***
### Instant answers while you're setting up
We know that the most common moment someone needs help is the moment they're trying to configure something. That's why we've built AI directly into our documentation. You can also use the Builders MCP to access our documentaiton from your preferred AI assistant.
Rather than opening a chat tab, switching to support, or searching through guides, you can ask a question right where you're reading and get an answer immediately, grounded in Supercycle's actual documentation.
Learn more about [AI for Support](/ai/support/overview).
***
### Enrichment partners to bring third-party industry specific intelligence inline
Some of the most valuable questions in circular commerce aren't answerable from your own data alone.
* *Is this product authentic?*
* *What's the current secondhand market value of this item?*
* *Does this condition match the description provided?*
We're building a network of **enrichment partners**, specialist AI providers with deep data in authentication, secondhand pricing, and condition grading, who surface their insights directly inside Supercycle, at the point where a decision is being made.
***
### Shopify Sidekick
We're integrating with [**Shopify Sidekick**](https://www.shopify.com/sidekick) rather than building our own in-app AI chat experience. Sidekick already lives inside Shopify admin, which is where your team spends most of their time. It makes more sense for Supercycle to be a capable, well-integrated part of that experience than to ask you to context-switch into a separate chat.
As the Sidekick integration matures, you'll be able to ask Sidekick questions that draw on your Supercycle circular commerce data alongside the rest of your Shopify store.
Learn more about [Shopify Sidekick](/ai/sidekick/shopify-sidekick).
***
## What we're not doing
It's worth being explicit about the choices we've made:
* **We're not building our own in-app AI chat.** Sidekick and MCP-connected tools do this better.
* **We're not training models on your merchant data.** Enrichment partner insights come from their own specialist datasets, not yours.
* **We're not adding AI features for the sake of it.** Every AI surface in Supercycle should make a real decision faster or a real workflow easier.
* **We're not using AI to charge you more.** Our goal is to deliver the best possible solutions to help you drive circular revenue growth. We share in your success through our fractional revenue share — so we build to make you as successful as possible.
# Builders MCP
Source: https://docs.supercycle.com/ai/builders-mcp/overview
Give your AI tools direct access to Supercycle's documentation and API reference
The Builders MCP gives AI tools a search tool that queries Supercycle's documentation and API reference directly. Instead of searching the web, your AI assistant gets up-to-date, structured access to our docs while helping you build.
## How it works
When you connect the Builders MCP, your AI tool can:
* Search our documentation while generating a response, not just when you explicitly ask
* Access up-to-date content, not cached web results
* Understand Supercycle's data model, API endpoints, and platform concepts
The MCP is read-only and requires no authentication — it serves the same public documentation available on this site.
## Getting started
Connect the Builders MCP to your preferred AI tool by following the [setup guide](/ai/builders-mcp/setup).
For ideas on what you can build, see [AI for Building](/ai/building/overview).
# Setup
Source: https://docs.supercycle.com/ai/builders-mcp/setup
Connect the Builders MCP to your preferred AI client
The Builders MCP server is available at:
```
https://docs.supercycle.com/mcp
```
Connect it to your preferred AI tool using the instructions below.
ChatGPT supports MCP connections through its Connectors feature.
In ChatGPT, go to **Settings** → **Connectors** → **Add custom connector**.
* **Name:** `Supercycle Builders MCP`
* **URL:** `https://docs.supercycle.com/mcp`
When starting a new chat, select the attachments button (the plus icon) and choose the Supercycle Builders MCP connector. ChatGPT will now search Supercycle's documentation when relevant to your questions.
Claude supports MCP connections through its Connectors feature.
Navigate to the [Connectors](https://claude.ai/settings/connectors) page in your Claude settings.
Select **Add custom connector** and enter:
* **Name:** `Supercycle Builders MCP`
* **URL:** `https://docs.supercycle.com/mcp`
When using Claude, select the attachments button (the plus icon) and choose the Supercycle Builders MCP connector. Claude will now search Supercycle's documentation when relevant to your questions.
Run the following command to add the Supercycle Builders MCP server to Claude Code:
```bash theme={null}
claude mcp add --transport http supercycle-builders-mcp https://docs.supercycle.com/mcp
```
Verify the connection:
```bash theme={null}
claude mcp list
```
Use Cmd + Shift + P (Ctrl + Shift + P on Windows) to open the command palette. Search for **Open MCP settings** and select **Add custom MCP**.
Add the following to your `mcp.json`:
```json theme={null}
{
"mcpServers": {
"Supercycle Builders MCP": {
"url": "https://docs.supercycle.com/mcp"
}
}
}
```
Create a `.vscode/mcp.json` file in your project and add:
```json theme={null}
{
"servers": {
"Supercycle Builders MCP": {
"type": "http",
"url": "https://docs.supercycle.com/mcp"
}
}
}
```
Open an existing agent or create a new one. On the **Configuration** tab, click **Add new tool** → **Connect to MCP Server**.
Select **Add new resource** and enter:
* **Name:** `Supercycle Builders MCP`
* **Server URL:** `https://docs.supercycle.com/mcp`
Your Retool agent can now search Supercycle's documentation when building apps, dashboards, and workflows.
Go to **Settings** → **Connectors** → **Personal connectors**, then click **New MCP server**.
* **Server name:** `Supercycle Builders MCP`
* **Server URL:** `https://docs.supercycle.com/mcp`
* **Authentication:** No authentication
The Lovable agent can now search Supercycle's documentation when generating code, prototypes, and integrations.
Any MCP-compatible client can connect using the server URL:
```
https://docs.supercycle.com/mcp
```
# Guidance for AI
Source: https://docs.supercycle.com/ai/building/guidance-for-ai
Instructions for AI agents working with the Supercycle Builders MCP
This page is written for AI agents. If you're an AI assistant helping a developer build on Supercycle, follow these guidelines.
You are helping a developer build on the Supercycle platform. Follow these rules:
1. Supercycle is the source of truth. Do not store or cache Supercycle data locally. Always read from and write to the Supercycle API.
2. Use the Admin API ([https://app.supercycle.com/api/v1](https://app.supercycle.com/api/v1)) for server-side operations: cycles, inventory, charges, products, customers. Use the Storefront API (via Shopify app proxy) for customer-facing experiences: availability, intents, storefronts.
3. Search the Supercycle documentation via the MCP before making assumptions about how something works.
4. The Admin API uses Bearer token authentication. Never hardcode API keys - use environment variables.
5. List endpoints use keyset pagination with a nextPage cursor. Always handle pagination.
6. Handle rate limits (429 responses) with backoff and retry logic.
7. When building internal tools, fetch data from the API on each load - do not sync to a local database.
8. When building automations, read current state from the API before acting - do not rely on stale data.
9. When building storefronts, use the Storefront API for availability checks and rental intents.
10. Do not scrape the Supercycle admin UI. Do not build your own rental logic. Do not assume Shopify metafields are the full picture - Supercycle stores its own data beyond metafields.
## Core principles
### Supercycle is the source of truth
Supercycle manages rental cycles, subscriptions, memberships, resale, inventory, and charges. **Do not store or cache Supercycle data locally.** Always read from and write to the Supercycle API as your primary interaction model.
* **Read live data** — Query the API for current state rather than relying on previously fetched data
* **Write back to Supercycle** — When a workflow creates, updates, or acts on Supercycle resources, use the API to make those changes, not a local database or file
* **Don't duplicate state** — Avoid building local copies of cycles, inventory, or customer data. Supercycle handles the lifecycle of these resources
### Use the right API for the task
Supercycle has two APIs:
* **[Admin API](/api-reference/admin/introduction)** — For server-side operations: reading and managing cycles, inventory, charges, products, and customers. Base URL: `https://app.supercycle.com/api/v1`
* **[Storefront API](/api-reference/storefront/introduction)** — For customer-facing experiences: checking availability, creating rental intents, and building custom storefronts. Accessed via Shopify app proxy
Use the Admin API for internal tools, dashboards, and automations. Use the Storefront API for anything customer-facing.
### Search the docs before guessing
You have access to Supercycle's documentation through the MCP search tool. **Use it.** Before making assumptions about how something works, search the docs. This is especially important for:
* Understanding which fields are required vs optional
* Learning how rental methods (calendar, subscription, membership, resale) differ
* Understanding Supercycle-specific concepts like cycles, allocation, and intents
## Working with the API
### Authentication
The Admin API uses Bearer token authentication:
```
Authorization: Bearer [api_token]
```
API keys are generated by the merchant in their Supercycle admin settings. Never hardcode API keys — always use environment variables or secure configuration.
### Pagination
List endpoints use keyset pagination with a `nextPage` cursor. Always handle pagination when building tools that list resources — don't assume all results fit in a single response.
### Rate limits
The API enforces rate limits. If you receive a `429 Too Many Requests` response, back off and retry. Build retry logic into any automation or integration.
## Common patterns
### Building internal tools
When building dashboards or admin tools (e.g. in Retool, Lovable, or custom apps):
* Fetch data from the Admin API on each page load — don't sync to a local database
* Use the API to perform actions (process returns, update cycles) — don't build a separate action queue
* Display Supercycle data alongside Shopify data where useful, but let Supercycle remain the authority for circular commerce data
### Building automations
When building workflows (e.g. in Make, Zapier, or custom scripts):
* Trigger automations from Supercycle events where possible
* Read current state from the API before taking action — don't rely on stale data from a previous step
* Write results back to Supercycle via the API
### Building storefronts
When building custom customer-facing experiences:
* Use the Storefront API to check product availability and create rental intents
* The intent endpoint returns form attributes needed to add items to the Shopify cart
* Availability timelines return 12 months of day-by-day inventory data for date pickers
## What not to do
* **Don't scrape the Supercycle admin UI** — Use the API
* **Don't store cycle or inventory data in a local database** — Read from Supercycle
* **Don't build your own rental logic** — Supercycle handles cycle management, allocation, charges, and returns
* **Don't assume Shopify metafields are the full picture** — Supercycle stores its own data beyond what's exposed in Shopify metafields
* **Don't skip error handling** — Always handle API errors, rate limits, and authentication failures gracefully
# Overview
Source: https://docs.supercycle.com/ai/building/overview
Build custom tools, integrations, and workflows on the Supercycle API with AI assistance
Connect the [Builders MCP](/ai/builders-mcp/overview) to your AI tool and start building on the Supercycle API. Describe what you want in natural language and your AI will use Supercycle's documentation to help you build it accurately.
***
## Applications
Use platforms like [Retool](https://retool.com), [Lovable](https://lovable.dev), or custom code to build full applications that read and write Supercycle data through the [Admin API](/api-reference/admin/introduction).
* **Operations dashboards** — Cycle performance by SKU, inventory utilization, revenue breakdowns
* **Warehouse apps** — Scan-to-receive tools, pick lists, restocking workflows
* **Customer portals** — Branded rental experiences, account management, self-service returns
* **Admin tools** — Bulk operations, custom reporting, team-specific views
***
## Integrations and automations
Connect Supercycle to your existing systems and automate workflows using the [Admin API](/api-reference/admin/introduction) and [Shopify Flow](/documentation/manage/automation/automation).
* **System integrations** — Sync data with your ERP, WMS, or CRM via the Admin API
* **Workflow automations** — Build triggers and actions in Make, Zapier, or custom scripts
* **Notification systems** — Slack alerts for returns, email reminders for overdue cycles
* **Data pipelines** — Export cycle, charge, and inventory data to your analytics stack
***
## Working with Shopify
Supercycle is built on Shopify, so many projects will involve both platforms. When building, you may also need:
* [Shopify Developer Documentation](https://shopify.dev/docs) — APIs, webhooks, themes, and app development
* [Shopify Dev MCP](https://shopify.dev/docs/apps/build/devmcp) — Give your AI tools access to Shopify's developer docs alongside Supercycle's
* [Customer Account MCP](https://shopify.dev/docs/apps/build/storefront-mcp/servers/customer-account) — Access customer account data and actions
* [Storefront MCP](https://shopify.dev/docs/apps/build/storefront-mcp/servers/storefront) — Access storefront data for building custom shopping experiences
Connecting both MCPs gives your AI tool a complete picture of the Supercycle + Shopify stack.
***
## Key resources
Server-side API for managing cycles, inventory, charges, products, and customers
Customer-facing API for availability, intents, and custom storefronts
Connect the MCP to your preferred AI coding tool
Instructions for AI agents working with the Supercycle API
# AI at Supercycle
Source: https://docs.supercycle.com/ai/index
Explore how AI enhances your circular commerce operations
Supercycle integrates AI throughout the platform to help you support customers, manage operations, and build custom solutions. Read more about [our approach to AI](/ai/approach).
Use our built-in documentation AI to get help with setup and usage.
Manage your circular models from your preferred AI chat with the Operators MCP.
Build custom portals and workflows on the Supercycle API with the Builders MCP.
***
## MCPs
Connect your AI assistant to your live Supercycle data.
Give AI coding tools access to Supercycle's documentation and API reference.
## Shopify
Circular commerce AI, built into Shopify Sidekick via our native extension.
# Overview
Source: https://docs.supercycle.com/ai/operations/overview
Manage your circular operations from your preferred AI chat with the Operators MCP
The Operators MCP is currently in early access. [Request access](https://admin.shopify.com/apps/supercycle/settings/integrations) from integrations.
The Operators MCP connects Supercycle to your preferred AI assistant, letting you review, audit, and take action on your circular operations without leaving your AI chat.
Connect it to Claude, ChatGPT, or any MCP-compatible client and interact with your live Supercycle data using natural language.
***
## What you can do
### Review your operations
Get summaries and insights across cycles, inventory, customers, and charges without opening the Supercycle admin.
Give me a summary of today's operations. How many new orders came in, how many returns are expected, and are there any overdue cycles?
Which items in our camera lens collection are currently available for rental? Show me their condition and last rental date.
Show me the rental history for customer [emma@example.com](mailto:emma@example.com). How many cycles have they completed and are any currently active?
What's our revenue breakdown across calendar, subscription, and membership methods this month?
### Audit workflows and compliance
Spot issues before they become problems. Check charge statuses, fulfillment rates, and return processing.
Show me all cycles where the return is overdue by more than 3 days. Include the customer email, product name, and how many days overdue.
List all charges that have failed payment in the last 7 days. Which ones are in active dunning and which have exhausted retries?
Are there any orders from more than 24 hours ago that haven't been fulfilled yet? Show me the details so I can prioritize.
How many items across our inventory are in a damaged condition? Group them by product and show which ones are repairable vs unrepairable.
### Take action
Execute operational tasks directly from your AI chat. Update cycles, manage returns, tag resources, and add comments.
Mark cycle SC-1042 as packed and assign item #4012 to it.
Create a return for customer [sarah@example.com](mailto:sarah@example.com) with rentals SC-1042 and SC-1043. Use collection as the return method.
Return #2001 has been received. Mark all return lines as received.
Find all cycles that are overdue for return by more than 5 days and tag them as "overdue-followup" so I can track them.
Add a comment to cycle SC-1042: Customer called to request early return, approved by manager.
***
## Common workflows
### Morning operations check
Start your day with a comprehensive overview of what needs attention.
Good morning. Give me a rundown of:
1. Orders that need fulfilling today
2. Returns expected to arrive today
3. Any overdue cycles or failed payments that need attention
4. Current inventory utilization rate
### End-of-week audit
Review the week's performance and flag anything that needs attention before the weekend.
Run a weekly audit for me:
1. How many cycles were completed this week vs last week?
2. Are there any returns that have been "in progress" for more than 3 days?
3. What's our charge collection rate this week?
4. Flag any items that have been rented more than 10 times and might need condition review.
### Membership management
Stay on top of membership operations, swaps, and billing.
Show me all active memberships. For each, tell me how many items they currently have checked out vs their allowance, and when their next billing date is.
***
## Getting started
The Operators MCP is currently in early access. [Request access](https://admin.shopify.com/apps/supercycle/settings/integrations) from [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations), then follow the setup guide to connect.
See the [setup guide](/ai/operators-mcp/setup) for connection instructions.
# Operators MCP
Source: https://docs.supercycle.com/ai/operators-mcp/overview
Use the Operators MCP to manage your circular models from your preferred AI chat
The Operators MCP connects your preferred AI assistant directly to your Supercycle data. Query cycles, inventory, customers, returns, and charges using natural language — without leaving your AI chat.
It uses OAuth authentication with your Shopify account and works with Claude, ChatGPT, and any MCP-compatible client.
## Available tools
Read tools are auto-approved. Write tools request confirmation before making changes, and require [full OAuth access](/ai/operators-mcp/security#oauth-access-levels) — read-only connections can list and inspect data but cannot call write tools.
`list_cycles` · `get_cycle` · `update_cycle`
List, inspect, and update rental cycles — including packing status, dates, and item assignment.
[View cycle tools →](/ai/operators-mcp/tools#cycles)
`list_returns` · `get_return` · `create_return` · `update_return`
List, inspect, create, and update return orders and return line statuses.
[View return tools →](/ai/operators-mcp/tools#returns)
`list_items`
Browse inventory items by visibility, condition, and availability.
[View inventory tools →](/ai/operators-mcp/tools#inventory)
`list_customers`
Find customers by activity, lifetime value, and outstanding balance.
[View customer tools →](/ai/operators-mcp/tools#customers)
`list_charges`
List charges filtered by payment status, amount, and category.
[View charge tools →](/ai/operators-mcp/tools#charges)
`list_method_options`
Browse pricing options across calendar, subscription, membership, and resale methods.
[View pricing tools →](/ai/operators-mcp/tools#pricing)
`list_tags` · `add_tag` · `remove_tag`
List, add, and remove tags on cycles, items, and returns.
[View tag tools →](/ai/operators-mcp/tools#tags)
`add_comment`
Add comments and notes to cycles, items, customers, and returns.
[View comment tools →](/ai/operators-mcp/tools#comments)
## What you can do
* **Query**: List and search cycles, inventory, customers, returns, and charges
* **Inspect**: Get full details on individual cycles and returns
* **Act**: Update cycles, create returns, reschedule dates, mark lines as received
* **Organise**: Tag and comment on cycles, items, customers, and returns
## Getting started
Find your MCP server URL in [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations), then follow the [setup guide](/ai/operators-mcp/setup) to connect your AI tool.
# Security
Source: https://docs.supercycle.com/ai/operators-mcp/security
Security model and best practices for the Operators MCP
The Operators MCP connects to your live Supercycle data, it can read and write to your store.
## Authentication
The Operators MCP uses OAuth authentication:
* You log in with your existing Shopify credentials
* No API keys to manage or rotate
* Access is scoped to your store only, no other merchant's data is accessible
* Sessions can be revoked from [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations)
## OAuth access levels
When you connect an AI client, the consent screen asks which access level to grant:
| Access level | OAuth scope | What it allows |
| --------------- | ----------- | ------------------------------------------------------ |
| **Full access** | `mcp` | Read and update cycles, returns, items, and customers |
| **Read only** | `mcp:read` | Read cycles, returns, items, and customers — no writes |
Full access is selected by default. Choose **Read only** when you want an AI assistant to search and inspect data but not change anything in Supercycle.
If the client already requested read-only access, the consent screen shows that level with no choice to widen it.
Read-only connections can call list and get tools (`list_cycles`, `get_cycle`, `list_items`, and the other read tools). Write tools — `update_cycle`, `create_return`, `update_return`, `add_tag`, `remove_tag`, `add_comment`, and `create_blocked_date` — return an **Insufficient scope** error. Reconnect and choose **Full access** to use them.
Deactivating an OAuth client in Integrations immediately blocks all of its tokens, including ones that were already issued.
## Approval flows
The Operators MCP uses MCP safety annotations to protect your data:
* **Read operations**: Auto-approved for seamless searching and viewing of cycles, inventory, charges, and customers.
* **Write operations**: Request user confirmation before creating, updating, or deleting data.
Your AI tool will prompt you for approval before making any changes to your store.
## Data access
* The MCP only operates within your store's data
* You have the same data access as your Supercycle admin account
* No data is shared with external systems unless you explicitly configure integrations
* All operations are performed through the Supercycle API with standard rate limits and validation
## Best practices
* **Review write operations** - Always read the confirmation prompt before approving changes from your AI tool
* **Revoke sessions when needed** - If a team member leaves or access should be removed, revoke their session from [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations)
# Setup
Source: https://docs.supercycle.com/ai/operators-mcp/setup
Connect the Operators MCP to your preferred AI client
The Operators MCP uses OAuth authentication. You'll find your MCP server URL in your [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations), and you'll be asked to sign in with your Shopify account when connecting.
ChatGPT supports MCP connections through its Connectors feature.
In ChatGPT, go to **Settings** → **Connectors** → **Add custom connector**.
* **Name:** `Supercycle Operators MCP`
* **URL:** Your MCP server URL from [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations)
You'll be redirected to sign in with your Shopify account. On the consent screen, choose **Full access** or **Read only** — see [OAuth access levels](/ai/operators-mcp/security#oauth-access-levels) — then approve. This authorizes ChatGPT to access your Supercycle data.
When starting a new chat, select the attachments button (the plus icon) and choose the Supercycle Operators MCP connector. ChatGPT will now be able to query your Supercycle data.
Claude supports MCP connections through its Connectors feature.
Navigate to the [Connectors](https://claude.ai/settings/connectors) page in your Claude settings.
Select **Add custom connector** and enter:
* **Name:** `Supercycle Operators MCP`
* **URL:** Your MCP server URL from [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations)
You'll be redirected to sign in with your Shopify account. On the consent screen, choose **Full access** or **Read only** — see [OAuth access levels](/ai/operators-mcp/security#oauth-access-levels) — then approve. This authorizes Claude to access your Supercycle data.
When using Claude, select the attachments button (the plus icon) and choose the Supercycle Operators MCP connector. Claude will now be able to query your Supercycle data.
Run the following command, replacing the URL with your MCP server URL from [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations):
```bash theme={null}
claude mcp add --transport http supercycle-operators-mcp
```
You'll be prompted to authenticate with your Shopify account. On the consent screen, choose **Full access** or **Read only** — see [OAuth access levels](/ai/operators-mcp/security#oauth-access-levels) — then approve. Verify the connection:
```bash theme={null}
claude mcp list
```
Any MCP-compatible client can connect using your MCP server URL from [Integrations](https://admin.shopify.com/apps/supercycle/settings/integrations). You'll authenticate via OAuth with your Shopify account when connecting, and choose an [access level](/ai/operators-mcp/security#oauth-access-levels) on the consent screen.
## Supplement with the Shopify AI toolkit
For broader access to your Shopify store, you can pair the Operators MCP with the [Shopify AI toolkit](https://shopify.dev/docs/apps/build/ai-toolkit). Adding both gives your AI assistant access to your Supercycle circular operations data **and** native Shopify resources like products, orders, and store policies in a single chat.
The Shopify AI toolkit is installed separately in your AI client — see Shopify's [installation guide](https://shopify.dev/docs/apps/build/ai-toolkit) for the plugin, agent skills, or Dev MCP options. Once both are connected, you can ask cross-store questions like:
* *"Compare this month's rental cycles in Supercycle to my Shopify product sell-through."*
* *"Which Shopify products are tied to overdue returns in Supercycle?"*
## Troubleshooting
If a write tool fails with a message like:
```
Insufficient scope: this tool requires write access, but this connection
was authorized as read only. Reconnect and choose full access to use it.
```
The connection was authorized as **Read only**. Disconnect and reconnect the MCP client, then choose **Full access** on the consent screen. See [OAuth access levels](/ai/operators-mcp/security#oauth-access-levels).
If you see an error like:
```
Oops, something went wrong.
What happened?
Unauthorized Access:
```
This means the email address for your AI chat client doesn't match a user email on your Shopify store. To fix this, either:
* Update your email in your [Shopify account settings](https://accounts.shopify.com/accounts/personal) to match your AI client email
* Or update your AI client to use the email associated with your Shopify account
# Tools
Source: https://docs.supercycle.com/ai/operators-mcp/tools
Reference of the tools available in the Operators MCP for managing cycles, inventory, customers, returns, charges, pricing, and tags
List tools support pagination (`page`, `per_page` max 100), sorting (`sort`, `sort_direction`), and date filtering (`created_after`, `created_before`, `updated_after`, `updated_before`) in `YYYY-MM-DD` format.
***
## Cycles
List cycles filtered by status, method, dates, and packing status.
| Parameter | Values |
| --------------------------------------- | --------------------------------------------------------------------------------------- |
| `status` | `upcoming`, `active`, `complete`, `to_fulfill`, `to_receive`, `to_restock`, `cancelled` |
| `method_type` | `calendar`, `subscription`, `membership`, `resale` |
| `packing_status` | `pending`, `printed`, `packed` |
| `rental_start_from` / `rental_start_to` | Date range for rental start |
| `customer_email` | Partial match |
| `item_title` | Partial match |
Optionally include related data with `include_customer`, `include_item`, `include_order`, `include_line_item`.
Get full details of a single cycle by ID.
| Parameter | Required | Description |
| --------- | -------- | ------------------------- |
| `id` | Yes | Cycle ID (e.g. `SC-1234`) |
Returns the complete cycle record with customer, item, order, charges, and return data.
Update a cycle's packing status, dates, or item assignment. Requires confirmation.
| Parameter | Description |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id` | Cycle ID (required) |
| `packing_status` | `pending`, `printed`, `packed` |
| `item_id` | Item ID to assign |
| `rental_start` / `rental_end` | Reschedule dates (`YYYY-MM-DD`) |
| `fulfilled_at` / `received_at` | Mark as fulfilled or received (`YYYY-MM-DD`) |
| `prepare_from` / `restock_by` | Override the preparation start or restock end date (`YYYY-MM-DD`). Pass `null` to revert to the automatic date computed from the shop's [logistics buffers](/documentation/configuration/logistics/buffers). |
***
## Inventory
List inventory items filtered by visibility, status, condition, and availability.
| Parameter | Values |
| ------------------- | ----------------------------------------------- |
| `visibility` | `available`, `unavailable`, `sold`, `retired` |
| `processing_status` | `unprocessed`, `processed` |
| `available` | `true` (not rented), `false` (currently rented) |
| `product_title` | Partial match |
| `sku` | Partial match |
| `condition_id` | Filter by condition |
Returns item ID, product/variant title, SKU, serial, visibility, condition, and pick location.
***
## Customers
List customers filtered by activity, value, and balance.
| Parameter | Description |
| ------------------------------- | --------------------------- |
| `customer_email` | Partial match |
| `name` | Partial match |
| `has_active_rentals` | `true` or `false` |
| `lifetime_value_min_cents` | Minimum lifetime value |
| `outstanding_balance_min_cents` | Minimum outstanding balance |
Sortable by `lifetime_value_cents`, `rentals_count`, `outstanding_balance_cents`.
***
## Returns
List returns filtered by status, receival, and credit status.
| Parameter | Values |
| ----------------- | ---------------------------------------------------------------------------- |
| `status` | `requested`, `expected`, `received`, `in_progress`, `completed`, `cancelled` |
| `receival_status` | `unreceived`, `partially_received`, `received` |
| `credit_status` | `uncredited`, `partially_recredited`, `recredited` |
| `incomplete` | `true` to show only incomplete returns |
| `customer_email` | Partial match |
Optionally include related data with `include_customer`, `include_return_lines`.
Get full details of a single return by ID.
| Parameter | Required | Description |
| --------- | -------- | ------------------------ |
| `id` | Yes | Return ID (e.g. `#2001`) |
Returns the complete return record with customer, return lines, conditions, return method, and tags.
Create a return order for a customer. Requires confirmation.
| Parameter | Required | Description |
| -------------------- | -------- | --------------------------------------------------- |
| `customer_id` | Yes | Customer email or Shopify ID |
| `rental_ids` | Yes | Array of rental IDs (e.g. `['SC-1042', 'SC-1043']`) |
| `return_method_type` | No | `collection` or `return_label` |
Update a return order's status or return line statuses. Requires confirmation.
| Parameter | Description |
| -------------- | ------------------------------------------------------------------------------ |
| `id` | Return ID (required) |
| `status` | `requested`, `expected`, `received`, `in_progress`, `completed`, `cancelled` |
| `return_lines` | Array of `{ id, status }` where status is `awaiting`, `received`, or `missing` |
***
## Charges
List charges with optional status filtering.
| Parameter | Description |
| --------------------------------------- | -------------------------------------------- |
| `status` | `paid`, `unpaid`, `cancelled` (default: all) |
| `customer_email` | Partial match |
| `amount_min_cents` / `amount_max_cents` | Filter by amount |
| `category_type` | `Checkout`, `Generic`, `BillingCycle` |
Optionally include related data with `include_customer`, `include_dunning`.
***
## Pricing
List pricing options for a given method, filtered by product and price range.
| Parameter | Required | Description |
| ------------------------------------- | -------- | -------------------------------------------------- |
| `method_type` | Yes | `subscription`, `membership`, `calendar`, `resale` |
| `product_id` | No | Filter by product |
| `price_min_cents` / `price_max_cents` | No | Filter by price |
Returns method-specific fields (e.g. recurring price and billing interval for subscriptions, duration for calendar).
***
## Availability
Block an item, variant, or product from being booked over a date range. Requires confirmation.
| Parameter | Required | Description |
| --------------- | -------- | ------------------------------------------------------------------------------------- |
| `resource_type` | Yes | `item`, `variant`, or `product` |
| `resource_id` | Yes | Formatted or numeric ID for items; Shopify ID or numeric ID for variants and products |
| `from` | No | First blocked date (`YYYY-MM-DD`, inclusive). Omit for open-ended start. |
| `to` | No | Last blocked date (`YYYY-MM-DD`, inclusive). Omit for open-ended end. |
| `description` | No | Optional note (e.g. `Repairs`, `Reserved for photoshoot`) |
At least one of `from` or `to` must be provided. Dates are day-bounded in the shop timezone.
***
## Tags
List all tags on a cycle, item, or return.
| Parameter | Required | Description |
| --------------- | -------- | ---------------------------- |
| `resource_type` | Yes | `cycle`, `item`, or `return` |
| `resource_id` | Yes | Resource ID (e.g. `#1042`) |
Add a tag to a cycle, item, or return. Idempotent. Requires confirmation.
| Parameter | Required | Description |
| --------------- | -------- | ---------------------------- |
| `resource_type` | Yes | `cycle`, `item`, or `return` |
| `resource_id` | Yes | Resource ID (e.g. `#1042`) |
| `tag` | Yes | Tag title to add |
Remove a tag from a cycle, item, or return. Idempotent. Requires confirmation.
| Parameter | Required | Description |
| --------------- | -------- | ---------------------------- |
| `resource_type` | Yes | `cycle`, `item`, or `return` |
| `resource_id` | Yes | Resource ID (e.g. `#1042`) |
| `tag` | Yes | Tag title to remove |
***
## Comments
Add a comment/note to a cycle, item, customer, or return. Requires confirmation.
| Parameter | Required | Description |
| --------------- | -------- | ---------------------------------------- |
| `resource_type` | Yes | `cycle`, `item`, `customer`, or `return` |
| `resource_id` | Yes | Resource ID or email for customers |
| `body` | Yes | Comment text |
# Shopify Sidekick
Source: https://docs.supercycle.com/ai/sidekick/shopify-sidekick
Access your Supercycle circular commerce data through Shopify's AI assistant
Supercycle ships native [Shopify Sidekick](https://www.shopify.com/sidekick) extensions, so you can ask Sidekick about your cycles and act on them without leaving Shopify admin. Sidekick already lives inside admin where your team spends most of their time — it makes more sense for Supercycle to be a capable, well-integrated part of that experience than to ask you to context-switch into a separate chat.
## What you can do today
### Search your cycles data
Ask Sidekick questions in natural language and it will query Supercycle directly. The data extension exposes three read-only tools that cover the most common operational questions.
Find cycles by customer, product, cycle number, or status. Fulfillment is the item going *out*; receival is the item coming *back*. Each has its own status (`due`, `scheduled`, `overdue`, `complete`).
* *"What's overdue to come back?"*
* *"Show me cycles shipping today."*
* *"What cycles does Jane Doe have right now?"*
* *"Look up cycle #1042."*
Find customers and see their email, membership/subscriber status, deposit balance, outstanding balance, and cycle counts (total and active).
* *"How many active cycles does [jane@example.com](mailto:jane@example.com) have?"*
* *"What's the outstanding balance for Jane Doe?"*
* *"Which of my customers are subscribers?"*
Find return orders by customer name, return number, or status (`requested`, `expected`, `received`, `in_progress`, `completed`, `cancelled`).
* *"Any returns still expected this week?"*
* *"Look up return #58."*
* *"Show me returns in progress for Jane Doe."*
These tools are read-only. To change a cycle, Sidekick will direct you into the Supercycle app.
### Include a product in your Supercycle catalog
Sidekick can take an existing Shopify product and set it up for cycles in Supercycle — the same "Include in Supercycle" flow exposed on the product index, now reachable conversationally.
* *"Add the Mountain Bike product to my Supercycle catalog."*
* *"Include this product in Supercycle."*
* *"Set up the Trail Tent for cycles."*
Sidekick opens Supercycle's product-import page with the product pre-loaded so you can confirm.
Including a product **moves its inventory management from Shopify into Supercycle** and turns on *continue selling when out of stock* for it. Supercycle needs to manage inventory to track cycle availability. Confirm on the import page before the change is applied.
### Circular insights in Shopify Analytics
Sidekick can also surface circular-specific insights from your Shopify Analytics alongside the rest of your store data.
* *"How are my Supercycle products performing compared to standard sales?"*
* *"What's my circular revenue breakdown this month?"*
From any [Analytics dashboard](/documentation/manage/analytics/dashboards), click **Ask AI** and choose **Open Sidekick**. Sidekick opens with a starter prompt — *Show me Supercycle stats from the last 30 days* — so you can dig into the numbers on screen without typing the first query from scratch.
### Automations with Shopify Flow
Use Sidekick to build Shopify Flow automations that include Supercycle triggers and actions. Describe the workflow in natural language and Sidekick will help you build it.
* *"Create a flow that tags customers after their first completed cycle."*
* *"Notify me when a return is overdue by 3 days."*
## Vocabulary Sidekick understands
So Sidekick gives accurate answers, it's worth knowing the terms it maps between:
* A **cycle** is a single use of one item by one customer for a period of time. "Cycle", "rental", "booking", and "hire" are all treated as the same thing — we use **cycle** everywhere in the product.
* **Fulfillment** is the item going *out* to the customer; **receival** is it coming *back*. Overdue cycles are the most operationally urgent.
* A **return order** groups one or more cycles a customer is sending back.
You can refer to cycles and returns with or without the leading `#` (for example, `1042` or `#1042`).
## Why Sidekick
* **Where you already work** — Sidekick lives inside Shopify admin, no context-switching required.
* **Unified view** — Ask questions that span both your Shopify store data and your Supercycle circular operations.
* **Familiar interface** — Your team already knows how to use Sidekick, so there's nothing new to learn.
## What's next
We'll keep widening the surface area Sidekick can reach in Supercycle — more read tools, and more conversational actions that hand the merchant straight to the right page in the app to confirm a change.
# Overview
Source: https://docs.supercycle.com/ai/support/overview
Get instant answers about Supercycle setup, features, and troubleshooting
Supercycle includes a built-in AI assistant that helps you get answers about the platform without leaving the documentation. Ask questions in the search bar and get responses grounded in our actual docs.
You can also connect the [Builders MCP](/ai/builders-mcp/overview) to your preferred AI tool to ask questions from Claude, ChatGPT, Cursor, or any MCP-compatible client.
## Getting started
The AI assistant is available directly in the documentation search. Click the search bar at the top of any page and type your question. Answers are generated from Supercycle's documentation, so they reflect the latest platform capabilities.
For AI tools outside the docs, connect the Builders MCP using the [setup guide](/ai/builders-mcp/setup).
***
## Example questions
### Setting up methods
How do I set up calendar rentals on my Supercycle store? Walk me through the product setup and configuration options.
What's the difference between item-based and credit-based membership plans? How do I decide which one to use?
How do deposits work with subscription rentals? How do I set them up and what happens when the customer returns the item?
Can I offer resale on the same products that I rent out? How does that work with inventory?
### Managing operations
What are the different cycle statuses in Supercycle? Walk me through the fulfillment and receival phases.
How do returns work in Supercycle? What's the difference between collection and return label methods?
A customer's subscription payment failed. How does dunning work and what are my options for collecting payment?
How does Supercycle's allocation algorithm (Ally) decide which item to assign to a rental? Can I override it?
### Configuration and logistics
What are logistics buffers and how do they affect rental availability? Walk me through preparation time, delivery time, and restock time.
What checkout validation rules does Supercycle apply automatically? How do I make sure customers can't checkout with conflicting items?
What Supercycle triggers and actions are available in Shopify Flow? Give me examples of useful automations I can set up.
How do I serialize my inventory in Supercycle? What are the differences between QR codes, barcodes, and RFID tags?
### Storefront and customer experience
How do I set up the customer portal so my customers can view their rentals and initiate returns?
How do I show rental pricing on my product pages? Are there code snippets for displaying recurring payment information?
How do I add availability search to my storefront so customers can filter products by rental dates?
***
## Tips for better answers
* **Be specific about your method** - Mention whether you're asking about calendar, subscription, membership, or resale
* **Include context** - Tell the AI what you're trying to achieve, not just what feature you're asking about
* **Ask follow-up questions** - Dig deeper into topics by asking clarifying questions
* **Reference your setup** - Mention your current configuration to get more relevant guidance
# Authentication
Source: https://docs.supercycle.com/api-reference/admin/authentication
All Supercycle API calls require authentication via an API key, which can be generated from the Supercycle Admin interface.
## Creating an API key
In your Shopify admin, navigate to **Supercycle** > **Settings** > **API**.
Select **Create API key**.
Give your new API key a name and hit **Create API key**.
## Authenticating requests with API key
Requests are authenticated via bearer auth and expect the API token to be set in the request headers.
```bash theme={null}
curl https://app.supercycle.com/api/v1/items \
-H 'Authorization: Bearer 8fe395...7ba7'
```
# Variant availability timeline
Source: https://docs.supercycle.com/api-reference/admin/availabilitytimelines/variant-availability-timeline
https://app.supercycle.com/docs/openapi-v1.yml get /availability_timelines
Returns per-day available inventory counts for a variant over a forward window.
# Create a blocked date
Source: https://docs.supercycle.com/api-reference/admin/blockeddates/create-a-blocked-date
https://app.supercycle.com/docs/openapi-v1.yml post /blocked_dates
Creates a manually blocked date range for an item, variant, product, or the entire store.
Rental scheduling blocks cannot be created through this endpoint.
Specify the resource with `resourceType` and `resourceId` (Supercycle internal IDs).
Calendar dates are inclusive; omit `from` or `to` for open-ended blocks.
# Get a blocked date
Source: https://docs.supercycle.com/api-reference/admin/blockeddates/get-a-blocked-date
https://app.supercycle.com/docs/openapi-v1.yml get /blocked_dates/{blockedDateId}
Returns a single manually blocked date range by ID.
# List blocked dates
Source: https://docs.supercycle.com/api-reference/admin/blockeddates/list-blocked-dates
https://app.supercycle.com/docs/openapi-v1.yml get /blocked_dates
Returns manually blocked date ranges for items, variants, products, and the entire store.
Rental scheduling blocks are excluded; only merchant-created blocked dates are returned.
Use the `activeFrom` and `activeTo` filters to find blocked dates that overlap a calendar window.
For incremental sync, use the `updated` filter together with `updatedAt` on each record.
# List all conditions
Source: https://docs.supercycle.com/api-reference/admin/conditions/list-all-conditions
https://app.supercycle.com/docs/openapi-v1.yml get /conditions
Returns a list of conditions.
# List custom field definitions
Source: https://docs.supercycle.com/api-reference/admin/customfielddefinitions/list-custom-field-definitions
https://app.supercycle.com/docs/openapi-v1.yml get /custom_field_definitions
Returns a list of custom field definitions filtered by owner type.
# Retrieve a custom field definition
Source: https://docs.supercycle.com/api-reference/admin/customfielddefinitions/retrieve-a-custom-field-definition
https://app.supercycle.com/docs/openapi-v1.yml get /custom_field_definitions/{id}
Returns details of a specific custom field definition.
# Create a custom field
Source: https://docs.supercycle.com/api-reference/admin/customfields/create-a-custom-field
https://app.supercycle.com/docs/openapi-v1.yml post /custom_fields
Create a custom field on an item or rental. Specify the definition either by definitionId, or by key and ownerType.
# Delete a custom field
Source: https://docs.supercycle.com/api-reference/admin/customfields/delete-a-custom-field
https://app.supercycle.com/docs/openapi-v1.yml delete /custom_fields/{id}
Delete an existing custom field.
# Update a custom field
Source: https://docs.supercycle.com/api-reference/admin/customfields/update-a-custom-field
https://app.supercycle.com/docs/openapi-v1.yml put /custom_fields/{id}
Update the value of an existing custom field.
# List all cycles
Source: https://docs.supercycle.com/api-reference/admin/cycles/list-all-cycles
https://app.supercycle.com/docs/openapi-v1.yml get /cycles
Returns a list of cycles given parameters. Used by merchants to see cycles due for dispatch, return etc.
For incremental sync, use the updated filter together with the updatedAt field on each cycle so you only fetch or process cycles that changed since your last request.
# Retrieve a cycle
Source: https://docs.supercycle.com/api-reference/admin/cycles/retrieve-a-cycle
https://app.supercycle.com/docs/openapi-v1.yml get /cycles/{cycleId}
View information about a single cycle. Can include timeline events if requested.
# Update a cycle
Source: https://docs.supercycle.com/api-reference/admin/cycles/update-a-cycle
https://app.supercycle.com/docs/openapi-v1.yml put /cycles/{cycleId}
Update details about a cycle - either edits or despatch/return information. Merchants may also update the Shopify order/fulfillment at the same time via the Shopify API.
# Introduction
Source: https://docs.supercycle.com/api-reference/admin/introduction
Access and manage your Supercycle data programmatically with the Admin API
The Supercycle Admin API allows you to programmatically access and manage your rental, subscription, and resale operations. Use the API to integrate Supercycle with your existing systems, automate workflows, and build custom tools for your business.
To use the Admin API, you need:
1. **API access** - Admin API access is available to merchants on our Superest, or custom plans. Contact the support team to request access.
2. **Authentication** - Generate API keys from your [Supercycle admin](https://admin.shopify.com/apps/supercycle/settings/integrations). See [Authentication](/api-reference/admin/authentication) for details.
3. **Base URL** - All API requests use the base URL: `https://app.supercycle.com/api/v1`
## API structure
The Admin API follows REST principles:
* Resources are accessed via standard HTTP methods (GET, POST, PUT, DELETE)
* Requests and responses use JSON format
* Responses include standard HTTP status codes
* [Pagination](/api-reference/admin/pagination) is available for list endpoints
## Cycles
List, fetch, and update cycles at [`/cycles`](/api-reference/admin/cycles/list-all-cycles) and [`/cycles/{cycleId}`](/api-reference/admin/cycles/update-a-cycle). These are the canonical paths.
The `/rentals` paths remain available as deprecated aliases with identical behavior. In API v1, request and response bodies still use the `Rental` schema and rental-named properties (`rentalStart`, `rentalEnd`, `reallocateConflictingRentals`, and so on). A schema rename is planned for API v2.
## Rate limits
API requests are rate limited to ensure system stability. If you exceed the rate limit, you'll receive a `429 Too Many Requests` response. Contact support if you need higher rate limits for your use case.
## Support
If you have questions or need help with the API, reach out to the Supercycle support team.
# Create an item
Source: https://docs.supercycle.com/api-reference/admin/items/create-an-item
https://app.supercycle.com/docs/openapi-v1.yml post /items
Create a new item against a product that has already been imported into Supercycle.
# List all items
Source: https://docs.supercycle.com/api-reference/admin/items/list-all-items
https://app.supercycle.com/docs/openapi-v1.yml get /items
Returns a list of items and their details given parameters. Used by merchants to view their inventory.
# Retrieve an item
Source: https://docs.supercycle.com/api-reference/admin/items/retrieve-an-item
https://app.supercycle.com/docs/openapi-v1.yml get /items/{itemId}
Returns all fields on an item. Can include timeline events if requested.
# Update an item
Source: https://docs.supercycle.com/api-reference/admin/items/update-an-item
https://app.supercycle.com/docs/openapi-v1.yml put /items/{itemId}
Update an item's serial, condition, processing status, or, in future, its metafields.
# List all locations
Source: https://docs.supercycle.com/api-reference/admin/locations/list-all-locations
https://app.supercycle.com/docs/openapi-v1.yml get /locations
Returns a list of locations.
# Pagination
Source: https://docs.supercycle.com/api-reference/admin/pagination
List API methods use keyset pagination to limit the number of results returned per request
## Specifying the number of results
The `limit` can optionally be set as a parameter on requests to list endpoints to set the maximum number of results to return. Limit can range between 1 and 100, and the default is 50.
```bash theme={null}
curl https://app.supercycle.com/api/v1/items?limit=10
```
## Requesting the next page
The response object for list endpoints will include a `nextPage` attribute. The value returned is a cursor
token which can be used to fetch the next page of results.
If the value of `nextPage` is `null` then you have reached the last page of the results.
To request the next page, include the token in the `page` parameter of the request.
```bash theme={null}
curl https://app.supercycle.com/api/v1/items?page=d97b06f29a0
```
# Create calendar method option
Source: https://docs.supercycle.com/api-reference/admin/products/create-calendar-method-option
https://app.supercycle.com/docs/openapi-v1.yml post /products/{productId}/calendar_method/options
Creates an option for a product's calendar method. If the method does not exist, it is created first.
# Create membership method option
Source: https://docs.supercycle.com/api-reference/admin/products/create-membership-method-option
https://app.supercycle.com/docs/openapi-v1.yml post /products/{productId}/membership_method/options
Creates an option for a product's membership method. If the method does not exist, it is created first.
# Create or update calendar method
Source: https://docs.supercycle.com/api-reference/admin/products/create-or-update-calendar-method
https://app.supercycle.com/docs/openapi-v1.yml post /products/{productId}/calendar_method
Creates or updates a calendar method for a product.
# Create or update membership method
Source: https://docs.supercycle.com/api-reference/admin/products/create-or-update-membership-method
https://app.supercycle.com/docs/openapi-v1.yml post /products/{productId}/membership_method
Creates or updates a membership method for a product.
# Create or update resale method
Source: https://docs.supercycle.com/api-reference/admin/products/create-or-update-resale-method
https://app.supercycle.com/docs/openapi-v1.yml post /products/{productId}/resale_method
Creates or updates a resale method for a product.
# Create or update subscription method
Source: https://docs.supercycle.com/api-reference/admin/products/create-or-update-subscription-method
https://app.supercycle.com/docs/openapi-v1.yml post /products/{productId}/subscription_method
Creates or updates a subscription method for a product.
# Create resale method option
Source: https://docs.supercycle.com/api-reference/admin/products/create-resale-method-option
https://app.supercycle.com/docs/openapi-v1.yml post /products/{productId}/resale_method/options
Creates an option for a product's resale method. If the method does not exist, it is created first.
# Create subscription method option
Source: https://docs.supercycle.com/api-reference/admin/products/create-subscription-method-option
https://app.supercycle.com/docs/openapi-v1.yml post /products/{productId}/subscription_method/options
Creates an option for a product's subscription method. If the method does not exist, it is created first.
# Import products
Source: https://docs.supercycle.com/api-reference/admin/products/import-products
https://app.supercycle.com/docs/openapi-v1.yml post /products
Import Shopify products into Supercycle by list.
# List all products
Source: https://docs.supercycle.com/api-reference/admin/products/list-all-products
https://app.supercycle.com/docs/openapi-v1.yml get /products
Returns a list of all products in Supercycle. Likely to be used in conjunction with Shopify API to display information about the products.
# List all rentals (deprecated alias of /cycles)
Source: https://docs.supercycle.com/api-reference/admin/rentals/list-all-rentals-deprecated-alias-of-cycles
https://app.supercycle.com/docs/openapi-v1.yml get /rentals
Returns a list of rentals given parameters. Used by merchants to see rentals due for dispatch, return etc.
For incremental sync, use the updated filter together with the updatedAt field on each rental so you only fetch or process rentals that changed since your last request.
# Retrieve a rental (deprecated alias of /cycles/{cycleId})
Source: https://docs.supercycle.com/api-reference/admin/rentals/retrieve-a-rental-deprecated-alias-of-cycles-
https://app.supercycle.com/docs/openapi-v1.yml get /rentals/{rentalId}
View information about a single rental. Can include timeline events if requested.
# Update a membership credit
Source: https://docs.supercycle.com/api-reference/admin/rentals/update-a-membership-credit
https://app.supercycle.com/docs/openapi-v1.yml put /membership_credits/{membershipCreditId}
Return (recredit) or reclaim a membership credit on a rental. Set status to `returned` to credit the customer back, or `unreturned` to reclaim a previously returned credit.
# Update a rental (deprecated alias of /cycles/{cycleId})
Source: https://docs.supercycle.com/api-reference/admin/rentals/update-a-rental-deprecated-alias-of-cycles-
https://app.supercycle.com/docs/openapi-v1.yml put /rentals/{rentalId}
Update details about a rental - either edits or despatch/return information. Merchants may also update the Shopify order/fulfillment at the same time via the Shopify API.
# Create a return
Source: https://docs.supercycle.com/api-reference/admin/returnorders/create-a-return
https://app.supercycle.com/docs/openapi-v1.yml post /return_orders
Create a return by items. Return line statuses and conditions can be specified. If an item is in an existing return and has not active rentals, the endpoint updates the return line. If the item has multiple active rentals, the rental ID must be specified (return rental IDs with error).
# List all returns
Source: https://docs.supercycle.com/api-reference/admin/returnorders/list-all-returns
https://app.supercycle.com/docs/openapi-v1.yml get /return_orders
Get a list of returns, their details and items, given parameters. Used by merchants to list registered returns to start, or check if an item already exists in a return.
# Retrieve a return
Source: https://docs.supercycle.com/api-reference/admin/returnorders/retrieve-a-return
https://app.supercycle.com/docs/openapi-v1.yml get /return_orders/{returnOrderId}
View information about a return. Can include timeline events if requested.
# Update a return
Source: https://docs.supercycle.com/api-reference/admin/returnorders/update-a-return
https://app.supercycle.com/docs/openapi-v1.yml put /return_orders/{returnOrderId}
Update the status of a return and its return lines. Allows updating the overall return order status and individual return line statuses.
# Create a timeline comment
Source: https://docs.supercycle.com/api-reference/admin/timelinecomments/create-a-timeline-comment
https://app.supercycle.com/docs/openapi-v1.yml post /timeline_comments
Creates a new comment associated with a timeline event for a specific resource in a shop. The resource must belong to the authenticated shop.
# Delete a timeline comment
Source: https://docs.supercycle.com/api-reference/admin/timelinecomments/delete-a-timeline-comment
https://app.supercycle.com/docs/openapi-v1.yml delete /timeline_comments/{id}
Deletes a timeline comment event for a specific shop. Only events with type 'comment' can be deleted.
# Availability log
Source: https://docs.supercycle.com/api-reference/storefront/availability-log
GET /{proxy_path_prefix}/availability_log
Fetch intra-day-precise availability for a variant, for hourly and time-slot booking.
Returns a sparse, **intra-day-precise** change log of how many items are available for a variant, spanning from the earliest possible rental start through 12 months. Use this instead of the [availability timeline](/api-reference/storefront/availability-timelines) when you need time-of-day precision, for example to build hourly or time-slot pickers.
The `occupancy` array is a chronological list of change points. Each `{ at, available }` entry means that from `at` onward, `available` items are free, until the next entry. The first entry is the opening level, and a trailing entry with `available` of `0` marks the end of the bookable window. Because availability only changes at a handful of instants, the array stays small.
`at` is a shop-local, offset-free timestamp (`YYYY-MM-DDTHH:MM:SS`). Interpret it in the shop's timezone; do not apply a UTC offset.
The counts already account for the selected delivery and return methods, including their preparation and restock times. These turnaround times can be configured in hours, so an item that comes back at 14:00 with a 6-hour restock will not become available again until 20:00, and a slot earlier that evening will report as unavailable.
# Availability timeline
Source: https://docs.supercycle.com/api-reference/storefront/availability-timelines
GET /{proxy_path_prefix}/availability_timelines
Fetch the availability of a variant across a date window.
Returns a day-by-day count of available items for a variant, spanning from the earliest possible rental start date through 12 months. Use this to build a date picker that disables fully booked days.
The `occupancy` object maps each date to the number of available items on that day. A value of `0` means fully booked.
# Intent
Source: https://docs.supercycle.com/api-reference/storefront/intent
POST /{proxy_path_prefix}/intents
Create a rental intent for a variant, including any add-ons, through the Storefront API
Returns the form attributes required to turn a line item into a Cycle when added to the cart.
Each rental method (subscription, membership, calendar, resale) stores its options in a product metafield. Every option has a `global_id` that is passed to this endpoint.
| Metafield | Method |
| ---------------------------------------------------------- | ------------ |
| `product.metafields.supercycle.calendar_configuration` | Calendar |
| `product.metafields.supercycle.subscription_configuration` | Subscription |
| `product.metafields.supercycle.membership_configuration` | Membership |
| `product.metafields.supercycle.resale_configuration` | Resale |
The options array within each metafield contains a `global_id` for each option:
```json theme={null}
{
"rental_periods": [
{ "global_id": "gid://supercycle/CalendarRental::RentalPeriod/1" },
{ "global_id": "gid://supercycle/CalendarRental::RentalPeriod/2" }
]
}
```
Once you have the variant ID and option `global_id`, call this endpoint to get the attributes that need to be attached to the line item so Supercycle processes it as a Cycle.
The response `attributes` object contains key-value pairs that must be included when submitting the add-to-cart form. Each entry should be added as a hidden input on the product form, or included in the request body when submitting via AJAX. See [Cycle line item property](/developers/line-items/cycle-line-item-properties) and [Validations line item property](/developers/line-items/validations-line-item-property) for the full schema.
**Hidden inputs:**
```js theme={null}
Object.entries(intent.attributes).forEach(([name, value]) => {
const input = document.createElement("input");
input.type = "hidden";
input.name = name;
input.value = value;
addToCartForm.appendChild(input);
});
```
**AJAX (fetch):**
```js theme={null}
const formData = new FormData(addToCartForm);
Object.entries(intent.attributes).forEach(([name, value]) => {
formData.set(name, value);
});
await fetch("/cart/add.js", { method: "POST", body: formData });
```
## Add-ons
`add_ons` are additional variants that must be submitted in the same request using Shopify's [multiple items cart API](https://shopify.dev/docs/api/ajax/reference/cart#post-locale-cart-add-js) format. Each add-on property (except `cart_quantity`) should be included as `items[n][property]`:
```js theme={null}
// Example for a single add-on
// items[0][id] = 4321
// items[0][quantity] = 1
// items[0][selling_plan] = 1234
intent.add_ons.forEach(({ cart_quantity, ...addOnAttributes }, index) => {
Object.entries(addOnAttributes).forEach(([key, value]) => {
formData.set(`items[${index}][${key}]`, value);
});
});
```
`cart_quantity` is not submitted — it is the maximum total quantity of that variant that should be present in the cart. Before adding the add-on, check the current cart to see if the variant is already there and skip if the quantity would exceed `cart_quantity`.
# Introduction
Source: https://docs.supercycle.com/api-reference/storefront/introduction
Merchants wishing to create custom frontend experiences and workflows can integrate with our Storefront API.
Our new Storefront API is currently under development. We can work closely with your team on Slack for custom implementations.
Storefront API access is only available to select merchants. To request access, reach out to the support team.
# Product availability
Source: https://docs.supercycle.com/api-reference/storefront/product-availability
POST /{proxy_path_prefix}/product_availability_checks
Fetch the availability of variants for a given set of products.
# Requests
Source: https://docs.supercycle.com/api-reference/storefront/requests
Making storefront API requests to Supercycle.
To make requests to Supercycle’s storefront API, you will need to go through the [app proxy](https://medium.com/shop-sheriff/what-is-a-shopify-application-proxy-and-how-can-i-use-it-153bf99d1a9d).
The path for this can be found with `window.supercycleAppEmbed.context.proxyPathPrefix` and will usually look like `/apps/supercycle` this will need to be prepended to all requests made to the storefront API.
```javascript theme={null}
async function supercycleFetch(method, path, options) {
if (!path.startsWith("/")) path = `/${url}`;
const { proxyPathPrefix } = window.supercycleAppEmbed.context
const response = await fetch(proxyPathPrefix + path, {
method,
headers: { "Content-Type": "application/json" },
...options,
});
return response.json();
}
```
# API changelog
Source: https://docs.supercycle.com/changelog/api
Updates to the Supercycle Admin and Storefront APIs.
## Filter cycles by `fulfilledAt` date range
[`GET /cycles`](/api-reference/admin/cycles/list-all-cycles) (and the deprecated `/rentals` alias) now accepts a `fulfilledAt` filter with `gte`, `gt`, `lte`, and `lt` operators for the actual fulfillment timestamp, alongside the existing `receivedAt`, `receiveAt`, `rentalStart`, `created`, and `updated` filters.
Query cycles fulfilled within a specific window — useful for syncing dispatch records to an external system or reporting on what shipped in a period.
```
GET /api/v1/cycles?fulfilledAt[gte]=2026-08-01T00:00:00Z&fulfilledAt[lt]=2026-08-09T00:00:00Z
```
## Incremental sync picks up leg field changes
Fulfillment and receival timestamps live on leg rows, not the cycle row itself. When a cycle is marked fulfilled or received, Supercycle now bumps the cycle's `updatedAt` so [`updated[gte]`](/api-reference/admin/cycles/list-all-cycles) incremental sync catches the change even when no other cycle fields were written.
If you poll with `updated[gte]`, cycles that transition to fulfilled or received will appear in the next page without needing a separate `fulfilledAt` or `receivedAt` filter.
## Override `prepareFrom` and `restockBy` on a cycle
`PUT /api/v1/rentals/{id}` now accepts `prepareFrom` and `restockBy` alongside the existing scheduling fields. Set either to override the buffer date computed from the shop's [logistics buffers](/documentation/configuration/logistics/buffers) for that cycle, or pass `null` to revert to the automatic date.
```
PUT /api/v1/rentals/123
{
"prepareFrom": "2026-07-14",
"restockBy": null
}
```
The override sticks until the leg's anchor date (`fulfilledAt` or `receivedAt`) next moves, at which point Supercycle recomputes both dates from the shop's buffers. Values outside the receive/fulfil bounds are accepted; unparseable dates return `422` with the validation reason in the response body.
The same fields are exposed on the [`update_cycle` MCP tool](/ai/operators-mcp/tools#cycles) and the [**Update cycle** Shopify Flow action](/documentation/manage/automation/automation#update-cycle).
## Blocked dates on the Admin API
List, fetch, and create manually blocked date ranges on items, variants, and products through the [Admin API](/api-reference/admin/introduction). Rental scheduling blocks are excluded, matching the admin blocked dates index.
**List blocked dates:** `GET /api/v1/blocked_dates` with filters for `resourceType`, `itemId`, `shopifyVariantId`, `shopifyProductId`, `activeFrom` / `activeTo` (overlap with a calendar window), `search` (description), and `created` / `updated` date ranges.
**Fetch a blocked date:** `GET /api/v1/blocked_dates/:id` returns the block with nested resource details.
**Create a blocked date:** `POST /api/v1/blocked_dates` accepts `resourceType`, `resourceId`, optional `from` / `to` dates, and an optional `description`. Open-ended ranges (no `from` or no `to`) are supported.
```
POST /api/v1/blocked_dates
{
"resourceType": "Item",
"resourceId": 123,
"from": "2026-01-01",
"to": "2026-01-07",
"description": "Maintenance"
}
```
* Shop logistics settings now expose `preparationDuration` and `restockDuration` as serialized duration values (e.g. `6.hour`, `2.day`) instead of whole-day integers, enabling sub-day buffer configuration via the API.
* Custom field definitions accept `owner_type=consignor` when consignment is enabled for the store.
## Filter rentals by `receivedAt` date range
`GET /rentals` now accepts a `receivedAt` filter (with `gte`, `gt`, `lte`, `lt` operators) for the actual receival timestamp, alongside the existing `receiveAt`, `rentalStart`, `created`, and `updated` filters.
Query rentals received within a specific window, useful for keeping an external system in sync on when items actually came back, not just when they were due.
```
GET /api/v1/rentals?receivedAt[gte]=2026-06-01T00:00:00Z&receivedAt[lt]=2026-06-09T00:00:00Z
```
## Recredit a membership credit via the API
`PUT /membership_credits/{id}` recredits or reclaims a customer's membership credit when you receive a rental back. This is the same action available in the admin.
The v1 Rental response now includes a `membershipCredit` object (id, credit cost, status, return condition), so you can find the credit and its status without a second call.
* `create_charge` accepts an optional `payment_collector_status` (defaults to `active`), so you can create a charge whose collection starts in a non-active state.
* Remove a line item from a subscription contract via the Admin GraphQL draft flow.
## Rental intent tokens are being retired
We're retiring rental intent tokens.
If your integration creates or reads rental intent tokens, plan to migrate off them. To migrate early, or to delay the migration, contact support.
## Item location on the Admin API
`GET`, `PUT`, and update an item's location via the [Admin API](/api-reference/admin/items/update-an-item).
Keep an external WMS or OMS in sync with where each unit physically lives, without anyone editing locations by hand in the admin.
## Create timeline events via the Admin API
Add comments to an Item, Rental, or ReturnOrder through the [Admin API](/api-reference/admin/timelinecomments/create-a-timeline-comment).
Push context from your own systems (an inspection note, a 3PL update) straight onto the record's timeline, so the full history lives in one place.
## Storefront API is now in beta
The [Storefront API](/api-reference/storefront/introduction) is available in beta on request.
Build a fully custom rental storefront with your own availability, cart, and checkout flows. Request access from support.
# Platform changelog
Source: https://docs.supercycle.com/changelog/platform
Updates and improvements to the Supercycle platform.
## Date picker blocked dates
Block which dates customers can pick on the storefront calendar from **Settings** → **Channels** → **Online store**. [Date picker blocked dates](/documentation/online-store/date-picker-blocks) replace hand-written DayPicker JSON in the Methods theme block for most stores.
Add rules for a specific date, a date range, every date before or after a cut-off, or recurring days of the week. Each rule targets start dates, end dates, or both. Rules apply store-wide wherever the Methods calendar renders on the online store.
These blocks only gate date selection — they do not change inventory availability like [Blocked dates](/documentation/manage/inventory/blocked-dates). Existing theme JSON in **Unavailable start dates** / **Unavailable end dates** still works and stacks with admin rules until those fields are removed.
* **Checkout and account requirements.** Unsigned [e-signature contracts](/documentation/configuration/risk/esignatures) now appear alongside [ID verification](/documentation/configuration/risk/identity-verification) in the **Checkout requirements** thank-you block and on the customer account **Requirements** page.
* **Admin API cycle paths.** [`/cycles`](/api-reference/admin/cycles/list-all-cycles) is now the canonical Admin API path for listing, fetching, and updating cycles; `/rentals` remains as a deprecated alias with identical behavior and unchanged request/response schemas in v1.
* **Filter cycles by fulfillment date.** [`GET /cycles`](/api-reference/admin/cycles/list-all-cycles) accepts a `fulfilledAt` date-range filter, and `updated[gte]` incremental sync now includes cycles when only fulfillment or receival timestamps change.
## Inventory schedule
See how each variant is booked day by day from a new [Schedule](/documentation/manage/inventory/schedule) view under Inventory. Spot gaps, conflicts, and booked-out periods without opening individual items or cycles.
Each cell shows booked time, buffer turnaround, and booked-out days. Click a day to see the cycles and blocked dates behind the count. Filter by proposed cycle dates, delivery method, and return method, or jump the window with the date range control.
## Add-ons on POS rentals
[Add-ons](/documentation/manage/products/add-ons) applied to a rental option now follow through on [Shopify POS](/documentation/point-of-sale/pos-overview). When staff apply a rental method, any required or optional add-ons returned by the intent are added to the cart with the rental line, matching the online storefront. That covers deposits, damage protection, card authorisation, and any other add-on attached to the option.
* **Draft-order contracts.** Turn on **Generate contracts for draft orders** under [Settings → Risk](/documentation/configuration/risk/esignatures) and unsigned contracts are created while a draft is still open, then reused when the order is placed. On POS, staff can list a draft's contracts, share a QR or signing link, and email the customer before checkout completes.
* **Complete your purchase in the return reminder.** When [convert to purchase](/documentation/manage/cycles/convert-to-purchase) is enabled and a rental is eligible, the [return item reminder](/supercycle-notifications) email includes a **Complete your purchase** button that takes the customer to their account to finish the conversion.
* **System fields in calculated formulas.** [Calculated fields](/documentation/configuration/custom-data/calculated-fields) can reference built-in item and cycle values such as completed cycles, acquisition cost, lifecycle revenue, ROI, utilization, schedule dates, charges, and deposits, without stuffing those into custom fields first. The formula picker lists them alongside your custom-field variables.
## Per-location opening hours and time selection
Customers can now choose a **pick-up or drop-off time** when they book, and the times they see come from each location's own [opening hours](/documentation/configuration/logistics/opening-hours). A city-centre store and a warehouse can each offer their real hand-off windows.
Set weekly opening hours per location from the locations table under **Settings** > **Logistics and locations**, edit them one at a time or in bulk, and mark which locations offer in-person pick up and drop off. Turn on **time selection** for the pick up or drop off method and pick a slot interval (15 minutes, 30 minutes, or 1 hour). On the storefront, the time picker is built from the selected location's window for the chosen day, days a location is closed can't be selected for that hand-off, and the location picker shows each location's weekly hours.
## Edit restock by and prepare from dates on a cycle
Override the preparation and restock buffer dates for an individual cycle when a specific rental needs more or less turnaround than your shop-wide [logistics buffers](/documentation/configuration/logistics/buffers) would give it.
The **Outbound fulfillment** card now has an **Edit prepare from date** action, and the **Inbound receival** card has an **Edit restock by date** action. Both let you set the date directly or **Revert to automatic date** to recalculate from the shop's preparation or restock buffer. The date you set sticks until the leg's anchor date next moves.
The same overrides are available from the [`update_cycle` MCP tool](/ai/operators-mcp/tools#cycles), the [**Update cycle** Shopify Flow action](/documentation/manage/automation/automation#update-cycle), and the [Update a cycle](/api-reference/admin/cycles/update-a-cycle) endpoint on the Admin API, each accepting `prepare_from` / `restock_by` (or `prepareFrom` / `restockBy`) alongside the existing fields. Pass an empty value to revert either date to the automatic calculation.
* **Reserve draft order inventory automatically.** Rentals added to a Shopify [draft order](/documentation/manage/cycles/edit-an-order#reserving-rental-inventory-on-a-draft-order) are now held automatically while the draft is still unpaid, so a unit can't be double-booked before the customer pays, with no need to turn on Shopify's Reserve items by hand. Control it from **Settings** > **Channels** > **Draft orders**, where you can toggle the behavior and set how long the hold lasts (7 days by default).
* **See why a cycle's dates conflict.** When a cycle's dates clash with the selected item or variant, the overview card now spells out the cause instead of just flagging that a conflict exists. It reads whether the dates are taken by another rental, blocked by [blocked dates](/documentation/manage/inventory/blocked-dates), or both, and whether that applies to the assigned item or across the whole variant pool (for example, "It's booked for another rental" versus "All items have blocked dates").
* **Start and end dates on every Supercycle order.** Orders created from the admin's **Add rentals** flow, the **Create order** page, and [CSV import](/documentation/setup/importing-products) now carry the same human-readable **Start date** and **End date** line item properties that online-store orders have always had, so the rental period is legible wherever the order appears. A related fix keeps [POS](/documentation/point-of-sale/pos-overview) rental dates from drifting a day across time zones.
## Expanded analytics dashboards
Supercycle's built-in [Analytics](/documentation/manage/analytics/dashboards) has grown from a single beta view into a full set of dashboards reporting on metrics you can't get from native Shopify, calculated directly from your cycles, items, and charges.
Dashboards are grouped by what you're measuring:
* **Overview, Calendar, Subscriptions, Memberships, and Resale** track cycle throughput and, for recurring methods, billing health like failed charges and churn.
* **Revenue and Charges** cover circular revenue, growth, collection rates, and outstanding balances.
* **Items, Products, and Customers** surface the circular economics: fleet utilization, yield, lifecycle revenue and ROI, age of stock, and customer lifetime value.
Every dashboard is scoped by a date range, each metric drills into a ranked table or detailed chart, and any card exports to CSV. Item, product, and customer detail pages also gain an inline **Performance** card showing that record's key numbers, and **Ask AI** opens Shopify [Sidekick](/ai/sidekick/shopify-sidekick) for questions that need more context than a chart.
## Calculated custom fields
Turn the data you already capture into insight. [Calculated fields](/documentation/configuration/custom-data/calculated-fields) are read-only custom fields whose value is computed from a [Liquid](https://shopify.dev/docs/api/liquid) formula, so you can express business logic directly against your items, cycles, and consignors, no code required.
A single formula can reference:
* Any scalar Supercycle custom field on the record (`fields.`), and on cycles also the rented item's fields (`item.fields.`).
* The linked Shopify variant's `price` and `unit_cost`, plus variant and product metafields (`variant.metafields.`, `variant.product.metafields.`).
That combination unlocks metrics that used to live in spreadsheets:
* **Utilization**: miles or hours completed during a cycle, and a running total on the item across every cycle.
* **Unit economics**: revenue-per-cycle, margin, and time-to-breakeven derived from acquisition cost and average revenue per cycle.
* **Operational flags**: booleans that light up when an item hits a service interval, has broken even, or exceeds a replacement-cost threshold.
Formulas support the full Liquid toolkit: filters like `plus`, `times`, `divided_by`, `default`, and `date`; control flow with `{% if %}` and `{% case %}`; and intermediate values with `{% assign %}`. Values recalculate on demand via a **Recalculate** button on each field, so you always know when a number reflects the latest inputs.
## Custom fields on POS rentals
Fill in [rental custom fields](/documentation/configuration/custom-data/custom-fields) as part of the [create rentals flow on POS](/documentation/point-of-sale/pos-overview#custom-fields-on-pos-rentals), so in-store bookings capture the same data as rentals created from the admin.
Single line and multi line text field definitions render on the POS rental method screen (multi line as a text area). Values flow through to the cycle at ingestion and land on the rental record just like a field set from admin. Other field types (date, boolean, references, etc.) are hidden on POS.
## Add-ons
Offer extras like damage protection, cleaning, or accessories alongside your rentals. [Add-ons](/documentation/manage/products/add-ons) live under **Products > Add-ons** — Supercycle owns the hidden Shopify product and syncs each price as a variant.
Apply an add-on to any Calendar, Membership, Subscription, or Resale option with a price and an **Optional** or **Required** setting, or bulk-apply across many options at once. Selected add-on variants are added to the cart alongside the rental, and are recorded against the fulfilled rental at their sold price so they flow through to charges and reporting.
## Reserve rental inventory on draft orders
Turn on Shopify's **Reserve items** on a draft order containing a rental, and Supercycle holds the picked unit for the rental window so nothing else can book it while the draft is unpaid. See [Edit cycles on order](/documentation/manage/cycles/edit-an-order#reserving-rental-inventory-on-a-draft-order).
The block releases automatically when the reserve is turned off, the draft is paid or cancelled, the rental line is removed, or the reserve expires. Changing the rental dates on the draft refreshes the held window.
## Finance comes to items
We're rolling out deeper finance reporting and controls for items, starting with acquisition costs and lifetime ROI.
Record acquisition cost and lifetime costs in a new Finance card on the item page. **Total ROI** appears alongside your existing analytics tiles, calculated as lifecycle revenue minus acquisition cost minus lifetime costs.
## Consignment
Sell stock owned by brand partners and track the revenue share you owe them. [Consignment](/documentation/manage/consignment/overview) is currently in beta and off by default. Contact support to request access.
Add consignors, assign items, and set a default revenue share (with per-item overrides). Supercycle builds a running balance as their items are paid for, reverses it on refunds, and lets you record payouts to settle up. Consignors can follow their balance, activity, and payouts in their own portal.
## Revamped Scanner app
The [Supercycle Scanner app](/documentation/manage/scanner/scanner) on iOS and Android has been rebuilt from the ground up, with a new design, faster workflows, and clearer bulk scanning on Zebra devices.
Lists for items, cycles, and returns use a cleaner layout with status pills and quick filters. Detail screens group the information you need into scannable cards, and you can edit serial numbers, pick locations, and warehouse assignments inline without leaving the page.
**Choose your scanner.** Turn camera, Zebra barcode, and Zebra RFID on or off independently from **Settings → Scanners**. The camera opens a single-item flow: scan a tag and jump straight to the item, cycle, or return. Zebra barcode and RFID start a multi-scan session: keep scanning to build a list, then run [bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions) across the selection (receive return, set visibility, warehouse, pick location, change product, or create items from unknown tags).
* Newly created items resolve instantly in a multi-scan session (no re-scan needed).
* Tap a matched row to open its detail page from the multi-scan list.
* RFID reads that pick up multiple tags at once are split into one item per tag.
## Hourly pick-up and drop-off slots
Set preparation and restock buffers in hours (not just whole days), and the storefront calendar greys out pick-up and drop-off times when nothing is free at that instant.
Sub-day buffers unlock tighter scheduling for in-store handover: a six-hour prep window or a two-hour restock no longer has to round up to a full day. When a customer picks a start or end date, unavailable time slots are disabled and the selection advances to the first free slot.
* The methods app block now shows **Total first payment** (deposit + recurring) when a subscription rental has a deposit, not just the recurring amount alone.
* Calendar availability filtering is faster on stores with large variant catalogs.
## Ask Sidekick about your cycles
[Shopify Sidekick](/ai/sidekick/shopify-sidekick) can now search your Supercycle data and include products in your catalog without leaving Shopify admin.
Ask natural-language questions about cycles, customers, and return orders, such as what's overdue, who's a subscriber, or which returns are still expected. Sidekick can also start the **Include in Supercycle** flow for an existing Shopify product, so you can set it up for cycles conversationally.
## Custom fields, upgraded
Define more field types on items and cycles (integer, color, URL, JSON, and item references) and edit values in a Shopify-style read-only box that opens a click-to-edit popover. See [Custom data](/documentation/configuration/custom-data/custom-fields).
Reference fields link straight to the related record. The type picker is grouped into sections (Text, Reference, Number, Date and time, Other, Advanced) so it's easier to find the right type when you're setting up a new definition.
## Extend a cycle
Lengthen an active calendar cycle without cancelling and rebooking, from the admin, or by the customer from their own account.
A customer who wants to keep an item a little longer can extend it and pay the difference themselves, instead of emailing you to sort it out. From the admin you can extend any cycle, override the charge, and set a custom end date. Let customers do it themselves by turning on extensions in **Settings → Customer accounts → Cycle actions**.
* **Block dates now support times:** set a block to a specific time (not just a whole day), give it a description, and import or export blocks in bulk via CSV.
* Bulk-update the product or variant for many selected items at once.
* New **Mark as received** action on receivals, split out from **Create return** for quicker handling.
* Add a brand-new customer while creating an order, not just pick an existing one.
* The method options CSV import/export now includes **ID verification** and **Contract** columns.
* New Shopify Flow action: **Create a payment attempt**.
## Pick up and drop off return methods
Customers can now choose how they return an item (ship it back or drop it off), and you can run pickup/drop-off only by switching shipping off.
Return logistics now mirror delivery: the storefront shows a return method picker when more than one is enabled, and availability and scheduling follow the customer's choice, so each return is scheduled on the right timeline. Stores that only do in-person handover can disable shipping entirely, as long as one delivery and one return method stay on.
## Request ID verification from the admin
Trigger an ID verification straight from a customer's page, and manage the whole feature from a new section under **Settings → Risk**.
You no longer have to wait for a customer to hit a verification gate at checkout. If something looks off, request [identity verification](/documentation/configuration/risk/identity-verification) yourself, and Supercycle applies the **ID Verification Required** tag just like the automatic flow.
* **Managed deposits:** add your deposit prices under **Settings → Risk** and Supercycle creates and manages the deposit product and its variants for you.
* Deposit cart validation is now enforced at checkout completion, not just in the cart.
* Custom SMTP now retries transient send failures, so a brief blip on your mail server doesn't drop a customer email.
* New `checkout_context` metafield passes Supercycle's view of the cart to checkout UI extensions.
## Send emails from your own domain
Configure [custom SMTP in settings](/supercycle-notifications#custom-smtp) and customer emails go out from your domain instead of ours.
Emails sent from your own domain reinforce your brand and give you control over your own sender reputation. Turn it on in **Settings → Emails**.
## Block dates for items, variants or products
Block availability for a specific item, for every item on a variant, or for every item across a whole product. Set a from and to date, or leave them blank for an indefinite block.
Perfect for store closures, scheduled servicing, or a venue going offline for a weekend. Stock you can't fulfil stops being bookable, so you avoid orders you'd have to cancel.
## Cart timer
[Automatically remove Supercycle items](/documentation/online-store/cart-timer) from customers' carts after a set time.
Rental stock is finite, and an abandoned cart can hold a unit hostage. Auto-expiry returns held inventory to the pool, reducing the chance of overbooking.
* New Shopify Flow triggers for **ID verification** and **e-signatures**, firing when the status of an ID verification or e-signature is updated.
## E-signatures on contracts, for online store and POS
Customers can [sign contracts](/documentation/configuration/risk/esignatures) at online checkout and at the point of sale.
Every cycle now carries the same signed-contract audit trail, whether it started online or in store, so you have a clear record to fall back on if an item comes back damaged or late.
* New Shopify Flow triggers and actions: new triggers for cycles, memberships, returns, and failed charges, plus actions to create charges, update cycles, add tags, re-allocate items, and update memberships. See [Automation](/documentation/manage/automation/automation).
* Update a subscription's billing anchor date as part of a Shopify Flow workflow.
## MCPs for builders and operators
[Connect your AI tools directly to Supercycle](https://supercycle.com/news/launching-mcp-servers) to query your data, automate workflows, and build custom tools without leaving your AI assistant.
Your team can answer "what's overdue?" or kick off an operational task straight from Claude or ChatGPT, instead of clicking through the admin or waiting on an integration.
## Rentals are now Cycles
"Rental" has become "[Cycle](https://supercycle.com/news/rentals-are-now-cycles)" throughout Supercycle.
A single product can move through rental, resale, trade-in, and subscription. "Rental" was too small a word for that. You'll see the updated terminology across the admin and Flow triggers over the coming weeks. The existing API is unchanged; a new API reflecting the updated modelling is on the way.
## Support for Shopify markets and pricing by item condition
Set pricing on method options by specific markets, variants, and item conditions, so a "well loved" unit can list below an "as new" one, and prices can follow each market.
## Filter rentals by item overlap conflict, then bulk re-allocate
See overlapping rentals (with filters for whether an alternative item is free), and resolve them in bulk with **Re-allocate item** from the reservations table actions.
* [RFID scanning on Zebra devices](/documentation/manage/scanner/scanner): warehouse and fulfilment teams can scan RFID-tagged items directly through the Supercycle scanner app.
* Update subscription billing day and recurring price using a Shopify Flow action.
* **Destination** column on the rentals table, making it easier to manage fulfilment at a glance.
* See and filter ID verification status directly on the rentals table.
* Checkout price on all methods can now be set to zero.
## Import 'vaulted cards' from Stripe
On request, we can enable an [Import from Stripe](/documentation/configuration/migrations/stripe) feature that brings previously vaulted cards from Stripe into Shopify.
Moving from Stripe usually means asking every customer to re-enter their card. Importing vaulted cards keeps existing subscriptions billing without interruption, so migrating doesn't cost you active contracts.
* Show, hide, and re-order columns on Reservations, Customers, Products, Returns, Inventory, and Charges.
* [New custom data fields](https://admin.shopify.com/apps/supercycle/settings/custom-data): money, customer, rental, return, multi-line text, true/false, date, and date/time data types on items and rentals.
* Export calendar, membership, and resale options to CSV.
## Deposits on calendar methods
[Add a deposit to calendar methods](/documentation/configuration/risk/deposits), then track which customers you hold deposits for and manage their return.
A refundable deposit covers you against damage or non-return on higher-value items, letting you rent out kit you'd otherwise hold back, without taking on the full risk.
* Filter customers by ID verification status.
* Show tooltips and help text on Methods app block labels to give customers more information. Set these up in Languages in settings.
* Failed charge emails now include a summary of the charge and a link to pay any outstanding balance.
## New rental Shopify Flow triggers
Trigger a Shopify Flow on **Rental created**, **Rental updated**, and **Rental cancelled**.
Automate the busywork around a rental's lifecycle (tag an order, notify a 3PL, or start a fulfilment task) without anyone watching the admin.
* Add new rentals to a draft order in a Shopify order via **Add rentals** in the **More actions** drop-down. Enable it from [beta features](https://admin.shopify.com/apps/supercycle/settings/features). This also changes the current **Create order** workflow from Reservations.
## Subscriptions on Shopify POS
[Start subscriptions from Shopify POS](/documentation/point-of-sale/pos-overview) using the POS extensions for Supercycle.
Sign a customer up to a membership or subscription at the counter, so in-store sales convert into recurring revenue instead of one-off transactions.
## Scanner app on iOS and Android
[Download the Supercycle Scanner app](/documentation/manage/scanner/scanner) to scan items, update records, and manage rental operations from your phone.
Your warehouse team works on the floor, not at a desk. The app puts item lookups and status updates in their hand instead of sending them back to a terminal.
## Update pricing in bulk
[Update pricing on method options in bulk](/documentation/manage/products/managing-method-options) with the new method options table. Enable it from beta features.
Roll out a seasonal price change across hundreds of products in a single pass.
* [New admin blocks](/documentation/setup/admin-setup) on customers and products in Shopify, making it easy to see the relationship between Shopify and Supercycle across the admin.
* New **Get rental data** action for [Shopify Flow](/documentation/manage/automation/automation#get-rental-data) to retrieve rental information for use in conditional logic during workflows.
* More detailed timeline events on rentals, making it easy to see what happened, when, and by whom.
* Updated customer page to better show active and upcoming rentals as well as returns in progress.
## Membership plan permalink
Copy a cart permalink from any membership plan in settings.
Drop the link in an email or campaign and the customer lands at checkout with the plan already in their cart. No navigating, and fewer drop-offs on the way to signing up.
* Require the customer to enter a start date for the subscription method.
* Filter rentals by subscription status (for example **Billing active** or **Billing paused**).
* [Automatically pause subscription billing](/documentation/methods/subscription) when a customer requests a return from their customer account, or when a return is created from the admin.
## Add rentals to an existing Shopify order
Add new rentals to an existing Shopify order via **Add rentals** in the **More actions** drop-down.
Handle add-ons and over-the-counter extensions on the order the customer already has, instead of creating a separate one to reconcile later.
* Filter and view products by Shopify product status, making it easier to see what's active, draft, and archived.
* Added Danish language support.
* Previews and filters on the reservations table: expand every column within a rental line to view and filter details without clicking through to the rental record.
## Pickup delivery method (beta)
A pickup delivery method lets you set different buffer periods for rentals that ship versus those collected in store. Enable it from [beta features](https://admin.shopify.com/apps/supercycle/settings/features).
Shipping needs days of turnaround buffer; a counter pickup needs almost none. Separate buffers mean store-pickup stock isn't blocked by shipping lead times it never uses.
* PlanetScale and Railway added as [subprocessors](https://www.supercycle.com/pages/subprocessors).
## Import items
Import items directly from the inventory page. Stand up a back catalogue in one upload instead of adding units by hand.
## Cancellation window and minimum term on membership plans
Set a cancellation window (for example, 14 days) and a minimum term (for example, 3 months) on a membership.
Commitment terms protect the economics of a plan: customers can't sign up and cancel the next day, so the recurring revenue you price around actually holds.
* Sort products by product title to help with finding and managing products.
* Filter products by **No methods** to find products that still need setting up.
## Card vaulting
[Capture a customer's card](/documentation/configuration/risk/card-vaulting) and charge it at any time.
A card on file lets you recover the cost of a late return, damage, or a missed payment without chasing the customer, lowering the risk of renting out high-value items.
* Improved inventory table on products, showing status at a glance: Uncommitted, On hand, and On order.
## Pay outstanding balance via customer accounts
Customers can view and pay their overdue balance directly from their account.
Self-serve payment means overdue charges get cleared without your team sending reminders or taking payment by hand.
* Set a default language for your store and customer portal, and offer multiple languages.
## Tasks on the dashboard
The dashboard now shows what needs doing at a glance: orders to fulfil, return requests, and outstanding charges, so the day's work is the first thing you see.
## Charge to saved card
Charge a customer's saved Shopify payment method to automatically capture payments from their card, instead of waiting on a manual checkout.
## Export products
Export products to CSV for reporting, bulk edits, or sharing with another system.
* Filter by active methods on the products table in the admin.
## 'Pick location' on items
[Set and update an item's pick location](/documentation/manage/inventory/items) in the admin or via the API.
Knowing exactly where a unit lives turns picking from a hunt into a lookup, useful the moment your warehouse outgrows a single shelf.
## Returns now work with customer accounts
[Returns](/documentation/manage/returns/returns) now run through new customer accounts, with a reworked flow in the admin.
Customers start a return themselves from their account, and your team manages it from one consistent place, with fewer support messages and less manual setup.
## SKU on the inventory table
See and search the SKU directly on the inventory table. Find a specific unit by the code you already use everywhere else.
## Export customers
Export customers to CSV for reporting or to sync into another tool.
* See and filter customers by their number of active rentals.
## Export items
Export items to CSV, a full inventory snapshot for reporting or reconciliation.
## Export rentals
Export rentals to CSV, so the data behind your reservations is yours to slice in a spreadsheet or warehouse.
## Analytics (beta)
Access beta analytics from the Supercycle navigation to see key circular metrics about your store.
Knowing utilisation, repeat rate, and what's earning helps you decide what to buy more of and what to retire, turning circular data into stocking decisions.
* Improved overlap visibility: we no longer show overlaps with items that have already been returned, helping you manage rental inventory more effectively.
* See the total number of rows on tables. Useful when filtering to find a total.
* New support chat in the admin: request support or suggest a feature without leaving Supercycle via the chat icon in the bottom right.
* New subscription storefront options: pricing tiles or a minimum-term dropdown, plus the option for customers to choose a preferred start date.
## Start and end conditions for subscriptions
Choose a start condition for when a subscription begins billing and an end condition for when it stops.
Billing that lines up with when the customer actually has the item, not the day they checked out, keeps charges fair and cuts the disputes that follow surprise bills.
* Detailed failed payment reasons now show on a charge.
* Change the payment method for active subscriptions or memberships from the rental, when a customer has multiple cards on file with Shopify.
* Edit the recurring price of active memberships and subscriptions from a customer's Supercycle customer page.
* Hookdeck added as a [subprocessor](https://www.supercycle.com/pages/subprocessors).
## Introducing Charges, replacing Invoices
Charges work like invoice lines but with more flexibility: combine several into a single payment via a draft order.
Billing a customer for a late fee plus an extension as one payment, instead of several separate invoices, makes the charge clearer for them and easier for you to reconcile.
* Change the product or variant an item is associated with, useful when using variants for conditions such as **Like New** and **Well Loved** and the item condition changes over time.
* Support for unlimited quantity when placing an order with a rental. Cart validation now checks availability against quantity, so a customer can select any quantity and we validate availability during checkout.
* Filter reservations and invoices tables by **Not tagged with**.
* A clearer inline subscription UI now shows the current status of subscriptions within a rental.
* **Create rental order** from Reservations now brings the Shopify variant into the draft order, so the correct variant SKU is communicated to your 3PL or operations team. Draft orders also support cart validation, guarding against overlapping rentals.
* Intercom and AppSignal removed as subprocessors; Attio, Fillout, and Relay added. See [subprocessors](https://www.supercycle.com/pages/subprocessors).
## Add a location to an item
Assign an inventory location to each item, supporting stock across multiple warehouses and physical stores, so availability reflects where things actually are.
## Save custom data against items and rentals
Create custom fields on items and rentals for information specific to your business (purchase price, consignee, or a manufacturer serial number), and keep it where the rest of the record lives.
## Save custom views
Filter Reservations, Returns, Products, Inventory, or Customers, then save the filtered view.
The reports you check every day ("overdue this week", "out for service") become one click instead of rebuilding the same filters each time.
* Filter reservations by a specific Shopify order number: go to **Add filter** and select **Order ID** on the reservations table.
* Serial numbers on items must now be unique. Previously an item's serial could match another item's.
* Sentry added as a [subprocessor](https://www.supercycle.com/pages/subprocessors).
## Filter tables by tags
Filter Reservations, Inventory, and Invoices by their tags, turning the tags you already apply into a way to find and action groups of records.
* New Supercycle metafields on Shopify products: boolean metafields for "imported into Supercycle" and each rental method, syncing to Shopify products to ease management from the Shopify products page. Use them to create automatic collections for rental methods. Applies to newly imported and edited products; existing products will be backfilled later.
* Reworked the item page to prioritise rentals. The serial number moved to the right-hand side and now displays a Code-128 barcode when a serial is present.
## Pause and unpause memberships
Pause and re-activate a membership from the customer's membership page, alongside cancelling.
A pause keeps a customer on the books through a break instead of losing them to a cancellation. Billing simply resumes on the schedule when they come back.
* Updated subscription payment failure descriptions with more detail, helping you follow up with customers.
* Search the customers table by email and full name.
* Reworked packing slip layout to emphasise order tags and shipping method.
* Plain added as a [subprocessor](https://www.supercycle.com/pages/subprocessors).
## Tagging for rentals, items and returns
Add tags to rentals, items, and returns from their respective pages: your own labels for grouping, triaging, and (later) filtering records.
# Methods filter
Source: https://docs.supercycle.com/developers/app-blocks/availability-search
Allows customers to search by availability
Allow customers to search by the availability of items from the collection page. For setup instructions see the [Methods filter guide](/documentation/online-store/search).
## Building a custom filter
The filter uses metafields and session storage to filter products with Shopify's Search & Discovery app.
### Session storage
The active filter method. One of `"calendar"`, `"membership"`, `"subscription"`, or `"resale"`. Set to `null` to clear all filters and show all products.
The selected date range for calendar mode. Only relevant when `filterMode` is `"calendar"`.
ISO 8601 date string. e.g. `"2025-06-01T00:00:00.000Z"`
ISO 8601 date string. e.g. `"2025-06-07T00:00:00.000Z"`
### Writing filter state from your own code
Values are stored as JSON strings. Use the helper below to write a key and notify the block — you can inspect the current values at any time in **DevTools > Application > Session Storage**.
```javascript theme={null}
function setFilterState(key, value) {
const serialized = JSON.stringify(value);
sessionStorage.setItem(key, serialized);
window.dispatchEvent(new StorageEvent("storage", {
key: key,
newValue: serialized,
storageArea: sessionStorage
}));
}
// Activate a mode
setFilterState("filterMode", "membership");
setFilterState("filterMode", "subscription");
setFilterState("filterMode", "resale");
setFilterState("filterMode", "calendar");
// Clear all filters
setFilterState("filterMode", null);
```
### Setting a date range (calendar mode)
```javascript theme={null}
setFilterState("scaf-dates", {
start_date: new Date("2025-06-01").toISOString(),
end_date: new Date("2025-06-07").toISOString()
});
setFilterState("filterMode", "calendar");
```
### Reading the current filter state
```javascript theme={null}
const mode = JSON.parse(sessionStorage.getItem("filterMode"));
// "calendar" | "membership" | "subscription" | "resale" | null
const dates = JSON.parse(sessionStorage.getItem("scaf-dates"));
// { start_date: "2025-06-01T00:00:00.000Z", end_date: "2025-06-07T00:00:00.000Z" } | null
```
### Global JavaScript hooks
Called each time the collection section re-renders after a filter is applied. Use it to re-initialise third-party scripts or sync a custom UI to the current state. Must be defined before the block initialises.
```javascript theme={null}
window.supercycleAfterSectionRender = function() {
const mode = JSON.parse(sessionStorage.getItem("filterMode"));
// Re-initialise your UI here
};
```
### Shopify metafields
These are the metafields Supercycle uses to power the filter. They are set automatically and can be inspected in **Shopify > Settings > Custom data**.
**Product metafields**
The rental methods available for a product. Values: `Calendar`, `Membership`, `Subscription`, `Resale`. Used to filter products by method type.
**Variant metafields**
Set to `1` when the variant has stock not yet committed to an active rental. Used by the Membership, Subscription, and Resale filters.
Set to `1` when the variant has availability for future dates. Used by the Calendar filter.
### Example: home page date picker
A date picker in a home page hero that sends customers to the collection page with calendar mode pre-activated. The Methods filter block on the collection page will read the saved sessionStorage state on load and apply the filter automatically.
```html theme={null}
```
## Adding the Methods filter to custom or legacy themes
If your theme doesn't support app blocks on collection pages, you can add the filter directly to your liquid template.
Go to **Online Store → Themes → … → Edit code**.
Open one of these files depending on your theme:
* `sections/main-collection.liquid`
* `sections/collection-template.liquid`
* `templates/collection.liquid`
Add the snippet below wherever you want the filter to appear — typically above your product grid.
```liquid theme={null}
{% render 'vite-tag' with 'methods-filter.jsx' %}
```
Find your collection section ID and paste it into the `collections_section_id` value. This enables the filter to re-render just the product grid without a full page reload. See the [Methods filter setup guide](/documentation/online-store/search#step-4-find-your-collection-section-id) for how to find it.
Set any of `enable_calendar`, `enable_membership`, `enable_subscription`, or `enable_resale` to `false` to hide those filter options.
Save, then preview a collection page with Supercycle methods enabled to confirm the filter appears and works correctly.
# Membership plans
Source: https://docs.supercycle.com/developers/app-blocks/membership-plans
Show available membership plans on any page
The membership plans app block displays your membership plans as cards on your storefront. This is the **only correct way** for customers to enroll in memberships—purchasing plan products directly will not work.
**This block is required for membership enrollment**
Customers must enroll through this app block. If they purchase plan products directly (e.g., via URL), the membership won't activate properly and features like swapping and plan management won't work.
## How it works
The membership block:
1. Displays your membership plans as cards with pricing and details
2. Shows an "Add to cart" button for each plan
3. Handles the proper enrollment flow when customers click the button
4. Ensures Supercycle activates all membership features correctly
5. Connects the customer to Supercycle for plan management
After enrollment, customers can navigate to any product with membership enabled and rent it using their credits.
## Adding the block
First, create a collection in Shopify and add your membership plan products to it. This collection controls which plans appear in the block.
See [Plans setup](/documentation/methods/membership/plans-setup#create-a-membership-page) for detailed instructions.
1. Go to **Online Store > Themes > Customize**
2. Navigate to the page where you want to display plans (or create a new page)
3. Click **Add section** or **Add block**
4. Select **Supercycle - Membership plans**
5. In the block settings, select the collection you created
6. Click **Save**
## Multiple blocks for different audiences
You can add multiple membership blocks to display different plans to different audiences:
**Example: Customer vs Business plans**
* Create a "Customer plans" collection with 3 plans for individuals
* Create a "Business plans" collection with 3 plans for businesses
* Add two membership blocks to the same page (or different pages)
* Connect each block to its respective collection
This gives you full control over which plans appear where on your storefront.
**Adding plan descriptions**
To add a description to a plan, find the plan product in Shopify admin and add the description there. It will automatically display in the membership block.
## What happens at checkout
When a customer enrolls in a membership and rents products:
1. **Enrollment**: The customer adds a membership plan to cart and completes payment
2. **Activation**: Supercycle activates the membership and assigns credits to the customer's account
3. **Browsing**: The customer can now browse your store and view products eligible for membership
4. **Adding to cart**: When they add an eligible product to cart, they can see it will use membership credits
5. **Checkout**: When they complete checkout, credits are automatically deducted from their membership balance
6. **Returns**: When customers return items, credits are immediately added back to their account for future rentals
7. **Management**: The customer can manage their membership, view credit balance, and track rentals through the profile dashboard page
## Styling
The block inherits your theme's styling but can be customized using CSS variables or by editing the block's appearance settings in the theme editor.
# Methods
Source: https://docs.supercycle.com/developers/app-blocks/methods
Add all rental methods to a product page
Supercycle automatically integrates with your theme’s product form. If your theme uses custom markup for product forms or variant inputs, follow this guide to help Supercycle correctly detect and control these elements.
***
## How the methods app block works
The **Methods app block** takes over your theme’s add to cart button using a component called **ProductContextSync**. This component automatically detects, monitors, and controls your theme’s product form.
Watches your theme’s variant input field and keeps it in sync with the active variant.
Adds rental-specific data such as selling plans and properties to your form.
Enables or disables the button based on rental validation.\
The button stays disabled when:
* No method is selected
* The product is out of stock
* The customer has insufficient credits
The takeover is non-destructive, it only adds hidden inputs and toggles button states without modifying your theme’s existing structure.
## Storefront calendar blocked dates
Merchants manage storefront calendar rules from **Settings** → **Channels** → **Online store** in the Supercycle admin. See [Date picker blocked dates](/documentation/online-store/date-picker-blocks) for block types, start vs end targeting, and examples.
Those admin rules feed the Methods app block calendar on the online store. When a customer picks dates, rentals whose start or end matches a blocked rule are rejected — duration options that would land on a blocked boundary are disabled too.
Date picker blocks affect **selectable dates** on the storefront calendar only. To remove **availability** for a product, variant, or item across the whole store, use [Blocked dates](/documentation/manage/inventory/blocked-dates) instead. [Opening hours](/documentation/configuration/logistics/opening-hours) can also block pick-up and drop-off dates when time selection is on.
## Legacy theme JSON matchers
The Methods app block still exposes **Unavailable start dates** and **Unavailable end dates** theme settings. Both accept DayPicker matcher JSON and apply independently of admin rules (existing JSON continues to work and stacks additively). These fields are **deprecated** — use [Date picker blocked dates](/documentation/online-store/date-picker-blocks) for new rules.
* **Unavailable start dates** — blocks dates from being chosen as a rental *start* date.
* **Unavailable end dates** — blocks dates from being chosen as a rental *end* date, independently of start dates.
Both fields accept the same JSON object/array matcher format shown below.
#### Block All Mondays
```json theme={null}
{"dayOfWeek": [1]}
```
*Note: Day of week values are 0 = Sunday, 1 = Monday, 2 = Tuesday, ..., 6 = Saturday*
#### Block Saturdays and Sundays (Weekends)
```json theme={null}
{"dayOfWeek": [0, 6]}
```
#### Block a Specific Date (January 1, 2026)
```json theme={null}
{"from": "2026-01-01", "to": "2026-01-01"}
```
#### Block a Date Range (December 22-27, 2025)
```json theme={null}
{"from": "2025-12-22", "to": "2025-12-27"}
```
#### Combine Multiple Rules
You can combine multiple matchers in an array to block multiple conditions:
```json theme={null}
[
{"dayOfWeek": [1]},
{"dayOfWeek": [0, 6]},
{"from": "2026-01-01", "to": "2026-01-01"},
{"from": "2025-12-22", "to": "2025-12-27"}
]
```
#### Format Reference
* **Day of week**: `{"dayOfWeek": [0, 1, 2, ...]}` - Blocks specific days of the week (0=Sunday, 6=Saturday)
* **Single date**: `{"from": "YYYY-MM-DD", "to": "YYYY-MM-DD"}` - Blocks a specific date (use same date for both `from` and `to`)
* **Date range**: `{"from": "YYYY-MM-DD", "to": "YYYY-MM-DD"}` - Blocks a range of dates
* **After date**: `{"after": Date}` - Blocks all dates after a specific date
* **Multiple matchers**: Use an array `[...]` to combine multiple rules
#### Block Dates Dynamically
To block dates dynamically (e.g. limit bookings to a maximum of 6 weeks in advance), add this script to your product template or a custom liquid block:
```html theme={null}
```
This sets a rolling window that blocks all dates beyond 6 weeks from today. Adjust `weeksToBlock` to change the booking window. `window.supercycleDisabledMatchers` applies to both start and end dates.
By placing this code in a custom liquid block instead of the main product template, you can apply different blockout rules to specific products or product templates. This allows you to have different booking windows for different product types.
***
## Troubleshooting
Supercycle uses a MutationObserver to maintain button state even if other scripts modify it.\
It also supports AJAX carts by injecting rental data before submission.
By default, Supercycle finds the variant ID input using `[name='id']`.\
If your theme doesn’t follow this pattern, Supercycle may not detect it automatically.
To resolve this, add the `supercycle-variant-id-input` attribute to the input element whose value updates when variants change.
```html theme={null}
```
To find all potential variant ID inputs, run this in your browser console:
```js theme={null}
document.querySelectorAll("[name='id']")
```
Supercycle looks for your theme’s add to cart form using multiple selectors.\
If none match, the app block won’t be able to sync or control your button.
Supercycle uses the following detection priority order:
This is the most reliable option.
Alternative detection used in many themes.
Common fallback for Online Store 2.0 themes.
Used only when none of the above are found.
If Supercycle cannot find your form automatically, add this attribute to your product form:
```liquid theme={null}
{% form 'product', product, id: product_form_id, class: 'form js-product-form', data-product-id: product.id, supercycle-add-to-cart-form: true %}
```
Alternatively, if the theme doesn't use a liquid form:
```html theme={null}
Ensure the **Supercycle app embed** is enabled, then hard refresh the page. If the problem persists, the theme you are using might not be compatible with the app blocks out of the box. Contact support at [support@supercycle.com](mailto:support@supercycle.com) so we can fix it for you.
Confirm the product is imported into Supercycle and methods are enabled for it.
Ensure your theme updates `product.selected_or_first_available_variant`
If your theme doesn’t support app blocks, you can still show the methods UI by adding this snippet directly to your product template code.
Go to Online Store → Themes → … → Edit code.\
Open one of these files depending on your theme:
sections/main-product.liquid
sections/product-template.liquid
templates/product.liquid (very old themes)
Locate where your product title and add to cart button are in the template.\
The methods component should go between these two elements.
Add the snippet below at the chosen spot.
```html theme={null}
```
Save, then preview a product with Supercycle methods enabled. Change variants to confirm the price and options update.
***
## FAQ
Yes. Use the `custom_css` setting inside `data-settings` for minor overrides. For larger design changes, use your theme’s stylesheet and target the methods block CSS classes.
Yes. Each option element exposes its backend name as `data-supercycle-option-name`, so you can hide or restyle specific options from CSS or JavaScript. See [Target method options by name](/developers/code-snippets/target-method-options) for examples.
***
# Create rental bundles
Source: https://docs.supercycle.com/developers/bundles
Group multiple products into a single rentable bundle and build a custom frontend experience using the Storefront API.
Bundles are available on request. [Get in touch](mailto:support@supercycle.com) and we will enable it for your store.
## Set up bundles
In your Supercycle dashboard, go to **Products** and select **Bundles**.
Click **Create bundle** and give it a name.
Add each product that makes up the bundle. Before adding a component, ensure it has the relevant methods enabled in Supercycle. The methods configured on each component determine which options are available when creating intents at checkout.
Save the bundle. Supercycle will tag the parent product as `Supercycle bundle product` and each component with `Bundle component: `, and attach the `supercycle.bundle` metafield to the parent.
## Bundle metafields
Parent bundle products will have the tag `Supercycle bundle product` and a `supercycle.bundle` metafield:
```json theme={null}
{
"components": [
{
"quantity": 1,
"product": {
"shopifyId": 10149040324891,
"handle": "slim-fit-suit-jacket",
"title": "Slim Fit Suit Jacket"
}
},
{
"quantity": 1,
"product": {
"shopifyId": 10149040324892,
"handle": "slim-fit-suit-trousers",
"title": "Slim Fit Suit Trousers"
}
},
{
"quantity": 1,
"product": {
"shopifyId": 10149040324893,
"handle": "slim-fit-suit-waistcoat",
"title": "Slim Fit Suit Waistcoat"
}
}
]
}
```
Component products will have the tag `Bundle component: `.
You can access each component product's full Shopify object in Liquid:
```liquid theme={null}
{{ all_products[''] }}
```
Each component product has a configuration metafield for every method enabled on it:
| Method | Configuration metafield |
| ------------ | ---------------------------------------------------------- |
| Calendar | `product.metafields.supercycle.calendar_configuration` |
| Membership | `product.metafields.supercycle.membership_configuration` |
| Subscription | `product.metafields.supercycle.subscription_configuration` |
| Resale | `product.metafields.supercycle.resale_configuration` |
You can iterate over all components and read the relevant configuration:
```liquid theme={null}
{% for component in product.metafields.supercycle.bundle.components %}
{% assign component_product = all_products[component.product.handle] %}
{{ component_product.metafields.supercycle.calendar_configuration }}
{% endfor %}
```
Each configuration metafield contains an options array with a `global_id` for each option. For example, a calendar configuration:
```json theme={null}
{
"rental_periods": [
{
"global_id": "gid://supercycle/CalendarRental::RentalPeriod/1",
"name": "3 days"
},
{
"global_id": "gid://supercycle/CalendarRental::RentalPeriod/2",
"name": "4 days"
}
],
"fixed_fees": []
}
```
See [Metafields](/developers/metafields) for the full schema of each configuration metafield.
## Build a frontend experience
Each component product must be added to the cart as its own line item with the correct Supercycle attributes. The steps below walk through checking availability, creating intents, and adding all components to the cart in one request.
Use the [Product availability API](/api-reference/storefront/product-availability) to confirm all component products are available for the selected dates.
Extract component IDs from the bundle metafield in Liquid:
```liquid theme={null}
{% assign component_productIds = product.metafields.supercycle.bundle.components | map: "product.shopifyId" | join: "," %}
```
Then check availability:
```js theme={null}
const component_productIds = [{{ component_productIds }}];
const availability = await fetch("/apps/supercycle/product_availability_checks", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
productIds: component_productIds,
rentalStart: "2025-01-01",
}),
}).then((res) => res.json());
```
Each component product needs an intent created via the [Intent API](/api-reference/storefront/intent). The intent returns an `attributes` object containing everything Supercycle needs to process the line item as a cycle, including `_cycle`, `_validations`, and `selling_plan`.
You will need to build a UI that lets the customer select an option for each component product, for example a dropdown of rental periods per item. Each option has a `global_id` in the component's configuration metafield, which is what you pass to the intent endpoint:
```js theme={null}
async function createIntent(variantId, optionGlobalId, rentalStart) {
return fetch("/apps/supercycle/intents", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
variantId,
option: {
globalId: optionGlobalId,
params: { rentalStart },
},
}),
}).then((res) => res.json());
}
```
Call this for every component before adding to the cart:
```js theme={null}
const intent = await createIntent(
variantId,
selectedOptionGlobalId,
"2025-01-01",
);
// intent.attributes contains selling_plan, _cycle, _validations, etc.
```
Once you have an intent for each component, add all variants to the cart in a single request using Shopify's [multiple items cart API](https://shopify.dev/docs/api/ajax/reference/cart#post-locale-cart-add-js).
Use `FormData` and set all `intent.attributes` keys directly. Each attribute key is already the correct form field name:
```js AJAX example theme={null}
const components = [
{
variantId: 12345678901,
optionGlobalId: "gid://supercycle/...",
quantity: 1,
},
{
variantId: 12345678902,
optionGlobalId: "gid://supercycle/...",
quantity: 1,
},
{
variantId: 12345678903,
optionGlobalId: "gid://supercycle/...",
quantity: 1,
},
];
const rentalStart = "2025-01-01";
const formData = new FormData();
await Promise.all(
components.map(async ({ variantId, optionGlobalId, quantity }, index) => {
const intent = await createIntent(variantId, optionGlobalId, rentalStart);
formData.set(`items[${index}][id]`, variantId);
formData.set(`items[${index}][quantity]`, quantity);
Object.entries(intent.attributes).forEach(([key, value]) => {
formData.set(`items[${index}][${key}]`, value);
});
}),
);
await fetch("/cart/add.js", { method: "POST", body: formData });
```
```html Form example theme={null}
```
# Supercycle prices
Source: https://docs.supercycle.com/developers/code-snippets/display-prices
Display Supercycle prices on the front end
For the latest Shopify themes a method price app block will be available soon
Add this to your price snippet file in your theme or your product card to display the different prices for each Superycle method.
Depending on your theme, you will need to edit the line
```
{% assign sc_product = product %}
```
For example, it could be
```
{% assign sc_product = product_card %}
```
You can also use the supercycle\_methods to show normal pricing
```
{% supercycle_methods == false %}
```
```html theme={null}
{% assign sc_product = closest.product %}
{% assign calendar_config = sc_product.metafields.supercycle.calendar_configuration.value %}
{% assign membership_config = sc_product.metafields.supercycle.membership_configuration.value %}
{% assign resale_config = sc_product.metafields.supercycle.resale_configuration.value %}
{% assign subscription_config = sc_product.metafields.supercycle.subscription_configuration.value %}
{% assign supercycle_methods = false %}
{% if calendar_config.rental_periods or membership_config or resale_config or subscription_config %}
{% assign supercycle_methods = true %}
{% endif %}
{% if supercycle_methods %}
{% if resale_config and sc_product.compare_at_price != blank %}
{% endif %}
```
# Link new and circular products
Source: https://docs.supercycle.com/developers/code-snippets/link-new-and-circular
Link between a new Shopify products and circular products on the same page
This is a temporary solution while we implement a proper integration.
You can link a product from new, as well as offer circular methods like resale, rental, or subscription, on the same product page. To do this you'll need to create 2 separate Shopify products, one for the new product and one for the circular methods.
## Prerequisites
* A Shopify product for the new item (e.g `t-shirt`)
* A separate Shopify product setup with Supercycle with a suffix (e.g `t-shirt-circular`)
## How it works
The code uses product handle naming conventions to automatically link products:
* Base product: `t-shirt` (new product from Shopify)
* Linked product: `t-shirt-circular` (product with circular methods via Supercycle)
When a customer views either product, they see a switcher that lets them toggle between the new and circular versions.
## Add the code to your theme
Add a **Custom Liquid** block to your product page in the theme editor:
1. Go to **Online Store > Themes** in your Shopify admin
2. Click **Customize** on your active theme
3. Navigate to a product page using the page selector dropdown
4. In the left sidebar, click **Add block** in the product information section
5. Select **Custom Liquid** from the block options
6. Paste the following code into the Custom Liquid field:
```liquid theme={null}
{%- comment -%} Configurable variables {%- endcomment -%}
{% assign new_label = 'New' %}
{% assign linked_label = 'Resale' %}
{% assign linked_suffix = '-resale' %}
{%- comment -%}
Work out base / linked handles
{%- endcomment -%}
{% assign current = product.handle %}
{% assign base = current | replace: linked_suffix, '' %}
{% assign is_linked = false %}
{% if base != current %}
{% assign is_linked = true %}
{% endif %}
{% assign linked = base | append: linked_suffix %}
{%- comment -%} Look up products {%- endcomment -%}
{% assign base_product = all_products[base] %}
{% assign linked_product = all_products[linked] %}
{%- comment -%}
Only show switcher when:
- linked_suffix is not blank
- base product exists
- linked product exists and is a real product
{%- endcomment -%}
{% if linked_suffix != blank and base_product and linked_product and linked_product.title != blank %}
{%- comment -%} Base option (no suffix) {%- endcomment -%}
{% endif %}
```
Update these variables to match your setup:
```liquid theme={null}
{% assign new_label = 'New' %}
{% assign linked_label = 'Resale' %}
{% assign linked_suffix = '-circular' %}
```
| Variable | Description | Examples |
| --------------- | --------------------------------------------------------------------------- | ------------------------------------------------- |
| `new_label` | Label shown for the new product option. | `New`, `Buy New` |
| `linked_label` | Label shown for the Supercycle product option. | `Resale`, `Rental`, `Circular`, `Buy refurbished` |
| `linked_suffix` | Suffix added to the base product handle to identify the Supercycle version. | `-circular`, `-resale`, `-rental` |
The switcher uses the same classes as the Supercycle methods app block.
The switcher only appears when both the base product and the linked Supercycle product exist. If either product is missing, the switcher won't display.
# Show recurring payments in the cart
Source: https://docs.supercycle.com/developers/code-snippets/show-recurring-payments
Add Liquid code to display plan details and total recurring costs for selling plan products.
When using membership or subscription plans, you can show more detail in the cart, including each product's plan name, first payment, recurring payment, and the total recurring amount for all items.
This helps customers understand what they'll be charged now and on a recurring basis.
## Add Liquid to your cart template
Add the following Liquid blocks to your cart template or snippet (for example, `main-cart-items.liquid`) to show recurring payment information.
In your Shopify theme editor, open the file where your cart line items are rendered.
Paste the first block below the cart items to show the total monthly recurring payment.
Paste the second block inside your cart item loop to show details for each plan.
Add a membership or subscription product to your cart and confirm the correct payment amounts display.
### Total recurring payment
Add this block below your cart item loop to calculate and display the total recurring payment for all items in the cart.
```liquid theme={null}
{%- assign total_recurring_payment = 0 -%}
{%- for item in cart.items -%}
{%- if item.selling_plan_allocation and item.selling_plan_allocation.selling_plan -%}
{%- assign adjustments = item.selling_plan_allocation.selling_plan.price_adjustments -%}
{%- for adjustment in adjustments -%}
{%- if adjustment.order_count == null -%}
{%- assign recurring_payment = adjustment.value | divided_by: 100 -%}
{%- assign total_recurring_payment = total_recurring_payment | plus: recurring_payment -%}
{%- endif -%}
{%- endfor -%}
{%- endif -%}
{%- endfor -%}
```
### Line item plan details
Add this block inside your cart item loop to show each product's plan name, first payment, and recurring payment.
```liquid theme={null}
{%- if item.selling_plan_allocation and item.selling_plan_allocation.selling_plan -%}
{%- endif -%}
```
## Notes
* **Placement:** The plan details block must sit *inside* the `{% for item in cart.items %}` loop.
* **Formatting:** If your prices appear incorrect, remove the `| divided_by: 100` filter — this depends on how your theme handles price formatting.
* **Non-plan products:** Items without selling plans are automatically skipped.
* **Accessibility:** Use clear labels like "First payment" and "Recurring payment" so customers and screen readers can easily understand the charges.
Learn how to set up membership plans and selling plan products.
Configure membership products in your store.
# Target method options by name
Source: https://docs.supercycle.com/developers/code-snippets/target-method-options
Use the data-supercycle-option-name attribute to style or hide specific method options from your theme
Each option rendered by the Supercycle methods app block exposes its backend name as a `data-supercycle-option-name` attribute on the option element. Use this attribute to target specific options from your theme's CSS or JavaScript without relying on positional selectors.
This works for every method that renders option pickers: Subscription, Calendar, Membership, Resale, and Trade-in.
## How it works
For each option you configure on a method, Supercycle renders a `.supercycle-options__option` element and sets `data-supercycle-option-name` to the option's name (the value you entered in the Supercycle admin).
For example, an option named `1 month - insurance` renders as:
```html theme={null}
...
```
You can then match it with any standard attribute selector.
## Hide options with CSS
Hide every option whose name contains the word `insurance`:
```css theme={null}
.supercycle-options__option[data-supercycle-option-name*="insurance"] {
display: none;
}
```
Match an exact option name:
```css theme={null}
.supercycle-options__option[data-supercycle-option-name="1 month - insurance"] {
display: none;
}
```
## Toggle options with JavaScript
Hide insurance options behind a toggle on the product page:
```html theme={null}
```
Option names come straight from the Supercycle admin, so any naming convention you adopt (for example, prefixing with `insurance-` or suffixing with ` - insurance`) becomes a stable selector you can reuse across your theme.
The attribute is rendered by Supercycle, so it stays in sync if you rename or add options. Hidden options are still present in the DOM, only visually hidden, customers cannot select them while they are hidden.
# Build an hourly booking widget
Source: https://docs.supercycle.com/developers/guides/build-an-hourly-booking-widget
Build a custom storefront widget that books rentals by date and time of day.
This guide shows how to build a **custom** storefront widget that books rentals by the hour (pick up and drop off at a chosen time of day), in place of the [Methods app block](/developers/app-blocks/methods). It reproduces the same data flow the Methods block uses: read the shop's time configuration, fetch availability, render date and time slots, then create an intent and add it to cart.
The Methods app block already supports hourly booking when the shop has pick up / drop off time selection enabled. Build a custom widget only when you need bespoke UI that the app block can't provide.
Everything runs against the Shopify App Proxy, so requests go to the shop's own domain and are signed by Shopify automatically. You never send an API key.
```
https://{shop_domain}/{proxy_path_prefix}/{path}
```
## Prerequisite: time selection must be enabled
Hourly booking is only available when both of these are true for the shop:
* The `pick_up_drop_off_time_selection` feature flag is enabled. Ask Supercycle to enable it.
* The pick up / drop off method has time selection turned on, with a window and interval configured in the Supercycle admin.
When time selection is off, treat the booking as day based (date only, no time).
The shop's logistics configuration is injected into the theme by the Supercycle app embed (the same source the Methods block reads). There is no separate endpoint for it, so read it from the page:
```javascript theme={null}
const { deliveryMethods, returnMethods, defaultDeliveryMethodType, defaultReturnMethodType, locations } =
window.supercycleAppEmbed.context.appSettings;
const pickUp = deliveryMethods.find((m) => m.deliveryMethodType === "pick_up");
const dropOff = returnMethods.find((m) => m.returnMethodType === "drop_off");
```
Each pick up / drop off entry carries:
Whether this leg offers time slots. When `false`, render a date only (no time).
The daily window the slots span, in `"HH:MM"`, e.g. `"09:00"` to `"17:00"`.
Slot step in minutes: `15`, `30`, or `60`.
Generate slots by stepping from `fromTime` to `toTime` in `timeIntervalMinutes` increments. `defaultDeliveryMethodType` and `defaultReturnMethodType` tell you which legs to preselect.
Use the [Availability log](/api-reference/storefront/availability-log) endpoint, not the per-day [Availability timeline](/api-reference/storefront/availability-timelines). It returns availability with time-of-day precision, which is what time slots need.
```
GET https://{shop_domain}/{proxy_path_prefix}/availability_log
?variant_shopify_id=44556677
&delivery_method_type=pick_up
&return_method_type=drop_off
&location_id=12345
```
The `occupancy` array is a list of change points, not one entry per day. Each `{ at, available }` entry means that from `at` onward, `available` items are free until the next entry. `at` is a shop-local, offset-free timestamp (`YYYY-MM-DDTHH:MM:SS`); use it as-is and do not apply a timezone offset.
The counts already account for prep and turnaround time. The merchant can set a **preparation time** (before an item can go back out: cleaning, checks) and a **restock time** (after it comes back) on the methods, and these can be expressed in hours. So an item returned at 14:00 with a 6-hour restock will not free up until 20:00, and a slot earlier that evening will show as unavailable. You don't compute any of this in the widget; just honour the `occupancy` counts.
Availability is expensive to compute and is cached, so re-fetch only when the selected variant, delivery/return method, or location changes.
For a candidate pick up instant (chosen date and slot time), the number of items available is the `available` value of the last `occupancy` entry whose `at` is at or before it. A slot is bookable only if items stay available across the whole window the customer is requesting.
```javascript theme={null}
// occupancy: sorted ascending by `at` (treat as shop-local wall-clock)
function slotBookable(occupancy, startISO, endISO) {
let level = 0;
for (const { at, available } of occupancy) {
if (at <= startISO) level = available; // level entering the window
}
let min = level;
for (const { at, available } of occupancy) {
if (at > startISO && at < endISO) min = Math.min(min, available); // changes inside it
}
return min > 0;
}
```
Disable any date or time whose window returns `false`. Because the log is sparse, this is cheap to evaluate entirely client-side.
When the customer has chosen their window, create the intent with the [Create an intent](/api-reference/storefront/intent) endpoint, passing the times of day alongside the date:
```
POST https://{shop_domain}/{proxy_path_prefix}/intents
Content-Type: application/json
{
"variant_id": 44556677,
"option": {
"global_id": "gid://supercycle/CalendarRental::RentalPeriod/1",
"params": {
"rental_start": "2026-06-27",
"arrive_by_time": "14:30",
"return_by_time": "17:00",
"delivery_method_type": "pick_up",
"return_method_type": "drop_off",
"location_id": 12345
}
}
}
```
Pick up time of day (`"HH:MM"`) from your slot picker. This is what makes the booking hourly. Omit it when the leg's `allowTimeSelection` is `false` to fall back to day based booking.
Drop off time of day (`"HH:MM"`). Omit for day based booking.
The response contains an `attributes` object. Pass it straight through as the cart line's attributes (it carries the line item properties and the `selling_plan`) when you add the variant to cart. On a problem (variant or option not found, method not enabled) the endpoint returns `422` with `{ "error": "..." }`. Surface it to the customer and block add to cart.
## See also
* [Availability log](/api-reference/storefront/availability-log) API reference
* [Create an intent](/api-reference/storefront/intent) API reference
* [Methods app block](/developers/app-blocks/methods)
# Cycle line item property
Source: https://docs.supercycle.com/developers/line-items/cycle-line-item-properties
Schema for the `_cycle` line item property.
The `_cycle` property format is subject to change as we iterate on it.
Integrations and automations should use [Shopify
Flow](/documentation/manage/automation/create-workflow) instead of relying
directly on this token.
A JSON-encoded object that contains everything Supercycle needs to create a Cycle from the line item when an order is placed. If an item doesn't have a `_cycle` property, Supercycle will not process that
item.
```json Full theme={null}
{
"item": {
"type": "existing",
"filters": {
"availability": { "from": "2025-01-01", "to": "2025-01-14" },
"location": { "shopify_id": 123456 },
"condition": { "ids": [1, 2] }
}
},
"attachments": {
"deposit": { "variant_id": 987654 },
"membership_credit": { "cost": 5 },
"subscription_contract_creator": { "selling_plan_id": 123 },
"custom_fields": {
"damage_waiver_taken ": "true",
"message": "Happy Birthday"
}
},
"method_type": "subscription",
"minimum_term": "3 months",
"rental_start": "2025-01-01"
}
```
```json Calendar theme={null}
{
"item": {
"type": "existing",
"filters": {
"availability": { "from": "2025-01-10", "to": "2026-01-15" },
"location": { "shopify_id": 789 }
}
},
"attachments": {
"custom_fields": {
"delivery_notes": "Leave at the front desk"
}
},
"method_type": "calendar",
"rental_start": "2025-01-05",
"rental_end": "2025-01-20"
}
```
```json Membership theme={null}
{
"item": {
"type": "existing",
"filters": {
"availability": { "from": "2026-03-15", "to": "2026-04-15" }
}
},
"attachments": {
"membership_credit": { "cost": 20 },
"custom_fields": { "backup_item": "234450" }
},
"method_type": "membership",
"rental_start": "2026-03-15",
"rental_end": "2026-04-15"
}
```
```json Subscription theme={null}
{
"item": {
"type": "existing",
"filters": {
"availability": { "from": "2026-04-01", "to": "2026-04-30" },
"location": { "shopify_id": 555 },
"condition": { "ids": [1] }
}
},
"attachments": {
"deposit": { "shopify_id": 999 },
},
"method_type": "subscription",
"rental_start": "2026-04-01",
"rental_end": "2026-04-30"
}
```
```json Resale theme={null}
{
"item": {
"type": "existing",
"filters": {
"location": { "shopify_id": 123456 },
"condition": { "ids": [3] }
}
},
"attachments": {
"custom_fields": {
"gift_message": "Enjoy!"
}
},
"method_type": "resale"
}
```
Describes how Supercycle selects an inventory item to assign to the Cycle.
Always `"existing"` — selects from existing inventory items.
Filters used to narrow down which inventory item is selected.
Restricts selection to items available within a date range.
Start of the required availability window.
End of the required availability window.
Restricts selection to items at a specific Shopify location.
Shopify ID of the location.
Restricts selection to items in specific conditions.
Array of Supercycle condition IDs the item must match.
Optional objects applied to the Cycle after creation. Only relevant keys will be present.
Links a deposit line item to the Cycle.
Shopify variant ID of the deposit.
Deducts credits from the customer's membership balance.
Number of credits to deduct.
The condition the item must be returned in to receive credits back.
Creates a Shopify subscription contract for the Cycle. Used when selling plans are unavailable (e.g. draft orders).
Shopify selling plan ID used to configure the contract.
Key-value pairs of custom field values to attach to the Cycle. Keys must match configured custom field definitions.
The rental method. One of `"subscription"`, `"membership"`, `"calendar"`,
`"resale"`.
The requested rental start date. Present for Subscription and Calendar
methods.
The minimum rental duration. Present for Subscription methods.
## How it works
1. When a customer selects a circular option, the `_cycle` property is fetched from the [Intent endpoint](/api-reference/storefront/intent) and attached to the cart line item. The Supercycle methods app block handles this automatically. For custom storefronts, you can call the Intent endpoint directly.
2. The `properties[_cycle]` value is submitted with the add-to-cart request as a hidden input or form data field.
3. When the order is created, Supercycle reads the `_cycle` property and creates a Cycle for that line item.
```
```
# Validations line item property
Source: https://docs.supercycle.com/developers/line-items/validations-line-item-property
Schema for the `_validations` line item property.
A JSON-encoded object used by Supercycle's cart validation to enforce rules at checkout. Multiple validations are merged into a single object — only the relevant keys will be present for a given line item.
```json Example theme={null}
{
"membership": { "credits": 5 },
"required_variant": { "id": 987654, "per_line": 1 },
"quantity": { "max": 3 },
"uniformity": { "key": "rental_start", "value": "2025-01-01" }
}
```
## Validations
Validates that the customer has enough membership credits to complete the rental.
Number of credits required for this line item.
Validates that a specific variant (e.g. a deposit) is present in the cart alongside this line item.
Shopify variant ID that must be present in the cart.
Required quantity per unit of the rental line item. Defaults to `1`.
Validates that the quantity of this line item does not exceed available inventory.
Maximum quantity allowed in the cart for this line item.
Validates that all rental line items in the cart share the same value for a given property. Used to prevent mixing incompatible options (e.g. different rental start dates).
The property key that must be uniform across all rental line items.
The expected value for that key.
# Metafields
Source: https://docs.supercycle.com/developers/metafields
Metafields for Shopify products, variants, and customers.
Metafields are set by Supercycle and should not be edited manually
## Product Metafields
Supercycle adds metafields to products to enable circular commerce methods. These metafields configure which rental methods are available and how they work.
### Product configuration metafields
Indicates whether a product is enabled for Supercycle functionality. Set to `"true"` when a product is imported to Supercycle, `"false"` when removed.
The total number of uncommitted inventory available across all variants.
### Method Configuration Metafields
These metafields contain the detailed configuration for each circular commerce method.
Lists all rental methods enabled for this product. Array of method names: `["Calendar", "Membership", "Subscription", "Resale"]`. Used by app blocks to determine which rental methods to display.
Configuration for calendar rental method.
Configuration for membership rental method.
Configuration for subscription rental method.
Configuration for resale method.
## Variant Metafields
Supercycle adds metafields to product variants to track inventory availability and membership pricing.
### Inventory Metafields
Indicates if variant has uncommitted inventory available. Used for inventory filtering in collections.
The number of physical inventory items for this variant that are currently available — specifically items that are both visible (not hidden/retired) and not committed to an active rental.
Indicates if variant has future availability inventory. Used for calendar rental availability filtering.
### Membership Metafields
Credit cost for this variant in membership rental. Used by membership rental method to determine pricing.
Credit allowance for this variant in membership plans. Used by membership plans to set credit limits.
## Customer Metafields
Supercycle adds metafields to customers to track membership status and payment information.
### Membership Metafields
Customer's membership information and quotas.
### Payment Metafields
Indicates if customer has a vaulted payment method. Used for payment method validation in cart.
## Usage Examples
#### Checking if a product has a method:
```liquid theme={null}
{% comment %} Check if product has calendar rental method {% endcomment %}
{% if product.metafields.supercycle.methods contains "Calendar" %}
{% endif %}
{% comment %} Check if product has membership rental method {% endcomment %}
{% if product.metafields.supercycle.methods contains "Membership" %}
{% endif %}
{% comment %} Check if product has subscription rental method {% endcomment %}
{% if product.metafields.supercycle.methods contains "Subscription" %}
{% endif %}
{% comment %} Check if product has resale method {% endcomment %}
{% if product.metafields.supercycle.methods contains "Resale" %}
{% endif %}
```
### Checking customer membership:
```liquid theme={null}
{% assign membership = customer.metafields.supercycle.membership.value %}
{% if membership.quotas.credits.allowance > 0 %}
{% endif %}
```
### Use metafields for merchandising
You can use metafields to merchandising your products. For example, you can use the `supercycle.uncommitted_inventory` metafield in an automatic collection to only show products that are available now.
# Overview
Source: https://docs.supercycle.com/developers/overview
Add configurable app blocks to your Shopify theme.
###
## App embed
All app blocks require the [Supercycle Engine app embed to be enabled](/documentation/setup/theme-setup) on your chosen theme.
Supercycle Engine contains settings for the following:
* Date format settings
* App block style settings
* Customer portal style settings
## App blocks
App blocks let you add app functionality exactly where you want to use it in your theme. You can add, remove, preview, reposition, and customize app blocks through the theme editor.
### Primary app blocks
Adds all rental methods to a product page.
### Calendar app blocks
Adds ability to search products by rental availability on a collection page.
### Membership app blocks
Shows available membership plans on any page.
# Checkout language
Source: https://docs.supercycle.com/documentation/configuration/checkout/checkout-language
Edit or remove default checkout messages that may confuse customers
Shopify displays default messages at checkout based on the purchase type. Which message your customers see depends on the Supercycle method they're buying.
| Supercycle method | Checkout message | Can you edit it? |
| ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | --------------------------------------------------- |
| Resale, Calendar | "One or more items in your cart is a deferred or subscription purchase…" | Yes, on all plans |
| Subscription, Membership | "Your cart contains an automatically renewing subscription…" | Shopify Plus only, except the cancellation sentence |
| Any checkout with the [card vaulting](/documentation/configuration/risk/card-vaulting) product | "Your cart contains an automatically renewing subscription…" | Shopify Plus only, except the cancellation sentence |
The card vaulting product is a \$0 Shopify subscription product. If you have card vaulting enabled, Supercycle adds it to checkouts that need a card on file. This means even a pure Calendar rental will show the subscription messages below, including a recurring subtotal like "First payment \$0.00, then \$0.00 every 12 months".
All the messages on this page are edited in the same place.
In your Shopify admin, go to **Online Store** > **Themes**. Click the **...** beside the theme you want to edit and select **Edit default theme content**.
Click the **Checkout & system** tab.
Search for the field name given in each section below, edit or clear the text, and save your changes.
## Resale and calendar methods
### Deferred purchase message
Resale and calendar orders use Shopify's deferred (pre-purchase) system, so checkout shows a default message above the **Pay now** button:
> "One or more items in your cart is a deferred or subscription purchase. By continuing with your payment, you agree that your payment method will automatically be charged at the price and frequency listed on this page until it ends or you cancel. All cancellations are subject to the cancellation policy."
This can confuse customers when there are no recurring charges. You can change it to something more appropriate for your store. For example:
> "One or more items in your cart are rental or resale products. By continuing, you agree that you are paying in full upfront for these items and agree to the cancellation policy."
To edit this message, search for the **Buyer consent product** field. You can also find it by searching for the default content, such as **"One or more items"**. To remove the message entirely, clear the field and save.
A similar label may also appear in your customer's cart. You can find it by searching for **"Buyer Consent Cart"** in the same theme content editor.
## Subscription and membership methods, and card vaulting
The messages in this section appear whenever the cart contains a Shopify subscription. That includes Subscription and Membership methods, and any checkout that includes the card vaulting product.
### Auto-renewal disclosure
When the cart contains a subscription, Shopify displays this disclosure above the **Pay now** button:
> "Your cart contains an automatically renewing subscription. By clicking "Pay now," you expressly and affirmatively agree that you will be automatically charged the recurring amount(s) shown in your cart (plus shipping and taxes) until the subscription(s) ends or you cancel. You may cancel anytime by going to your account or contacting the store. Please see the cancellation policy."
This disclosure can only be edited on Shopify Plus. On all other plans, you can only edit the cancellation instructions sentence ("You may cancel anytime by going to your account or contacting the store."). The rest of the disclosure can't be changed or removed. See [Shopify's subscription considerations](https://help.shopify.com/en/manual/products/purchase-options/subscriptions/considerations) for details on which text you can change.
### Recurring subtotal text
The checkout order summary shows a **"Recurring subtotal"** line, for example:
> **Recurring subtotal**
> First payment \$0.00, then \$0.00 every 12 months
With the card vaulting product this shows the vaulting plan's \$0.00 amount and interval, and the "every 12 months" wording can be confusing when the customer isn't expecting a consumable subscription. This text can be edited on all plans.
To edit it, search for **"recurring totals"**. The line is built from a few fields:
* **Checkout subscriptions recurring totals with policies first cycles** contains the `First payment {{ total_price }}` part.
* **Checkout subscriptions recurring totals with policies** contains the `, then {{ total_price }} every {{ interval }}` part.
Update the text around the `{{ ... }}` placeholders, then save your changes.
The **?** tooltip next to the recurring subtotal ("Does not include shipping, tax, duties, or any applicable discounts.") can also be edited. Search for **"Recurring total tooltip"** in the same theme content editor.
### Recurring shipments label
Due to the nature of subscriptions, a customer is charged on a recurring basis. Shopify sees this as shipments, since it expects a consumable subscription rather than a rental.
At checkout, this displays as **"Recurring Shipments"** followed by a shipping profile and amount (for example, "Economy \$19.00"). Supercycle does not charge this amount for recurring charges, so the label can be misleading.
You can edit the content to clarify it for customers. For example:
> **Any recurring shipments**
> Economy \$19.00
To edit it, search for the **Checkout shipping shipping method recurring shipments group title** field. The search can be tricky, so try searching for **"Recurring shipment"** first, then **"Recurring Shipments"**.
You can also change the frequency wording. Look for **Checkout shipping subscription delivery description subscription delivery frequency day** in the same theme content editor.
# Checkout rules
Source: https://docs.supercycle.com/documentation/configuration/checkout/checkout-rules
Enable Supercycle validations at checkout to prevent overbooking and other rental checkout errors
Supercycle adds a checkout validation in Shopify that enforces rental, membership and availability requirements before customers can complete checkout. The validation runs against every cart and blocks checkout when any of the rules below are not met.
## Supercycle validations
We recommend this is always enabled.
The Supercycle validation enforces the following rules for merchants:
* **Unavailable items**: Ensures requested quantities don't exceed available inventory for rental items.
* **Deposit requirements**: Checks that required deposit products are added to the cart for rental items.
* **Card authorization**: Verifies that vaulted payment methods are available when required.
* **Account requirement**: Ensures customers have accounts for membership rentals (unless purchasing a membership plan).
* **Multiple memberships**: Prevents multiple membership lines in the same cart.
* **Membership combinations**: Ensures membership rentals and non-membership rentals aren't mixed for the same item.
* **Credit allowance**: Verifies customers don't exceed their membership credit limits.
* **Start date consistency**: Ensures all items with the same selling plan have matching start dates for a given duration.
* **Fixed dates**: When 'Fixed dates' is enabled, ensures all rental items in the cart have matching start and end dates.
* **Fulfillment constraint**: Ensures rental items are fulfilled from the location the customer selected at checkout.
## Enable checkout rules in Shopify
In your Shopify admin, go to [**Settings** > **Checkout** > **Checkout rules**](https://admin.shopify.com/settings/checkout).
Enable the `validation` rule.
Save your changes.
# Payments gateways
Source: https://docs.supercycle.com/documentation/configuration/checkout/payments
Enable payments to continue testing your site
Supercycle requires you to use one of the following payment gateways.
* [Shopify Payments](https://help.shopify.com/en/manual/payments/shopify-payments)
* [PayPal Express](https://help.shopify.com/en/manual/payments/paypal)
* [Authorize.net](https://help.shopify.com/en/manual/payments/third-party-providers/set-up-authorize-net)
* [Adyen](https://help.shopify.com/en/manual/payments/third-party-providers/adyen-gateway)
* Stripe
### Testing payments
We recommend enabling Shopify Payments in test mode so that you can test your rental store as you're building it.
You can't test payments on Supercycle using Shopify's Bogus Gateway.
You'll need to have started [setting up Shopify Payments](https://help.shopify.com/en/manual/payments/shopify-payments/testing-shopify-payments).
Navigate to your store **settings** and under **Payments** click **Activate** Shopify Payments.
You'll need to enter some details about your business.
Under **Settings > Payments**, under the Shopify Payments section click **Manage**. In the Test mode section, select **Enable test mode**.
# Calculated fields
Source: https://docs.supercycle.com/documentation/configuration/custom-data/calculated-fields
Derive read-only custom field values from a Liquid formula
Calculated fields are read-only custom fields whose value is computed from a [Liquid](https://shopify.github.io/liquid/) formula. A single formula can pull from [Supercycle custom fields](/documentation/configuration/custom-data/custom-fields), built-in Supercycle system values, and [Shopify metafields](https://help.shopify.com/en/manual/custom-data/metafields) on the same record. For example, you can divide acquisition cost by completed cycles, or set a flag from a metafield.
Calculated fields are available on the same resources as custom fields (**items**, **cycles**, and **consignors**) and appear alongside regular custom fields in the **Custom fields** section on the record. Their value updates on demand via a **Recalculate** button on each field.
## Create a calculated field
In Shopify Admin, head to **Supercycle** > **Settings** > **Custom data** and choose **Items**, **Cycles**, or **Consignors**.
Click **Add definition** on the calculated fields card.
Set up your calculated field:
* **Name**: Display name shown on the record (e.g., "Total rental cost").
* **Key**: Auto-generated identifier based on the name (can be manually edited).
* **Result type**: The type of value the formula produces. Choose from single line text, multi line text, money, integer, boolean, date, or date and time.
* **Formula**: A Liquid expression that computes the value.
Click **Save** to create the calculated field.
The result type cannot be changed after creation. Choose the appropriate type when creating the definition.
## Include in consignor payouts
When [consignment](/documentation/manage/consignment/overview) is enabled and the result type is **Money** or **Integer**, calculated field definitions on **items** or **cycles** show **Include in consignor payouts**. Flagged fields appear as columns on [payout](/documentation/manage/consignment/payouts) breakdown reports. Calculated values recompute when you view the report; a failing formula shows a blank cell.
## Writing formulas
Formulas use [Liquid](https://shopify.github.io/liquid/), the same templating language Shopify themes and notifications use. A formula is any Liquid expression that renders to a value matching the field's result type.
The form lists the available variables as clickable pills. Click one to insert it into your formula.
### General rules
* Formulas are evaluated in **strict mode**. Referencing an undefined variable causes the formula to fail.
* Only **scalar** custom fields are referenceable. Reference fields (customer, cycle, item, return), color, URL, and JSON custom fields are not available in formulas.
* Built-in **system fields** (completed cycles, acquisition cost, schedule dates, charges, and similar) are available alongside custom fields. The formula picker lists them as clickable pills.
* A calculated field cannot reference another calculated field.
* **Money values are always in cents** (integer). For example, `$15.00` is `1500`. A money-typed formula must also produce cents.
* **Durations from system fields are in days** (for example `utilized_days` and `total_utilized_days`).
Money fields are represented in **cents** inside formulas. Multiply and divide accordingly when combining money with other numbers, and remember that the result of a money-typed formula also has to be in cents.
For example, to compute a 10% discount off a daily rate stored as money:
```liquid theme={null}
{{ fields.daily_rate | times: 0.9 }}
```
To convert an integer number of dollars into a money result, multiply by `100`:
```liquid theme={null}
{{ fields.dollars | times: 100 }}
```
### Liquid basics
Liquid has two kinds of markup:
* **Output**: `{{ ... }}` renders a value. Everything a formula produces has to end up inside output tags.
* **Tags**: `{% ... %}` control logic and don't render anything themselves (e.g. `{% if %}`, `{% assign %}`, `{% case %}`).
Values are transformed with **filters**, chained with `|`:
```liquid theme={null}
{{ fields.daily_rate | times: fields.days | plus: fields.cleaning_fee }}
```
Common filters you'll use in formulas:
`plus`, `minus`, `times`, `divided_by`, `modulo`
```liquid theme={null}
{{ fields.rate | times: fields.days }}
```
`round`, `ceil`, `floor`
```liquid theme={null}
{{ fields.total | divided_by: 3 | round }}
```
`default` substitutes a value when the input is empty.
```liquid theme={null}
{{ fields.rate | default: 0 }}
```
`upcase`, `downcase`, `capitalize`, `append`, `prepend`
```liquid theme={null}
{{ fields.sku | prepend: "SC-" }}
```
`date` formats a date with a `strftime` string.
```liquid theme={null}
{{ fields.starts_on | date: "%Y-%m-%d" }}
```
See the [Liquid reference](https://shopify.github.io/liquid/) for the full list.
### Conditional logic
Use `{% if %}` to branch. The formula still has to render a value that matches the result type, so return one on every branch:
```liquid theme={null}
{% if item.fields.replacement_cost > 50000 %}true{% else %}false{% endif %}
```
For more than two branches, `{% case %}` is often cleaner:
```liquid theme={null}
{% case fields.tier %}
{% when "gold" %} {{ fields.base_rate | times: 0.8 }}
{% when "silver" %} {{ fields.base_rate | times: 0.9 }}
{% else %} {{ fields.base_rate }}
{% endcase %}
```
### Working with intermediate values
`{% assign %}` lets you name intermediate values so complex formulas stay readable:
```liquid theme={null}
{% assign gross = fields.daily_rate | times: fields.days %}
{% assign discount = gross | times: fields.discount_percent | divided_by: 100 %}
{{ gross | minus: discount }}
```
## Liquid variable reference
The variables available in a formula depend on the calculated field's owner. Custom field keys are shop-defined; below they are shown as `fields.` and `metafields.`.
### Scalar custom field types
Every `fields.` variable takes its Liquid type from the underlying scalar custom field definition:
| Custom field type | Liquid type | Example | Notes |
| ------------------------ | ----------- | ----------------------- | ----------------- |
| `money` | integer | `1500` | Cents |
| `integer` | integer | `3` | |
| `boolean` | boolean | `true` / `false` | |
| `single_line_text_field` | string | `"hello"` | |
| `multi_line_text_field` | string | `"hello\nworld"` | |
| `date` | string | `"2024-01-15"` | ISO 8601 date |
| `date_time` | string | `"2024-01-15T12:30:00"` | ISO 8601 datetime |
### Liquid references by owner
The variables available in a formula depend on the calculated field's owner. Expand an owner below to see every variable it exposes, along with its Liquid type and where the value comes from.
One entry per scalar custom field defined on items, keyed by the definition's key. The Liquid type mirrors the custom field type: `money` and `integer` are integers (money in cents), `boolean` is a boolean, and text, `date`, and `date_time` are strings.
Number of completed cycles on the item.
Number of unfulfilled (upcoming) cycles on the item.
Number of currently active cycles on the item.
Item acquisition cost in cents.
Lifetime revenue attributed to the item, in cents.
Lifetime ROI for the item in cents.
Share of the item's published lifetime spent utilized, as a fraction from `0` to `1`. `0` when the item has no `published_at`.
Total days the item has been utilized, rounded to two decimal places. Fleet age is measured from `published_at` when set.
Total days the item has not been utilized since publish, rounded to two decimal places. `0` when the item has no `published_at`.
Item visibility status, such as `active` or `draft`.
Item processing status.
The item's linked Shopify variant. Only available when the item has a linked variant.
Shopify purchase price in cents.
Shopify unit cost in cents. May be `nil`.
Locally stored Shopify variant metafield value, keyed by metafield key.
The variant's parent product.
Shopify product metafield value, keyed by metafield key.
One entry per scalar custom field defined on cycles, keyed by the definition's key. The Liquid type mirrors the custom field type: `money` and `integer` are integers (money in cents), `boolean` is a boolean, and text, `date`, and `date_time` are strings.
Planned fulfill date for the outbound leg.
Date the cycle was fulfilled, when set.
Cycle start date.
Cycle end date.
Planned receive date for the inbound leg.
Date the cycle was received back, when set.
Restock-by date for the inbound leg.
Days this cycle utilized the item, rounded to two decimal places.
Original unit price on the line item, in cents.
Discounted unit price on the line item, in cents.
Subtotal of open (not cancelled) charges on the cycle, in cents.
Amount paid across open charges on the cycle, in cents.
Amount still due across open charges on the cycle, in cents.
Deposit amount on the cycle in cents, or `0` when there is no deposit.
Deposit amount refunded in cents, or `0` when there is no deposit.
The rented item. Includes the item's custom fields, [system fields](/documentation/configuration/custom-data/calculated-fields#liquid-references-by-owner), and, when the item has a linked Shopify variant, its variant data. Nested as `item.*`, for example `item.completed_cycles` or `item.acquisition_cost`.
One entry per scalar custom field defined on items, keyed by the definition's key.
Number of completed cycles on the item.
Number of unfulfilled (upcoming) cycles on the item.
Number of currently active cycles on the item.
Item acquisition cost in cents.
Lifetime revenue attributed to the item, in cents.
Lifetime ROI for the item in cents.
Share of the item's published lifetime spent utilized, as a fraction from `0` to `1`.
Total days the item has been utilized.
Total days the item has not been utilized since publish.
Item visibility status.
Item processing status.
The item's linked Shopify variant. Only available when the item has a linked variant.
Shopify purchase price in cents.
Shopify unit cost in cents. May be `nil`.
Locally stored Shopify variant metafield value, keyed by metafield key.
The variant's parent product.
Shopify product metafield value, keyed by metafield key.
One entry per scalar custom field defined on consignors, keyed by the definition's key. The Liquid type mirrors the custom field type: `money` and `integer` are integers (money in cents), `boolean` is a boolean, and text, `date`, and `date_time` are strings.
More information on using Liquid can be found [on Shopify's developer documentation](https://shopify.dev/docs/api/liquid).
### Allowed result types
A calculated field's output must match its declared result type. Result types are the same scalar set as the referenceable custom field types:
* `money` (stored as cents, e.g. `"4500"`)
* `integer`
* `boolean`
* `single_line_text_field`
* `multi_line_text_field`
* `date`
* `date_time`
## Example formulas
### Miles completed during a cycle (integer)
Set on a **cycle**. Record the item's odometer reading at drop-off and return, and store the difference as the miles completed on this cycle.
```liquid theme={null}
{{ fields.odometer_return | minus: fields.odometer_start }}
```
### Total miles completed on an item (integer)
Set on an **item**. Accumulate miles across cycles by adding this cycle's contribution to the running total already stored on the item.
```liquid theme={null}
{{ fields.total_miles | plus: fields.miles_this_cycle }}
```
Because calculated fields recalculate on demand, click **Recalculate** on the item's `total_miles` field after each cycle to roll its value forward.
### Average revenue per completed cycle (money)
Set on an **item**. Divide lifetime revenue by completed cycles. Money stays in cents.
```liquid theme={null}
{% if completed_cycles > 0 %}
{{ lifecycle_revenue | divided_by: completed_cycles }}
{% else %}
0
{% endif %}
```
### Time to breakeven, in cycles (integer)
Set on an **item**. Divide remaining cost to recover by average revenue per cycle, using system fields for acquisition cost and lifecycle revenue plus a merchant-managed `average_revenue_per_cycle` metafield on the product.
```liquid theme={null}
{% assign remaining = acquisition_cost | minus: lifecycle_revenue %}
{{ remaining | divided_by: variant.product.metafields.average_revenue_per_cycle | ceil }}
```
### Has broken even (boolean)
Set on an **item**. Flag items whose lifecycle revenue has met or exceeded their acquisition cost.
```liquid theme={null}
{% if lifecycle_revenue >= acquisition_cost %}true{% else %}false{% endif %}
```
### Cycle yield including charges (money)
Set on a **cycle**. Add the discounted line price to charges paid on the cycle.
```liquid theme={null}
{{ discounted_unit_price | plus: charges_paid }}
```
## Recalculating values
Calculated fields don't update automatically when the fields they depend on change. To update a value:
Open the item, cycle, or consignor that owns the calculated field.
Scroll to the **Custom fields** section and locate the calculated field you want to update.
Click the field, then press **Recalculate**. The formula is rendered against the record's current field values and the result is saved.
If the formula is invalid, or the rendered result doesn't match the declared result type (for example, the formula produces `"abc"` for a **money** field), the recalculation fails and the previously stored value is left unchanged. Fix the formula in **Settings** > **Custom data** and try again.
# Custom fields
Source: https://docs.supercycle.com/documentation/configuration/custom-data/custom-fields
Add custom field definitions to your items, cycles, and consignors
Custom fields let you add custom field definitions to your items, cycles, and consignors, so you can capture additional information specific to your business needs. This is useful for tracking specialized attributes, internal notes, or business-specific data that isn't covered by Supercycle's standard fields.
Supercycle custom fields are available on:
* **Items**
* **Cycles**
* **Consignors**
For other Shopify resources such as products, variants, orders, and customers, use [Shopify metafields](https://help.shopify.com/en/manual/custom-data/metafields) to capture the same kind of structured custom data. Shopify metafields and Supercycle custom fields can coexist on the same resource.
For read-only fields whose values are computed from a formula, see [Calculated fields](/documentation/configuration/custom-data/calculated-fields).
## Setting up custom fields
### Access custom data settings
In Shopify Admin, head to **Supercycle** > **Settings** > **Custom data**.
### Create custom field definitions
Select whether you want to add custom fields to **Items**, **Cycles**, or **Consignors**.
Click **Add definition** to create a new custom field.
Set up your custom field:
* **Name**: Display name for the field (e.g., "Serial Number", "Condition Notes")
* **Key**: Auto-generated identifier based on the name (can be manually edited)
* **Type**: Select from the available field types (see below)
Click **Save** to create the custom field definition.
## Field types
Custom fields support the following types:
| Type | Description |
| -------------------------- | ---------------------------------------------------------------------- |
| **Single line text field** | Short text input for simple values like serial numbers or codes |
| **Multi line text field** | Longer text input for notes or descriptions |
| **Boolean** | True/false checkbox for yes/no values |
| **Date** | Date picker for dates without time |
| **Date and time** | Date and time picker for timestamps |
| **Money** | Currency value input |
| **Integer** | Whole number input (positive or negative) |
| **Color** | Hex color value (e.g. `#1a2b3c`) |
| **URL** | Link to an external resource (must start with `http://` or `https://`) |
| **JSON** | Arbitrary JSON-formatted value for structured data |
| **Customer reference** | Link to a customer record |
| **Cycle reference** | Link to a cycle record |
| **Item reference** | Link to an item record |
| **Return reference** | Link to a return order record |
The field type cannot be changed after creation. Choose the appropriate type when creating your custom field definition.
## Include in consignor payouts
When [consignment](/documentation/manage/consignment/overview) is enabled, item and cycle field definitions with type **Money** or **Integer** show an **Include in consignor payouts** checkbox. Turn it on to add that field as a column on [consignor payout](/documentation/manage/consignment/payouts) breakdown reports — for example a repair fee your revenue share formula deducts.
Values read **live** from the entry's item or cycle when you open the payout, so fees entered after the sale still appear. Money columns on the payout itself stay frozen at earning time. If the field is empty or its source record was deleted, the cell is blank.
The checkbox clears automatically if you change the field type away from money or integer.
## Managing custom field definitions
Click on any custom field definition name to edit its settings. You can update the name and key, but the type cannot be changed after creation.
The custom data table shows how many items or cycles are using each field definition, helping you track adoption and identify unused fields.
Use the **Delete** button on individual field definition pages to remove unused custom fields. Be careful as this action cannot be undone.
## Best practices
Use clear, descriptive names for your custom fields that will be easily understood by your team (e.g., "Warranty Expiration", "Purchase Order Number").
While keys are auto-generated, you can customize them for API consistency. Use lowercase letters, numbers, and underscores only.
# Patchworks integration
Source: https://docs.supercycle.com/documentation/configuration/integrations/patchworks
Connectors for the Patchworks iPaaS platform
Supercycle offers pre-built connectors on [Patchworks](https://www.wearepatchworks.com/) that make it easy to integrate with your warehouse management systems, 3PLs, and broader ecommerce, operations, and finance stack.
Patchworks provides a comprehensive integration platform that connects Supercycle with your existing business systems. These pre-built connectors eliminate the need for custom development and enable you to quickly sync data across your technology stack.
These may include using Patchworks to connect Supercycle to:
* **Warehouse management systems (WMS)** - Sync inventory levels, order fulfillment, and shipping data
* **Third-party logistics (3PL)** - Automate order routing and tracking information
* **Finance systems** - Sync transaction data and accounting records
## Getting started
To set up a Patchworks integration:
Visit [Patchworks](https://www.wearepatchworks.com/) to explore available connectors
Contact the Patchworks team to discuss your integration requirements
Work with Patchworks to configure the connectors for your specific systems
For technical support with Patchworks integrations, reach out to the Patchworks support team.
For hands on integration projects, we have specialist Supercycle and Patchworks integration agencies such as [Cogent2](https://www.cogent2.com/) we can connect you with.
# Logistics buffers
Source: https://docs.supercycle.com/documentation/configuration/logistics/buffers
Add preparation, delivery, and restock time around rentals so items are ready before they can be booked again
Logistics buffers add time around rentals so your team can prepare, deliver, and restock items before they’re available again.\
The **rental period + logistics buffers = the cycle period**.
Your **preparation buffer** and **delivery buffer** make up *outbound logistics*.\
Your **reverse delivery buffer** and **restock buffer** make up *reverse logistics*.
## How Supercycle calculates availability
Supercycle calculates the soonest available rental as:\
**Current time in store’s timezone + preparation time → next available cutoff time + delivery time**
This ensures customers can only rent items when they’re ready to be fulfilled and restocked.
***
## Buffer types
Each buffer defines how much extra time is added before or after a rental.
| Buffer | Description |
| ------------------------- | ------------------------------------------------------------------------ |
| **Preparation time** | Time needed to prepare the item before it can be delivered or picked up. |
| **Cutoff time** | The last time of day orders can be placed for same-day fulfillment. |
| **Delivery time** | Number of days after the cutoff needed to deliver an item. |
| **Reverse delivery time** | Time it takes for an item to return after a customer sends it back. |
| **Restock time** | Time needed to process the returned item and make it available again. |
***
## Delivery methods
You can manage which delivery methods are available and how long they take under **Supercycle > Settings > Logistics and locations**.
### Shipping
Define your **cutoff times** and **delivery times** for each day of the week.\
Orders placed after the cutoff time are processed the next day.
### Pick up (beta)
Merchants can now offer **pick up** as a delivery method.\
Toggle pick up on and set a **cutoff schedule** for each day customers can collect orders. Pick up has no delivery time — the rental starts the day the order is fulfilled.
Pick up delivery is currently in **beta** and not available to all merchants.\
If you'd like to enable it, contact us at [support@supercycle.com](mailto:support@supercycle.com) and we'll set it up for your store.
For detailed setup instructions and information about pickup location behavior, see [Pickup in store](/documentation/configuration/logistics/pickup-in-store).
### Shipping is optional
You can turn shipping off entirely and operate as pick up only, as long as at least one delivery method remains enabled. The same applies to returns: shipping returns can be disabled if drop off is enabled.
If you try to disable the last enabled method on either side, the change is blocked with **"At least one delivery method must be enabled"** (or the equivalent for returns). Enable the alternative method first, then disable shipping.
When shipping is disabled, the storefront picker hides the shipping option and preselects the remaining method for new customers.
***
## Return methods
You can manage which return methods are available and how long they take under the **Return** section of **Supercycle > Settings > Logistics and locations**.
### Ship back
Set your **reverse delivery time**: how long it typically takes for an item to return after a customer sends it back, and your **restock time**, which is how long it takes to process and make it available again. Ship back is enabled by default and cannot be disabled.
### Drop off (beta)
Merchants can now offer **drop off** as a return method. Toggle drop off on and set a **restock time** for items returned in person. Drop off has no reverse delivery time — the item is received the moment the rental ends.
Drop off returns are currently in **beta** and not available to all merchants. If you'd like to enable it, contact us at [support@supercycle.com](mailto:support@supercycle.com) and we'll set it up for your store.
When more than one return method is enabled, customers see a **Return method** picker on the product page and the rental's availability adjusts based on their choice. For detailed setup instructions, see [Drop off returns](/documentation/configuration/logistics/drop-off-returns).
Drop off can be used in place of shipping returns. To run drop off only, enable drop off first, then disable shipping returns.
Products can override the global **restock time** when configured during [calendar product setup](/documentation/setup/importing-products).
***
## Considerations
### Effects on availability
When Supercycle calculates availability, the entire cycle period (rental + buffers) is treated as unavailable.\
Items become available for new rentals only after:
* The end of the cycle period, or
* The restock time has passed after the item’s return, whichever is sooner.
Customers always see availability based on the store’s timezone.
### Effects of restocking
When an item is restocked after return, it becomes immediately available for new rentals, even if the original cycle’s buffer period hasn’t ended.
### Overriding buffer dates on a single cycle
The preparation and restock buffers apply to every new cycle by default, but you can override the resulting **prepare from** and **restock by** dates on an individual cycle when a specific rental needs more or less turnaround. See [Edit restock by and prepare from dates](/documentation/manage/cycles/rental-actions#edit-restock-by-and-prepare-from-dates).
***
## Set up logistics buffers
In Shopify admin, go to **Supercycle > Settings > Logistics and locations**.
Under **Buffer times**, set your preparation and restock time.
Open **Shipping** to set cutoff times and delivery time, or open **Pick up** to toggle it on and set a cutoff schedule. You can disable shipping as long as at least one other delivery method remains enabled.
Under **Return**, set your reverse delivery and restock times.
Click **Save** before exiting.
***
## FAQs
From your Shopify admin, go to **Apps** → [Supercycle](https://admin.shopify.com/apps/supercycle/) → **Settings** → **Channels** → **Online store**.
Under **Date picker blocked dates**, click **Add dates** to create a rule. Choose the block type (specific date, range, before/after, or days of the week), set whether it applies to start dates, end dates, or both, and save.
See [Date picker blocked dates](/documentation/online-store/date-picker-blocks) for examples and how these rules differ from inventory [Blocked dates](/documentation/manage/inventory/blocked-dates).
Older stores may still use the Methods app block theme settings **Unavailable start dates** and **Unavailable end dates**. Each field accepts JSON matcher format and is enforced independently.
```json theme={null}
{"dayOfWeek": [0, 6]}
```
These fields are deprecated in favour of the admin settings above. Full matcher reference: [Legacy theme JSON matchers](/developers/app-blocks/methods#legacy-theme-json-matchers).
# Drop off returns
Source: https://docs.supercycle.com/documentation/configuration/logistics/drop-off-returns
Let customers return rentals in person at one of your store locations
Drop off returns let customers hand items back at one of your physical store locations instead of shipping them back. When drop off is enabled, customers can choose between **Ship back** and **Drop off** on the product page, and Supercycle adjusts the rental's availability dates to match the return method they pick.
Drop off returns are currently in **beta** and not available to all merchants.
If you'd like to enable it, contact us at [support@supercycle.com](mailto:support@supercycle.com) and we'll set it up for your store.
## How it works
Drop off is treated as an instant hand-back — the moment the rental ends, the item is back in your possession. There's no reverse delivery time, so the item moves straight into your restock buffer and becomes available again sooner than a shipped return.
| Return method | Reverse delivery time | When the item is received |
| ------------- | ---------------------------- | ---------------------------- |
| **Ship back** | Number of days you configure | After the carrier returns it |
| **Drop off** | None | The day the rental ends |
If only one return method is enabled, customers don't see a picker — the rental uses that method automatically. **Ship back** is enabled by default and cannot be disabled.
## Setting up drop off returns
In **Shopify Admin**, go to **Supercycle > Settings > Logistics and locations**. Under **Return**, select **Drop off**, toggle it on, and set the **restock time** for drop off returns.
Under **Ship back**, confirm your **reverse delivery time** and **restock time**. These apply when customers choose to ship their rental back.
Click **Save** before exiting.
## Customer experience
When more than one return method is enabled, the product page shows a **Return method** picker with **Ship back** and **Drop off** options. The available rental dates update based on the customer's choice, so they can see exactly when an item needs to be back if they pick drop off versus shipping it back.
The selected return method is stored on the order and used when the rental is scheduled, so your team knows how to expect the item back.
## Drop off times
You can let customers choose a **drop-off time** when they book, with the available times driven by each location's opening hours. See [Opening hours](/documentation/configuration/logistics/opening-hours) to set per-location hours and turn on time selection for drop off.
## Related documentation
* [Opening hours](/documentation/configuration/logistics/opening-hours) - Let customers pick a return time from each location's hours
* [Logistics buffers](/documentation/configuration/logistics/buffers) - Configure preparation, delivery, and restock times
* [Pickup in store](/documentation/configuration/logistics/pickup-in-store) - Let customers collect rentals in person
* [Locations](/documentation/configuration/logistics/locations) - Set up your store locations
# Locations
Source: https://docs.supercycle.com/documentation/configuration/logistics/locations
Enable when items are stored at multiple physical locations
Locations represent the physical warehouses or store locations where your inventory items are stored. This feature is essential for businesses that operate multiple warehouses, have retail stores that serve as pickup points, or need to track which specific location an item is stored at.
Supercycle uses Shopify's native location system, so your existing Shopify locations will be available in Supercycle for inventory management.
## Setting up locations
Ensure you have set up your locations in Shopify admin:
In your Shopify admin, navigate to **Settings** > **Locations**.
Add new locations or edit existing ones as needed. Each location should represent a physical place where inventory is stored.
For each location, set up:
* Location name
* Address details
* Whether the location fulfills online orders
* Local delivery settings (if applicable)
Enable the locations feature in Supercycle:
In Shopify Admin, head to **Supercycle** > **Settings** > **Locations**.
Click the **Enable locations** toggle to activate location tracking for your inventory.
For each location, you can control:
* **Fulfills online orders**: Managed by Shopify (read-only)
* **Fulfills rental orders**: Toggle to control which locations can fulfill rental orders
Enable **Require location** to force customers to select a location before adding items to their cart. This restricts inventory and shipping methods to those available at the selected location.
When "Require location" is enabled, items without assigned locations will become unavailable for rent. Supercycle will display a warning banner showing how many items are affected.
Assign inventory items to specific locations in Supercycle:
Update location from the [Location](/documentation/manage/inventory/items#location) field on the item page.
Use the **Update location** action from the **Actions** options on the [Inventory](https://admin.shopify.com/apps/supercycle/items) table.
## Location-based customer experience
When locations are enabled and required, customers will need to select a location before adding items to their cart. This provides several benefits:
* **Accurate availability**: Only shows items available at the selected location
* **Location-specific shipping**: Restricts shipping methods to those available from the selected location
* **Local inventory**: Displays real-time availability for the selected location
You can extend Supercycle to add location-based features such as:
* **Zip code locator**: Help customers find the nearest location
* **Delivery zones**: Configure different delivery options based on location
## Best practices
Use clear, consistent naming conventions for your locations (e.g., "NYC Warehouse", "LA Store", "Chicago Fulfillment Center").
Regularly review and balance inventory across locations to optimize availability and fulfillment efficiency. Use the inventory count links in the locations table to quickly view items per location.
Configure which locations fulfill rental orders vs. online orders. Some locations might be suitable for storage but not fulfillment.
Keep track of items without assigned locations using the "No location" row in the locations table. These items become unavailable when location selection is required.
## Related documentation
* [Items management](/documentation/manage/inventory/items) - Learn how to assign items to locations
* [Storefront API](/api-reference/storefront/introduction) - Technical details for location-based filtering
# Troubleshooting
Source: https://docs.supercycle.com/documentation/configuration/logistics/logistics-troubleshooting
Troubleshooting common logistics and shipping issues for Supercycle on Shopify.
**Problem**\
Customers are charged more than once for shipping on a single order.
**Why it happens**\
Shopify splits orders into separate shipments when items have different fulfillment timings, belong to different shipping profiles, or ship from different locations. Each split can add another shipping fee.
**How to fix it**\
Turn off **Split shipping** in Shopify so all items ship under one label and customers pay once.
In **Shopify Admin**, go to **Settings → Shipping and delivery**.
If the toggle isn’t visible, create a temporary **empty shipping profile** (no products assigned).
Once visible, turn off **Split shipping**.
Delete the temporary profile if you don’t need it.
**Problem**\
Customers see a future shipping date at checkout (for example, **"Ships June 2041"**) when purchasing a rental product. The date is incorrect and does not reflect the actual rental period.
**Why it happens**\
Shopify reads the fulfillment date from Supercycle's selling plan configuration and displays it using the **"Pre order ships date"** label in checkout. When that date is incorrect, customers see a confusing or alarming date.
**How to fix it**\
As a workaround, you can hide or replace the date with neutral text.
In your Shopify admin, go to **Online Store** > **Themes**. Click the **...** beside the theme you want to edit and select **Edit default theme content**.
Click the **Checkout & system** tab.
Search for **"ships"** and find the field **Pre order ships date**. It will contain the default value `Ships {{date}}`.
Replace the text with something neutral like `Ships soon`, or clear the field entirely to hide it. Save your changes.
# Opening hours
Source: https://docs.supercycle.com/documentation/configuration/logistics/opening-hours
Set per-location opening hours so customers pick a pick-up or drop-off time that works for each store
Opening hours let customers choose a **pick-up or drop-off time** when they book, with the available times coming from each location's own hours. A customer collecting from your city-centre store sees that store's Saturday hours; someone dropping back at the warehouse sees the warehouse's weekday window.
Opening hours and time selection are currently rolling out and not available to all merchants.
If you'd like to enable them, contact us at [support@supercycle.com](mailto:support@supercycle.com) and we'll switch them on for your store.
## How it works
Each [location](/documentation/configuration/logistics/locations) has its own weekly opening hours and a flag for whether it offers in-person pick up and drop off. Once time selection is turned on for [pick up](/documentation/configuration/logistics/pickup-in-store) or [drop off](/documentation/configuration/logistics/drop-off-returns), the storefront uses those hours to:
* **Offer time slots** within the selected location's window for the chosen day, at the interval you set. That's the rental's start day for pick up, or its end day for drop off.
* **Block closed days** as a start date (for pick up) or end date (for drop off), so a customer can't book a hand-off on a day the location is shut.
* **Filter the location picker** to only the locations that offer the chosen method, and show the selected location's weekly hours as help text (for example, *"Open Mon–Fri 7:00am–12:00pm · Sat 10:00am–2:00pm"*).
Locations start with default hours of **9:00am–5:00pm, Monday to Sunday**. Until you customise a location's hours, its time slots follow that default, so turning the feature on is safe for every store.
## Setting opening hours
Opening hours are managed from the locations table alongside your other per-location logistics settings.
In **Shopify Admin**, go to **Supercycle** > **Settings** > [**Logistics and locations**](https://admin.shopify.com/apps/supercycle/settings/logistics). The locations table lists every location with its **Open days**, **Shipping**, and **In store** (pick up and drop off) settings.
Select a location's name to open its settings, then use the **Opening hours** section to set the window. Tick **Same hours every day** to apply one From/To window across the week, or untick it to open and close individual days and give each its own hours.
Select multiple rows and use **Edit opening hours** to apply the same hours to all of them, or **Edit logistics** to set whether they offer shipping and in-person pick up and drop off. Changes apply immediately.
A location must be open on at least one day. Closed days simply have no hours, so they're removed from the customer's available dates for that location.
## Turning on time selection
Time selection is enabled per method, so you can offer it for pick up, drop off, or both.
On the same **Logistics and locations** page, open the **Pick up** delivery method or the **Drop off** return method.
Turn on **time selection** for that method to let customers choose a time when they book.
Choose the **Time interval** (**15 minutes**, **30 minutes**, or **1 hour**) that sets the gap between the times customers can pick from within each location's window.
When pick-up time selection is on, the pick-up [order cutoff schedule](/documentation/configuration/logistics/order-cutoff-time) is replaced by opening-hours-driven slots, and you no longer set per-method From/To times. The times come from each location's hours instead.
## Customer experience
When time selection is on and a location has hours, customers booking that method see a time picker built from the location's window for the day they've chosen, stepped by your interval. Days the location is closed can't be selected for that hand-off, and the location picker shows each location's weekly hours so customers know what they're choosing before they commit.
## Related documentation
* [Locations](/documentation/configuration/logistics/locations) - Set up your store locations and assign inventory
* [Pickup in store](/documentation/configuration/logistics/pickup-in-store) - Let customers collect rentals in person
* [Drop off returns](/documentation/configuration/logistics/drop-off-returns) - Let customers hand rentals back in person
# Order cutoff time
Source: https://docs.supercycle.com/documentation/configuration/logistics/order-cutoff-time
Set the latest time a customer can place a rental for a given despatch day, including time zones and no-despatch days
Order cutoff schedules determine the latest a customer can order on a day for their rental to start as soon as the delivery buffer.
For example, if it's currently Monday and you have a delivery buffer of 2 days, a customer must order before your *Monday order cutoff time* in order for their rental to start on Wednesday.
In the example above, if the order cutoff time is 3PM and the customer is attempting to rent an item at 4PM, the earliest availability they will see is Thursday (Tuesday despatch + delivery buffer of 2 days).
We recommend setting your order cutoff schedule to match your courier's latest pickup time minus the time you need to prepare the rental.
***
## Time zones
The **calendar picker** always uses the store’s time zone.\
If a customer is browsing from a different time zone, the cutoff still applies in the store’s local time.
Example:
* Store time zone is UTC+0 with a cutoff at **14:00**.
* A customer browsing from UTC+3 still sees the cutoff as **14:00** UTC+0.
* In their local time, this means the cutoff is actually **17:00**.
***
## No despatch day
If you don't despatch on a certain day of the week you should set your order cutoff to nothing.
In the case above, if Monday was a *No despatch day*, the customer would not see availability until Thursday, regardless of the time they were browsing.
If Monday had a cutoff of 3PM and Tuesday was a *No despatch day*, the first availability a customer browsing at 4PM on Monday would see is Thursday. This is because:
* It's too late to despatch the item on Monday
* No despatches occur on Tuesday
* The item will be despatched on Wednesday with a delivery buffer of 2 days.
***
## No order cutoff
To create a day where you essentially have no cutoff time, you should set the cutoff for that day to 11:59PM.
This means any time before 11:59PM, the customer will be before the cutoff.
***
## Setting your cutoff schedule
In Shopify Admin, head to **Supercycle** > **Settings** > [**Logistics**](https://admin.shopify.com/apps/supercycle/settings/logistics)
Under **Delivery**, set order cutoff times for each day of the week.
Leave non-despatch days blank.
**Save** your changes before exiting.
# Pickup in store
Source: https://docs.supercycle.com/documentation/configuration/logistics/pickup-in-store
Allow customers to collect rentals from your physical locations
Pickup in store lets customers collect their rental orders from one of your physical store locations instead of having items shipped to them.
Pickup in store is currently in **beta** and not available to all merchants.\
If you'd like to enable it, contact us at [support@supercycle.com](mailto:support@supercycle.com) and we'll set it up for your store.
## How it works
When pickup is enabled, customers can select "pickup in store" during checkout. Supercycle uses Shopify's native local pickup functionality, so you'll need to configure pickup locations in Shopify first.
## Setting up pickup in store
In **Shopify Admin**, go to **Settings > Shipping and delivery > Local pickup**. Enable local pickup for the locations where customers can collect orders.
In **Shopify Admin**, go to **Supercycle > Settings > Logistics and locations**. Under delivery methods, select **Pick up**, toggle it on, and configure your cutoff schedule for pickup orders.
Set a **cutoff time** for each day customers can collect orders. Pickup is treated as an instant hand-off, so there's no delivery time — the rental starts the day the order is fulfilled. Leave a day blank to skip pickup that day.
If you only want to offer pick up, disable the shipping delivery method on the same page. Do the same under return methods if you only want to offer drop off. At least one delivery method and one return method must remain enabled — disabling the last one is blocked with a validation error.
## Running pick up / drop off only
Shipping is no longer required. A shop can operate with pick up as the only delivery method and drop off as the only return method, provided each side has at least one enabled method.
When shipping is disabled:
* The storefront method picker hides the shipping option for that side.
* New customers are preselected onto the remaining enabled method (the storefront reads `default_delivery_method_type` and `default_return_method_type` from the theme app settings metafield).
* Disabling the last enabled method on either side fails with **"At least one delivery method must be enabled"** or **"At least one return method must be enabled"**. Enable the alternative method before disabling the current one.
## Pickup location behavior
How the pickup location is set on an order depends on how the order is created:
| Order type | Pickup location behavior |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| **Online checkout** | Automatically populated when the customer selects "pickup in store" |
| **Draft order** | Must be set manually using the "Add shipping or delivery" text in the payment section *while the order is still in draft* |
| **Confirmed order** | You can update the store location, but you cannot switch between store pickup and shipping—the fulfillment type is locked |
### Online checkout
When a customer selects "pickup in store" during online checkout, the pickup location is automatically populated on the Shopify order. No manual intervention is required.
### Draft orders
When creating a draft order for a pickup, you must manually set the pickup location:
Create the draft order as usual
In the payment section, click **Add shipping or delivery**
Select **Local pickup** and choose the store location
Complete the draft order
The pickup location must be set while the order is still in draft. Once the order is confirmed, you cannot change the fulfillment type.
### Confirmed orders
Once an order is confirmed in Shopify:
* You **can** update which store location the customer will pick up from
* You **cannot** switch between store pickup and shipping—the fulfillment type is locked
## Pickup times
You can let customers choose a **pickup time** when they book, with the available times driven by each location's opening hours. See [Opening hours](/documentation/configuration/logistics/opening-hours) to set per-location hours and turn on time selection for pick up.
## Related documentation
* [Opening hours](/documentation/configuration/logistics/opening-hours) - Let customers pick a collection time from each location's hours
* [Logistics buffers](/documentation/configuration/logistics/buffers) - Configure preparation and delivery times for pickup orders
* [Locations](/documentation/configuration/logistics/locations) - Set up your store locations for inventory and fulfillment
# Migrations overview
Source: https://docs.supercycle.com/documentation/configuration/migrations/overview
Requirements and options for migrating to Supercycle
This guide covers the requirements and migration options for moving your existing rental or subscription business to Supercycle.
Supercycle offers managed migrations and can advise on the best migration path for your business. [Contact us](mailto:support@supercycle.com) to discuss your migration.
## Supported platforms
Supercycle can migrate from a variety of platforms:
| Platform | Difficulty |
| ---------------------------------------------- | ---------- |
| Any system using Stripe | Easy |
| Firmhouse | Easy |
| Circuly | Easy |
| Booqable | Easy |
| Twice Commerce | Easy |
| Recharge (and other Shopify subscription apps) | Easy |
| Other systems, including bespoke | On request |
## Requirements for all migrations
Before starting any migration, ensure you have completed the following:
Import your product catalog into Supercycle. See [importing products](/documentation/setup/importing-products) for details.
Configure your circular commerce methods (Calendar, Membership, Subscription, or Resale). See [methods setup](/documentation/setup/methods-setup) for details.
Set up your inventory via CSV import. This ensures all items are tracked and available for allocation.
## Migration options for Subscriptions and Memberships
Choose one of the following migration paths for subscription or membership-based businesses:
### Migrate on old payment method
Available for **Stripe**, **Authorize.net**, and **Braintree**.
This option allows you to continue billing customers using their existing payment methods without requiring them to re-enter payment details.
Import your existing customer records into Shopify.
Transfer the vaulted payment method tokens from your existing payment processor to Shopify.
Import your subscription or membership contracts into Supercycle and begin billing from Supercycle.
### Migrate on new payment method
This option requires customers to add a new payment method before billing can continue.
Import your existing customer records into Shopify.
Send email or SMS invitations to customers requesting they add a new payment method.
Import your subscription or membership contracts into Supercycle and begin billing once payment methods are added.
### No migration switch
Run both systems in parallel without migrating existing customers.
* New customers are managed from Supercycle
* Old customers continue to be managed from your existing system
* Items are added to Supercycle once they are physically returned from the old system
## Migration options for Calendar and Resale
Choose one of the following migration paths for calendar rental or resale businesses:
### Migrate management, but not vaulted billing
This option migrates your customer and rental data without transferring payment method tokens.
Import your existing customer records into Shopify.
Import your product catalog into Shopify.
Import both historic and future rental records into Supercycle for unified management.
### No migration switch
Run both systems in parallel without migrating existing customers.
* New customers are managed from Supercycle
* Old customers continue to be managed from your existing system
* Items are added to Supercycle once they are physically returned from the old system
# Migrate from Stripe
Source: https://docs.supercycle.com/documentation/configuration/migrations/stripe
Import your Stripe customers and payment methods into Supercycle
This guide covers how to migrate customers and their vaulted payment methods from Stripe to Supercycle.
## Prerequisites
Before starting the migration, ensure you have:
* Completed the [migrations overview](/documentation/configuration/migrations/overview) requirements
* Access to your Stripe dashboard to export customer data
* The Stripe import feature enabled for your store
The **Import from Stripe** option is not enabled by default. Contact Supercycle support to request this feature be enabled for your store before proceeding.
## Export customers from Stripe
Export your customer data from Stripe including their payment method information.
Navigate to **Customers** in your Stripe dashboard.
Click **Export** and download a CSV file containing your customer records.
Ensure your CSV includes the following columns:
| Column | Description | Required |
| --------- | --------------------------------------------- | -------- |
| `id` | The Stripe customer ID (e.g., `cus_xxx`) | Yes |
| `email` | Customer email address | Yes |
| `name` | Customer full name | Yes |
| `card_id` | The Stripe payment method ID (e.g., `pm_xxx`) | No |
## Import customers to Supercycle
Once you have your CSV file ready, import it into Supercycle.
In Supercycle, navigate to **Settings** > **Migrations** and select **Import from Stripe**.
Upload the CSV file exported from Stripe.
Supercycle will automatically detect and map the columns. Verify the mappings are correct:
* `id` → Stripe ID
* `email` → Email
* `name` → Name
* `card_id` → Card ID (optional)
Review the preview to ensure the data looks correct, then click **Import** to begin the migration.
## What happens during import
For each row in your CSV, Supercycle will:
1. **Find or create the Shopify customer** by email address
2. **Link the Stripe payment method** to the Shopify customer using Shopify's remote payment method API
3. **Store the payment method** locally for future billing
If a customer with the same email already exists in Shopify, Supercycle will link the Stripe payment method to the existing customer rather than creating a duplicate.
## After the import
Once the import is complete:
* Customers will appear in your Shopify admin and Supercycle
* Payment methods will be available for subscription and membership billing
* You can begin creating subscriptions or memberships for the imported customers
## Troubleshooting
**Problem**\
The import fails with "multiple Shopify customers were found".
**Why it happens**\
You have duplicate customer records in Shopify with the same email address.
**How to fix it**\
Merge or remove the duplicate customers in Shopify before retrying the import.
In **Shopify Admin**, go to **Customers** and search for the email address.
Keep one customer record and merge or delete the others.
Run the Stripe import again.
**Problem**\
The payment method from Stripe is not linking to the customer.
**Why it happens**\
The `card_id` in your CSV is using a legacy card token (starting with `card_`) instead of a payment method ID (starting with `pm_`).
**How to fix it**\
Convert legacy card tokens to payment methods in Stripe before importing.
Check your CSV for any `card_id` values starting with `card_`.
In Stripe, convert the legacy card tokens to payment methods using the Stripe API or dashboard.
Replace the `card_` values with the new `pm_` payment method IDs.
Upload the updated CSV and run the import again.
# Card vaulting
Source: https://docs.supercycle.com/documentation/configuration/risk/card-vaulting
Capture customers' credit card using Shopify's subscription system to reduce risk and fraud by being able to charge the card.
## How it works
Supercycle creates a Shopify subscription product that customers add to their cart to authorize payment method storage. When they complete the checkout process, their payment method is securely vaulted and can be used for future charges. For example, if a customer rents an item and comes back damaged, you are able to charge them.
You don't need card vaulting if using Subscription or Membership methods, as they store customer cards. But it is needed if you want a card on file for creating subscriptions on behalf of customers when they don't have active subscriptions.
## When you need card vaulting
Shopify only stores a customer's payment method when a subscription is included in their order. This means:
* **Subscription** and **Membership** rentals automatically store the card. No vaulting setup needed.
* **Calendar** rental checkouts that do not include a subscription line do not store the card by default.
* **Resale** checkouts do not store the card.
If you ever need to charge the customer after the initial checkout (a deposit, damage fee, late fee, or extension), you need a card on file. Enabling card vaulting captures the payment method at every checkout, including pure Calendar rentals.
## Enable card vaulting
Set up card vaulting by configuring risk settings in Supercycle.
Go to [Settings > Risk](https://admin.shopify.com/apps/supercycle/settings/risk) in Supercycle and enable credit card vaulting.
Configure the product title and selling plan name for the vaulting product. This is what customers will see when adding the product to their cart. You may also want to update the image on the product.
## How customers add their payment method
### Automatic cart addition
For rental orders that require a vaulted payment method, Supercycle automatically adds the vaulting product to the customer's cart if they don't already have one saved.
### Direct cart addition
Customers can add the vaulting product directly to their cart using the permalink URL. This automatically adds the product with the correct subscription configuration.
For example, if you are a merchant that creates orders on customers' behalf, you can send them the link to add their card details, and then you can create orders in Supercycle on behalf of the customer and charge their card.
### Manual addition
If needed it can be setup so customers can manually add the vaulting product from your store's product page.
## Vaulting actions
### Check customer verification status
Check a customer's vaulted payment method status directly on their profile page in Supercycle.
## Vaulting FAQs
Not at the moment. To vault a card, customers must have the vaulting product to their cart.
If a charge fails, Supercycle will retry the payment according to your configured retry settings. Failed charges remain in the system and can be retried manually or automatically.
Yes, you can create multiple charges and charge them all at once to the customer's vaulted payment method. Each charge will be processed as a single payment transaction.
The charging limits depend on your Shopify plan and the customer's payment method. Supercycle will process charges up to the maximum allowed by Shopify's subscription billing system.
## Best practices
* **Clear Communication**: Let customers know that adding the vaulting product will save their payment method for future charges.
* **Transparent Pricing**: The vaulting product is free (\$0) but clearly explains its purpose.
* **Regular Review**: Periodically review vaulted payment methods to ensure they're still valid.
# Deposits
Source: https://docs.supercycle.com/documentation/configuration/risk/deposits
Capture refundable deposits against a rental to cover damage or loss, and manage refund options
Deposits are managed by Supercycle and linked to a rental or subscription. Supercycle owns the deposit product in your Shopify store — you set up deposit prices in Supercycle and each price is kept in sync as a variant on the underlying Shopify product.
When a customer adds a rental product with a deposit in its pricing, the matching deposit variant is added to the cart at the same time. The customer cannot check out the rental item if the deposit is removed.
Currently you can only refund a deposit via Shopify within 120 days. We are looking at other solutions. [more infomation](#refunding-deposits-after-120-days)
## Creating a deposit
Deposits are configured under **Risk > Deposits**. Supercycle creates and maintains the Shopify product for you.
In your Shopify admin, navigate to **Supercycle** > **Risk** > **Deposits**.
Click **Set up**, give the product a title (defaults to `Deposit`), and click **Create product**. Supercycle creates a hidden Shopify product with a single `Price` option. Inventory tracking is disabled automatically so it isn't treated as stock.
Use the price table to add each deposit amount you need. Every price you add becomes a variant on the Shopify product, and the product is synced to Shopify automatically as soon as the first price is added. You can add, edit, or remove prices at any time.
Deposits can be linked to your subscription products during [product setup](/documentation/methods/subscription/product-setup).
### Adding a deposit price from a subscription option
You can also create deposit prices inline while configuring a subscription. In the deposit section of a method option, the **Deposit price** field is an autocomplete:
* Start typing to filter your existing deposit prices, or select one from the list.
* Enter a new amount and choose **Create deposit price** to add it to the deposit product on the fly. The new price is saved, synced to Shopify, and selected for the option once it's ready.
This means you don't need to leave the subscription setup to add a missing deposit amount.
## Deposit FAQs
Refunds processed via Shopify Payments are subject to a **time limit (typically \~120 days)** set by card networks and payment processors. When refunding via Supercycle a message will showin in the order timeline that the refund failed.
When this happens, the deposit **must be refunded outside of Shopify Payments**.
## Available refund options
After the card refund window has expired, merchants should refund deposits using one of the following methods.
### PayPal
* Send the refund directly to the customer’s PayPal account
* Requires the customer’s PayPal email address
* Provides a clear receipt and audit trail
### Bank transfer
* Refund the customer via bank transfer (commonly using a service like Wise)
* Requires bank details appropriate to the customer’s country (for example IBAN, routing number, or local account codes)
### Store credit discount or gift card (optional)
* Issue store credit or a gift card instead of cash
* Should only be used if the customer explicitly agrees
* Can be taken off price of product if customer is purchasing it
## Shopify admin handling
Because the refund is processed externally:
* The order **cannot be marked as refunded via Shopify Payments**
* Merchants should:
* Add an internal order note confirming the refund method and date
* Record the refund in their accounting system as an external or manual refund
**Example order note:**
```
Deposit refund of £150 issued via bank transfer on 29 Jan 2026 (outside card refund window).
```
## Example customer email
You can use the following template when contacting customers about a deposit refund after 120 days:
```text theme={null}
Hi {{customer_name}},
This deposit is now outside the card refund window, so we’re unable to issue the refund back to the original payment method. That said, we can process the refund manually using one of the options below.
Please let us know which you prefer:
• PayPal – we can send the refund directly to your PayPal email address
• Bank transfer – we can refund you via international bank transfer
Once we have your preference (and the relevant details), we’ll process the refund promptly and confirm once it’s been sent.
Thanks for your patience, and sorry for the extra step here.
Best regards,
```
# E-signatures
Source: https://docs.supercycle.com/documentation/configuration/risk/esignatures
Require customers to sign rental contracts online or in store before fulfilling a rental.
E-signatures are currently in beta. Enable them under [Settings > Beta features](https://admin.shopify.com/apps/supercycle/settings/features) before getting started.
E-signatures let you attach signed contracts to rentals. Author contracts as templates with Liquid, send them automatically when an order is placed, and collect signatures online or in person on Shopify POS.
Supercycle charges **\$0.75 per completed e-signature**. A signature is counted when a customer signs a contract.
Key functionalities include:
* **Contract templates**: Author HTML + CSS + Liquid templates for any rental contract you need.
* **Multiple contracts per rental**: Require more than one template per rental option (for example, a rental agreement plus a damage waiver).
* **Multiple ways to sign**: Customers can sign at checkout success, from their customer account, from an emailed link, or in store on POS.
* **Automation triggers**: A `contract_signed` usage event fires once all contracts are signed, ready to use in [Automations](/documentation/manage/automation/automation).
* **Legally compliant**: Signatures are ESIGN, UETA, and eIDAS compliant, with full audit trails and certificates of completion attached to every signed contract.
## Setup E-signatures
Go to [Settings > Beta features](https://admin.shopify.com/apps/supercycle/settings/features) and enable **Contracts**.
Navigate to [Settings > Risk](https://admin.shopify.com/apps/supercycle/settings/risk) and find the **Contract templates** section. Add a template with a name, body (HTML with Liquid), and styles (CSS). Use **Preview** to render the template against sample data before saving.
Open the rental method option for the product (calendar, subscription, membership, or resale) and select one or more contract templates to require at checkout. To attach contract templates to many options at once, use the **Apply contracts** [bulk action](/documentation/manage/products/managing-method-options#bulk-actions) on the options table.
Still on [Settings > Risk](https://admin.shopify.com/apps/supercycle/settings/risk), under **Contract templates**, turn on **Generate contracts for draft orders** if you want unsigned contracts created while a draft is still open. See [Contracts on draft orders](#contracts-on-draft-orders).
## Template variables
Contract templates are written in HTML, styled with CSS, and rendered with [Liquid](https://shopify.github.io/liquid/). The following variables are available:
* `rentals` — array of [rentals](#rental) included in the contract.
* `customer` — the signing [customer](#customer).
* `customer_signature` — replaced with the customer's signature when the document is signed. Required if you want the signature to render in the PDF.
#### Liquid references for contract templates
The title of the rented product
The title of the rented variant
The SKU of the rented item
The serial number of the rented item
The condition of the rented item
The rental start date
The rental end date
The minimum rental term
The date the minimum rental term ends
The rental price in cents
The subscription associated with the rental, if any
The subscription start date
The subscription end date
The formatted subscription price
The subscription amount in cents
The billing frequency of the subscription
The customer's full name
The customer's display name
The customer's first name
The customer's last name
The customer's email address
More information on using Liquid can be found [on Shopify's developer documentation](https://shopify.dev/docs/api/liquid).
## How customers sign
Once an order is placed, Supercycle generates one contract per template and notifies the customer. Customers can sign from any of the following:
* **Thank you page**: Add the **Checkout requirements** block to your thank-you page (same block used for [ID verification](/documentation/configuration/risk/identity-verification)). When the order includes rentals that require contracts, a collapsible **Sign your contract** row appears with a button to `/contracts`. That landing page polls until the contract is ready to sign, redirects straight to signing when there is one, or lists multiple unsigned contracts.
* **Customer account**: Add the **Account requirements** page from the Supercycle customer-account extensions. Unsigned contracts appear on the **Requirements** page with a **Sign contract** button for each template, alongside any outstanding ID verification prompts.
* **Email link**: Supercycle emails the customer a signing link when the order is placed, and you can resend the link from the order at any time.
* **Shopify POS**: Staff open the order in POS and either hand the device to the customer to sign on screen, or display a QR code for the customer to scan and sign on their own phone.
## Contracts on draft orders
By default, contracts are created when the order is placed. Turn on **Generate contracts for draft orders** under [Settings > Risk](https://admin.shopify.com/apps/supercycle/settings/risk) to create unsigned contracts as soon as rental lines are added to a Shopify draft order.
That lets customers sign before checkout completes, which is useful for POS saved carts and admin draft orders that sit unpaid for a while.
A draft with a customer and rental lines that require contracts gets one unsigned contract per template.
The same templates and Liquid variables apply. Draft contracts render against the rental blueprint on the draft line, so you can keep one template for both draft and placed orders.
When the draft becomes an order, Supercycle reuses those contracts instead of creating duplicates.
Ready-to-sign email is **not** sent automatically for draft contracts. Send the signing link or email from the draft when the customer is ready, including from [Shopify POS](/documentation/point-of-sale/pos-overview#contracts-on-draft-orders-on-pos).
Drafts without a customer, and completed drafts, are skipped.
**Generate contracts for draft orders** appears when draft-order contracts are enabled for your store. If you don't see the checkbox, contact [support@supercycle.com](mailto:support@supercycle.com).
## Contract status
Each contract has one of two statuses:
| Status | Meaning |
| ---------- | ------------------------------------------------------------------------------- |
| `unsigned` | The contract has been generated but the customer has not yet signed. |
| `signed` | The contract has been signed and the rendered PDF is stored against the rental. |
When every contract on a rental is `signed`, Supercycle emits a `contract_signed` usage event you can use as a trigger in [workflows](/documentation/manage/automation/create-workflow).
## Compliance and audit trails
Supercycle e-signatures are legally binding and compliant with the major electronic signature regulations:
* **ESIGN Act** (US Electronic Signatures in Global and National Commerce Act)
* **UETA** (US Uniform Electronic Transactions Act)
* **eIDAS** (EU Electronic Identification, Authentication and Trust Services)
Every signed contract includes:
* **Audit trail**: A tamper-evident record of every action taken on the contract, including when it was generated, viewed, and signed, along with the signer's IP address and timestamps.
* **Certificate of completion**: A signed certificate attached to the contract PDF documenting the signing parties, signature events, and audit history — admissible as evidence of intent and consent.
***
## E-signatures FAQs
Supercycle charges \$0.75 per completed e-signature. Generating or sending a contract is free — you only pay when a customer signs.
Calendar, subscription, membership, and resale options can all require contract templates.
Yes. Assign multiple templates to a rental option and Supercycle generates one contract per template. The rental is only fully signed once every contract is signed.
Once a contract is signed, Supercycle stores the rendered PDF against the contract record. You can download it from the order in Supercycle.
Yes. On POS, present the QR code on the till device and the customer scans it to sign on their phone. The POS screen updates automatically once they finish.
Yes. Turn on **Generate contracts for draft orders** under Settings → Risk. Unsigned contracts are created on the draft, and staff can share a QR code, signing link, or email from the draft or from POS. See [Contracts on draft orders](#contracts-on-draft-orders).
# Identity verification
Source: https://docs.supercycle.com/documentation/configuration/risk/identity-verification
Verify your customers' identities with face-matching liveness checks against government-issued IDs
Identity verification is currently a **request access** feature. [Join the waitlist](https://admin.shopify.com/apps/supercycle) from your Supercycle home page to enable it on your store.
This page covers the new identity verification flow. The previous Stripe Identity integration (configured under **Settings > Risk**) is being retired — stores on the new flow no longer use it. If you're still on Stripe Identity, contact support to migrate.
Merchants choose which products require an ID check, and within each product can narrow further to specific **method options** — for example, a product where only the 7-day rental period (Calendar) or the Pro plan (Membership) needs verification while shorter periods or the Basic plan don't. Once a flagged option is in a customer's cart, they're prompted to verify on the thank you page and from their customer account. Approval is tracked at the customer level — a single approved verification fulfils every outstanding request that customer has.
## Setup
In your Shopify admin, go to **Supercycle > Products** and open the product you want to gate behind ID verification. Select the **Calendar**, **Membership**, or **Subscription** method tab — verification is configured at the option level on each method, so a product with multiple methods needs the flag turned on per method.
Each method has a list of options (rental periods on Calendar, plans on Membership and Subscription). Click an option to open its modal, find the **Require ID verification** checkbox, tick it, and save.
The option list shows an **ID verification** column with a **Required** / **Not required** badge so you can see at a glance which options will trigger a check.
From **Supercycle > Products**, click **Method options** in the top right, pick a method, select the options you want, then use the **3-dot (…) menu** in the bulk action bar to **Apply ID verification required**.
Go to [Settings > Checkout](https://admin.shopify.com/settings/checkout), customize the checkout, switch to the **Thank you** page, and add the **Checkout requirements** app block. Save.
The block reads each line's `_cycle` intent data and shows a collapsible row for every outstanding requirement on the order — ID verification when a flagged option was purchased, and [contract signing](/documentation/configuration/risk/esignatures) when a template is attached. Each row links to the matching app-proxy flow (`/identity_verification` or `/contracts`). If the customer is already verified and no other requirements apply, the block renders nothing.
Go to [Settings > Customer accounts](https://admin.shopify.com/settings/customer_accounts), open the customer account editor, and add the **Account requirements** page from the Supercycle extensions. Use **Add to menu** so customers can reach the **Requirements** page from their account navigation.
The page lists outstanding ID verification requests alongside any unsigned [e-signature contracts](/documentation/configuration/risk/esignatures) on the customer's account.
Go to [Settings > Language](https://admin.shopify.com/apps/supercycle/settings/language) and edit the strings for the checkout requirements block, customer account requirements page, and verification page.
## How customers verify
When a customer checks out with a flagged cycle, Supercycle creates an **identity verification request** against their account. Customers can complete the check from any of these surfaces:
* **Thank you page** — the **Checkout requirements** block shows immediately after checkout. The ID verification row expands by default when it is the first outstanding requirement, with a button that opens the Persona embed at `/identity_verification`.
* **Customer account** — the **Requirements** page (from the **Account requirements** extension) shows the current status and lets them resume an in-progress verification or retry a failed one.
The verification page lives at `/identity_verification` on your store.
## Request verification manually
You can ask a customer to verify their identity even if they haven't bought a flagged cycle — useful when you need an extra check before fulfilling a rental, or when a previous request expired.
In Supercycle, open the customer's profile.
In the **Risk** section, find **Identity verification not requested**.
Select **Request ID verification**.
Supercycle creates an outstanding verification request, tags the customer in Shopify with **ID Verification Required**, and surfaces the verification prompt on their **Requirements** page the next time they sign in. If the customer already has an open request, selecting the button refreshes the tag without creating a duplicate.
### Request verification from POS
Store staff can start ID verification directly from Shopify POS using the **Verify ID** action on the order details and post-purchase screens. POS displays a QR code and a shareable link that customers can use to verify on their own phone, and the screen updates automatically once they're done.
See [Verify a customer's ID on POS](/documentation/point-of-sale/pos-overview#verify-a-customers-id-on-pos) for the staff-facing steps.
## Check customer verification status
The button is hidden once the customer has an outstanding request or an approved verification.
## Check verification status
A customer's verification status is shown on their profile in Supercycle. From there you can:
* See the current status (pending, submitted, in review, completed, on hold, expired) and result (approved, rejected, inconclusive).
* Open **View details** to inspect the full verification record, including the documents and reports returned.
* Filter the Customers and Rentals pages by Identity status (see below).
## Filter by Identity status
The **Identity status** filter on the Customers and Rentals pages narrows the list to customers whose verification has reached a particular outcome. Approval is a customer-level property: one approved verification clears every outstanding request that customer has, so a customer is matched against the most favourable outcome they've reached.
| Filter value | Matches customers who… |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Verified | Have at least one **approved** verification. Earlier rejections don't disqualify them. |
| Failed | Have a **rejected** verification and have not since reached an approval. |
| Unverified | Have a verification request but no resolved verification yet (still pending or in review). Customers who never had a request are not matched. |
Use **Verified** to find customers who can rent without further checks, **Failed** to follow up with customers whose verification didn't pass, and **Unverified** to chase customers who started but haven't completed a check.
## Statuses
| Status | Meaning |
| --------- | --------------------------------------------------------------------- |
| Pending | Request created, customer has not started yet. |
| Submitted | Customer has completed the flow; awaiting a decision. |
| In review | The submission is being manually reviewed. |
| Completed | A final result has been returned. |
| On hold | Verification paused — contact support. |
| Expired | The verification link expired; the customer needs to start a new one. |
| Result | Meaning |
| ------------ | ---------------------------------------------------------------------------- |
| Approved | Identity verified. All outstanding requests for this customer are fulfilled. |
| Rejected | Identity could not be verified. The customer can retry. |
| Inconclusive | The provider couldn't determine a result. The customer can retry. |
## FAQs
Supercycle currently uses [Persona](https://withpersona.com) to run identity verification. We may swap providers in the future — we'll always select the solution that best serves our merchants, and any change will be transparent to your customers.
The new integration offers stronger document support, manual review, and richer status reporting. The provider-agnostic data model also means we can swap or add providers in the future without changing your setup.
The previous Stripe Identity flow was configured globally under **Settings > Risk** (verification type, document types, live capture, matching selfie). The new flow has no global configuration — you turn on **Require ID verification** per method option, and Persona handles the document/selfie logic. **Settings > Risk** still has an **ID verification** section, but it only summarizes the feature and links to **Products** so you can manage which options require a check.
Approval is a customer-level property. One approved verification fulfils every outstanding request that customer has, regardless of how many cycles triggered them.
Supercycle ships with a single built-in provider. There are also third-party Shopify apps such as [RealID](https://apps.shopify.com/real-id), [iDenfy](https://apps.shopify.com/idenfy-id-verification) and [Engage Message](https://apps.shopify.com/em-id-and-age-verification) that you can run alongside Supercycle.
# Analytics dashboards
Source: https://docs.supercycle.com/documentation/manage/analytics/dashboards
Native circular commerce reporting built into the Supercycle admin
Supercycle's built-in **Analytics** dashboards turn your circular commerce data into reports you can't get from native Shopify Analytics: utilization, yield, lifecycle ROI, return rates, and recurring-billing health, all calculated from your cycles, items, and charges.
Open **Analytics** from the Supercycle navigation to get started.
## How the dashboards are organised
Analytics is split into a set of dashboards, each grouping related stat tiles and charts. Use the section switcher at the top of the page to move between them.
| Dashboard | What it covers |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Overview** | The headline numbers: cycles created, fulfilled, and received; average lead time, fulfillment, and receival; circular revenue, active cycles, and most rented products. |
| **Calendar** | Cycle throughput for your [Calendar](/documentation/methods/calendar/overview) method: created, fulfilled, received, lead times, and method breakdowns. |
| **Subscriptions** | [Subscription](/documentation/methods/subscription/overview) cycle activity plus recurring-billing health: subscriptions over time, by status, paused count, average lifetime, failed charges, and new vs churned. |
| **Memberships** | [Membership](/documentation/methods/membership/overview) cycle activity, memberships over time and by status, and membership tier distribution. |
| **Resale** | [Resale](/documentation/methods/resale/overview) activity and resale revenue. |
| **Revenue** | Circular revenue, revenue growth, total orders, revenue by location and method, and top products by revenue. |
| **Charges** | Outstanding balance and count, recovered charges, total paid, customers with an outstanding balance, and collection-rate trends. |
| **Items** | Fleet utilization, average completed cycles (yield), average lifetime revenue and ROI, inventory position and value, and age of stock. |
| **Products** | Top products and variants, plus per-product rollups (utilization, yield, ROI, lifecycle revenue, rental length, lead time, rent-to-buy) grouped by a dimension you choose, such as brand or category. |
| **Customers** | Circular acquisition and conversion rates, average and median lifetime value, acquisition over time, and customers by location. |
## Working with a dashboard
Every dashboard is scoped by a date range. Choose a preset (Today, Yesterday, Last 7 / 30 / 90 / 365 days) or pick a custom range. Stat tiles and charts update to the selected window.
Select a card to open the full report, where a metric is broken out into a ranked table or a more detailed chart. For example, the item utilization tile drills into a per-item ranking.
Every chart and report has an **Export** action that downloads the underlying data as CSV, so you can pivot it in a spreadsheet or share it with your team.
Click **Ask AI** when a number needs more context than a chart can give. The modal's **Open Sidekick** action launches Shopify [Sidekick](/ai/sidekick/shopify-sidekick) with a starter prompt — *Show me Supercycle stats from the last 30 days* — so you can ask follow-up questions about the dashboard you're viewing. The same modal also shows your [Operators MCP](/ai/operators-mcp/overview) URL if you prefer an external AI tool.
## Inline performance cards
You don't have to leave a record to see how it's performing. Item, product, and customer detail pages each show a **Performance** card with that record's key metrics, so the numbers sit next to the record they describe. That means utilization and lifecycle economics for an item or product, and lifetime value and activity for a customer.
## Understanding the circular metrics
Most dashboards mix familiar commerce numbers with metrics specific to renting the same item many times. The circular-specific ones:
| Metric | Meaning |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Utilization** | The share of an item's available time that it was out on a cycle. Measured from when the item became available (its published date, defaulting to when it was created) to the end of the range, with cancelled cycles excluded. Fleet utilization is the availability-weighted average across items. |
| **Yield** | The average number of completed cycles an item has been through, a measure of how much work you've got out of the asset. |
| **Lifetime revenue** | Total charge revenue earned across every cycle for an item, averaged per item at the fleet level. |
| **Lifecycle ROI** | Lifetime revenue minus the item's acquisition cost. Only items with a recorded cost count toward the average; items without a cost show a dash rather than a faked margin. |
| **Rent-to-buy** | How often rentals convert into a purchase. |
| **Lead time** | The gap between a cycle being created and fulfilled. |
| **Circular acquisition rate** | The share of customers whose first order with you was a circular (rental, subscription, membership, or resale) order rather than a retail one. |
| **Circular conversion rate** | The share of customers who started with retail and went on to place a circular order (or vice versa). |
Item utilization, yield, and ROI depend on each item having accurate acquisition costs and a published date. Record acquisition and lifetime costs on the item's Finance card, and set a published date on items that became rentable later than they were created, so the fleet numbers reflect reality.
## Other ways to analyse your data
The native dashboards are one of several places your circular commerce data lives. For revenue, orders, and conversion reporting alongside retail, use [Shopify Analytics](/documentation/manage/analytics/shopify-analytics); for ad-hoc questions in natural language, connect the [Operators MCP](/ai/operators-mcp/overview). See the [analytics overview](/documentation/manage/analytics/overview) for when to reach for each.
# Analytics overview
Source: https://docs.supercycle.com/documentation/manage/analytics/overview
Where to get analytics for your circular commerce business
Because Supercycle is built on Shopify primitives, your circular commerce data is available across several places. Use whichever fits the question you're trying to answer.
## Where to get analytics
Native circular reporting built into the admin: utilization, yield, lifecycle ROI, revenue, charges, and recurring billing health.
Revenue, orders, customers, and conversion — populated automatically from native Shopify orders.
Group customers by Supercycle tags for targeted reporting and marketing.
Ad-hoc questions answered in natural language from Claude, ChatGPT, or any MCP-compatible assistant.
## Analytics dashboards
Supercycle's built-in [Analytics dashboards](/documentation/manage/analytics/dashboards) report on metrics you can't get from native Shopify, calculated directly from your cycles, items, and charges: fleet utilization, yield, lifecycle ROI, return rates, and recurring-billing health. Filter by date range, drill into any metric, and export to CSV.
You can also use Supercycle's admin pages as live, filterable dashboards by saving filtered URLs:
| Page | Best for |
| ------------------------------------------------ | ------------------------------------------------------------- |
| [Cycles](/documentation/manage/cycles/cycles) | Fulfillment progress, allocation conflicts, returns in motion |
| [Items](/documentation/manage/inventory/items) | Inventory utilization, condition mix, items out vs idle |
| [Returns](/documentation/manage/returns/returns) | Receival progress, overdue returns, credit status |
| [Charges](/documentation/manage/charges/charges) | Pending payments, recurring billing health, dunning |
## Using Shopify Analytics
All Supercycle revenue flows through native Shopify orders, so it lands in Shopify's built-in reports automatically. Filter by the tags Supercycle applies (`Has rental products`, `Has membership`, `Has active subscription`) to isolate circular commerce data — see [using Shopify Analytics](/documentation/manage/analytics/shopify-analytics) for report recipes.
## Using segments
Supercycle tags every customer with their membership status and rental activity. Use those tags in [Shopify customer segments](/documentation/manage/analytics/segments) to slice your audience for marketing, discounts, and reports.
## Using the Operators MCP
For one-off questions that don't fit a standard report, connect the [Operators MCP](/ai/operators-mcp/overview) to your AI assistant and ask in natural language:
* *"How many items are out across all calendar rentals right now?"*
* *"List customers with an active subscription and an outstanding balance over \$100."*
* *"Which subscriptions had a failed billing attempt in the last 7 days?"*
The assistant can summarise, compare, or chart the results — a custom report on demand.
# Using segments
Source: https://docs.supercycle.com/documentation/manage/analytics/segments
Use Shopify Segments with Supercycle's customer and order tags
[Shopify Segments](https://help.shopify.com/manual/customers/customer-segmentation/customer-segments) let you group customers based on attributes like purchase history, location, or tags. Because Supercycle automatically applies tags to your customers and orders, you can use Segments to slice your circular commerce audience without any extra setup.
## Tags Supercycle applies
Supercycle writes the following tags. The full reference lives in [Customer tags](/documentation/methods/membership/shopify-tags).
### Customer tags
| Tag | Applied when |
| --------------------------- | --------------------------------------------------------------------- |
| `Supercycle member` | Customer has placed any rental order |
| `Has active subscription` | Customer has an active membership or subscription |
| `Has paused subscription` | Customer has paused their membership or subscription |
| `Has canceled subscription` | Customer has canceled their membership or subscription |
| `{Plan name} subscriber` | Customer is on a specific membership plan (e.g. `Starter Subscriber`) |
### Order tags
| Tag | Applied when |
| --------------------- | ----------------------------------------------------------------------------------- |
| `Has rental products` | Order contains rental products |
| `Has membership` | Order contains a membership plan product |
| `Recurring order #X` | The Nth recurring order in a subscription or membership (e.g. `Recurring order #1`) |
Tags are applied and updated automatically as customers move through the rental lifecycle. You don't need to manage them manually.
## Create a segment
In your Shopify admin, go to **Customers** > **Segments**.
Click **Create segment** and use the query builder to define your criteria.
Use the **Customer tags** filter to include or exclude customers. For example, to target everyone with an active subscription:
```
customer_tags CONTAINS 'Has active subscription'
```
Combine tags with other Shopify filters (location, lifetime spend, last order date) for sharper segments.
Click **Save segment** and give it a name. The segment becomes available across Shopify — for marketing campaigns, discounts, and reports.
## Example segments
### Active subscribers
Target customers currently subscribed for retention or upsell campaigns:
```
customer_tags CONTAINS 'Has active subscription'
```
### Paused subscribers ready to win back
Re-engage customers who paused but haven't canceled:
```
customer_tags CONTAINS 'Has paused subscription'
AND customer_tags NOT CONTAINS 'Has canceled subscription'
```
### High-value renters
Combine rental activity with spend to find your best circular customers:
```
customer_tags CONTAINS 'Supercycle member'
AND amount_spent >= 500
```
### Plan-specific upsell
Target a specific plan to promote upgrades:
```
customer_tags CONTAINS 'Starter Subscriber'
```
### Renters who haven't subscribed
Find one-off rental customers to convert into subscribers:
```
customer_tags CONTAINS 'Supercycle member'
AND customer_tags NOT CONTAINS 'Has active subscription'
```
## Where to use segments
Segments work everywhere Shopify supports them:
* **Email marketing** — Shopify Email, Klaviyo, and other tools that sync segments
* **Discounts** — restrict a discount code to a specific segment
* **Reports** — filter [Shopify Analytics](/documentation/manage/analytics/shopify-analytics) reports by segment to compare cohort performance
* **Customer accounts** — show different content based on segment membership
Segments are dynamic — Shopify recalculates membership as tags change, so a customer who pauses their subscription automatically moves between segments without manual cleanup.
# Using Shopify Analytics
Source: https://docs.supercycle.com/documentation/manage/analytics/shopify-analytics
Use Shopify's built-in analytics to track your circular commerce performance alongside retail
Because Supercycle uses native Shopify orders, products, customers, and tags, most of your circular commerce activity is already flowing into Shopify Analytics. Every charge Supercycle collects — initial checkouts, recurring billing cycles, and draft orders for late fees — results in a Shopify order with full line item, customer, tag, and financial context. That means you can use the same reports you rely on for retail to understand rental, subscription, membership, and resale performance, often without any extra setup.
## Reports that work out of the box
### Sales reports
All Supercycle revenue appears in your **Sales over time**, **Sales by product**, and **Sales by channel** reports. Recurring membership and subscription charges create new orders each billing cycle, so they accumulate in sales totals automatically.
Use the **Sales by product** report to compare revenue across your catalog — rental products and retail products side by side.
### Order reports
The **Orders over time** and **Order details** reports include every Supercycle order. You can filter these reports using the tags Supercycle applies:
* `Has rental products` — orders containing rental items
* `Has membership` — orders containing a membership plan
### Subscription reports
If you use the **Subscription** or **Membership** method, Supercycle creates Shopify subscription contracts. Shopify's built-in subscription reports become available automatically:
* **New subscriptions over time** — tracks when customers start subscriptions
* **Subscription sales over time** — recurring revenue from subscription billing
* **Subscription vs one-time sales** — compare circular revenue against retail
Subscription reports populate automatically when Supercycle creates subscription contracts. No additional setup is required.
### Customer reports
Supercycle tags every customer with their membership status and activity. Shopify's **Customer cohort analysis** and **Returning customer rate** reports let you track retention across your circular commerce customers.
The **RFM (Recency, Frequency, Monetary)** analysis works particularly well for rental businesses, where repeat transactions are the norm rather than the exception.
### Finance reports
All payment activity — including recurring billing attempts and draft order payments — flows into Shopify's finance reports. Use **Finances summary** and **Payment methods** to reconcile circular commerce revenue alongside retail.
## Filtering reports by Supercycle activity
Shopify lets you filter reports by tags, product type, and other dimensions. Combined with the tags Supercycle applies, you can isolate circular commerce data within any report.
### Filter by order tags
Supercycle applies these tags to orders:
| Tag | Applied when |
| -------------------------------- | ---------------------------------------- |
| `Has membership` | Order contains a membership plan product |
| `Has rental products` | Order contains rental products |
| `Recurring order #1`, `#2`, etc. | Indicates the billing cycle number |
In any order or sales report, add a **Tag** filter to isolate rental or membership orders.
### Filter by customer tags
Supercycle applies these tags to customers:
| Tag | Applied when |
| --------------------------- | ---------------------------------------------------------- |
| `Has active subscription` | Customer has an active membership |
| `Has paused subscription` | Customer has paused their membership |
| `Has canceled subscription` | Customer has canceled their membership |
| `Supercycle member` | Customer has made any rental order |
| `{Plan name} subscriber` | Customer is on a specific plan (e.g. `Starter subscriber`) |
Use these in **Customer reports** or when building [Segments](/documentation/manage/analytics/segments) for targeted analysis.
### Filter by product
Since Supercycle products are standard Shopify products, you can filter any **Sales by product** or **Product analytics** report to specific items. Use the `supercycle.methods` metafield to identify which products are configured for circular commerce.
Create a Shopify [collection](https://help.shopify.com/manual/products/collections) for your Supercycle products using the `supercycle.supercycle_enabled` metafield. Reference this collection when filtering reports by product group.
## Building custom reports
Shopify's custom report builder lets you combine metrics and dimensions to create reports tailored to circular commerce. Here are some useful combinations:
### Rental revenue by product
Create a custom **Sales** report with:
* **Dimension**: Product title
* **Metrics**: Net sales, Orders
* **Filter**: Order tag `is` `Has rental products`
### Membership plan performance
Create a custom **Sales** report with:
* **Dimension**: Product title
* **Metrics**: Net sales, Orders, Average order value
* **Filter**: Order tag `is` `Has membership`
### Recurring revenue trend
Use the **Subscription sales over time** default report, or create a custom report with:
* **Dimension**: Day / Week / Month
* **Metrics**: Net sales
* **Filter**: Order tag `contains` `Recurring order`
### Customer lifetime value for renters
Create a custom **Customers** report with:
* **Dimension**: Customer name
* **Metrics**: Total spent, Orders
* **Filter**: Customer tag `is` `Supercycle member`
Custom metafields can also be used as dimensions and filters in Shopify reports. When creating a metafield in Shopify, enable **Use in analytics** to make it available in the report builder.
## Using metafields in reports
Supercycle writes [metafields](/developers/metafields) to products, variants, and customers. Some of these can enhance your reporting:
| Metafield | Type | Useful for |
| ---------------------------------------- | -------- | ---------------------------------------------------------------- |
| `supercycle.methods` | Product | Filtering reports to specific rental methods |
| `supercycle.uncommitted_inventory_count` | Variant | Understanding real-time availability alongside inventory reports |
| `supercycle.membership` | Customer | Enriching customer reports with membership status |
To use a metafield in Shopify Analytics, ensure the **Use in analytics** toggle is enabled on the metafield definition in **Settings** > **Custom data**.
## What Shopify Analytics doesn't cover
Shopify Analytics gives you a strong picture of revenue, customers, and product performance. For operational metrics specific to circular commerce, use the Supercycle admin:
| Metric | Where to find it |
| --------------------------------------- | ------------------------------------------------------------------- |
| Cycle status and fulfillment progress | [Cycles](/documentation/manage/cycles/cycles) in Supercycle |
| Item utilization and condition tracking | [Items](/documentation/manage/inventory/items) in Supercycle |
| Return rates and receival status | [Returns](/documentation/manage/returns/returns) in Supercycle |
| Charge collection and dunning | [Charges](/documentation/manage/charges/charges) in Supercycle |
| Allocation conflicts | [Allocation](/documentation/manage/cycles/allocation) in Supercycle |
Combine Shopify Analytics for revenue and customer insights with [Supercycle Analytics](/documentation/manage/analytics/overview) for operational metrics to get a complete view of your circular commerce business.
# Automation overview
Source: https://docs.supercycle.com/documentation/manage/automation/automation
Automate with triggers and actions using Shopify Flow
Automations let you connect Supercycle with other apps or workflows in [Shopify Flow](https://admin.shopify.com/apps/flow).
You can trigger Supercycle actions automatically when specific events happen, such as a return being created or a payment failing. This enables you to build powerful workflows that respond to cycle lifecycle events without manual intervention. Examples include:
* **Pause subscriptions** when customers start a return
* **Create charges** for late fees, damage fees, or conversion to purchase
* **Send notifications** when returns are approved or received
* **Update inventory** based on return status changes
* **Re-allocate items** when a cycle has an item conflict
* **Manage payment collection** for failed subscription payments
***
## Available triggers
Supercycle includes several triggers you can use to start an automation. Every trigger payload also includes a `customer` reference (the Shopify customer) you can use in conditions and downstream actions.
Runs when a return is created inside Supercycle.
| Property | Description |
| ---------------------------- | ---------------------------------------------------------- |
| `customer.id` | Shopify customer ID |
| `returnOrder.formattedId` | Display ID (e.g. `#1001`) |
| `returnOrder.sequentialId` | Sequential numeric ID |
| `returnOrder.receivalStatus` | Status: `pending`, `received`, or `overdue` |
| `returnOrder.createdAt` | ISO 8601 date the return was created |
| `returnOrder.requestedAt` | ISO 8601 date the return was requested |
| `returnOrder.tags` | Tags on the return order |
| `returnOrder.rentals` | Array of cycles in the return (see Cycle properties below) |
Runs when a return is updated inside Supercycle.
Payload is identical to **Return created**.
Runs when a cycle is created inside Supercycle.
| Property | Description |
| -------------------------- | ----------------------------------------------------------------------------------------- |
| `customer.id` | Shopify customer ID |
| `rental.id` | Cycle global ID (e.g. `gid://supercycle/Rental/12345`) |
| `rental.formattedId` | Display ID (e.g. `#1001`) |
| `rental.sequentialId` | Sequential numeric ID |
| `rental.status` | Status: `scheduled`, `unfulfilled`, `fulfilled`, `unreceived`, `received`, or `cancelled` |
| `rental.fulfillmentStatus` | Fulfillment status: `pending`, `scheduled`, `in_progress`, `overdue`, or `complete` |
| `rental.receivalStatus` | Receival status: `pending`, `scheduled`, `in_progress`, `overdue`, or `complete` |
| `rental.packingStatus` | Packing status: `pending`, `printed`, or `packed` |
| `rental.methodType` | Method type: `calendar`, `subscription`, `membership`, or `resale` |
| `rental.conflictLevel` | Item allocation conflict: `none`, `item`, or `variant` |
| `rental.lineItemId` | Shopify line item ID |
| `rental.orderId` | Shopify order ID |
| `rental.shopifyOrderName` | Shopify order name (e.g. `#1001`) |
| `rental.subscriptionId` | Supercycle subscription ID (if exists) |
| `rental.returnOrderId` | Return order ID (if exists) |
| `rental.itemId` | Allocated item ID |
| `rental.fulfillAt` | ISO 8601 dispatch date |
| `rental.fulfilledAt` | ISO 8601 date the cycle was fulfilled |
| `rental.receiveAt` | ISO 8601 planned return date |
| `rental.receivedAt` | ISO 8601 date the cycle was received |
| `rental.rentalStart` | ISO 8601 cycle period start |
| `rental.rentalEnd` | ISO 8601 cycle period end |
| `rental.minimumRentalEnd` | ISO 8601 end of minimum cycle term |
| `rental.restockBy` | ISO 8601 date the item should be restocked by |
| `rental.restockedAt` | ISO 8601 date the item was restocked |
| `rental.cancelledAt` | ISO 8601 cancellation date |
| `rental.createdAt` | ISO 8601 creation date |
| `rental.updatedAt` | ISO 8601 last updated date |
| `rental.tags` | Tags on the cycle |
| `rental.customFields` | Array of `{ key, value }` custom fields |
| `rental.item` | Allocated item details (see Item properties below) |
Runs when a cycle is updated inside Supercycle.
Payload is identical to **Cycle created**.
Runs when a cycle is canceled inside Supercycle.
Payload is identical to **Cycle created**.
Runs when a membership is created inside Supercycle.
| Property | Description |
| ----------------------------- | ----------------------------------------------------- |
| `customer.id` | Shopify customer ID |
| `membership.id` | Membership global ID |
| `membership.customerId` | Shopify customer GID |
| `membership.status` | Status: `active`, `paused`, `cancelled`, or `expired` |
| `membership.planTitle` | Plan or product title |
| `membership.priceCents` | Membership price in cents |
| `membership.creditAllowance` | Total credits allowed |
| `membership.creditsUsed` | Credits currently used |
| `membership.remainingCredits` | Credits remaining |
| `membership.orderAllowance` | Maximum orders allowed (`null` if unlimited) |
| `membership.ordersUsed` | Orders used in current period |
| `membership.remainingOrders` | Orders remaining (`null` if unlimited) |
| `membership.returnAllowance` | Maximum returns allowed (`null` if unlimited) |
| `membership.returnsUsed` | Returns used in current period |
| `membership.remainingReturns` | Returns remaining (`null` if unlimited) |
| `membership.renewalDate` | ISO 8601 next renewal date |
| `membership.minimumTermStart` | ISO 8601 minimum term start date |
| `membership.minimumTermEnd` | ISO 8601 minimum term end date |
| `membership.cancelAt` | ISO 8601 scheduled cancellation date |
Runs when a membership is updated inside Supercycle.
Payload is identical to **Membership created**.
Runs when a membership is canceled inside Supercycle.
Payload is identical to **Membership created**.
Runs when a [contract's](/documentation/configuration/risk/esignatures) status changes inside Supercycle (for example, when a customer signs an unsigned contract).
| Property | Description |
| ----------------------- | ----------------------------------------------------------- |
| `customer.id` | Shopify customer ID |
| `contract.id` | Contract global ID (e.g. `gid://supercycle/Contract/12345`) |
| `contract.status` | Current status: `unsigned` or `signed` |
| `contract.templateName` | Name of the contract template |
| `contract.signedAt` | ISO 8601 date the contract was signed |
| `contract.createdAt` | ISO 8601 creation date |
| `contract.updatedAt` | ISO 8601 last updated date |
Runs when an [identity verification's](/documentation/configuration/risk/identity-verification) status changes inside Supercycle, including when a verification is first uploaded.
| Property | Description |
| -------------------------------- | ----------------------------------------------------------------------------------------- |
| `customer.id` | Shopify customer ID |
| `identityVerification.id` | Identity verification global ID (e.g. `gid://supercycle/IdentityVerification/12345`) |
| `identityVerification.status` | Current status: `pending`, `submitted`, `in_review`, `completed`, `on_hold`, or `expired` |
| `identityVerification.result` | Verification result: `approved`, `rejected`, or `inconclusive` |
| `identityVerification.createdAt` | ISO 8601 creation date |
| `identityVerification.updatedAt` | ISO 8601 last updated date |
Runs when a single charge payment attempt fails. Use this to react to individual payment failures (for example, on a damage charge).
| Property | Description |
| ---------------------- | ------------------------------------------------------- |
| `customer.id` | Shopify customer ID |
| `charge.id` | Charge global ID (e.g. `gid://supercycle/Charge/12345`) |
| `charge.formattedId` | Display ID (e.g. `#1001`) |
| `payment.errorCode` | Error code from the failed payment attempt |
| `payment.errorMessage` | Customer-friendly error message |
| `payment.subtotal` | Amount due, in cents |
| `payment.paid` | Amount paid, in cents |
Runs when a payment collection process completes without successfully capturing payment. Use this for dunning-style automations that react to repeated failures over time.
| Property | Description |
| ----------------------------------------- | --------------------------------------------------------------------- |
| `customer.id` | Shopify customer ID |
| `paymentCollector.id` | Payment collector global ID |
| `paymentCollector.status` | Current status of the payment collector |
| `paymentCollector.summary` | Summary text |
| `paymentCollector.chargeableId` | Object being charged (e.g. `gid://supercycle/Rental/12345`) |
| `paymentCollector.subscriptionContractId` | Shopify subscription contract ID |
| `paymentCollector.failedPaymentCount` | Number of failed payment attempts |
| `paymentCollector.lastFailedPayment` | Last failed payment (`errorCode`, `errorMessage`, `subtotal`, `paid`) |
| `paymentCollector.payments` | Array of all payment attempts |
### Shared sub-objects
Several triggers expose nested objects you can drill into:
Available on `rental.item` (Cycle triggers) and on each entry in `returnOrder.rentals[].item`.
| Property | Description |
| ----------------------- | ------------------------------------------------------------ |
| `item.id` | Item global ID |
| `item.productTitle` | Product title |
| `item.variantTitle` | Variant title |
| `item.serial` | Serial number |
| `item.sequentialId` | Sequential numeric ID |
| `item.status` | Processing status: `processed` or `unprocessed` |
| `item.visibility` | Visibility: `available`, `unavailable`, `sold`, or `retired` |
| `item.pickLocation` | Physical warehouse location |
| `item.conditionId` | Condition ID |
| `item.shopifyVariantId` | Shopify variant GID |
| `item.shopifyProductId` | Shopify product GID |
| `item.imageUrl` | Image URL |
| `item.tags` | Tags on the item |
| `item.createdAt` | ISO 8601 creation date |
Available as `customer` on every trigger.
| Property | Description |
| ------------------------------------- | ------------------------------------------------- |
| `customer.identityVerified` | Whether the customer has verified their identity |
| `customer.numberOfOutstandingCharges` | Count of unpaid charges |
| `customer.outstandingBalance` | Total outstanding balance, in cents |
| `customer.totalSpent` | Lifetime spend, in cents |
| `customer.deposit.balance` | Current deposit account balance |
| `customer.membership` | Customer's membership (see Membership properties) |
***
## Available actions
Supercycle provides the following actions for use in Shopify Flow workflows.
Create a charge for a chargeable object in Supercycle, such as a cycle or membership.
| Property | Description |
| -------------- | -------------------------------------------------------------------------- |
| `customer` | Shopify customer reference (required) |
| `chargeableId` | The ID of the object to charge (e.g. `gid://supercycle/Rental/1234567890`) |
| `description` | The message included in the charge |
| `amountCents` | The charge amount in cents (e.g. `1234` for \$12.34) |
Returns a `Charge` object you can reference in subsequent steps.
Update a subscription's status, recurring price, or billing start date.
| Property | Description |
| --------------------- | ---------------------------------------------------------------------------- |
| `subscriptionId` | The ID of the subscription (e.g. `gid://supercycle/Subscription/1234567890`) |
| `status` | The status to set: `active`, `paused`, `cancelled`, or `expired` |
| `recurringPriceCents` | New recurring price in cents (e.g. `1500` for \$15.00) |
| `billingStartDate` | New billing schedule start date. Supports Liquid date variables. |
Only `subscriptionId` is required — provide any combination of the other fields to update.
Update the status of a membership.
| Property | Description |
| -------------- | ------------------------------------------------------------------------------------------ |
| `membershipId` | The ID of the membership (e.g. `gid://supercycle/MembershipRental::Membership/1234567890`) |
| `status` | The status to set: `active`, `paused`, `cancelled`, or `expired` |
Get data about a cycle in Supercycle. Use this to retrieve cycle information for use in conditional logic.
| Property | Description |
| ---------- | --------------------------------------------------------------- |
| `rentalId` | The ID of the cycle (e.g. `gid://supercycle/Rental/1234567890`) |
Returns a `Rental` object with all cycle properties (see the **Cycle created** trigger for the full list).
For example, to check if a cycle has a subscription before taking action:
Add the **Get cycle data** action:
* **Cycle ID:** `{{rental.id}}`
Access the returned data in subsequent steps:
* `{{getRental.subscriptionId}}` — Subscription ID if it exists
* `{{getRental.orderId}}` — Associated order ID
* `{{getRental.fulfilledAt}}` — Fulfillment date
* `{{getRental.receivedAt}}` — Received date
Use the data in conditions:
```
getRental.subscriptionId is not empty
```
Update properties of a cycle.
| Property | Description |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `rentalId` | The ID of the cycle (e.g. `gid://supercycle/Rental/1234567890`) |
| `itemId` | The item ID to assign to the cycle |
| `fulfilledAt` | ISO 8601 datetime when the cycle was fulfilled (e.g. `2024-01-15T10:30:00Z`) |
| `receivedAt` | ISO 8601 datetime when the cycle was received |
| `rentalStart` | ISO 8601 date when the cycle period starts |
| `rentalEnd` | ISO 8601 date when the cycle period ends |
| `prepareFrom` | ISO 8601 date the outbound preparation buffer starts. Pass an empty value to revert to the automatic date computed from the shop's [preparation buffer](/documentation/configuration/logistics/buffers). |
| `restockBy` | ISO 8601 date the inbound restock buffer ends. Pass an empty value to revert to the automatic date computed from the shop's [restock buffer](/documentation/configuration/logistics/buffers). |
| `packingStatus` | The packing status: `pending`, `printed`, or `packed` |
Only `rentalId` is required — provide any combination of the other fields to update.
Add tags to a cycle.
| Property | Description |
| ---------- | -------------------------------------------------------------------------- |
| `rentalId` | The ID of the cycle (e.g. `gid://supercycle/Rental/1234567890`) |
| `tags` | Comma-separated list of tag titles to add (e.g. `damaged, follow-up, vip`) |
Trigger a payment attempt on a charge's payment collector. This mirrors the **Retry billing** button on the charge detail page and is a natural companion to the **Payment collection failed** trigger — use it to programmatically retry collection (for example, after a delay, or once a downstream system signals the customer has updated their payment method).
| Property | Description |
| ----------- | ---------------------------------------------------------------- |
| `charge_id` | The ID of the charge (e.g. `gid://supercycle/Charge/1234567890`) |
Returns a `Payment` object you can reference in subsequent steps:
| Property | Description |
| -------------- | -------------------------------------------- |
| `errorCode` | Error code from the payment attempt (if any) |
| `errorMessage` | Customer-friendly error message (if any) |
| `subtotal` | Amount due, in cents |
| `paid` | Amount paid, in cents |
The action fails (and the workflow step errors) if:
* The charge cannot be found (`404`).
* The charge has no associated payment collector (`400`) — for example, an ad-hoc charge that was never tied to a subscription billing flow.
* The charge is cancelled or already paid in full (`400`).
Re-allocate an available item to a cycle. Useful when the currently allocated item has a conflict (`rental.conflictLevel` of `item` or `variant`) and you want Supercycle to pick a fresh available item automatically.
| Property | Description |
| ---------- | --------------------------------------------------------------- |
| `rentalId` | The ID of the cycle (e.g. `gid://supercycle/Rental/1234567890`) |
Returns the updated `Rental`. Pair this with the **Cycle updated** trigger and a condition on `rental.conflictLevel` to automatically resolve item conflicts as soon as they appear.
***
Learn how to build your first workflow
Explore Shopify Flow capabilities
# Create a workflow
Source: https://docs.supercycle.com/documentation/manage/automation/create-workflow
Build automations using Supercycle triggers and actions in Shopify Flow
This guide walks you through creating workflows in Shopify Flow using Supercycle triggers and actions. You'll learn how to build common automations and understand the workflow structure.
## Getting started
Navigate to [Shopify Flow](https://admin.shopify.com/apps/flow) in your Shopify admin and click **Create workflow**.
Search for **Supercycle** to see available triggers:
* Return created / Return updated
* Cycle created / Cycle updated / Cycle canceled
* Membership created / Membership updated / Membership canceled
* Charge failed
* Payment collection failed
Build your workflow logic using conditions, loops, and actions to respond to the trigger event.
Test your workflow with sample data, then enable it to start automating.
***
## Example workflows
### Pause subscription on return
Automatically pause a customer's subscription when they start a return.
Select **Return created** as your trigger.
Add a **For each** loop and set it to `returnOrder.rentals`.\
This processes each rental in the return individually.
Add a **Condition** to check if the rental has a subscription:
```
rentals.foreachitem.subscriptionId is not empty and exists
```
In the **Then** branch, add **Update subscription**:
* **Subscription ID:** `{{rentals.foreachitem.subscriptionId}}`
* **Status:** `paused`
Save and enable. Subscriptions will now pause automatically when returns are created.
***
### Send notification on failed payment
Notify your team when subscription payments fail multiple times.
Select **Payment collection failed** as your trigger.
Check if this is the third failed attempt:
```
paymentCollector.failedPaymentCount is greater than or equal to 3
```
In the **Then** branch, add **Send internal email**:
* **To:** Your support team email
* **Subject:** `Urgent: Customer payment failed 3+ times`
* **Body:** Include customer details and `paymentCollector.lastFailedPayment.errorMessage`
Add another action to **Update subscription**:
* **Subscription ID:** Extract from `paymentCollector.subscriptionContractId`
* **Status:** `cancelled`
Save and enable. Your team will be notified of payment issues automatically.
***
### Auto-resolve item conflicts on a cycle
When a cycle's allocated item is unavailable (for example, it's still out on another cycle), automatically re-allocate a fresh available item.
Select **Cycle updated** as your trigger.
Check whether the cycle has an item or variant conflict:
```
rental.conflictLevel is equal to item or rental.conflictLevel is equal to variant
```
In the **Then** branch, add **Re-allocate item**:
* **Cycle ID:** `{{rental.id}}`
Save and enable. Cycles with item conflicts will be re-allocated automatically.
***
## FAQs
Yes. Returns can contain multiple rentals, so always use a `For each loop` when processing `returnOrder.rentals` to ensure each rental is handled individually.
No. Some rentals won’t have subscriptions, so you should always check whether subscriptionId exists before using it in any actions.
Use Shopify Flow’s test feature with sample data to confirm your logic works as expected before enabling it in production.
Use clear, descriptive names (for example, “Pause subscription on return”) so workflows are easy to find and manage later.
Regularly monitor the Flow dashboard to confirm successful runs and catch or debug any errors early.
# Charge actions
Source: https://docs.supercycle.com/documentation/manage/charges/charge-actions
Step-by-step guides for creating charges and processing payments against a cycle
### Create charge
**Fields:**
* **Customer** – The customer to charge (use a variable like `customer.id`).
* **Chargeable ID** – The object to charge.
* **Description** – The message included in the charge.
* **Amount cents** – The charge amount in cents (for example, `1234` for \$12.34).
***
#### Create payment
Payment attempts can be initiated from **Create payment** .
***
#### Update payment card
***
#### Change payment card
In your Shopify admin, navigate to **Supercycle > Cycles**. Select the rental you want.
Click 3 dots on the top right of the billing information, followed by **Change payment method** .
Select the payment card you want to use for future payments and click **Save**.
# Charges overview
Source: https://docs.supercycle.com/documentation/manage/charges/charges
Understand how charges record billing for the usage of a rented product
* A charge is the record of the payment due for the usage of a product.
* A charge may have multiple [payment attempts](/documentation/manage/charges/payments).
Charges are accessed from [Charges](https://admin.shopify.com/apps/supercycle/charges)
***
#### Charge category
| Category | Description |
| ------------- | ---------------------------------------------------- |
| Checkout | An initial checkout for a rental or membership. |
| Billing cycle | A recurring charge for a membership or subscription. |
***
#### Charge period
The period of time the charge covers.
***
#### Balance due
Remaining balance owed for the charge.
***
#### Associated payments
Payment attempts made against the charge.
Includes the status of the payment.
| Status | Description |
| --------- | ------------------------------------------------- |
| `Pending` | Waiting for payment. |
| `Failed` | Multiple payment attempts have been unsuccessful. |
| `Paid` | Payment has been successfully collected. |
***
#### Collect payment
Options to capture payment against the charge.
***
#### Tags
Freeform tags added to the charge.
Often used for tracking progress on collecting overdue payments.
***
## Charge FAQs
All orders will have a corresponding charge, but not all charges will have a corresponding order. In a situation where payment attempts haven't been successful, there will be a `Pending` or `Failed` charge, once payment has been captured and order will be created and connected to the charge.
# Dunning
Source: https://docs.supercycle.com/documentation/manage/charges/dunning
Automated payment retry system for failed subscription billing
The dunning process is an automated payment retry system that handles failed subscription billing attempts. When a payment fails, the system creates a dunning record that manages the retry logic, tracking payment attempts and determining when to retry based on configurable shop settings.
## What triggers dunning
Dunning is triggered when a recurring billing attempt fails. Supercycle creates billing attempts for recurring charges, and if Shopify cannot process the payment, dunning automatically begins. Learn more in [Payment attempts](https://docs.supercycle.com/documentation/manage/charges/payments).
## Which methods it applies to
Dunning applies to subscription-based billing:
* **Subscriptions**
* **Membership**
## Viewing dunning status
You can view dunning information in the charges detail page.
Navigate to **Supercycle** > **Charges** > click on a specific charge to view the dunning banner.
The charge detail page displays:
* Dunning status (active, failed, cancelled, or complete)
* Current retry attempt count out of maximum attempts
* Next scheduled retry date and time
* Manual "Retry now" button option
## Configure dunning settings
Navigate to **Settings** > **Risk** > **Dunning** section.
The configuration page allows adjusting:
| Setting | Default | Description |
| -------------------- | ------- | ----------------------------------- |
| Maximum retries | 3 | Total number of retry attempts |
| Time between retries | 2 | The interval value between attempts |
| Retry unit | Days | Hours or Days |
Email templates are controlled separately via customer email settings and cannot be customized per-dunning instance. The failed charge email is enabled/disabled globally.
## Manual retry
You can manually retry a payment from the charge detail page:
Go to the charge with failed dunning status.
Click the **Retry now** button in the dunning banner.
Confirm in the modal dialog. The system immediately creates a new billing attempt, bypassing the retry interval.
## Shopify Flow integration
The **Payment collection failed** Flow trigger fires when a payment collector exhausts its retries without successfully capturing payment. Use it to send notifications, update subscriptions, or take other custom action when collection fails.
You can also pair it with the **Create payment attempt** Flow action to programmatically retry billing on a charge from inside a workflow — for example, to schedule a delayed retry or to retry once a downstream system signals the customer has updated their payment method. Learn more in [Available actions](/documentation/manage/automation/automation#available-actions) and [Create a workflow](/documentation/manage/automation/create-workflow).
## Common error codes
| Error code | Message | Solution |
| ------------------------------- | ----------------------------------------------- | ----------------------------------------------------- |
| `expired_payment_method` | The customer's payment method has expired | Request updated payment method |
| `payment_method_declined` | Payment method declined by processor | Advise customer to contact bank or try another method |
| `payment_method_not_found` | No active payment method found | Ensure customer has valid payment method on file |
| `buyer_canceled_payment_method` | Customer canceled their payment method | Ask customer to update payment details |
| `insufficient_funds` | Shown as declined | Advise retry later |
| `authentication_error` | Authentication failed during payment processing | Ensure customer payment details are correct and retry |
## Limits and constraints
**Automatic retry conditions:**
* Retries only occur if no pending payment exists
* Retries respect the configured interval since last failed attempt
* Retries stop after max attempts reached
* Manual retry bypasses interval check but still respects max attempts logic
**Dunning cancellation:**
* If the associated charge is cancelled, dunning is automatically cancelled
* Cancelled dunning will not create new payment attempts
# Payment attempts
Source: https://docs.supercycle.com/documentation/manage/charges/payments
Track the individual payment attempts made against a charge and their status
* A [charge](/documentation/manage/charges/charges) is the record of the payment due for the usage of a product.
* A [charge](/documentation/manage/charges/charges) may have multiple payment attempts.
* A payment attempt may be for multiple charges.
There are several different ways to attempt a payment, we call these instruments.
We have the following payment instruments:
| Instrument | Description |
| --------------- | ------------------------------------------------------------------------------ |
| Draft order | A manual request for payment via a Shopify draft order. |
| Billing attempt | An automatic billing attempt for recurring subscription and membership cycles. |
| Order | A Shopify order, used when the charge is paid upfront through checkout. |
Once a payment is successful, it will always result in a Shopify order, which will be connected to the associated charge, updating the balance due on the charge.
# Assigning items
Source: https://docs.supercycle.com/documentation/manage/consignment/assigning-items
Link items to a consignor so they earn a revenue share when the item is sold.
Assigning an item to a consignor tells Supercycle that the consignor owns that stock and earns a share of its revenue. You can assign one item at a time or many at once.
Every item uses its consignor's [revenue share](/documentation/manage/consignment/revenue-share-formulas) — inherit, percentage, or formula. There is no per-item rate override. To treat one item differently, add a custom field on the item and reference it in the formula (for example `item.fields.payout_rate`).
***
## Assign items to a consignor
In Shopify admin, go to **Supercycle** > [**Inventory**](https://admin.shopify.com/apps/supercycle/items) and open an item.
In the **Consignor** card, select the edit icon, search for the consignor, and choose **Select**.
Go to **Supercycle** > [**Inventory**](https://admin.shopify.com/apps/supercycle/items) and select the items you want to assign.
Open the **•••** menu, choose **Assign consignor**, pick a consignor, and confirm.
***
## How revenue share is calculated
Revenue share accrues to a consignor's balance based on what their items actually earn:
When a charge on a consigned item is paid, Supercycle records an **earning** for the consignor.
Supercycle resolves the consignor's revenue share (or the shop default when they inherit), renders the formula against the charge, cycle, item, and consignor, and records the result in cents.
The formula text, basis, amount, and source are saved with the earning. Changing settings later only affects **future** earnings.
If that charge is later refunded, Supercycle records a **refund** entry that reverses the same proportion of the original amount — the formula is not re-rendered.
Every earning and refund is itemized in the [payout breakdown](/documentation/manage/consignment/payouts#payout-breakdown) when you settle a balance.
Revenue share is calculated when a charge is **paid**, so an order that's placed but not yet paid doesn't add to a consignor's balance until payment is collected.
# Consignment actions
Source: https://docs.supercycle.com/documentation/manage/consignment/consignment-actions
Step-by-step guides for common consignment tasks.
### Enable consignment
In Shopify admin, go to **Supercycle** > **Settings** > [**Consignment**](https://admin.shopify.com/apps/supercycle/settings/consignment).
Turn on **Enable consignment**, then **Save**. Once saved, **Manage consignors** becomes available.
Under **Payout methods**, **Manual** is active by default: record payouts you make outside Supercycle, like cash or a bank transfer. **Store credit** and **Bank transfer** are coming soon.
Under **Default revenue share**, choose **Percentage of sale** or **Formula**. This applies to every consignor that inherits the shop default. See [Revenue share formulas](/documentation/manage/consignment/revenue-share-formulas) for formula syntax and examples.
Consignment is rolling out gradually. If you don't see the **Consignment** tab in settings, it isn't enabled for your store yet, so contact support to request access.
***
### Add a consignor
In Shopify admin, go to **Supercycle** > [**Consignors**](https://admin.shopify.com/apps/supercycle/consignors). You can also reach this from **Settings** > **Consignment** > **Manage consignors**.
Select **Add consignor**.
Give the consignor a **Name** (their brand or partner name), optionally link a **Customer**, and set their **Revenue share** — inherit the shop default, enter a percentage, or write a [formula](/documentation/manage/consignment/revenue-share-formulas).
Select **Create consignor**. You can add **Payout methods** and edit the consignor's details from their page afterwards.
***
### Assign an item to a consignor
In Shopify admin, go to **Supercycle** > [**Inventory**](https://admin.shopify.com/apps/supercycle/items) and open an item.
In the **Consignor** card, select the edit icon, search for the consignor, and choose **Select**.
Go to **Supercycle** > [**Inventory**](https://admin.shopify.com/apps/supercycle/items) and select the items you want to assign.
Open the **•••** menu, choose **Assign consignor**, pick a consignor, and confirm.
***
### Record a payout
In Shopify admin, go to **Supercycle** > **Consignors** > [**Payouts**](https://admin.shopify.com/apps/supercycle/consignors/payouts).
Select **Pay consignors**.
Set the **Payout method** (Manual), the **Paid on** date, and any **Notes**, such as a reference.
Tick the consignors you're paying. Each row shows their outstanding balance, and the footer shows the selected count and total. Consignors with nothing outstanding don't appear.
Select **Record \[n] payouts**. Supercycle settles each selected consignor's outstanding balance into a payout and groups them under a single payout **run**.
Recording a payout doesn't move any money. Supercycle tracks what you owe and what you've paid. Make the actual payment outside Supercycle (cash, bank transfer, etc.) using the payout method details on the consignor.
***
### Archive or unarchive a consignor
Open the consignor, change **Status** to `Archived` (or `Active`), and save.
On the [**Consignors**](https://admin.shopify.com/apps/supercycle/consignors) table, select the consignors, open the **•••** menu, and choose **Archive consignors** or **Unarchive consignors**.
Archiving keeps all earnings, refunds, and payouts, and any outstanding balance stays payable. See [Archive a consignor](/documentation/manage/consignment/consignors#archive-a-consignor).
***
### Delete a payout
Open the payout from [**Payouts**](https://admin.shopify.com/apps/supercycle/consignors/payouts) and delete it.
Select the payouts, open the **•••** menu, and choose **Delete payouts**. Confirm to remove them.
Deleting a payout returns the entries it covered to unsettled, so they count toward the balance owed again. See [Delete a payout](/documentation/manage/consignment/payouts#delete-a-payout).
# Consignor portal
Source: https://docs.supercycle.com/documentation/manage/consignment/consignor-portal
What consignors see about their balance, earnings, and payouts.
Consignors can follow their own performance without you sending updates. When a consignor is linked to a customer, a **Consignment** section appears in that customer's Shopify customer account, showing their balance, recent activity, payouts, and items.
The portal is read-only. Consignors can see their numbers but can't change anything.
***
## Giving a consignor access
On the [consignor's page](/documentation/manage/consignment/consignors), link the consignor to the Shopify **Customer** account they'll log in with.
The consignor logs in to your store's customer account. The **Consignment** section appears on their profile automatically.
The consignor portal relies on Shopify [customer accounts](/documentation/online-store/portal). The consignor only sees their details while they're linked to an active consignor. Archiving the consignor hides them, and a customer who isn't a consignor sees *"Consignment isn't set up for this account yet."*
***
## What the consignor sees
The portal has two surfaces, mirroring how membership appears in the customer account:
* A **summary card** on the account profile, for an at-a-glance update.
* A fuller **Consignment view** with stats, activity, and items.
### Summary card
On their profile, the consignor sees a compact card:
* **Balance owed**: *"\[amount] owed to you"*, or *"You're all settled up"* when nothing is outstanding.
* A line summarizing their items and earnings: *"Your \[n] consigned items have generated \[amount] in rentals to date"*.
* **Total paid out**: *"\[amount] paid out to date"*.
* **Recent payouts**: the latest payouts you've recorded, each with its date and amount.
### Stats
The fuller view leads with four figures: **Balance owed**, **Total earned**, **Consigned items**, and **Total paid out**.
### Recent activity
A reverse-chronological feed of everything affecting their balance:
* **Earnings** from rentals, shown with the cycle and item, as a positive (green) amount.
* **Refunds**, shown as a negative (red) amount.
* **Payouts** you've recorded, shown as a negative amount.
Before any items have been rented, the consignor sees *"Earnings will appear here once your items are rented."*
### My items
The consignor's items, each showing its title, serial number, and a summary: *"Rentals completed: \[n] · Commission: \[rate]%"*. If they have more items than fit, the list shows the first batch with a *"Showing \[n] of \[total] items"* note.
***
Everything in the portal mirrors what you manage in the admin. Recording a payout or assigning an item updates the consignor's view the next time they open it, with nothing extra to publish or send.
# Consignors
Source: https://docs.supercycle.com/documentation/manage/consignment/consignors
Add and manage the brand partners whose stock you sell.
A **consignor** is the brand partner, supplier, or person who owns stock you sell on their behalf. Each consignor has a default revenue share, an optional linked customer, and one or more payout methods.
Find your consignors in Shopify admin under **Supercycle** > [**Consignors**](https://admin.shopify.com/apps/supercycle/consignors), or via **Settings** > **Consignment** > **Manage consignors**.
***
## The consignors list
The consignors table shows every consignor and the key numbers at a glance.
| Column | Description |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Consignor` | The consignor's name. Links to their detail page. |
| `Customer` | The linked Shopify customer, if any. |
| `Revenue share` | The consignor's share of net revenue — a percentage when derivable, or **Formula** when set to a Liquid formula (including inherit → shop formula). |
| `Items` | How many items are assigned to the consignor. |
| `Balance owed` | The amount you've accrued but not yet paid out. |
| `Status` | `Active` or `Archived`. |
Use the **All**, **Active**, and **Archived** tabs to filter by status, search by name, and sort by name or created date. Select **Export** to download the list as a CSV.
***
## Add a consignor
In Shopify admin, go to **Supercycle** > [**Consignors**](https://admin.shopify.com/apps/supercycle/consignors). You can also reach this from **Settings** > **Consignment** > **Manage consignors**.
Select **Add consignor**.
Give the consignor a **Name** (their brand or partner name), optionally link a **Customer**, and set their **Revenue share** — inherit the shop default, enter a percentage, or write a [formula](/documentation/manage/consignment/revenue-share-formulas).
Select **Create consignor**. You can add **Payout methods** and edit the consignor's details from their page afterwards.
***
## Revenue share
Each consignor has a **Revenue share** mode:
* **Inherit shop default** — uses the default from **Settings** > **Consignment** (the default for new consignors).
* **Percentage of sale** — a fixed percentage of the charge subtotal for this consignor's items.
* **Formula** — a Liquid expression returning the consignor's amount in cents.
Formulas are edited in a modal with variable chips and a **Try it out** calculator. See [Revenue share formulas](/documentation/manage/consignment/revenue-share-formulas) for the full variable reference, examples, and how amounts are frozen on each sale.
***
## Payout methods
Each consignor can have its own payout details, configured on their page. Turn on the methods you'll use for that consignor.
Record payouts you make outside Supercycle. Add **Payment instructions** so anyone recording a payout knows where to send it: a PayPal address, cash on pickup, and so on.
Coming soon. Pays the consignor with credit to spend in your store. The consignor must have a linked **Customer** to receive store credit.
Coming soon. Stores the consignor's **Account holder**, **Bank name**, **Account number**, and **Routing number** (sort code, routing number, or BSB). Bank details are encrypted.
Only **Manual** payouts can be recorded today. **Store credit** and **Bank transfer** are shown so you can prepare details ahead of launch.
***
## Archive a consignor
Set a consignor's **Status** to `Archived` to hide them from your active list, for example when a partnership ends. You can also **Archive consignors** in bulk from the consignors list.
Archiving is reversible (**Unarchive consignors**) and non-destructive:
* Past earnings, refunds, and payouts are kept.
* Any outstanding balance remains payable. Archived consignors with a balance still appear when recording payouts.
* Items stay assigned to the consignor.
***
## Custom fields
You can add **custom field definitions** for consignors to store extra information, such as a tax ID or contract reference. Set these up under **Settings** > **Custom data**. See [Custom data](/documentation/configuration/custom-data/custom-fields) for more.
# Consignment overview
Source: https://docs.supercycle.com/documentation/manage/consignment/overview
Sell stock owned by brand partners and track the revenue share you owe them.
**Consignment** lets you list and sell stock you don't own. A **consignor** (a brand partner, supplier, or individual) provides items, you rent or resell them, and Supercycle automatically tracks the **revenue share** you owe the consignor as their items earn.
Supercycle keeps a running balance for each consignor, builds it up as their items are paid for, reverses it on refunds, and lets you record payouts to settle up. Consignors can follow along in their own portal.
**Beta feature.** Consignment is currently in beta and is off by default. Access is granted on a per-store basis upon request and approval. Contact support to request access. If you don't see the **Consignment** tab in **Settings**, it isn't enabled for your store yet.
***
## How it works
Turn consignment on in **Settings** and choose how you'll pay consignors. See [Enable consignment](#enable-consignment) below.
Create a [consignor](/documentation/manage/consignment/consignors) and set their **revenue share** — inherit the shop default, use a percentage, or write a [Liquid formula](/documentation/manage/consignment/revenue-share-formulas).
[Assign items](/documentation/manage/consignment/assigning-items) to the consignor. Per-item exceptions go through formula context (`item.fields.*`), not a separate rate on the item.
When a charge on a consigned item is paid, Supercycle adds the consignor's share to their **balance owed**. Refunds reverse it automatically.
Record [payouts](/documentation/manage/consignment/payouts) to settle the balance. Consignors see their balance, activity, and payouts in the [consignor portal](/documentation/manage/consignment/consignor-portal).
***
## Key concepts
| Term | What it means |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Consignor** | The brand partner or person who owns the stock. Has a name, an optional linked customer, a default revenue share, and payout methods. |
| **Revenue share** | What the consignor keeps from each paid charge — a shop default, a consignor percentage, or a [Liquid formula](/documentation/manage/consignment/revenue-share-formulas) returning cents. |
| **Shop default** | The revenue share applied when a consignor inherits. Set under **Settings** > **Consignment**. |
| **Balance owed** | The money you've accrued for a consignor but haven't yet paid out. |
| **Earning** | An entry added to a consignor's balance when a charge on their item is paid. |
| **Refund** | An entry that reverses part of a consignor's balance when a charge is refunded. |
| **Payout** | A record of a payment you've made to a consignor, which settles part or all of their balance. |
| **Payout run** | A batch of payouts recorded together, labelled `Run #1`, `Run #2`, and so on. |
***
## Payout methods
You choose how you pay consignors in **Settings** > **Consignment**.
| Method | Status | Description |
| ----------------- | ----------- | ----------------------------------------------------------------------------------- |
| **Manual** | Active | Record payouts you make outside Supercycle, like cash or a transfer from your bank. |
| **Store credit** | Coming soon | Pay consignors with credit to spend in your store. |
| **Bank transfer** | Coming soon | Send payouts directly to consignor bank accounts. |
Recording a payout in Supercycle tracks what you owe and what you've paid. It doesn't move any money itself. With the **Manual** method you make the actual payment outside Supercycle.
***
## Consignment and your other methods
Consignment is independent of how an item is sold. An item can be on resale, on a rental method, or both. Assigning it to a consignor simply changes who earns a share of the revenue when it's paid for.
* Store-owned items have no consignor and earn you 100% of the revenue.
* Consigned items earn the consignor their revenue share, and you keep the rest.
This means you can run consigned and store-owned stock side by side, and a single order can include both.
***
## Enable consignment
In Shopify admin, go to **Supercycle** > **Settings** > [**Consignment**](https://admin.shopify.com/apps/supercycle/settings/consignment).
Turn on **Enable consignment**, then **Save**. Once saved, **Manage consignors** becomes available.
Under **Payout methods**, **Manual** is active by default: record payouts you make outside Supercycle, like cash or a bank transfer. **Store credit** and **Bank transfer** are coming soon.
Under **Default revenue share**, choose **Percentage of sale** or **Formula**. This applies to every consignor that inherits the shop default. See [Revenue share formulas](/documentation/manage/consignment/revenue-share-formulas) for formula syntax and examples.
Consignment is rolling out gradually. If you don't see the **Consignment** tab in settings, it isn't enabled for your store yet, so contact support to request access.
***
## Consignment FAQs
A consignor earns when a charge on one of their items is **paid**, not when the order is placed. Supercycle renders the revenue share formula at that moment and freezes the amount on the ledger entry.
If a paid charge is later refunded, Supercycle adds a reversing **refund** entry proportional to the original earning — the refunded share of the basis reverses the same share of the amount. The formula is not re-rendered.
The formula and amount are frozen when each earning is recorded. Changing a consignor's revenue share or the shop default only affects future earnings. Past ledger entries are not recalculated.
No. Supercycle records what you owe and what you've paid. With the **Manual** method you make the actual payment yourself, then record it to settle the balance.
# Payouts
Source: https://docs.supercycle.com/documentation/manage/consignment/payouts
Track what you owe consignors and record the payments you make.
As consigned items earn, Supercycle builds a **balance owed** for each consignor. A **payout** records a payment you've made to settle some or all of that balance.
Recording a payout tracks what you owe and what you've paid. It doesn't move money itself. With the **Manual** method you make the actual payment outside Supercycle, then record it here.
***
## How balances build up
A consignor's balance owed is the sum of their unsettled entries:
* **Earnings**: added when a charge on the consignor's item is paid (the consignor's [revenue share formula](/documentation/manage/consignment/revenue-share-formulas) rendered at that moment).
* **Refunds**: subtracted when a paid charge is refunded, reversing proportionally against the original earning.
When you record a payout, the entries it covers are marked as settled and stop counting toward the balance owed. Deleting a payout returns them to unsettled.
***
## Record a payout
In Shopify admin, go to **Supercycle** > **Consignors** > [**Payouts**](https://admin.shopify.com/apps/supercycle/consignors/payouts).
Select **Pay consignors**.
Set the **Payout method** (Manual), the **Paid on** date, and any **Notes**, such as a reference.
Tick the consignors you're paying. Each row shows their outstanding balance, and the footer shows the selected count and total. Consignors with nothing outstanding don't appear.
Select **Record \[n] payouts**. Supercycle settles each selected consignor's outstanding balance into a payout and groups them under a single payout **run**.
Recording a payout doesn't move any money. Supercycle tracks what you owe and what you've paid. Make the actual payment outside Supercycle (cash, bank transfer, etc.) using the payout method details on the consignor.
Each payout covers a **statement period** from where the consignor's previous payout ended to the moment this one was recorded. The first-ever payout for a consignor starts at its earliest money event. The period appears on the payout page and as a **Period** column on the payouts list.
***
## Payout breakdown
When you open a payout, the **Breakdown** itemizes every entry it settled:
| Column | Description |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Cycle` | The cycle the entry came from (pinned left when scrolling). |
| `Type` | `Earning`, `Refund`, or `Adjustment`. Lines priced via fallback show a **Fallback** badge when the formula failed and the shop default was used. |
| `Item` | The item the entry relates to. Links to the item. |
| `Date` | When the money event occurred. |
| `Basis` | The charge revenue (or refunded amount) the share was calculated on. |
| `Revenue share` | The effective percentage when derivable from the frozen amount, otherwise `—`. |
| *(custom columns)* | [Money and integer fields](/documentation/configuration/custom-data/custom-fields#include-in-consignor-payouts) you flagged **Include in consignor payouts** on item or cycle definitions. Values read live from the entry's item or cycle. |
| `Amount` | The consignor's share: positive for earnings, negative for refunds (pinned right when scrolling). |
A **Total** row at the bottom sums to the payout amount.
***
## Payout runs
Each time you record payouts, the payouts created together are grouped into a **payout run**, labelled `Run #1`, `Run #2`, and so on. Runs make it easy to see everything settled in a single session, for example a monthly settlement across all your consignors.
***
## Delete a payout
If you record a payout in error, select it and choose **Delete payouts** (also available in bulk from the payouts list). Deleting a payout:
* Returns the entries it covered to **unsettled**, so they count toward the balance owed again and can be settled in a future payout.
* Updates the totals on the payouts summary.
Deleting a payout can't be undone, but the underlying earnings and refunds are preserved.
# Revenue share formulas
Source: https://docs.supercycle.com/documentation/manage/consignment/revenue-share-formulas
Define consignor revenue shares as Liquid formulas, including tiered rates and per-item deductions.
Consignor **revenue shares** can be a simple percentage of the sale or a [Liquid](https://shopify.github.io/liquid/) **formula** that returns the consignor's amount in **cents**. Both modes run through the same engine — a percentage compiles to a canonical formula — so what you preview is what gets frozen on each sale.
Set a **shop default** under **Settings** > **Consignment**, then override it per consignor when needed. Consignors set to **Inherit shop default** use whatever the shop default is at earning time.
**Item-level revenue share overrides are removed.** To treat one item differently, reference its custom fields in the formula (for example `item.fields.payout_rate`) instead of setting a separate rate on the item.
***
## Set the shop default
In Shopify admin, go to **Supercycle** > **Settings** > [**Consignment**](https://admin.shopify.com/apps/supercycle/settings/consignment).
Under **Default revenue share**, pick **Percentage of sale** or **Formula**. This applies to every consignor that inherits the shop default.
For a percentage, enter **Revenue share percentage** (0–100%). For a formula, select **Add formula** to open the editor.
Select **Save**. Changes apply to future earnings only — past ledger entries keep their frozen amounts.
***
## Set a consignor's revenue share
On a consignor's page, the **Revenue share** selector has three options:
| Mode | What it does |
| ------------------------ | ----------------------------------------------------------------------------- |
| **Inherit shop default** | Uses the shop default from consignment settings (default for new consignors). |
| **Percentage of sale** | A fixed percentage of the charge subtotal for this consignor's items. |
| **Formula** | A Liquid expression returning the consignor's share in cents. |
When the consignor uses a formula (or inherits a shop default that is a formula), the consignors list and related displays show **Formula** instead of a percentage. When a percentage can be derived — including inherit → shop percent — the display shows that percentage.
***
## Write a formula
Select **Add formula** or **Edit formula** to open the formula editor. The sidebar shows a read-only preview; edits apply when you select **Done** and save the consignor or settings form.
### Rules
* The formula must render a **non-negative integer in cents**. For example, `$60.00` on a sale is written as `6000`.
* Formulas run in **strict mode** — referencing an undefined variable fails validation on save, or surfaces an error in **Try it out**.
* **Money values are in cents** throughout the formula context.
### Variable chips
The editor lists clickable variable chips you can insert into the formula. Available context:
| Prefix | What it includes |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `charge.subtotal` | The charge revenue the share is calculated on, in cents (same value frozen as **Basis** on payout lines). |
| `cycle.*` | Built-in cycle system values (schedule dates, charges totals, deposit, and similar). |
| `item.*` | Built-in item system values (completed cycles, acquisition cost, lifecycle revenue, ROI, utilization, variant price, and similar). |
| `item.fields.*` | Custom and calculated fields on the item, by key. |
| `cycle.fields.*` | Custom and calculated fields on the cycle, by key. |
| `consignor.fields.*` | Custom and calculated fields on the consignor, by key. |
The same system fields available in [calculated fields](/documentation/configuration/custom-data/calculated-fields) are exposed here under `item.*` and `cycle.*`.
### Examples
**60% of the sale** (equivalent to percentage mode):
```liquid theme={null}
{{ charge.subtotal | times: 60.0 | divided_by: 100.0 | round }}
```
**60% minus a repair fee** stored as a money custom field on the item:
```liquid theme={null}
{% assign share = charge.subtotal | times: 60.0 | divided_by: 100.0 | round %}
{% assign fee = item.fields.repair_fee | default: 0 %}
{{ share | minus: fee }}
```
**Tiered rate** by sale amount:
```liquid theme={null}
{% if charge.subtotal >= 10000 %}
{{ charge.subtotal | times: 70.0 | divided_by: 100.0 | round }}
{% else %}
{{ charge.subtotal | times: 50.0 | divided_by: 100.0 | round }}
{% endif %}
```
***
## Try it out
Before saving, use **Try it out** in the formula editor:
1. Pick any **Item** in your shop (formulas can reference that item's fields regardless of who consigns it).
2. Enter a **Sale amount**.
3. Select **Calculate**.
Supercycle renders the draft through the real engine and shows what the consignor would receive. If the result exceeds the sale amount, you get a warning. Liquid errors appear verbatim — previews do not fall back to the shop default, so you see exactly why a formula is broken.
***
## What happens on a sale
Supercycle resolves the consignor's mode: consignor percent or formula, or the shop default when the consignor inherits. Percentages compile to the same cents formula path.
When the charge is **paid**, the formula renders against that charge, cycle, item, and consignor. The resulting **amount**, **basis**, **formula text**, and **source** (`consignor`, `shop`, or `fallback`) are frozen on the ledger entry.
If a formula fails at earning time, Supercycle falls back to the shop default formula (or zero if that also fails), writes the entry with `source: fallback`, and logs the error. Money events never drop. Correct mistakes with an **adjustment** entry; the payout breakdown shows a **Fallback** badge on affected lines.
Refunds reverse `earning amount × refund basis ÷ earning basis` — the formula is never re-rendered. For percentage-based entries this matches the old rate-based reversal.
Changing a consignor's revenue share or the shop default only affects **future** earnings. Past entries stay frozen with the formula and amount recorded at the time.
***
## Per-item exceptions without overrides
Because item-level revenue share overrides are gone, express different terms through data the formula reads:
* Add a **money** or **integer** [custom field](/documentation/configuration/custom-data/custom-fields) on items (for example `payout_rate` or `repair_fee`).
* Reference it in the shop default or consignor formula with `item.fields.payout_rate`.
* Set the field per item in **Inventory** — no separate commission field on the item.
For read-only derived values, use a [calculated field](/documentation/configuration/custom-data/calculated-fields) on items or cycles and reference it the same way.
# Allocating items to cycles
Source: https://docs.supercycle.com/documentation/manage/cycles/allocation
Ally, our item to cycle allocation algorithm
Our inventory allocation algorithm works to maximize inventory utilization - it's optimizes which items are assigned to which rentals, making sure that future rentals have the most availability possible.
**Ally** is a greedy algorithm that maximizes the space between bookings, with a few other considerations. All new bookings placed are run through the algorithm.
This means that future customers see the largest date ranges possible.
### Buffers and cutoffs
When Ally is optimizing availability, it takes into account your [logistics buffers](/documentation/configuration/logistics/buffers) to ensure bookings aren't placed too close together.
### Allocating membership rentals
Regardless of whether you encourage them to, you can't know a customer will send back a membership item on a certain date. Because of that, Ally treats membership rentals with indefinite end dates, so no future rentals can be placed against that item until it is returned.
# Convert to purchase
Source: https://docs.supercycle.com/documentation/manage/cycles/convert-to-purchase
Convert an active cycle into a sale so the customer keeps the item instead of returning it
Convert to purchase lets you turn an active cycle into a sale. The item is marked as **sold**, the cycle stops, and any upcoming cycles on that item are reallocated to alternative stock.
Use this when a customer decides to keep an item they're renting instead of returning it.
Letting customers convert to purchase from their account is in **beta**. We'd love your feedback on the flow — what's clear, what's not, and anything that could be easier to understand.
***
## Before you start
A cycle can only be converted to purchase if:
* The cycle has been fulfilled but **not yet received** back.
* The receival has exactly **one rental** on it.
* Any upcoming cycles on the same item have **alternative stock available** to be reallocated to.
If any of these aren't met, Supercycle shows the reason in the **Convert to purchase** modal and blocks the action.
***
## Convert a cycle to a purchase from the admin
From [Cycles](https://admin.shopify.com/apps/supercycle/cycles), open the cycle you want to convert.
On the **Receival** card you'll see two actions — **Create return** and **Convert to purchase**. Select **Convert to purchase**.
The modal shows:
* **Resale price** — the configured resale price for the item, or the retail price if no resale price is set.
* **Paid** — the total the customer has already paid in rental charges on this cycle.
* **Suggested charge** — the difference between the resale price and what the customer has paid, clamped to zero.
The **Charge amount** field is pre-filled with the suggested charge. Edit it if you'd like to charge a different amount, or leave it blank to convert without creating a charge.
If the item has upcoming cycles, they're listed in the modal. These will automatically be reallocated to alternative items when you confirm.
Select **Convert to purchase**.
Supercycle will:
* Create a charge on the cycle for the **Charge amount** (if greater than 0).
* Mark the item as **sold** so it's no longer available for future cycles.
* End the cycle and clear its return dates.
* Cancel the subscription, if the cycle is part of one.
* Reallocate any upcoming cycles on this item to alternative stock.
* Log a **Converted to sale** event on the cycle timeline.
***
## Let customers convert to purchase from their account Beta
You can let customers convert their own rentals to a purchase from the customer account portal.
Go to **Settings** > **Customer accounts**.
Turn on **Customers can convert to purchase**.
Once enabled, customers see a **Purchase this item** button on eligible rentals in their account dashboard. When they tap it, they're charged the difference between the resale price and what they've already paid to complete the conversion.
The customer-facing button only appears when a resale price is set on the product and the suggested charge can be calculated. It also follows the same eligibility rules as the admin flow.
### Return item reminder email
When convert to purchase is enabled for customers, the [return item reminder](/supercycle-notifications) email includes a **Complete your purchase** button for each eligible rental on that reminder.
The button uses the same eligibility checks as the customer account flow, and links the customer to their account rental page to finish the conversion. Rentals that are not eligible omit the button and only show the usual return reminder content.
***
## FAQs
No. Once a receival is marked as received, the cycle can't be converted to a purchase. You'd need to handle it as a new sale order in Shopify instead.
Supercycle automatically reallocates them to other available items of the same variant. If there's no alternative stock for one of the upcoming cycles, the conversion is blocked and Supercycle tells you which cycle can't be reallocated.
No. Earlier charges stay on the cycle. The **Charge amount** in the modal is the additional amount the customer pays to keep the item — it doesn't refund or adjust what they've already paid.
Yes. Leave **Charge amount** blank to convert without creating a charge.
# Create cycle order
Source: https://docs.supercycle.com/documentation/manage/cycles/create-cycles-order
Create a cycle order on behalf of a customer from the Supercycle admin
You can create cycles for a customer by starting a brand new cycle order from the Supercycle admin. To add a cycle to an existing Shopify order instead, see [Edit cycles on order](/documentation/manage/cycles/edit-an-order#adding-a-rental-to-an-order).
***
## Create a new cycle order
An in-app create order flow is available in beta. Enable **New create order flow** under [Settings > Beta features](https://admin.shopify.com/apps/supercycle/settings/features) to pick the customer, add variants, and configure calendar, membership, or subscription intents directly inside Supercycle before the Shopify draft order is created. See [Create cycle order (beta)](/documentation/manage/cycles/create-cycles-order-beta).
You can create a cycle on behalf of a customer via the Shopify admin.
Go to Supercycle > Cycles.
Supercycle asks who the order is for before opening the Shopify draft order. Search for an existing Shopify customer by name or email in the customer picker and select them.
If the customer doesn't exist yet, click **Add new customer** and enter their first name, last name, and email. Supercycle creates them in Shopify on the fly and selects them for the order. Email is required; first and last name are optional.
The customer picker searches every customer in your Shopify store, not just customers already synced to Supercycle.
Click **Continue**. Supercycle creates a Shopify draft order pre-filled with the customer you just selected.
Select the cycle method. For the calendar, select the period and dates.
Add another product if needed.
Click save.
* Apply discounts
* Add shipping
* Add tags or a note
Adding a product to the draft order will not create a cycle for that product — cycles must be added via Supercycle.
* Accept payment from the customer by marking the order as paid or entering card details. Then create an order.
* Set payment to due later. Then create an order.
You will now have a Shopify order for that customer with cycles that can be seen in Supercycle Cycles.
***
## Reserving cycle inventory on a draft order
When you build an order with cycles as a Shopify draft order, the customer hasn't paid yet, so the units on the draft aren't held unless you reserve them.
### Reserve inventory automatically
By default, Supercycle **reserves inventory automatically** whenever cycles are added to a draft order, so a unit can't be double-booked while the draft is still unpaid. No manual step is required, and Shopify shows **Reserve items** as active on the draft. The reserve lasts for a set duration (7 days by default) from when the draft is created.
Control this under [Settings > Channels > Draft orders](https://admin.shopify.com/apps/supercycle/settings/channels/draft-orders):
* **Reserve inventory automatically** — toggle the behavior on or off.
* **Reserve inventory for** — how long inventory stays reserved after the draft order is created.
### Reserve manually
You can also reserve items on a draft directly with Shopify's **Reserve items**, which is useful when auto-reserve is off or you want to set a specific expiry:
In your Shopify admin, go to **Draft orders** and open the draft containing the cycle.
In the **Reserve items** card, set an expiry date and time and save. Shopify shows the reserve as active on the draft.
While a reserve is active, the unit is held with an internal block spanning the cycle's pick-up and return dates, and no other cycle can book it in that window.
The reserve is released automatically when any of the following happens:
* You turn **Reserve items** off on the draft.
* The customer pays and the draft becomes an order (the cycle picks an available unit as normal).
* The draft is cancelled or deleted.
* You remove the cycle line from the draft.
* The reserve expiry time passes.
Changing the cycle dates on the draft updates the reserve window automatically.
# Cycles overview
Source: https://docs.supercycle.com/documentation/manage/cycles/cycles
Manage active cycles and track their full lifecycle in Supercycle
In Supercycle, you can create cycles for items that are blocked for a specific time. Cycles are used to manage the availability of items and to track the items that are currently out with customers.
To create a cycle order for a customer, see [Create cycle order](/documentation/manage/cycles/create-cycles-order). A new in-app [create order flow](/documentation/manage/cycles/create-cycles-order-beta) is also available in beta.
Access cycles from [Cycles](https://admin.shopify.com/apps/supercycle/cycles).
***
## Cycle overview
Each cycle record includes details about the product, item, serial, customer, return progress, billing, and key activity.
***
#### Return progress
Displays the current stage of the cycle and return process — **Prepare**, **Fulfilled**, **Arrival**, **Return**, **Receive**, and **Restock**.\
Also shows the expected receival date if a return is in progress.
***
#### Product
The product and variant.
***
#### Item
The specific [Item](/documentation/manage/inventory/items/) assigned to the cycle.
***
#### Serial
The item’s [Serial](/documentation/manage/inventory/items/#serial) currently assigned to the cycle.\
Use this for scanning, tracking, and service history.
***
#### Order
The Shopify order linked to this cycle.\
Open it directly, view fulfillment details, or print packing slips.
***
#### Return
The associated return record.
***
#### Customer
Displays the customer’s name, email, and shipping address.\
Includes quick access to contact details and outstanding charges.
***
#### Billing
Shows the billing summary for the cycle, including next charge date and total charges for recurring cycles.\
You can also create manual charges directly from this section.
***
#### Tags
Freeform tags used to group, filter, or search cycles.
***
#### Timeline
Shows all activity on the cycle, including creation, fulfillment, return, and billing events.\
Use it to trace when actions occurred and who performed them.
***
## Cycle FAQs
You can filter cycles by **Order ID** from the [Cycles](https://admin.shopify.com/apps/supercycle/cycles) table.
No. The arrival date does not update based on tracking information.\
It’s calculated using your configured logistics buffers.
# Edit cycles on order
Source: https://docs.supercycle.com/documentation/manage/cycles/edit-an-order
Change an existing cycle order directly from Shopify
You can edit an existing rental order directly from Shopify without needing to create a new one. You can remove or add rentals, charge any difference, or issue refunds.
***
## Removing a rental from an order
In your Shopify admin, go to **Orders** and open the specific order you want to edit.
Select **Edit**.
Hover over the rental item you want to remove.\
Select the **X** that appears, or set the **quantity** to 0.
Click **Save** to confirm the change.
***
## Adding a rental to an order
**Setting up your Shopify product price for the Add rental flow**
When you add a rental to an existing order, Supercycle automatically applies a discount to bring the Shopify product price down to your configured rental price.
This means your Shopify product price must be set higher than your most expensive rental option in Supercycle. If the product price is lower than a rental option, that rental price cannot be applied correctly on the order edit.
In your Shopify admin, go to **Orders** and open the specific order.
Select **More actions** > **Add cycles**.
You can:
* Manually choose a **rental method** and **start date**, or
* Select from one of the **presets** shown.
Presets are based on the existing rentals in the order.\
For example, if the order includes a subscription and a calendar rental from **October 10–21**, you'll see both a *Subscription* preset and a *Calendar (Oct 10–21)* preset.
Choose the product you want to add.\
Supercycle will check the item’s availability.\
Once ready, click **Add to order**.
***
## Charging the difference
If adding rentals increases the total order value, Shopify will show the **outstanding balance**.
After adding all new rentals, check the summary for the amount due.
You can either:
* **Send an invoice** to the customer, or
* **Charge a saved card** directly.
***
## Refunding the difference
If removing rentals lowers the total order value, you’ll see a **Manage refund** button.
Select **Manage refund**. This opens Shopify’s refund page.
Review the refund details and confirm to process it directly in Shopify.
***
## FAQs
To change the shipping address for an existing order, go to the order in Shopify.\
Click the **three dots** next to the customer’s name, then select **Edit address**.\
Any changes you make will automatically be reflected in Supercycle.
# Extend calendar rental
Source: https://docs.supercycle.com/documentation/manage/cycles/extensions
Let customers extend an active calendar cycle and pay the difference
Sometimes a customer wants to keep a rental for longer than they originally booked. Instead of asking them to email support or place a new order, you can let them extend an active calendar cycle directly from their customer account.
When extensions are enabled, the customer sees an **Extend** action on the rental in their account, picks a new return date from your existing rental periods, and pays the difference. Supercycle creates a charge, moves the **Return by** date forward, and reschedules the cycle.
Extensions are only available on the [customer portal](/documentation/online-store/portal). Make sure the Supercycle account page is added to your theme before you turn extensions on.
***
## How it works
Customers can extend a cycle when **all** of the following are true:
* The product uses the [calendar](/documentation/methods/calendar/overview) method.
* The cycle hasn't been received back yet.
* The receival contains exactly one rental.
* Inventory is available for the extended dates.
* There isn't already an unpaid extension in progress for the cycle.
The available extension options come from the same [rental periods](/documentation/methods/calendar/product-setup) you've configured on the product. Each option is offered as an additional duration on top of the current return date, so a 3-day rental period becomes a 3-day extension. Any [fixed fees](/documentation/methods/calendar/fixed-fees) priced into a rental period are included in the extension charge.
When the customer submits an extension:
1. Supercycle re-checks inventory under a lock to handle concurrent bookings.
2. An unpaid extension charge is added to the cycle for the price difference.
3. The customer is sent to checkout to pay the outstanding balance.
4. The **Return by** date moves forward and the cycle timeline shows a `Cycle extended from X to Y` event.
***
## Enable extensions
In your Shopify admin, go to **Supercycle** > **Settings** > **Methods** and open the **Calendar** method.
Under **Extensions**, turn on **Allow customers to extend cycles** and save.
Extensions appear on the rental detail page in the [customer portal](/documentation/online-store/portal). If you haven't added the Supercycle account page to your theme yet, do that first.
The setting is off by default and applies to all calendar products on your store.
***
## What the customer sees
On the rental in their account, customers see an **Extend** button. Selecting it opens a list of options showing the new return date and the additional duration, for example:
```text theme={null}
10 Jun 2026 (3 days)
13 Jun 2026 (6 days)
```
Options that aren't available — because another booking is in the way — are shown but can't be selected. After choosing an option, the customer is taken to checkout to pay the difference.
***
## From the admin
You can also extend a rental on a customer's behalf from the Supercycle admin. This is useful when a customer calls or emails to ask for more time, or when you want to grant an extension at a custom price.
### Where to find it
Open the rental in your Supercycle admin and look at the **Inbound receival** card. When the cycle is eligible, the card shows an **Extend rental** action that opens the extension modal.
The same eligibility rules as the customer flow apply:
* The cycle hasn't been received back yet.
* The receival contains exactly one rental.
* Inventory is available for the new dates.
If any of these aren't true, the **Extend rental** action isn't shown.
### Choose an extension
The modal lists the same rental period options the customer would see, each with the new end date and price. You also get one extra choice the customer doesn't:
* **Custom end date** — pick any date after the current return date using a date picker. Use this when you want to extend by a duration that doesn't match one of the configured rental periods.
### Override the charge
Below the options list, the **Charge amount** field is editable. It prefills from the selected option's price (or is left blank when you choose **Custom end date**), and you can change it to any value — including £0 — before confirming.
A charge is always created on the cycle, even when the amount is £0, so the extension is recorded in the cycle's billing history.
Setting the amount to £0 is a quick way to grant a goodwill extension without taking payment, while still leaving an audit trail on the rental.
# Fulfilling cycles
Source: https://docs.supercycle.com/documentation/manage/cycles/fulfil-a-rental
Find, ship, and return cycle orders using Supercycle.
All rentals are connected to a Shopify order, and a Shopify order can include multiple rentals.
Fulfilling a rental, requires fulfilling the associated Shopify order.
When you fulfil a rental order, Supercycle automatically updates the rental status.
To fulfil a rental order, you need to know which orders to fulfil, creating shipments and prepare for receiving the items back.
***
### Filtering which orders to fulfil
You can find rental orders in both Shopify and Supercycle.
From Shopify.
* **Unfulfilled** status
* Tagged with **Has rental items**
From Supercycle.
Use the **Expected fulfilment date** filter and set it to **Today**.
Use the [`list_cycles`](/ai/operators-mcp/tools#cycles) tool with:
* `status` - `to_fulfill`
* `packing_status` - `pending`, `printed`, or `packed`
Use the [List all cycles](/api-reference/admin/cycles/list-all-cycles) endpoint with status and packing filters.
### Print a shipping label
You can create a shipping label in Shopify:
In Supercycle, click the **Shopify order link** in the cycle to open the order in Shopify.
In Shopify, click **Create shipping label**.
If you use a third-party shipping tool like **ShipStation**, you can print the label there and add the tracking number in Shopify.
### Fulfil the order
You can fulfil the order from Shopify, from Supercycle, or through the API.
When you fulfil the order in Shopify, Supercycle automatically updates the rental status to **Fulfilled**.
In your Shopify admin, go to **Orders**, then select the order you want to fulfil.
In the **Unfulfilled** section, click **Fulfil item(s)**.\
Add a tracking number and select a carrier if needed.
Select **Send shipment details to your customer now** to email tracking info.
Shopify updates the status to **Fulfilled**, and Supercycle marks rentals as fulfilled.
You can also fulfil directly in the **Cycles** view in Supercycle.
We don't recomened this at the moment. As you will still need fulfil orders directly in Shopify. We're working on fixing this, and it will be available in an upcoming update.
Use the [`update_cycle`](/ai/operators-mcp/tools#cycles) tool with:
* `id` - Cycle ID (e.g. `SC-1234`)
* `fulfilled_at` - Fulfilment date in `YYYY-MM-DD` format
Use the [Update a cycle](/api-reference/admin/cycles/update-a-cycle) endpoint with the `fulfilledAt` parameter.
# Cycle actions
Source: https://docs.supercycle.com/documentation/manage/cycles/rental-actions
Step-by-step guides for processing, updating, and managing cycles from the admin
### Create cycles
An in-app create order flow is available in beta. Enable **New create order flow** under [Settings > Beta features](https://admin.shopify.com/apps/supercycle/settings/features) to pick the customer, add variants, and configure calendar, membership, or subscription intents directly inside Supercycle before the Shopify draft order is created. See [Create cycle order (beta)](/documentation/manage/cycles/create-cycles-order-beta).
You can create a cycle on behalf of a customer via the Shopify admin.
Go to Supercycle > Cycles.
Supercycle asks who the order is for before opening the Shopify draft order. Search for an existing Shopify customer by name or email in the customer picker and select them.
If the customer doesn't exist yet, click **Add new customer** and enter their first name, last name, and email. Supercycle creates them in Shopify on the fly and selects them for the order. Email is required; first and last name are optional.
The customer picker searches every customer in your Shopify store, not just customers already synced to Supercycle.
Click **Continue**. Supercycle creates a Shopify draft order pre-filled with the customer you just selected.
Select the cycle method. For the calendar, select the period and dates.
Add another product if needed.
Click save.
* Apply discounts
* Add shipping
* Add tags or a note
Adding a product to the draft order will not create a cycle for that product — cycles must be added via Supercycle.
* Accept payment from the customer by marking the order as paid or entering card details. Then create an order.
* Set payment to due later. Then create an order.
You will now have a Shopify order for that customer with cycles that can be seen in Supercycle Cycles.
***
### Filtering which orders to fulfil
You can find rental orders in both Shopify and Supercycle.
From Shopify.
* **Unfulfilled** status
* Tagged with **Has rental items**
From Supercycle.
Use the **Expected fulfilment date** filter and set it to **Today**.
Use the [`list_cycles`](/ai/operators-mcp/tools#cycles) tool with:
* `status` - `to_fulfill`
* `packing_status` - `pending`, `printed`, or `packed`
Use the [List all cycles](/api-reference/admin/cycles/list-all-cycles) endpoint with status and packing filters.
***
### Fulfil the order
You can fulfil the order from Shopify, from Supercycle, or through the API.
When you fulfil the order in Shopify, Supercycle automatically updates the rental status to **Fulfilled**.
In your Shopify admin, go to **Orders**, then select the order you want to fulfil.
In the **Unfulfilled** section, click **Fulfil item(s)**.\
Add a tracking number and select a carrier if needed.
Select **Send shipment details to your customer now** to email tracking info.
Shopify updates the status to **Fulfilled**, and Supercycle marks rentals as fulfilled.
You can also fulfil directly in the **Cycles** view in Supercycle.
We don't recomened this at the moment. As you will still need fulfil orders directly in Shopify. We're working on fixing this, and it will be available in an upcoming update.
Use the [`update_cycle`](/ai/operators-mcp/tools#cycles) tool with:
* `id` - Cycle ID (e.g. `SC-1234`)
* `fulfilled_at` - Fulfilment date in `YYYY-MM-DD` format
Use the [Update a cycle](/api-reference/admin/cycles/update-a-cycle) endpoint with the `fulfilledAt` parameter.
***
### Change product/variant
You can change the item associated with a rental to any item from any product.
Changing the product on a rental does not change the product on the Shopify order. If this is important, you should refund the line item in Shopify in order to cancel the existing rental and then create a new rental for the new product.
Changing the product will not charge/refund the difference to the customer. You should do this manually by partially refunding the original order, creating a draft order with a custom line item to charge the extra amount.
From the rental's page, on the item card, select **Change item**.
Under **Change item**, search and select an item by its product/variant name or its item id/serial.
Supercycle limits the number of items that are returned on the search dropdown. If the item you're looking for doesn't show, try adding more detail to the search.
Save your changes at the top of the page.
***
### Change item
From the rental's page, on the item card, select **Change item**.
Under **Change item**, search and select an item by its product/variant name or its item id/serial. Click a row or use its checkbox to select it.
Each candidate shows:
| Column | What it tells you |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Condition** | The item's current [condition grade](/documentation/manage/inventory/item-conditions). |
| **Availability** | Whether the item is free for this cycle's dates (`Available` or `Overlaps`). |
| **Active** | The cycle the item is currently out on, if any. |
| **Upcoming** | How many unfulfilled cycles are already booked on the item. The cycle you're editing is excluded from its own current item's active and upcoming counts. |
| **Previous** | How many cycles the item will have completed by the time this cycle starts. |
When [consignment](/documentation/manage/consignment/overview) is enabled, **Consignor** and **Revenue share** columns show who would earn from the cycle and how much.
Supercycle limits the number of items that are returned on the search dropdown. If the item you're looking for doesn't show, try adding more detail to the search.
Save your changes at the top of the page.
Change which item is allocated to a rental, either from the rental, or by scanning an item which has a rental for the same product/variant (that currently has a different item allocated to it).
Use the [`update_cycle`](/ai/operators-mcp/tools#cycles) tool with:
* `id` - Cycle ID (e.g. `SC-1234`)
* `item_id` - The new item ID to assign
Use the [Update a cycle](/api-reference/admin/cycles/update-a-cycle) endpoint with the `itemId` parameter.
***
### Change rental period
The rental dates can be changed to any dates and we recommend checking the availability of the item before selecting new dates.
Changing the rental period does not automatically adjust charges to the customer.\
You will need to handle any additional charges or refunds separately.
From the rental's page, under **Logistics**, select **Edit**.
Under **Rental start** and **Rental end**, select new dates for either or both.
You'll have to charge or refund the customer separately if changing the rental period.
You'll still need to do this, even if you close the edit rental view.
Use the [`update_cycle`](/ai/operators-mcp/tools#cycles) tool with:
* `id` - Cycle ID (e.g. `SC-1234`)
* `rental_start` / `rental_end` - New dates in `YYYY-MM-DD` format
Use the [Update a cycle](/api-reference/admin/cycles/update-a-cycle) endpoint with the `rentalStart` and/or `rentalEnd` parameters.
***
### Change fulfillment date/time
From the rental's page, under **Logistics**, select **Edit**.
Under **Fulfilled at**, select new dates.
You'll still need to do this, even if you close the edit rental view.
When an Order in Shopify is marked as fulfilled with an associated rental, the rental's **Fulfilled at** will also be updated.
**Mark as Fulfilled** action from the **Actions** options on the [Cycles](https://admin.shopify.com/apps/supercycle/cycles) table.
Use the [`update_cycle`](/ai/operators-mcp/tools#cycles) tool with:
* `id` - Cycle ID (e.g. `SC-1234`)
* `fulfilled_at` - Fulfilment date in `YYYY-MM-DD` format
Use the [Update a cycle](/api-reference/admin/cycles/update-a-cycle) endpoint with the `fulfilledAt` parameter.
***
### Change receival date/time
From the rental's page, select **Edit**.
Under **Received at**, select new dates.
You'll still need to do this, even if you close the edit rental view.
When a Return is marked as received with an associated rental, the rental's receival will also be updated.
**Mark as Returned** action from the **Actions** options on the [Cycles](https://admin.shopify.com/apps/supercycle/cycles) table.
Use the [`update_cycle`](/ai/operators-mcp/tools#cycles) tool with:
* `id` - Cycle ID (e.g. `SC-1234`)
* `received_at` - Receival date in `YYYY-MM-DD` format
Use the [Update a cycle](/api-reference/admin/cycles/update-a-cycle) endpoint with the `receivedAt` parameter.
***
### Edit restock by and prepare from dates
Override the buffer dates for a single cycle when the item needs longer (or less) preparation or restock than the shop-wide [logistics buffers](/documentation/configuration/logistics/buffers) would set. The date you set sticks until the leg's anchor date next moves. **Revert to automatic date** recalculates it from your logistics settings.
Open the cycle from **Supercycle > Cycles** and expand the **Outbound fulfillment** card (for the prepare from date) or the **Inbound receival** card (for the restock by date).
In the card's actions menu, select **Edit prepare from date** or **Edit restock by date**.
Pick a new date, or tick **Revert to automatic date** to let Supercycle recalculate it from the preparation or restock buffer in your logistics settings. Save.
Use the [`update_cycle`](/ai/operators-mcp/tools#cycles) tool with:
* `id` - Cycle ID (e.g. `SC-1234`)
* `prepare_from` - Preparation start date in `YYYY-MM-DD` format, or `null` to revert to automatic
* `restock_by` - Restock date in `YYYY-MM-DD` format, or `null` to revert to automatic
Use the [**Update cycle**](/documentation/manage/automation/automation#update-cycle) action with `prepareFrom` and `restockBy` fields. Pass `null` to clear the override and recalculate from the shop's logistics settings.
Use the [Update a cycle](/api-reference/admin/cycles/update-a-cycle) endpoint with the `prepareFrom` and `restockBy` parameters. Pass `null` to revert either buffer date to the automatic value.
***
### Cancel rental
Rentals can be canceled by removing the line item from the Shopify order.
You can also navigate to the order via the rental in Supercycle.
From the Shopify order, click **Refund**.
You should process a refund against any line items you want to cancel rentals for.
Shopify allows you to set the refund amount, regardless of the value of the line items. Changing the refund amount won't affect whether rentals are canceled in Supercycle.
Select **Refund** to continue.
Refunding a line item in Shopify will cancel a rental in Supercycle regardless of its fulfillment status.
***
# Cycle statuses
Source: https://docs.supercycle.com/documentation/manage/cycles/rental-statuses
Understanding cycle status lifecycle and when each status is triggered
Rentals in Supercycle progress through different statuses based on their logistics timeline. Each status reflects where the rental is in its fulfillment and return journey.
## Status overview
A rental's status is determined by two main factors:
* Whether it has been cancelled
* Its position in the logistics timeline (fulfillment and receival stages)
## Main statuses
### Cancelled
**Displayed as:** Cancelled
**When triggered:** When a rental is manually cancelled
**What it means:** The rental has been cancelled and will not proceed through the normal fulfillment and return process. This is a terminal status.
***
### Fulfillment statuses
These statuses apply when a rental has not yet been fulfilled (sent to the customer).
#### Unfulfilled
**Displayed as:** Unfulfilled
**When triggered:**
* The rental has not been fulfilled yet
* No fulfillment date is set, OR
* The fulfillment date is today or in the past
**What it means:** The rental is awaiting fulfillment but has no scheduled future fulfillment date.
#### Fulfillment scheduled
**Displayed as:** Fulfillment scheduled
**When triggered:** The rental has a future fulfillment date set
**What it means:** The rental is scheduled to be fulfilled on a specific future date.
#### Fulfillment overdue
**Displayed as:** Fulfillment overdue
**When triggered:** The fulfillment date has passed but the rental has not been fulfilled
**What it means:** The rental should have been fulfilled by now but hasn't been marked as fulfilled yet.
#### Fulfilled
**Displayed as:** Fulfilled
**When triggered:** The rental has been marked as fulfilled (covers both in-transit and delivered states)
**What it means:** The rental has been shipped/fulfilled and is either in transit to the customer or has been delivered.
***
### Receival statuses
These statuses apply once fulfillment is complete and the rental is with the customer.
#### With customer
**Displayed as:** With customer
**When triggered:**
* Fulfillment is complete
* The rental has not been received back yet
* No receival date is set, OR
* The receival date is today or in the past
* The predicted rental end date has not passed
**What it means:** The rental is with the customer and awaiting return, but no specific return date is scheduled or it's due today/past due.
#### Receival scheduled
**Displayed as:** Receival scheduled
**When triggered:**
* Fulfillment is complete
* The rental has a future receival date set
* The rental has not been received back yet
**What it means:** The rental is scheduled to be returned on a specific future date.
#### Receival overdue
**Displayed as:** Receival overdue
**When triggered:**
* Fulfillment is complete
* The receival date has passed but the rental has not been received back
**What it means:** The rental should have been returned by now but hasn't been marked as received yet.
#### Unreceived
**Displayed as:** Unreceived
**When triggered:**
* Fulfillment is complete
* The predicted rental end date has passed
* The rental has not been received back yet
**What it means:** The rental period has ended and the item is expected to be in transit back to you, but hasn't been received yet.
#### Received
**Displayed as:** Received
**When triggered:** The rental has been received back from the customer
**What it means:** The item has been returned and received back into your inventory. This is the final status for a completed rental.
## Status progression
A typical rental progresses through statuses in this order:
1. **Fulfillment scheduled** → When a future fulfillment date is set
2. **Unfulfilled** → On the fulfillment day
3. **Fulfillment overdue** → If fulfillment date passes without being fulfilled
4. **Fulfilled** → When marked as fulfilled and shipped
5. **With customer** → When item reaches customer
6. **Receival scheduled** → Return date is set
7. **Receival overdue** → If return date passes without being received
8. **Unreceived** → Rental period ended, awaiting return
9. **Received** → Item received back
At any point, a rental can be moved to **Cancelled** status.
# Cycle troubleshooting
Source: https://docs.supercycle.com/documentation/manage/cycles/rental-troubleshooting
Issues you might encounter with cycles and how to resolve them
When you create a rental order from the **Cycles** tab in Supercycle and click **Save**, you’re taken to a Shopify **draft order**. Add a **customer** and **process the payment** on that draft order. After payment is captured, the cycle appears in **Cycles** in Supercycle.
# Blocked dates
Source: https://docs.supercycle.com/documentation/manage/inventory/blocked-dates
Stop the whole store, products, variants, or items from being booked during specific dates
Blocked dates let you mark your whole store, a product, a variant, or an individual item as unavailable for a defined period. Use them to handle planned downtime, photoshoots, repairs, holidays, store closures, or any other reason a resource shouldn't be bookable.
Blocked dates remove **availability** for a resource across the whole store. To block selectable **date options** on the storefront calendar (for example, weekends or a rolling booking window), use [Date picker blocked dates](/documentation/online-store/date-picker-blocks) under **Settings** → **Channels** → **Online store** instead.
## When to use blocked dates
Use a blocked date when you want to stop new bookings for a resource without changing its visibility or status.
| Resource type | Use when you want to block… |
| ------------- | ------------------------------------------------------------------------------------------------ |
| `Shop` | Every item in the store. Use for full store closures, public holidays, or company-wide downtime. |
| `Product` | Every variant and item belonging to a product. |
| `Variant` | Every item belonging to a specific variant. |
| `Item` | A single, serialized item. |
Existing rentals are not affected. If you need to reassign or cancel bookings that already exist during the blocked period, do that from the cycle.
## Create a blocked date
In Shopify Admin, head to **Supercycle** > **Inventory** > **Blocked dates**.
Click **Create blocked date** in the top right.
Choose **Shop**, **Product**, **Variant**, or **Item** from the **Resource type** dropdown. The resource search below repopulates with matching records.
Selecting **Shop** blocks the entire store for the date range — no resource search is needed.
For Product, Variant, or Item blocks, start typing in the **Resource** field to search by title (or SKU for variants). Select the record you want to block. Skip this step for **Shop** blocks.
Set **From** and **To** dates.
* Leave **From** blank to block every date up to (and including) **To**.
* Leave **To** blank to block every date from **From** onwards.
* Leave both blank to block the resource indefinitely.
Click **Create**. The blocked date appears in the table immediately and applies to availability checks straight away.
## Manage existing blocked dates
The Blocked dates table lists every active block on the store. Use the column filters to narrow the list by resource or date, and use the row selection to remove blocks in bulk.
To see how blocks and cycles sit across your variants over time, use the [Schedule](/documentation/manage/inventory/schedule).
# Inventory troubleshooting
Source: https://docs.supercycle.com/documentation/manage/inventory/inventory-troubleshooting
Issues you might encounter with inventory and how to resolve them
This happens when you update a variant via CSV in Shopify. Shopify replaces the variant ID but doesn't notify Supercycle, so the items lose their link to the original variant.
To re-link the affected items:
Open the **Inventory** tab in Supercycle.
Filter by **Variant** and select **Unlinked**.
Select the items you want to re-link.
Open **Bulk actions**, choose **Update product**, then select the new variant.
# Item actions
Source: https://docs.supercycle.com/documentation/manage/inventory/item-actions
Step-by-step guides for creating, updating, retiring, and managing inventory items
### Create items
You should create inventory inside your Supercycle product, not your Shopify product, as Supercycle is responsible for inventory management after import.
In Shopify Admin, head to **Supercycle** > [**Products**](https://admin.shopify.com/apps/supercycle/products/) > **Product**.
In the variants table, under the status you want to add a product, select the current quantity dropdown followed by **Add inventory**.
On the next page, add a serial number on a new line for each item you'd like to create.
Alternatively, select **Add without serials** and enter a number of items. You can add serials to the newly created items later from their item page.
Click **Review** to continue.
Review the items you're about to add and click **Add inventory** to save your changes.
Always use the provided template (Sample CSV). Exports often contain extra columns that imports ignore.
Every row represents one item. Include these columns:
Column
Purpose
Item
Unique ID for the item (for example, #2001). New ID = new item. Existing ID = update that item.
Variant Shopify ID
Links the item to its Shopify product variant.
SKU
Stock keeping unit. Recommended even if Variant ID is included.
Visibility
Sets whether the item is available or unavailable.
Status
Workflow state, such as processed, unprocessed, or retired.
Optional columns include Condition.
Use a **new Item ID** or **Serial number** and provide the correct Variant Shopify ID and SKU.\
Example:
Keep the **same Item ID** but change values like condition, visibility, or status.\
Example:
The importer cannot delete items. To remove an item from circulation, set:
Visibility = unavailable
Status = retired
Example:
Import the completed CSV into Supercycle. Changes are applied immediately, and the store owner receives an email report showing how many items were added, how many were updated, and any failures.
## Common mistakes
* Leaving **Variant Shopify ID** and **SKU** blank → item cannot be linked.
* Reusing an **Item ID** for a new unit → overwrites instead of creating.
You can create a new item by scanning a serial number with the [Supercycle Scanner](/documentation/manage/scanner/scanner).
If the scanned serial number doesn't already exist in Supercycle, the **Create item** modal opens automatically.
Press **Select a product** to load the full product list. Scroll or search to find the product and variant for the item you've scanned.
Confirm the status for the new item (`Active`, `Draft`, `Retired`, `Sold`).
Press **Create item** to finish adding the new item to your inventory.
After the item is created, Supercycle opens the item details page. From there, you can review and update additional info, such as the pick location.
When you're in a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes) with a Zebra scanner, any unknown serials show as **Unknown tag** rows. You can turn them into items in one step:
The count next to **Create item** shows how many unknown serials will be created.
The same product and status applies to every serial in the batch. The serials are listed read-only so you can confirm what you're creating.
Press **Create items** to create them in one call. The multi-scan list automatically re-resolves the serials, so the rows flip from **Unknown** to **Matched** and become eligible for the other bulk actions.
***
### Make item unavailable
If there’s something wrong with an item and you need to stop future rentals from being placed on it temporarily, you can make it unavailable.
Making an item unavailable won't remove its existing future rentals. You should go through its existing rentals and reassign them if necessary.
Make item unavailable by changing the **Visibility** status to **Draft**.
Change an item's visibility status — `Active`, `Draft`, `Retired`, or `Sold` — from the scanner.
From the item detail screen, tap the status dropdown and pick the new status.
From a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes), press **Visibility** in the bulk action bar, pick the status, and apply — every selected item is updated in one call. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
If you need to make an item permanently unavailable, you should [retire the item](documentation/manage/inventory/items#retire-items).
***
### Update blocked dates
Blocked dates take items, variants, or products out of availability for a specific period. You can change the **From** and **To** sides of those date ranges in bulk from the Blocked dates table.
On the [Blocked dates](https://admin.shopify.com/apps/supercycle/unavailabilities) table, select the rows you want to change, then choose **Update blocked dates** from the **Actions** menu.
In the modal, set a new **From** date, a new **To** date, or both:
* **Set a value** to overwrite that side on every selected row.
* **Leave a field empty** to clear that side on every selected row.
* **Leave both fields empty** to clear both sides.
Each side is applied independently, so you can update one side without affecting the other.
Rental-typed blocked dates are managed from the rental and are skipped by this action.
***
### Delete items
You can delete an item only if it has no [cycles](/documentation/manage/cycles/cycles) on record. Use deletion sparingly — for example, when an item was created by mistake — because all of the item's data is permanently removed (including analytics on stock utilization).
If an item has cycle history, deletion is blocked. Supercycle shows a message such as *"Item #1042 can't be deleted because it has cycles. Retire the item instead."* [Retire the item](/documentation/manage/inventory/item-actions#retire-item) to take it out of circulation while keeping its history.
**Delete items** action from the **Actions** options on the [Inventory](https://admin.shopify.com/apps/supercycle/items) table.
Bulk delete removes only items with no cycles. Items that have cycles are skipped, and the confirmation toast summarizes the result — for example, *"46 items deleted, 4 kept because they have cycles. Retire them instead."* When every selected item can be deleted, the toast shows a plain count such as *"2 items deleted"*.
***
### Retire item
Retiring an item will prevent future rentals from being placed against it. Retiring can be reversed, although if you intend to remove an item from circulation temporarily we recommend making it unavailable instead.
Retire item from the [Visibility](#visibility) field.
Change an item's visibility status — `Active`, `Draft`, `Retired`, or `Sold` — from the scanner.
From the item detail screen, tap the status dropdown and pick the new status.
From a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes), press **Visibility** in the bulk action bar, pick the status, and apply — every selected item is updated in one call. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
***
### Update item condition
Update condition from the [Condition](#condition) field.
**Update condition** action from the **Actions** options on the [Inventory](https://admin.shopify.com/apps/supercycle/items) table.
**Update item condition** action from the **Actions** options on the [Cycles](https://admin.shopify.com/apps/supercycle/cycles) table.
***
### Update item processing state
Update processing state from the [Warehouse](#warehouse) field.
**Update status** action from the **Actions** options on the [Inventory](https://admin.shopify.com/apps/supercycle/items) table.
**Update item status** action from the **Actions** options on the [Cycles](https://admin.shopify.com/apps/supercycle/cycles) table.
***
### Update item warehouse location
Update location from the [Location](#location) field.
**Update location** action from the **Actions** options on the [Inventory](https://admin.shopify.com/apps/supercycle/items) table.
Move items between warehouses directly from the scanner.
From the item detail screen, press the warehouse row to open the warehouse picker, choose the destination, then press **Save changes**.
From a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes), press **Warehouse** in the bulk action bar, pick the destination warehouse, and apply — every selected item is moved in one call. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
***
### Update item tags
Update tags from the [Tags](#tags) field.
Use the [`add_tag`](/ai/operators-mcp/tools#tags) or [`remove_tag`](/ai/operators-mcp/tools#tags) tool with:
* `resource_type` - `item`
* `resource_id` - Item ID (e.g. `#1042`)
* `tag` - Tag title to add or remove
Use the [Update an item](/api-reference/admin/items/update-an-item) endpoint with the `tagsAttributes` parameter.
***
### Update item product
You can reassign one or more items to a different product/variant. This is useful when items have been mis-tagged against the wrong product, when a product has been split or merged in Shopify, or when you want to consolidate items under a single canonical variant.
When you change the variant on an item, the underlying product link is updated automatically — the product is derived from the chosen variant, so you only need to pick the variant. Affected products are re-ingested so their availability and inventory counts stay in sync.
Update the variant from the [Variant](#variant) field on the item's page. The product is updated automatically to match the chosen variant.
**Update product** action from the **Actions** options on the [Inventory](https://admin.shopify.com/apps/supercycle/items) table.
Tick the items you want to reassign in the Inventory table.
Open the **Actions** menu and select **Update product**.
Search for a product in the variant picker and choose the target variant. The modal previews the product image, product title, variant title, and SKU so you can confirm you've selected the right one before saving.
Save to assign that variant to every selected item. The product link on each item is derived from the variant automatically, and the affected products are re-ingested. Your selection is cleared once the update completes.
***
# Item conditions
Source: https://docs.supercycle.com/documentation/manage/inventory/item-conditions
Create condition grades to log and track the current state of each inventory item
In Supercycle, you can log an individual item's condition (and change it over time). These conditions are internal-facing and not displayed to the customer.
## Creating conditions
You can create as many conditions as you need, which are categorized under 4 condition severities.
In Shopify Admin, head to **Supercycle** > **Settings** > [**Item conditions**](https://admin.shopify.com/apps/supercycle/settings/item-conditions).
Click **Add condition** and set its name.
Condition severities are used by Supercycle to trigger customizable actions.
#### Update item condition
Update condition from the [Item](/documentation/manage/inventory/items#condition).
**Update condition** action from the **Actions** options on the [Inventory](https://admin.shopify.com/apps/supercycle/items) table.
**Update item condition** action from the **Actions** options on the [Cycles](https://admin.shopify.com/apps/supercycle/cycles) table.
# Items overview
Source: https://docs.supercycle.com/documentation/manage/inventory/items
Manage the individual physical items that make up your rental inventory
Supercycle handles your inventory, tracking individual items, often called serials.
This allows items have their own status, condition and event history.
This serialization is important in circular models because:
* You need to know that the correct item has been despatched to and received back from a customer.
* You’re able to record exactly what’s happened to an item over its lifetime.
* You can temporarily take individual items out of circulation (i.e. for damage) understanding the impact on cycles.
* If you have consignment inventory, you need to attribute revenue to the correct consignor.
Items are accessed from [Inventory](https://admin.shopify.com/apps/supercycle/items)
***
#### Rentals
The rentals that have been made on this item.
#### Visibility
An item is only available when set to `Active` and not already assigned to a cycle.
| Status | Description | Available |
| --------- | ------------------------------------------------ | ---------------------------- |
| `Draft` | An item not yet available. | |
| `Active` | An item available to customers. | |
| `Retired` | An item no longer suitable for rental or resale. | |
| `Sold` | An item now sold. | |
#### Pick location
The warehouse pick location code of the item. This is used to determine the location of the item when it is picked.
#### Processing status
This shows whether an item is currently `Ready` or `Not ready` to be sent a customer.
Items are automatically set to `Not ready` following a return from a cycle.
The item status on an item does not affect the availability of the item.
| Status | Description | Available |
| ----------- | --------------------------------------------------------- | ---------------------------- |
| `Ready` | An item that can go to a customer. | |
| `Not ready` | An item that needs processing before going to a customer. | |
***
#### Condition
The following conditions are available by default after installing Supercycle.
The condition status on an item does not affect the availability of the item.
| Status | Description | Available |
| ------------------------ | ------------------------------------------------------ | ---------------------------- |
| `Unused` | An item returned without being used. | |
| `Used` | An item returned that has been used. | |
| `Damaged (Repairable)` | An item returned with damage that can be repaired. | |
| `Damaged (Unrepairable)` | An item returned with damage that can not be repaired. | |
You can [add](/documentation/manage/inventory/item-conditions), [delete](/documentation/manage/inventory/item-conditions) or [edit conditions](/documentation/manage/inventory/item-conditions).
***
#### Methods
The methods enabled for this item. Here you can enable or disable the methods that are available for this item.
***
#### Location
The warehouse or store location of the item.
If the location doesn't show, you will need to [add the location](/documentation/configuration/logistics/locations).
***
#### Custom fields
The custom fields that have been added to the item.
***
#### Product
The product and specific variant the item is associated with.
***
#### Serial
The unique number you have given the item to identify it.
Typically this matches a physical tag attached to the item that can be scanned.
***
#### Tags
Freeform tags added to the item.
***
## Item FAQs
Currently, we only factor the items we have a record of into availability. If you want un-restrictive availability on the frontend you'll need to add a high quantity of items.
# Schedule
Source: https://docs.supercycle.com/documentation/manage/inventory/schedule
See how each variant is booked across a date range, including buffers and blocked dates
The Schedule shows how each variant is booked day by day. Use it to spot gaps, conflicts, and booked-out periods without opening individual items or cycles.
Each row is a variant. Each column is a day in the visible window. The bar in a cell shows how many of that variant's items are taken that day:
| Legend | Meaning |
| -------------- | ------------------------------------------------------------------------- |
| **Booked** | Items reserved by a cycle on that day. |
| **Buffer** | Items held for preparation or restock turnaround around a cycle or block. |
| **Booked out** | No items left available that day. |
Hover a day for a quick count (`3 of 5 available`, or `Booked out`). Click the day to open the unavailabilities behind the count: cycles, [blocked dates](/documentation/manage/inventory/blocked-dates), and their buffers, with links through to the cycle or blocked dates list.
## Open the Schedule
In Shopify Admin, head to **Supercycle** > [Inventory](https://admin.shopify.com/apps/supercycle/items).
Click **Schedule** (it sits next to **Blocked dates**).
You can also open it directly at [Schedule](https://admin.shopify.com/apps/supercycle/schedule).
## Change the date window
By default the grid shows about a month, starting two days before today. Use the date range control in the page header to jump to **Next 30 days**, **Next 60 days**, or **Next 90 days**, or pick a custom range. Use the previous/next pagination in the header to shift the window by its current length.
## Filter and search
Search variants by product title, variant title, or SKU.
| Filter | What it does |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Cycle dates** | Highlight a proposed rental period on the grid. Optionally filter to variants that are **Available** or **Unavailable** for those dates. Leave the end date empty for an open-ended cycle, such as a subscription. |
| **Delivery method** | Shipping or pick up. Pads the schedule with that method's preparation and delivery buffers. Defaults to your shop's usual delivery method. |
| **Return method** | Shipping or drop off. Pads the schedule with that method's return and restock buffers. Defaults to your shop's usual return method. |
When cycle dates are set, each row shows a **bookable** badge (`2/5 bookable`) instead of the plain item count. Green means at least one item can take the dates with the selected methods. A warning badge means nothing fits those methods, but the dates would fit with pick up and drop off instead.
Sort the list by product title A to Z or Z to A.
## Send feedback
While Schedule is in beta, use **Send feedback** in the page header to tell us what's working, what's missing, or what's confusing. Feedback goes straight to the product team.
## Related documentation
* [Blocked dates](/documentation/manage/inventory/blocked-dates) — mark products, variants, items, or the whole store unavailable
* [Logistics buffers](/documentation/configuration/logistics/buffers) — how preparation and restock windows affect availability
* [Items overview](/documentation/manage/inventory/items) — manage individual serialized items
# Serializing items
Source: https://docs.supercycle.com/documentation/manage/inventory/serializing-items
How and why to track items with unique serial numbers
Serialising items means giving each product a unique identifier, a digital fingerprint.
This transforms your inventory from generic stock into a traceable network of assets you can measure, automate, and monetise.
***
## Benefits of serializing items
* **Item-level reporting** such as item utilisation, lifecycle, and revenue attribution.
* **Consignment tracking** for accurate payouts and settlements on consigned stock.
* **Operational speed and accuracy** by quickly scanning items without the need to search or touch the app admin.
* **Automated workflows** can be triggered to update item status, send reminders, or prompt actions based on specific item data.
***
## Supported tag types
Supercycle supports **QR codes**, **barcodes**, and **RFID tags**, depending on your scale and use case.
***
### QR codes
QR codes are 2D scannable codes readable by smartphones and tablets.
| **Advantages** | **Limitations** |
| ------------------------------------------------- | ------------------------------------------------ |
| Simple and inexpensive to produce. | Slower for large-scale scanning. |
| Can be scanned using any camera or mobile device. | Requires line-of-sight and clean label surfaces. |
| Can encode more data than a traditional barcode. | Can degrade with abrasion or moisture. |
QR codes are well suited to industries where staff scan items with phones rather than warehouse hardware.
* Fashion rental and resale
* Consumer electronics rental
* Baby gear and lifestyle equipment rental
#### Recommended setup
* Print on standard adhesive or vinyl labels.
* Works with consumer-grade thermal or inkjet printers.
* For label printing: [Avery Weatherproof QR Code Labels](https://www.avery.com/products/labels/5523)
* For thermal printers: [Zebra ZD421](https://www.zebra.com/us/en/products/printers/desktop/zd421.html)
* For apparel labels: [Dutch Label Shop](https://www.dutchlabelshop.com/)
***
### Barcodes
Barcodes are one-dimensional codes and widely used in retail and logistics. They can be scanned using standard barcode scanners or compatible mobile devices.
| **Advantages** | **Limitations** |
| ------------------------------------------------------ | --------------------------------------------------------- |
| Fast scanning speed, especially for bulk handling. | Requires dedicated scanner hardware for best performance. |
| Compatible with existing retail and warehouse systems. | Can only encode a small amount of data. |
| Integrates easily with POS and logistics software. | Must be aligned and visible to be scanned. |
Bluetooth barcode scanners can also be used directly in the Supercycle admin in any search field.
Barcodes are best suited to high-throughput or hardware-driven operations where dedicated scanners are already in use.
#### Recommended setup
* Use **thermal transfer** or **direct thermal** label printers.
* Choose **polypropylene or vinyl** labels for durability.
* For printer hardware: [Zebra ZT230](https://www.zebra.com/us/en/products/printers/industrial/zt230.html)
* For labels: [Avery Durable Barcode Labels](https://www.avery.com/products/labels/61525)
***
### RFID tags
RFID (radio frequency identification) tags use embedded chips to transmit data wirelessly. They can be scanned in bulk, even without direct line-of-sight.
This is our recommended route for most merchants where scale is a key consideration.
| **Advantages** | **Limitations** |
| -------------------------------------------------------- | ------------------------------------------------ |
| Enables instant bulk scanning of many items at once. | Higher setup cost (readers, tags, and printers). |
| Works through packaging and without visual contact. | Requires compatible RFID readers and printers. |
| Extremely durable and ideal for industrial environments. | More complex setup and integration process. |
RFID is best suited to high-volume environments that require automation, rapid throughput or full asset traceability.
#### Recommended setup
* Use UHF RFID tags for long-range scanning (3–10 meters).
* For printers: [Zebra ZT411 RFID Printer](https://www.zebra.com/us/en/products/printers/industrial/zt411.html)
* For readers: [Impinj R700 RFID Reader](https://www.impinj.com/products/readers/impinj-r700)
* For tags: [Omni-ID IQ 600 RFID Label](https://www.omni-id.com/products/iq-600/)
***
## Adding serials
To add a serial, you'll first need to create an item, then add a unique serial number to that item.
### Create items
You should create inventory inside your Supercycle product, not your Shopify product, as Supercycle is responsible for inventory management after import.
In Shopify Admin, head to **Supercycle** > [**Products**](https://admin.shopify.com/apps/supercycle/products/) > **Product**.
In the variants table, under the status you want to add a product, select the current quantity dropdown followed by **Add inventory**.
On the next page, add a serial number on a new line for each item you'd like to create.
Alternatively, select **Add without serials** and enter a number of items. You can add serials to the newly created items later from their item page.
Click **Review** to continue.
Review the items you're about to add and click **Add inventory** to save your changes.
Always use the provided template (Sample CSV). Exports often contain extra columns that imports ignore.
Every row represents one item. Include these columns:
Column
Purpose
Item
Unique ID for the item (for example, #2001). New ID = new item. Existing ID = update that item.
Variant Shopify ID
Links the item to its Shopify product variant.
SKU
Stock keeping unit. Recommended even if Variant ID is included.
Visibility
Sets whether the item is available or unavailable.
Status
Workflow state, such as processed, unprocessed, or retired.
Optional columns include Condition.
Use a **new Item ID** or **Serial number** and provide the correct Variant Shopify ID and SKU.\
Example:
Keep the **same Item ID** but change values like condition, visibility, or status.\
Example:
The importer cannot delete items. To remove an item from circulation, set:
Visibility = unavailable
Status = retired
Example:
Import the completed CSV into Supercycle. Changes are applied immediately, and the store owner receives an email report showing how many items were added, how many were updated, and any failures.
## Common mistakes
* Leaving **Variant Shopify ID** and **SKU** blank → item cannot be linked.
* Reusing an **Item ID** for a new unit → overwrites instead of creating.
You can create a new item by scanning a serial number with the [Supercycle Scanner](/documentation/manage/scanner/scanner).
If the scanned serial number doesn't already exist in Supercycle, the **Create item** modal opens automatically.
Press **Select a product** to load the full product list. Scroll or search to find the product and variant for the item you've scanned.
Confirm the status for the new item (`Active`, `Draft`, `Retired`, `Sold`).
Press **Create item** to finish adding the new item to your inventory.
After the item is created, Supercycle opens the item details page. From there, you can review and update additional info, such as the pick location.
When you're in a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes) with a Zebra scanner, any unknown serials show as **Unknown tag** rows. You can turn them into items in one step:
The count next to **Create item** shows how many unknown serials will be created.
The same product and status applies to every serial in the batch. The serials are listed read-only so you can confirm what you're creating.
Press **Create items** to create them in one call. The multi-scan list automatically re-resolves the serials, so the rows flip from **Unknown** to **Matched** and become eligible for the other bulk actions.
***
### Create serials
To create a serial, you can either generate your own unique code and program it onto a tag, or use pre-coded tags with unique IDs and assign those to items in Supercycle.
In progess.
In progress.
In progress.
# Managing add-ons
Source: https://docs.supercycle.com/documentation/manage/products/add-ons
Offer optional or required extras alongside your rental products
Add-ons are extras a customer can attach to a rental at checkout — things like damage protection, cleaning services, or an accessory bundle. Supercycle owns the add-on product in your Shopify store: you configure each add-on and its prices inside Supercycle, and every price is kept in sync as a variant on the underlying hidden Shopify product.
When a customer adds a rental to their cart, any add-ons applied to the selected option appear on the product page. Required add-ons are always attached; optional add-ons are toggled by the customer. The chosen add-on variants are added to the cart alongside the rental line item and are recorded against the fulfilled rental so they show on the order and any related charges.
## Creating an add-on
Add-ons are configured under **Products** > **Add-ons**. Supercycle creates and maintains the Shopify product for you.
In your Shopify admin, navigate to **Supercycle** > **Products** > **Add-ons**.
Click **Create add-on** and give it:
* **Name** — shown on the product page selector and on line item properties (e.g. `Damage protection`).
* **Description** — shown to customers underneath the add-on name on the product page. HTML is supported.
* **Prices** — one or more amounts customers can pick from. Each price becomes a variant on the underlying Shopify product.
Add-ons need at least one price before they can be saved.
Supercycle creates a hidden Shopify product with a `Price` option axis, one variant per price. Inventory tracking is disabled automatically so add-ons are not treated as stock. You can edit the name, description, or prices at any time — changes are synced to Shopify and to every option the add-on is applied to.
## Applying add-ons to a method option
Once an add-on exists, you can attach it to any Calendar, Membership, Subscription, or Resale option.
In the options table for a method, open the option you want to attach the add-on to.
Toggle the **Add-ons** section on and tick the add-ons you want to offer.
For each ticked add-on:
* **Price** — pick one of the add-on's prices. You can also type a new amount and choose **Create price** to add it to the add-on inline — the new variant is created, synced to Shopify, and selected for the option once it's ready.
* **Requirement** — set to **Optional** (customer chooses whether to add it) or **Required** (always attached, not togglable on the storefront).
Only one price per add-on can be applied to a given option. If you need to offer the same add-on at multiple prices on the same option, create separate add-ons.
### Bulk-applying add-ons
To apply the same add-ons across many options at once, open the options table for a method, tick the options you want to update, and choose **Apply add-ons** from the [bulk actions menu](/documentation/manage/products/managing-method-options).
The set you pick in the modal **replaces** each selected option's current add-ons wholesale. Leave everything unchecked and save to remove all add-ons from the selected options.
## On the storefront
Add-ons applied to the selected option appear underneath the option selector on the product page:
* **Required** add-ons are shown checked and locked, with a **Required** badge next to the title.
* **Optional** add-ons can be toggled by the customer.
Selected add-on variants are added to the cart alongside the rental. If a customer removes an add-on that is required, they cannot check out the rental.
## On Shopify POS
When staff apply a rental method on [POS](/documentation/point-of-sale/pos-overview#add-ons-on-pos-rentals), add-ons on that option are added to the cart with the rental line, including required add-ons such as deposits or card authorisation. Behaviour matches the storefront, including quantity caps shared across lines in the same cart.
## On rentals and charges
Once an order is processed:
* Each attached add-on is recorded against the fulfilled rental, frozen at the title and price it was sold at.
* Add-ons appear on the rental detail page and are included in the rental's charges so they flow through to reporting and payouts.
* A rental line item that spans multiple cycles (e.g. a subscription renewal) only receives as many add-on records as were actually purchased on the underlying line item.
## Deleting an add-on
Deleting an add-on removes it from every option it was applied to and removes the underlying hidden Shopify product. Existing rentals keep their historical add-on records because those are stored independently of the add-on product.
# Bundles
Source: https://docs.supercycle.com/documentation/manage/products/bundles
Group multiple products into a single rentable bundle
Bundles let you group multiple products into a single rentable item, so customers can rent a set of components (for example a suit made up of a jacket, trousers, and waistcoat) as one product.
Bundles require development work to build a custom storefront experience using the Storefront API. See [Create rental bundles](/developers/bundles) for the full implementation guide.
Bundles are available on request. Contact your Supercycle account manager to enable the feature for your store.
## How bundles work
A bundle is a parent product made up of one or more component products. Each component keeps its own methods, options, and inventory — the bundle simply groups them so they can be rented together.
When a customer rents a bundle:
* Each component is added to the cart as its own line item with the correct Supercycle attributes.
* Availability is checked across all components for the selected dates.
* The customer selects an option (for example a rental period) for each component.
## Set up a bundle
In your Supercycle dashboard, go to **Products** and select **Bundles**.
Click **Create bundle** and give it a name.
Add each product that makes up the bundle. Before adding a component, make sure it has the relevant methods enabled in Supercycle — the methods configured on each component determine which options are available at checkout.
Save the bundle. Supercycle will tag the parent product as `Supercycle bundle product` and each component with `Bundle component: `, and attach the `supercycle.bundle` metafield to the parent.
## Build the storefront experience
Bundles do not render automatically on the storefront. A developer needs to build the frontend experience using the [Storefront API](/api-reference/storefront/intent) to:
* Read the bundle metafield and component configurations.
* Check availability for all components.
* Create an intent for each component.
* Add every component to the cart in a single request.
See [Create rental bundles](/developers/bundles) for the full developer guide, including code examples for Liquid, the availability check, intent creation, and cart integration.
# Managing method options
Source: https://docs.supercycle.com/documentation/manage/products/managing-method-options
You can manage method pricing options in bulk
Method options control how each rental method is priced and offered on a product. Once you have a lot of options across many products, Supercycle gives you tools to update them in bulk rather than editing one product at a time.
## Bulk actions
Open the options table for any method (Calendar, Membership, Subscription, or Resale), tick the options you want to update, and choose an action from the bulk menu.
Update the name shown on the product page selector and on line item properties. Liquid is supported, so you can reference option fields like `{{ resale_option.product.title }}`.
Enable or disable options in bulk. Disabled options are hidden from the storefront but preserved in your data so you can re-enable them later.
Recalculate prices using a Liquid formula (see below). Useful for percentage-based price changes, currency adjustments, or recalculating against the variant price.
Target the selected options at specific Shopify [markets](/documentation/manage/products/multi-market-pricing). Leave the market selection empty to apply to **all markets**.
Resale only. Target the selected options at specific item conditions (new, good, fair, poor) or all conditions.
Require [identity verification](/documentation/configuration/risk/identity-verification) on the selected options. Customers checking out with these options will be prompted to verify their identity before fulfilment. Only available when identity verification is enabled on your store.
Attach one or more [add-ons](/documentation/manage/products/add-ons) to the selected options. The set you pick replaces each option's current add-ons wholesale — leave everything unchecked to remove all add-ons from the selected options.
Attach one or more [contract templates](/documentation/configuration/risk/esignatures) to the selected options. Customers will be required to sign the templates after checkout. Leave the template selection empty to remove all contract templates from the selected options. Only available when e-signatures are enabled and at least one contract template exists.
Remove the selected options. This is destructive and cannot be undone.
## Using formulas to update method options
You can use formulas to update method options in bulk. This is useful when you want to apply a consistent change across multiple options, such as increasing prices by a certain percentage.
#### Liquid references for method options
The product associated with the option
The title of the product
The title of the variant
The price of the variant in cents
The name of the option
How the option applies to variants. Either `"all"` (applies to all variants) or `"some"` (applies only to specific variants).
Array of Shopify variant IDs this option applies to. Only relevant when `variant_application_type` is `"some"`.
How the option applies to markets. Either `"all"` (available in all markets) or `"some"` (available only in specific markets).
Array of Shopify market IDs this option is available in. Only relevant when `market_application_type` is `"some"`.
How the option applies to item conditions. Either `"all"` (applies to all conditions) or `"some"` (applies only to specific conditions).
Array of item condition values this option applies to (for example, `["new", "good"]`). Only relevant when `condition_application_type` is `"some"`.
The checkout price of the option in cents
The product associated with the option
The title of the product
The title of the variant
The price of the variant in cents
The name of the option
How the option applies to variants. Either `"all"` (applies to all variants) or `"some"` (applies only to specific variants).
Array of Shopify variant IDs this option applies to. Only relevant when `variant_application_type` is `"some"`.
How the option applies to markets. Either `"all"` (available in all markets) or `"some"` (available only in specific markets).
Array of Shopify market IDs this option is available in. Only relevant when `market_application_type` is `"some"`.
How the option applies to item conditions. Either `"all"` (applies to all conditions) or `"some"` (applies only to specific conditions).
Array of item condition values this option applies to (for example, `["new", "good"]`). Only relevant when `condition_application_type` is `"some"`.
The product associated with the option
The title of the product
The title of the variant
The price of the variant in cents
The name of the option
How the option applies to variants. Either `"all"` (applies to all variants) or `"some"` (applies only to specific variants).
Array of Shopify variant IDs this option applies to. Only relevant when `variant_application_type` is `"some"`.
How the option applies to markets. Either `"all"` (available in all markets) or `"some"` (available only in specific markets).
Array of Shopify market IDs this option is available in. Only relevant when `market_application_type` is `"some"`.
How the option applies to item conditions. Either `"all"` (applies to all conditions) or `"some"` (applies only to specific conditions).
Array of item condition values this option applies to (for example, `["new", "good"]`). Only relevant when `condition_application_type` is `"some"`.
The product associated with the option
The title of the product
The title of the variant
The price of the variant in cents
The name of the option
How the option applies to variants. Either `"all"` (applies to all variants) or `"some"` (applies only to specific variants).
Array of Shopify variant IDs this option applies to. Only relevant when `variant_application_type` is `"some"`.
How the option applies to markets. Either `"all"` (available in all markets) or `"some"` (available only in specific markets).
Array of Shopify market IDs this option is available in. Only relevant when `market_application_type` is `"some"`.
How the option applies to item conditions. Either `"all"` (applies to all conditions) or `"some"` (applies only to specific conditions).
Array of item condition values this option applies to (for example, `["new", "good"]`). Only relevant when `condition_application_type` is `"some"`.
The number of days for the calendar option
The checkout price of the option in cents
More information on using Liquid can be found [on Shopify's developer documentation](https://shopify.dev/docs/api/liquid).
## Targeting options across markets, variants, and conditions
Each option can be scoped so it only appears in certain contexts on the storefront:
* **[Markets](/documentation/manage/products/multi-market-pricing)** — show the option only in selected Shopify markets (e.g. region- or currency-specific pricing).
* **Variants** — apply to all variants or only a subset (e.g. one storage size on an electronics product).
* **Conditions** — resale only. Apply to all item conditions or only a subset (e.g. new vs. refurbished).
These filters combine: an option applies on the storefront when the current market, variant, and condition all match. Use this to model multi-market, multi-variant pricing matrices without duplicating products.
# Multi-market pricing
Source: https://docs.supercycle.com/documentation/manage/products/multi-market-pricing
Set different method options and prices per Shopify market
If you sell across multiple Shopify [markets](https://help.shopify.com/manual/markets) (for example different countries, currencies, or B2B vs DTC storefronts), you can target method options to specific markets. This lets you offer different pricing, durations, conditions, or even entirely different rental methods depending on where the customer is shopping from.
Multi-market pricing is available on a feature flag. If you don't see the **Apply to specific markets** option, contact your Supercycle account manager to enable it.
## How market targeting works
Every method option (calendar, membership, subscription, and resale) has a market application setting:
* **All markets** — the option is shown to customers in every market. This is the default.
* **Specific markets** — the option only appears in the markets you select.
When a customer visits your storefront, Supercycle filters the available options based on their current market. Options that aren't applied to that market are hidden from the product page, cart, and checkout.
Markets are synced automatically from Shopify. If you add, rename, or remove a market in Shopify, Supercycle reflects the change within a few minutes via webhook.
## When to use multi-market pricing
Common scenarios:
* **Different prices per region** — charge €50/month in the EU and £45/month in the UK for the same subscription.
* **Currency-specific options** — create one option per currency rather than relying on Shopify's automatic conversion.
* **Region-specific availability** — only offer resale or membership in markets where you have fulfillment.
* **B2B vs DTC pricing** — if you've set up a B2B market in Shopify, target wholesale-priced options to that market only.
* **Pilot launches** — roll out a new method or price to one market before going global.
## Apply an option to specific markets
You can set the market application when [creating or editing any method option](/documentation/manage/products/managing-method-options).
In your Shopify admin, navigate to **Supercycle** > **Products**, select a product, and open the method (Calendar, Membership, Subscription, or Resale).
Click an existing option or **Add option**.
In the option modal, find the **Apply to specific markets** section and toggle it on.
Tick each market the option should apply to. Leave all unchecked (or toggle off) to apply to every market.
Click **Save**. The option is now only visible to shoppers in the selected markets.
## Apply many options to markets in bulk
If you've duplicated options across markets, or need to retarget many at once, use the bulk action on the options table.
Navigate to the method's **Options** tab on a product, or open the bulk options view from any method.
Tick the options you want to update.
From the bulk actions menu, select **Apply to markets**.
Select the markets to apply the options to. Leaving the selection empty applies them to all markets.
See [Managing method options](/documentation/manage/products/managing-method-options) for other bulk actions.
## Duplicating options across markets
A common pattern is creating a "base" option, then duplicating it for each market with adjusted pricing:
1. Create one option targeting market A with the local price and currency.
2. Create a second option targeting market B with that market's price.
3. Repeat for every market you sell in.
Each option appears only to its target market, so customers see a single, correctly-priced option on the storefront.
When using [Liquid formulas to update options in bulk](/documentation/manage/products/managing-method-options), you can combine market filters with price formulas to recalculate prices per market in one operation.
## Storefront behavior
Supercycle automatically filters options based on the customer's active market. You don't need to add any code to your theme — option filtering happens at render time using the same logic across:
* Product pages and method app blocks
* Cart and checkout
* Membership plan blocks
* Availability search
If a product has no options applicable to the current market, the rental method will not be available on the storefront for that market.
## FAQs
The feature is gated. It will only appear if your shop has the `applyToMarkets` feature enabled and at least one Shopify market synced. Contact Supercycle support to enable the feature.
The method will not display on the storefront for that market. Make sure each market you sell in has at least one applicable option per active method.
Existing options set to **All markets** automatically apply to the new market. Options targeted at **Specific markets** will not include the new market until you edit them and tick it.
Yes — open any option to view its market application. You can also filter the options table by market to audit coverage.
Yes. Each option exposes `market_application_type` (`all` or `some`) and `market_application_shopify_ids` (an array of Shopify market IDs). The Storefront API filters options by the requesting market automatically.
# Product actions
Source: https://docs.supercycle.com/documentation/manage/products/product-actions
Updating products and method pricing options
### Add a product
In Shopify Admin, head to [**Products**](https://admin.shopify.com/store/products/).
In the products table, **select the products** you want to import, **more actions** and then **Include in Supercycle** .
Products imported will have inventory set to 'Inventory not tracked' within Shopify and Supercycle will take over inventory management.
Review the products you are about to import and confirm by clicking **Import**.
### Bulk update method options
In your Shopify admin, go to **Supercycle** > **Products**.
Select the products you want to update method options for.
Click the **•••** menu and select **Bulk update options**.
Select the rental method (Calendar, Membership, Subscription, or Resale) you want to create or update options for.
Download the CSV template to see the required format and fields.
Complete the CSV with your option details. You can use Liquid templating for dynamic values.
Upload your completed CSV file and click **Import** to create or update the options.
You can also use [Liquid formulas](/documentation/manage/products/managing-method-options) to update existing options in bulk without CSV import. This is useful for applying consistent changes like price increases across multiple options.
# Products overview
Source: https://docs.supercycle.com/documentation/manage/products/products
Import and manage products available with circular methods
Products are [added in Shopify](https://help.shopify.com/en/manual/products/add-update-products) and then imported into Supercycle to manage circular methods.
Products are accessed from [Products](https://admin.shopify.com/apps/supercycle/products)
***
#### Availability
A heatmap view at the availability of the product across all variants over the next 8 months.
***
#### Inventory
Number of items `Available` and `Unavailable` for each variant.
***
#### Methods
Add and manage [Methods](/documentation/overview/methods) for the product.
Each method's options can be targeted to specific [Shopify markets](/documentation/manage/products/multi-market-pricing), variants, and (for resale) item conditions, so you can model multi-market and multi-region pricing without duplicating products.
***
## Products FAQs
Shopify Bundles is not compatible with Supercycle, but Supercycle has its own [Bundles](/documentation/manage/products/bundles) feature that lets you group products into a single rentable item. Bundles require development work to build a custom storefront experience.
# Return actions
Source: https://docs.supercycle.com/documentation/manage/returns/return-actions
Step-by-step guides for creating, receiving, and processing returned items
### Create a return
A customer can initiate a return from their rental portal.
In the rental portal, the customer should click **Return items**. This button may have different text depending on your [Language](/documentation/online-store/languages) settings.
On the next page, the customer can select the items they'd like to return. Then select **Request return**
You can create a return on behalf of a customer, either proactively or if you receive items back where the customer has not created the return.
In Shopify Admin, head to **Supercycle** > [**Customers**](https://admin.shopify.com/apps/supercycle/customers) > **Customer**.
On the customer page, under **Active rentals** click the **Create return** button.
Click **Browse**, Add any items from the list of the customers' active rentals, click **select,** and click **Save**.
You can create a return directly from a cycle.
In Shopify Admin, head to **Supercycle** > [**Cycles**](https://admin.shopify.com/apps/supercycle/cycles) > **Cycle**.
On the cycle page, click the **Create return** button.
Click **Browse**, add any items from the cycle, click **select,** and click **Save**.
Use this shortcut when the customer has already returned the items physically (for example via their own label or an in-store drop-off) and you just need to record receival. It creates the return and marks the items as received in a single step, and skips the **Return requested** email so the customer isn't asked to send items they've already handed back.
In Shopify Admin, head to **Supercycle** > [**Cycles**](https://admin.shopify.com/apps/supercycle/cycles) > **Cycle**.
On the cycle's inbound card, click the **Mark as received** button next to **Create return**.
This option only appears on fulfilled cycles that don't already have a return.
Pick the date the items were received and confirm. The return is created and the rentals are marked as received in one action.
You can create a return by scanning items with the [Supercycle Scanner](/documentation/manage/scanner/scanner).
If the scanned serial number belongs to a rental that doesn't already have an associated return, the rental modal opens automatically.
Press **Create return & receive** — this creates a return and marks the rental as received in one step.
From a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes), press **Receive return** in the bulk action bar. Any selected item that's on an active cycle gets a return created and is marked received in one step. Items already on a return, or not on a cycle, are skipped. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
Use the [`create_return`](/ai/operators-mcp/tools#returns) tool with:
* `customer_id` - Customer email or Shopify ID
* `rental_ids` - Array of rental IDs (e.g. `['SC-1042', 'SC-1043']`)
* `return_method_type` - Optional: `collection` or `return_label`
Use the [Create a return](/api-reference/admin/returnorders/create-a-return) endpoint.
***
### Receive a return
Click **Receive items** . You can then select which items to be marked as recieved.
If an item was added to a return by mistake, you can **Edit** the return, removing it to be added to a customer's future returns.
If the customer has already returned the items physically and no return exists yet, you can record receival directly from the cycle without creating the return first.
On the cycle's inbound card, click **Mark as received** next to **Create return**, pick the received date, and confirm. Supercycle creates the return and marks the items as received in a single step, and skips the **Return requested** customer email.
This shortcut is only available on fulfilled cycles that don't yet have a return. Once a return exists, use **From a Return** above (or **Mark as received** from the cycle's inbound card actions menu) instead.
Items are automatically marked as received on a return when you create a return from the scanner app. You can also mark items as received manually:
Open a single-scan match and mark the item received from the item detail screen.
Open the return in the scanner app and mark items received from the returns screen.
Scan a batch of items with a Zebra scanner and press **Receive return** in the bulk action bar. Any selected item that's on an active cycle gets a return created and marked received in one step. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
Use the [`update_return`](/ai/operators-mcp/tools#returns) tool with:
* `id` - Return ID (e.g. `#2001`)
* `return_lines` - Array of `{ id, status }` where status is `awaiting`, `received`, or `missing`
Use the [Update a return](/api-reference/admin/returnorders/update-a-return) endpoint.
***
### Recredit membership items
You can automatically recredit returns from changing settings in **Supercycle** > **Settings** > [Membership rental](https://admin.shopify.com/apps/supercycle/settings/membership).
***
### Item ready
When an [Item](/documentation/manage/inventory/items) is received from a Return, the processing status is set to `Not Ready` as you’ll typically need to process it (clean, refurbish, etc.) before it’s `Ready` to go out on its next rental.
The process of marking that Item as `Ready` is often called restocking.
Update processing state from the [Warehouse](/documentation/manage/inventory/items/#warehouse) field on the Item.
**Update status** action from the **Actions** options on the [Inventory](https://admin.shopify.com/apps/supercycle/items) table.
**Update item status** action from the **Actions** options on the [Cycles](https://admin.shopify.com/apps/supercycle/cycles) table.
# Returns overview
Source: https://docs.supercycle.com/documentation/manage/returns/returns
Receive and process returned items from customers
Returns can be initiated by the customer through the **customer portal** or manually from the **Returns** section in the Supercycle admin.
A single return can include multiple items across different rentals.
***
## Return statuses
A **return status** shows the overall stage of a return. This status updates automatically as you or the customer take actions.
| Return status | Description |
| ------------- | ---------------------------------------------------------------------------- |
| `Requested` | The customer has asked to return items and is awaiting approval if required. |
| `Expected` | The return has been approved, and you’re waiting to receive items. |
| `In progress` | Some items have been received, but not all. |
| `Received` | All items in the return have been received. |
| `Completed` | The return is fully processed — items received, deposits or credits handled. |
| `Cancelled` | The return has been cancelled. |
***
## Receival status
A **receival status** summarizes how many items in the return have been received. It’s automatically derived from the return line statuses.
| Receival status | Description |
| -------------------- | -------------------------------------------- |
| `Unreceived` | No items in the return have been received. |
| `Partially received` | Some items in the return have been received. |
| `Received` | All items in the return have been received. |
***
## Return methods
A **return method** defines how the customer is returning their items.\
You can configure which return methods are available in **Supercycle > Settings > Customer accounts**.
### Collection
The **collection** method allows customers to schedule a home pickup for their return.\
It includes the customer’s address and a chosen collection date.
### Return label
The **return label** method provides a shipping label the customer can use to send items back.\
Tracking details and courier information are shown once the label is created.
### Customer portal view
This is how return methods appear to customers in the portal.\
They choose a method, enter any required details, and confirm the return.
### Admin view
Once a customer submits a return, you can review and manage it from **Supercycle > Returns > \[Return ID]**.\
This view lets you confirm collection details, update item statuses, and mark items as received.
In the admin view:
**Confirm collection details**: approve or verify the address and collection date provided by the customer.\
**Receive items**: mark items as received once they arrive, updating both the return line and overall receival statuses automatically.
***
## Return FAQs
Returns in Supercycle are currently separate from Shopify’s native return system.
Yes. If multiple return methods are enabled, customers can select one when starting a return in the portal.
# Scanner overview
Source: https://docs.supercycle.com/documentation/manage/scanner/scanner
Manage items from the Supercycle Scanner app.
The Supercycle Scanner app streamlines inventory management by enabling you to quickly scan items, update records, and manage rental operations directly from your mobile device. Use the app to handle item intake, process returns, update warehouse locations, and manage rental assignments on the go.
Download on the Apple App Store.
Download on Google Play Store.
Key functionalities include:
* **Item creation**: Scan to create new items, assigning to the connected product/variant. Create one item at a time, or many in bulk from a multi-scan session.
* **Return processing**: Mark items as received when they arrive back from rentals, individually or in bulk.
* **Location management**: Update warehouse and pick locations by scanning item and location IDs.
* **Rental assignment**: Change which item is assigned to active rentals.
* **Bulk actions**: Apply visibility, warehouse, pick location, and return changes to many items in one pass.
## Scanner types
The app supports three scanner inputs, each independently enabled from **Settings → Scanners**. The **Scan** tab shows one button per enabled scanner.
| Scanner | Description | Requirements |
| ------------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| **Camera** | Scan one barcode or QR code at a time with the device camera. | Works on any device. On by default. |
| **Zebra barcode scanner** | Scan items one after another with an attached Zebra barcode scanner, with bulk actions across the session. | Zebra Android device (e.g. EM45). |
| **Zebra RFID** | Read many RFID tags at once using the built-in or attached reader. | Zebra Android device with RFID reader. |
The Zebra scanners automatically configure DataWedge — no additional setup is required.
## Supported code types
| Type | Formats |
| --------------- | -------------------------------------------------------------------------------------------------- |
| **1D barcodes** | Code 128, Code 39, Code 93, Codabar, EAN-13, EAN-8, Interleaved 2 of 5 (ITF), ITF-14, UPC-A, UPC-E |
| **2D barcodes** | QR Code, Data Matrix, PDF417, Aztec |
| **RFID** | UHF RFID tags via Zebra handheld devices (Android only). |
## Scan modes
The scanner has two modes, chosen by which scanner you start a session with:
* **Single scan** (camera): one tag at a time. The app immediately opens the matching item, rental, or return — or the **Create item** flow for an unknown tag.
* **Multi scan** (Zebra barcode and RFID): keep scanning to build up a list of items in one session, then apply [bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions) across the selection. Unknown tags can be turned into new items in one batch from the same screen.
Details of each action are covered in the [Scanner actions](/documentation/manage/scanner/scanner-actions) section.
## Scan workflow
Below is a high-level flowchart illustrating how the Supercycle Scanner app processes scanned items:
```mermaid theme={null}
flowchart TD
%% ----- Terminals -----
start([Start scan]):::term --> scan[Scan item]:::action
done([Done]):::term
%% ----- Intake -----
scan --> exists{Does item exist?}:::decision
exists -- No --> create[Create item record]:::action --> update[Update item]:::action
exists -- Yes --> update
%% ----- Context decisions -----
update --> onReturn{On a return?}:::decision
onReturn -- Yes --> received[Mark as received]:::action --> done
onReturn -- No --> onRental{On a rental?}:::decision
%% Return created from rental
onRental -- Yes --> makeReturn[Create a return]:::action --> received --> done
%% Active rental swap
onRental -- No --> active{Active rental for product?}:::decision
active -- Yes --> pick[Select which rental]:::action --> change[Change item on rental]:::action --> done
active -- No --> done
%% ----- Styles -----
classDef decision fill:#f7f7f7,stroke:#9aa0a6,stroke-width:1px;
classDef action fill:#eef6ff,stroke:#1a73e8,stroke-width:1px;
classDef term fill:#e6f4ea,stroke:#137333,stroke-width:1px;
```
***
## Troubleshooting
Restart the device and open the Supercycle app first. Another app may be blocking Supercycle's communication with the RFID scanning hardware.
Make sure **Zebra barcode scanner** is enabled in **Settings → Scanners**. The DataWedge profile is created the first time you open a Zebra scan session — give it a moment to initialise after the first launch.
You may not be able to scan items whilst the device is plugged in via USB.
# Scanner actions
Source: https://docs.supercycle.com/documentation/manage/scanner/scanner-actions
Step-by-step guides for running inventory and return operations on the go with the Scanner app
### Create item
You can create a new item by scanning a serial number with the [Supercycle Scanner](/documentation/manage/scanner/scanner).
If the scanned serial number doesn't already exist in Supercycle, the **Create item** modal opens automatically.
Press **Select a product** to load the full product list. Scroll or search to find the product and variant for the item you've scanned.
Confirm the status for the new item (`Active`, `Draft`, `Retired`, `Sold`).
Press **Create item** to finish adding the new item to your inventory.
After the item is created, Supercycle opens the item details page. From there, you can review and update additional info, such as the pick location.
When you're in a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes) with a Zebra scanner, any unknown serials show as **Unknown tag** rows. You can turn them into items in one step:
The count next to **Create item** shows how many unknown serials will be created.
The same product and status applies to every serial in the batch. The serials are listed read-only so you can confirm what you're creating.
Press **Create items** to create them in one call. The multi-scan list automatically re-resolves the serials, so the rows flip from **Unknown** to **Matched** and become eligible for the other bulk actions.
***
### Change item
Change which item is allocated to a rental, either from the rental, or by scanning an item which has a rental for the same product/variant (that currently has a different item allocated to it).
***
### Create return
You can create a return by scanning items with the [Supercycle Scanner](/documentation/manage/scanner/scanner).
If the scanned serial number belongs to a rental that doesn't already have an associated return, the rental modal opens automatically.
Press **Create return & receive** — this creates a return and marks the rental as received in one step.
From a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes), press **Receive return** in the bulk action bar. Any selected item that's on an active cycle gets a return created and is marked received in one step. Items already on a return, or not on a cycle, are skipped. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
***
### Mark items as received
Items are automatically marked as received on a return when you create a return from the scanner app. You can also mark items as received manually:
Open a single-scan match and mark the item received from the item detail screen.
Open the return in the scanner app and mark items received from the returns screen.
Scan a batch of items with a Zebra scanner and press **Receive return** in the bulk action bar. Any selected item that's on an active cycle gets a return created and marked received in one step. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
***
### Set pick location on an item
Set the [pick location](/documentation/manage/inventory/items#pick-location) for an item so it's easy to find later.
If the scanned serial has no active return or rental, the item modal opens automatically.
Press **Pick location** to open the **Change pick location** modal.
Type or scan the pick location ID, then press **Save changes** to update the item.
From a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes), press **Pick location** in the bulk action bar to apply the same pick location to every selected item in one step. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
***
### Set warehouse on an item
Move items between warehouses directly from the scanner.
From the item detail screen, press the warehouse row to open the warehouse picker, choose the destination, then press **Save changes**.
From a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes), press **Warehouse** in the bulk action bar, pick the destination warehouse, and apply — every selected item is moved in one call. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
***
### Set item visibility
Change an item's visibility status — `Active`, `Draft`, `Retired`, or `Sold` — from the scanner.
From the item detail screen, tap the status dropdown and pick the new status.
From a [multi-scan session](/documentation/manage/scanner/scanner#scan-modes), press **Visibility** in the bulk action bar, pick the status, and apply — every selected item is updated in one call. See [Bulk actions](/documentation/manage/scanner/scanner-actions#bulk-actions).
***
### Bulk actions
When you start a session with the **Zebra barcode scanner** or **Zebra RFID** reader, the app collects every scanned tag into one list. From there, you can apply actions across the whole selection rather than one item at a time.
On the **Scan** tab, press **Scan with barcode scanner** or **Scan with RFID**. Keep the trigger pressed (or press it once for RFID) to add items to the list. Duplicate tags are de-duplicated automatically.
Each row shows whether the tag matched an existing item, is still loading, or is an **Unknown tag**. Tap the checkbox to include or exclude a row from the bulk action; tap the row body to open its detail page. Swipe to remove a row from the list.
Use the action bar at the bottom of the screen. Each button shows the number of selected items it's eligible for — actions are disabled when nothing in the selection qualifies.
| Action | What it does |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Receive return** | Creates a return for any selected item that's on an active cycle and marks it received in one step. Items already on a return, or not on a cycle, are skipped. |
| **Visibility** | Sets all selected items to `Active`, `Draft`, `Retired`, or `Sold`. |
| **Warehouse** | Moves all selected items to the chosen warehouse. |
| **Pick location** | Sets the same pick location on every selected item. |
| **Change product** | Reassigns all selected items to a different product/variant. |
| **Create item** | Turns every **Unknown tag** in the list into a new item under one product/variant — see [Create item](/documentation/manage/scanner/scanner-actions#create-item). |
Before any action runs, the confirmation sheet shows how many items will be touched and groups the rest by skip reason (for example, *Already returning*, *Not on a cycle*, *Unknown tag*).
Press **Apply** to run the action. Updated items refresh in the list so you can keep scanning or run another bulk action against the same selection.
# Fixed fees
Source: https://docs.supercycle.com/documentation/methods/calendar/fixed-fees
Break down rental pricing with fixed fees such as cleaning, insurance, or return shipping
Fixed fees are a Calendar-only feature. They let you surface itemized fees in the rent buttons block on the storefront. Subscription, Membership, and Resale don't have an equivalent.
Sometimes the cost of renting can be difficult for a customer to understand.
Why would someone rent something when they can own it for less than double the price (that's a rhetorical question - we know why!)?
One way to help the customer see value is to break down the price using fees. You could include things like:
* Cleaning
* Insurance
* Return shipping
Fixed fees are not included in the price of a rental period.
To create a fixed fee, go to *Supercycle* > *Settings* in your Shopify admin. Click the Calendar rental tab and
You can set a default value for your fixed fee here, which can be overridden on a product's calendar settings in Supercycle.
When you create a new fixed fee, we don't automatically add it to existing products. To do this, you'll need to turn calendar rental off and on again on the product.
To exclude a fixed fee on a specific product, you can set its value to 0.
Fees are displayed to the customer on the rent buttons block and summarized on the line item in the cart/checkout.
# Calendar overview
Source: https://docs.supercycle.com/documentation/methods/calendar/overview
Learn about running one-off rentals on your store
Calendar rental, also known as one-off or event rental, is the most recognizable method: you might have rented your skis, a suit for a wedding, or a dress for an event this way before.
In calendar rental, a customer books an item between two specific dates, which Supercycle calls the **Arrive by** and **Return by** dates. You predetermine the rental periods - the number of days a product can be rented for - and the corresponding price.
To enable charging customers automatically at a later date for damage or extensions etc, enable [card vaulting](/documentation/configuration/risk/card-vaulting).
***
## Configurations
Additional configurations to your calendar rental method to suit your business needs.
Charge set fees in addition to charging by rental period, such as a cleaning fee.
Let customers extend an active cycle from their account and pay the difference.
Ensure Supercycle doesn't allow rentals too close together
Allow customers to filter search results for products by availability.
***
# Product setup
Source: https://docs.supercycle.com/documentation/methods/calendar/product-setup
Allow customers to rent a product one-off
Once you've [imported a product](/documentation/setup/importing-products) into Supercycle, setting it up for calendar rental is a simple process.
In your Shopify admin, navigate to **Supercycle** > **Products**.
Select the product you want to set up and then select the **Calendar** rental method.
Under **Options**, click **Add option** and add a price and period.
Repeat this step for different periods. We recommend no more than 4 rental periods to maintain a good UX.
Turn the calendar rental method on and click save.
Next, you'll learn about the fixed fees settings you saw on this page.
Each rental period can be targeted to specific Shopify markets — useful for charging different prices per region or currency. Open a rental period and use **Apply to specific markets**. See [Multi-market pricing](/documentation/manage/products/multi-market-pricing).
***
## Troubleshooting
Yes, you can bulk create or update method options. Learn how in [Product actions](/documentation/manage/products/product-actions#bulk-update-method-options).
# Credit systems
Source: https://docs.supercycle.com/documentation/methods/membership/credit-systems
Add price differentiation for items with varying costs
By default, Supercycle uses an item-based usage limit on membership plans. If a customer takes out a plan with a 5 item limit, they can have any 5 items at a time. Simple.
But what if your store has items of varying value? How do you make sure customers are renting their fair share of your inventory?
## Credit-based usage limits
Under **Apps > Supercycle > Settings > Methods > Membership** you can change your credit system.
If you select an items credit system, every item will be worth one credit. If you select a credits credit system, you’ll need to set the number of credits each item in your catalogue takes from a member’s usage limit.
You can call credits whatever you'd like in your [language settings](https://admin.shopify.com/apps/supercycle/settings/languages).
Each unit added to cart uses that variant's configured credit cost. If a member selects quantity 2 of the same variant, each unit is charged independently at the variant's credit cost. For example, a variant set to 2 credits at quantity 2 uses 4 credits in total. Members set the quantity using the quantity selector on the product page before clicking Add to cart.
# Membership overview
Source: https://docs.supercycle.com/documentation/methods/membership/overview
Learn about running membership rental plans on your store
Membership rental gives your customers access to a catalogue of items for one recurring price. This works well for products where a customer's needs likely change over time (like childrenswear or maternity wear).
**How memberships work**
Memberships are created at the store level. You set up membership plans for your entire store, then choose which products customers can rent with their membership credits by enabling membership on each product individually.
With Supercycle, you can use an item-based or credit-based membership system. If you opt for credit-based you'll be able to set the credit cost of items to customers at the variant level, which works well if you want to include large and small items (like dresses and accessories) in your membership.
Customers can swap their items at an interval you determine. Once they've returned an item, they'll be able to rent a new one.
## How customers enroll
There are two ways customers can discover and enroll in memberships:
**Option 1: Membership page first**
* Customer visits a page with the membership block (displaying your plans)
* Browses available plans and selects one
* Completes enrollment and receives credits
* Navigates to eligible products and rents using credits
**Option 2: Product page first**
* Customer finds a product eligible for membership
* Sees "Become a member" option on the product page
* Clicks through to the membership enrollment page
* Enrolls in a plan and returns to rent the product
After enrollment, customers can manage their membership through the profile dashboard page.
## Items or credits
A customer chooses from a set of membership plans. Depending on your setup, they receive either an item or credit limit.
At any one time, a customer can have up to their limit in items/credits. When they're ready to change items, they can return them and receive their credits back to spend on future items. For example, if a customer rents a 2-credit item and returns it, those 2 credits are added back to their account immediately.
The frequency they can swap (return and order new) items depends on the plan settings.
Memberships are billed on whatever interval you choose, with a minimum of 1 month. You may choose to bill memberships yearly to lock in revenue, for example.
If you make an item available on membership and calendar rental, we'll block out its availability indefinitely if a customer rents it on their membership (until the return is started).
## Configurations
To get your store ready for membership rental, you should make sure you've done at least all of the steps below.
Differentiate item values using credit systems
Create membership plans for your customers to subscribe to
# Plans setup
Source: https://docs.supercycle.com/documentation/methods/membership/plans-setup
Create membership plans for your customers to subscribe to
Plans are the foundation of memberships. When a customer takes out a plan, Supercycle bills them on the interval you specify using a Shopify product.
A plan defines how often the customer is billed and for how much, how many items they can rent at any one time, and how often they can swap items.
**Critical: Plan products are technical placeholders**
When you create a membership plan, Supercycle creates a "plan product" in Shopify. These are technical placeholders that should **never be sold directly** to customers.
* Plan products are only used to attach selling plans and handle billing
* Purchasing them directly (e.g., via direct URL) won't activate membership features
* Customers won't be connected to Supercycle properly
* Plan-management features won't work
**The correct way**: Customers must enroll through the Supercycle membership block on your storefront. See the "Create a membership page" section below for setup instructions.
**What if a customer buys a plan product directly?** If a customer somehow purchases a plan product directly (e.g., via URL), the order will process but the membership won't activate. The customer won't be connected to Supercycle, won't receive credits, and won't be able to use membership features. You'll need to refund the order and guide them to enroll properly through the membership block.
When creating a Supercycle membership plan, a product with the same name is created in Shopify.\
To add a description to the plan, find the plan product in Shopify and add the description.\
This will then automatically display on the storefront in the membership app block.
We create a corresponding Shopify product when you create a membership plan in Supercycle to handle billing.
The plan title is the Shopify product title and is displayed in the cart, checkout, transactional emails, and orders in Shopify admin.
The maximum number of credits (or items) that a customer can spend at any one time.
The order and return allowances determine how often a customer can swap items on their membership.
Allowances are aligned with the billing anniversary but you can set a different cadence.
For example, a customer is on a plan that is billed monthly and they took the membership out on 1 January.\
You’ve set the swap allowance so they are allowed 1 order and 1 return every 3 months.\
They take 3 items out on 1 January and can return them anytime, but their order allowance won’t reset until 1 April,\
meaning they can’t rent new items until then. They’ll continue to be billed monthly on 1 February and 1 March.
Swap allowances protect your margins. The majority of rental costs are in logistics, so it’s best to balance customer flexibility with cost control.\
In an ideal membership, the customer keeps the same item indefinitely.
Purchase options define the different billing cycles you want to offer your customers.
A plan can have multiple purchase options.
For example, you may offer a plan on a £50 monthly payment or a £500 yearly payment,\
giving customers the equivalent of 2 months free in exchange for a 12-month commitment.
The billing cycle a customer chooses doesn’t affect how regularly they can swap items.
***
## Add or update a membership plan
In your Shopify admin, navigate to **Supercycle > Settings > Methods > Membership**.
From the **Membership** page, click **Add plan** or select an existing plan to edit it.
Enter a title for your plan along with additional membership details.
Click **Save**.
***
## Delete a membership plan
When you delete a membership plan, it’s permanently removed from Supercycle and cannot be restored.\
A plan can only be deleted if no customers are currently subscribed to it.
***
**Limitation: Plan products in membership collections**
Currently, Shopify does not allow a product to be hidden from the main storefront while still being visible in a specific collection (like your membership plans collection). This means plan products will appear in the "all" collection.
**Workaround for developers**: If you have a developer, they can modify your theme to filter out products with specific plan names from rendering in collection pages, while still allowing them to display in the membership block.
## What if a customer purchases a plan product directly?
If a customer somehow purchases a plan product directly (e.g., by accessing the product URL directly), the membership will not activate properly. The customer will complete the purchase, but:
* Supercycle won't recognize it as a membership enrollment
* The customer won't be connected to Supercycle
* Credits won't be assigned to their account
* Swap and plan-management features won't work
This is why it's critical to ensure customers enroll through the membership block. If this happens, you'll need to manually refund the customer and guide them to enroll through the proper membership page.
***
## Create a membership page
Create a collection in Shopify (for example, **Membership plans**) and add each plan product to it.\
This collection controls which plans appear on the storefront and is required for the membership block to display plans.
**Multiple collections for different audiences**
You can create multiple collections to display different plans to different audiences. For example:
* Create a "Customer plans" collection with 3 plans for individual customers
* Create a "Business plans" collection with 3 plans for businesses
* Display them on different pages or in different blocks on the same page
Each membership block can be connected to a different collection, giving you full control over which plans appear where.
In Shopify admin, go to **Sales channels > Online store > Pages** and create a new page for memberships (e.g., "Become a member").
Go to **Sales channels > Online store > Themes > Customize**.\
Open the membership page you created, add the **Supercycle app block** called **Membership plans**,\
and select the collection you created earlier.
See the [Membership plans app block](/developers/app-blocks/membership-plans) documentation for detailed setup instructions.
***
## FAQs
By default, your membership tiers might not display in price order.
To reorder them, update the collection settings in Shopify so the tiers appear from lowest to highest price:
In your Shopify admin, go to **Products** > **Collections**, and select the membership collection you created.
In the collection, choose **Sort** > **Manually**. Then drag and drop the membership tiers into the order you want.
If a customer purchases a plan product directly (e.g., via direct URL or if they find it in search), the order will process in Shopify, but the membership won't activate properly.
**What won't work:**
* The customer won't be connected to Supercycle
* They won't receive membership credits
* They won't be able to use any membership features (swapping, plan management, etc.)
**How to fix it:**
1. Refund the order in Shopify
2. Guide the customer to enroll properly through the membership block on your storefront
3. Consider hiding plan products by setting them to "unlisted" status (see "Hide membership plan products" section above)
If you delete a membership product from Shopify, it breaks the link between your store and the Supercycle plan.\
To fix it:
In your Shopify admin, go to **Supercycle > Memberships > Plans** and delete the affected plan.
Create a new plan with the same settings.\
Supercycle will automatically recreate the Shopify product linked to the plan.
Go to **Shopify > Products**, find the new plan product, and add it to the collection displayed in your membership app block on the storefront.
# Product setup
Source: https://docs.supercycle.com/documentation/methods/membership/product-setup
Enable products for membership rental, set credit cost, and add cart validation
After creating membership plans, you need to enable membership on individual products to make them rentable with membership credits.
**How membership eligibility works**
Membership plans are created at the store level. To make products available for membership rental, you enable membership on each product individually and assign credit values. This gives you control over which products customers can rent with their membership credits.
## Turn on product for membership rental
Once you've [imported a product](/documentation/setup/importing-products) into Supercycle, you'll need to enable it for membership rental.
In your Shopify admin, navigate to **Supercycle** > **Products**.
Select the product you want to set up and then select the **Membership** rental method.
Turn the membership rental method on and click save.
## Set credit cost
If you're using a [credit-based credit system](/documentation/methods/membership/credit-systems), you should set credit costs for each product. This determines how many credits customers need to spend to rent this product.
Credit costs are set at the variant level. We default the credit cost of a variant to 1.
For example, if you set a dress to cost 2 credits and a customer has a plan with 5 credits, they can rent the dress and still have 3 credits remaining for other products.
In your Shopify admin, navigate to **Supercycle** > **Products**.
Select the product you want to set up and then select the **Membership** rental method.
Set the credit cost value of each variant to any integer.
If the fields are inactive, this is because you're using an item-based credit system. You can change this in your [membership settings](/documentation/methods/membership/credit-systems).
***
## Target memberships to specific markets
If you sell across multiple Shopify markets, you can target individual membership options to specific markets — for example to offer a different plan or price in the EU vs. the US. Open a membership option and toggle **Apply to specific markets**.
See [Multi-market pricing](/documentation/manage/products/multi-market-pricing) for details and bulk update workflows.
***
## Add cart validation for memberships
To make sure customers can't checkout membership products without an active plan, you need to activate the membership cart validation rule.
Learn how to set it up in the [Checkout rules documentation](/documentation/configuration/checkout/checkout-rules).
***
## Troubleshooting
Yes, you can bulk create or update method options. Learn how in [Product actions](/documentation/manage/products/product-actions#bulk-update-method-options).
# Customer tags
Source: https://docs.supercycle.com/documentation/methods/membership/shopify-tags
Organize your membership customers and orders with the Shopify tags Supercycle applies
Supercycle automatically tags each Membership plan subscriber and their Supercycle related orders, these tags can be used to organize your store's customer information in Shopify and other apps connected to Shopify.
Tags can could be used for:
* Organizing customers and orders in Shopify
* Membership discounts
* Member area content
* Email automation
* Loyalty programs
Supercycle applies the following tags:
## Order tags
### Has membership
When an order has a membership plan product.
`Has membership`
### Has rental products
When an order is a rental product.
`Has rental products`
### Recurring order #X
This tag defines the number of recurring orders in the customer's subscription:
`Recurring order #1`, `Recurring order #2`
## Customer
### Has \{status} subscription
The status of the customer's subscriptions
`Has active subscription` `Has paused subscription` `Has canceled subscription`
### \{plan name} subscriber
The plan the customer is subscribed to.
`Starter Subscriber`
### Supercycle member
Any customer that has made a rental order.
`Supercycle member`
# Resale overview
Source: https://docs.supercycle.com/documentation/methods/resale/overview
Sell your serialized secondhand items alongside your rental methods with resale
Resale allows you to sell individual serialized items, typically used or refurbished products from a trade-in or items that have completed their rental lifecycle.
With resale, customers can purchase specific items, in specific conditions, enabling you to monetize inventory that's ready to be sold while maintaining full item tracking and serialization.
When you enable resale for a product, customers can purchase individual serialized items at prices you set. Each resale transaction is tracked through Supercycle's inventory system, maintaining the item's history and serial number.
You can create different pricing options based on item condition or variant, allowing you to offer different prices for items in various states (unused, used, refurbished, etc).
## Configurations
To get your store ready for resale, you should complete the following steps:
Import products from Shopify and create Supercycle inventory
Enable products for resale and configure pricing options
## Resale vs. rental methods
Unlike rental methods (calendar, subscription, membership) where items return to your inventory, resale permanently transfers ownership to the customer. This makes resale ideal for:
* Items that have completed their rental lifecycle
* Refurbished or used inventory you want to clear
* Products customers want to own rather than rent
* Monetizing inventory that's no longer optimal for rental
You can run resale alongside other rental methods on the same products, giving customers the choice to rent or buy.
# Product setup
Source: https://docs.supercycle.com/documentation/methods/resale/product-setup
## Turn on product for resale
Once you've [imported a product](/documentation/setup/importing-products) into Supercycle, you'll need to enable it for resale.
In your Shopify admin, navigate to **Supercycle** > **Products**.
Select the product you want to set up and then select the **Resale** method.
Turn the resale method on and click save.
## Create pricing options
Pricing options allow you to offer different prices based on item condition or variant. For example, you might price "New" items higher than "Good" condition items, or offer different prices for different product variants.
In your Shopify admin, navigate to **Supercycle** > **Products**.
Select the product you want to set up and then select the **Resale** method.
Under **Options**, select **Add option**.
The option name is shown on the selector on the product page and on the line item properties in the cart and at checkout.
The price customers will pay to purchase the item. This is a one-time payment that transfers ownership of the item to the customer.
Control whether this option is available for customers to select. Disabled options won't appear on the product page.
Choose which product variants this pricing option applies to. You can apply it to all variants or select specific ones.
Choose which item conditions this pricing option applies to. You can apply it to all conditions or select specific ones (new, good, fair, poor).
If you sell across multiple Shopify markets, you can target this option to specific markets only. Leave it set to all markets to show the option everywhere. See [Multi-market pricing](/documentation/manage/products/multi-market-pricing) for details.
Click **Add** to create the option. You can create multiple options with different pricing for different conditions or variants.
You must have at least one enabled option for resale to work. You can create up to 31 options per product.
## Troubleshooting
Turn on the resale method for each new inventory item.
Enable resale in bulk from inventory
Go to Supercycle > Inventory.
Select all items on the page.
Open the ••• menu and choose Update methods.
Check Resale and select Save.
Repeat for other pages as needed.
Enable resale for a specific product
Go to Supercycle > Products and open the product.
Select View inventory.
Select the inventory items.
Open the ••• menu → Update methods → check Resale → Save.
Yes, you can bulk create or update method options. Learn how in [Product actions](/documentation/manage/products/product-actions#bulk-update-method-options).
# Add a disclaimer
Source: https://docs.supercycle.com/documentation/methods/subscription/add-a-disclaimer
Set clear delivery expectations with a note under requested start date.
Add a short note under **requested start date** to set clear expectations about delivery timing for subscription orders.
***
### Where it appears
The disclaimer shows directly under the **requested start date** field in the subscription method.
***
### Add or edit the disclaimer
Go to **Settings**.
Select **Language**.
Choose **English** (or your storefront language).
Go to **Methods > Subscription > Disclaimer HTML**.
Paste your text (plain text or basic HTML), then select **Save**.
> Changes can take a few minutes to appear on your storefront.
***
### Localization
If you sell in multiple languages, repeat these steps for each language so the disclaimer appears for all shoppers.
# Migrate subscriptions
Source: https://docs.supercycle.com/documentation/methods/subscription/migration
Migrate subscriptions from other Shopify apps or external systems into Supercycle without interrupting billing.
Move your existing subscriptions into Supercycle to keep customer billing and data in sync.
Make sure every customer has a saved card in Shopify.\
This lets you charge them in Supercycle without asking for payment again.
When you start a migrated subscription, Shopify sends an order confirmation email.\
Update the template so migrated customers see an “updating your subscription” message.
Add this to your **Shopify order confirmation email** (subject and body):
```liquid theme={null}
{% if order.tags contains 'migration' %}
This order is marked for migration.
{% else %}
Order confirmation
{% endif %}
```
In the body:
```liquid theme={null}
{% if order.tags contains 'migration' %}
We’re updating your subscription. No action needed.
{% else %}
Standard order confirmation content here.
{% endif %}
```
In **Supercycle**, create a subscription plan for each product.\
Set the **checkout price** to **\$0** and set the billing interval to match the existing subscription.
For each customer:
* Go to **Supercycle → Cycles → Create rental order**
* Choose the **Subscription** method
* Select the correct **product**
* Set the **start date** to match the customer’s recurring billing date\
(use the same date they are normally charged)
Once the draft order is created and the customer is added:
* Add **"migration"** tag to the order
* Charge the customer’s saved card
For detailed steps on creating rental orders, see [how to create a rental order](https://docs.supercycle.com/documentation/manage/cycles/rental-actions#from-the-admin).
Cancel the subscription in your previous app to prevent duplicate charges.
Migrate one subscription to confirm billing dates, charges, and emails.\
Then migrate the rest.
# Subscription overview
Source: https://docs.supercycle.com/documentation/methods/subscription/overview
Offer access to products on a rolling basis
In [Supercycle 101](/documentation/overview/methods), we briefly introduced the subscription rental method.
> With subscription rental, a customer pays monthly for access to a single product. This is great for high-value products like phones and household appliances, especially those customers regularly upgrade.
## How subscription rental works
When a customer chooses a subscription rental plan, their card is billed for the price of the subscription on each billing interval until the item is returned.
As part of the subscription rental plan, the customer commits to a minimum rental period. They will not be able to initiate a return before their minimum rental period is up but you as the merchant can initiate an early return on their behalf.
Subscriptions can be billed on whatever interval you choose. The same interval must be used across all subscription rental products on your store.
## Getting ready for subscription rental
To get your store ready for subscription rental, you should make sure you've done at least all of the steps below.
Import products from Shopify and create Supercycle inventory
Set your store-wide billing start and end settings subscription products
Create deposit amounts to be assigned to different subscription products
Enable products for subscription rental and set up their pricing
Display the subscription rental purchasing option on product pages
Once you have your first subscriptions, use our billing management tools to reconcile customers' payments
# Product setup
Source: https://docs.supercycle.com/documentation/methods/subscription/product-setup
Enable products for subscription rental and create their pricing groups
## Turn on product for subscription rental
Once you've [imported a product](/documentation/setup/importing-products) into Supercycle, you'll need to enable it for subscription rental.
In your Shopify admin, navigate to **Supercycle** > **Products**.
Select the product you want to set up and then select the **Subscription** rental method.
Turn the subscription rental method on and click save.
## Create pricing groups
Pricing groups are prices (a combination of the recurring billing amount and initial charge) applied to variants for a given minimum term.
In your Shopify admin, navigate to **Supercycle** > **Products**.
Select the product you want to set up and then select the **Subscription** rental method.
Under **Options**, select **Add option**.
The pricing group's is shown on the selector on the product page and on the line item properties in the cart and at checkout.
The price is the recurring billing amount, starting from the rental start date. The initial charge is charged at checkout - other merchants use this as a joining or administration fee.
Currently an initial charge is mandatory but in future will be optional.
If you've [created deposit amounts](/documentation/configuration/risk/deposits), you can select one here to be added to the cart with the subscription.
Supercycle will link the deposit and subscription together throughout the lifetime of the rental.
You can define the minimum term as any period. The minimum term begins from the rental start (usually the fulfillment time).
Once a customer has rented the item for the minimum term, they will be able to initiate a return. As a merchant, the minimum term is displayed in Supercycle as advisory but you are able to override it.
You can apply pricing groups to all or specific variants. This works well for different storage sizes on electronics or different conditions, for example.
If you sell across multiple Shopify markets, you can target this pricing group to specific markets only — for example to charge different recurring amounts in different currencies or regions. Leave it set to all markets to show the group everywhere. See [Multi-market pricing](/documentation/manage/products/multi-market-pricing) for details.
***
## Troubleshooting
Yes, you can bulk create or update method options. Learn how in [Product actions](/documentation/manage/products/product-actions#bulk-update-method-options).
# Start/end settings
Source: https://docs.supercycle.com/documentation/methods/subscription/subscription-settings
Manage how subscription billing starts, stops, and appears on your storefront.
Subscription billing settings are accessed from [Subscription settings](https://admin.shopify.com/apps/supercycle/settings/methods/subscription)
***
## Billing start
Control when subscription billing begins after a customer places their order.
| Option | Description |
| ---------------------------------------------- | ---------------------------------------------------------- |
| **Immediately** | Billing starts as soon as the order is placed. |
| **When the subscription product is fulfilled** | Billing starts once the product is fulfilled in Shopify. |
| **On the expected delivery date** | Billing starts on the date the item is expected to arrive. |
You can also delay the start of billing by a set number of billing cycles.\
Set it to **0** to start billing right away.
### Delay billing for X cycles
Use this to control when the first recurring charge fires after the subscription starts. Set the value to skip cycles that have already been paid for at checkout.
| Value | When the first recurring charge fires |
| ----- | -------------------------------------------------------------------------------------------------------------------------------- |
| `0` | Immediately when the subscription start date is reached. Use this when checkout did not collect any subscription period upfront. |
| `1` | One billing cycle after the subscription start date. Use this when storefront checkout already covers the first cycle. |
| `2+` | Two or more cycles later. Use only when checkout covers more than one cycle. |
This setting is forward-only. Changing it does not retroactively update existing subscription contracts. If you change it, the next billing date on every existing subscriber must be updated manually for the new behavior to apply to them.
If your storefront price already covers the first cycle, set `Delay billing for` to `1` so recurring billing skips ahead by one cycle. Otherwise customers can be billed twice for the same period.
If you are unsure how your existing contracts are set up, contact support before changing this setting.
***
## Billing end
Choose when and how to stop billing for a subscription.
| Option | Description |
| -------------------------------------------------- | ---------------------------------------------------------------- |
| **Pause once a return is created** | Automatically pauses billing when a return is initiated. |
| **Stop when the subscription product is received** | Ends billing once the returned product is received and scanned. |
| **Stop when manually cancelled** | Keeps billing active until you cancel the subscription manually. |
***
## Billing interval
Define how often customers are billed while their subscription is active.
The default interval applies to all new pricing options, however can be customized per option.
| Example | Description |
| ------------------ | ------------------------------- |
| **Every 1 month** | Customers are billed monthly. |
| **Every 3 months** | Customers are billed quarterly. |
***
## Storefront settings
Control what customers can do on your storefront.
### Start date selector
Turn this on to let customers choose their subscription start date during checkout.\
This is useful for preorders or rentals starting at a future date.
# Cart timer
Source: https://docs.supercycle.com/documentation/online-store/cart-timer
Automatically remove Supercycle items from customers carts to reduce chance of overbooking.
The cart timer limits how long a Supercycle item can sit in a customer's cart. After the time runs out, Supercycle items are removed from the cart. This helps reduce the chance of two customers reaching checkout at the same time when only one unit is available. Non-Supercycle items are left untouched.
Use the cart timer if you've seen cycles fail to reserve correctly because of abandoned carts, or if you want to reduce the chance of two customers booking overlapping cycles.
The cart timer is off by default. Existing stores see no change in behaviour until you turn it on.
## How it works
* The timer starts when a customer adds a Supercycle item to their cart.
* It only counts Supercycle cycle line items. Regular Shopify products are ignored.
* When the time runs out, Supercycle items are removed from the cart and the cart UI (drawer, count bubble, cart page) refreshes in place — no page reload.
* The timer resets each time the cart's cycle items change.
## Enable the cart timer
From your Shopify admin, go to apps then [Supercycle.](https://admin.shopify.com/apps/supercycle/)
Go to **Settings** then **Channels** then **Online store**.
Toggle **Limit time in cart** on. The field defaults to **20 minutes** — the recommended value.
Enter the number of minutes you want Supercycle items to stay in a customer's cart before being removed.
Click **Save**.
To turn the timer off, toggle **Limit time in cart** off and save. The value resets to `0`, which disables the behaviour.
## Action after time expires
Once the timer is enabled, you can choose what happens when it runs out using the **Action after time expired** setting.
| Option | What it does |
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **Remove Supercycle items and hide the message** | Removes Supercycle items from the cart and hides the `sc-cart-timer` element if you're using it. |
| **Remove Supercycle items and redirect** | Removes Supercycle items from the cart and redirects the customer to a URL of your choice. Enter the destination URL in the field provided. |
## Show a countdown to customers (optional)
You can show customers how long they have left before their cart expires by dropping a custom element into your theme.
Add the following snippet anywhere in your theme where you want the countdown to appear (for example, the header, cart drawer, or cart page):
```html theme={null}
Reserved for
```
The `` element shows the remaining time as `MM:SS` and updates every second.
The surrounding `.sc-cart-timer` wrapper is automatically hidden when there are no Supercycle items in the cart or the timer is not running, so customers only see it when it matters. You can style the wrapper with your own CSS to match your theme.
Wrap the timer in your own copy so it reads naturally — for example, "Reserved for 14:32" or "Your items expire in 14:32".
## Picking a timeout
A shorter timeout reduces the window where two customers could reach checkout at the same time, but gives customers less time to complete their purchase. A longer timeout is friendlier to customers but increases that overlap risk. The default of **20 minutes** is a good starting point for most stores.
# Date picker blocked dates
Source: https://docs.supercycle.com/documentation/online-store/date-picker-blocks
Stop customers selecting certain start or end dates on the storefront calendar without changing inventory availability.
Date picker blocked dates are rules that stop customers selecting certain dates on the storefront calendar when they book a [calendar rental](/documentation/methods/calendar/overview). Use them for weekends, holidays, a rolling booking window, or any date pattern you want to turn off in the picker.
These rules only affect **which dates customers can pick** on the online store. They do **not** remove inventory availability, hold units, or affect draft orders or existing cycles. To make specific products, variants, or items unavailable to book, use [Blocked dates](/documentation/manage/inventory/blocked-dates) instead. [Opening hours](/documentation/configuration/logistics/opening-hours) can also block pick-up and drop-off dates when time selection is enabled.
## Block types
Each rule uses one block type:
| Block type | What it blocks |
| -------------------- | ----------------------------------------------------------- |
| **Specific date** | One calendar day |
| **Date range** | Every day from a start date through an end date (inclusive) |
| **Before a date** | Every date strictly before the chosen day |
| **After a date** | Every date strictly after the chosen day |
| **Days of the week** | Recurring weekdays (for example every Saturday and Sunday) |
Add an optional **Description** so you can tell rules apart in the table (for example "Christmas break" or "No Sunday starts").
## Start vs end dates
Every rule also sets **Applies to**:
| Setting | Effect |
| ----------------------- | --------------------------------------------------------------------------- |
| **Start and end dates** | Blocks the matched dates on both the rental start picker and the end picker |
| **Start dates only** | Blocks only when customers choose a cycle **start** date |
| **End dates only** | Blocks only when customers choose a cycle **end** date |
Use separate rules when start and end restrictions differ — for example block Sunday **starts** but still allow a rental to end on a Sunday.
## Manage date picker blocks
From your Shopify admin, go to **Apps** → [Supercycle](https://admin.shopify.com/apps/supercycle/) → **Settings** → **Channels** → **Online store**.
The **Date picker blocked dates** table lists every active rule with its summary, what it applies to, and your description. Click a row to edit it.
Click **Add dates**. Choose the **Block type**, fill in the dates or days, set **Applies to**, and add a description if helpful. Click **Save**.
Click a row to change the rule, or use **Delete** in the modal footer to remove it. Changes apply to the storefront calendar immediately.
Rules are store-wide. They apply wherever the Methods app block renders a calendar date picker on the online store.
## Examples
**Block weekend starts and ends**
Create one rule: **Days of the week** → Saturday and Sunday → **Start and end dates**.
**Block bookings more than six weeks out**
Create one rule: **After a date** → pick the cut-off day six weeks from today → **Start and end dates**. Edit the date periodically, or keep using the theme JSON escape hatch below for a rolling window.
**Block Christmas week for starts only**
Create one rule: **Date range** → 24 Dec through 2 Jan → **Start dates only**.
## Theme block JSON (legacy)
Before this admin UI, merchants entered [DayPicker matcher JSON](/developers/app-blocks/methods#legacy-theme-json-matchers) in the Methods app block's **Unavailable start dates** and **Unavailable end dates** theme settings. That JSON still works and stacks with admin rules, but those fields are deprecated and will be removed in a future release. Prefer **Date picker blocked dates** in the admin for new rules.
For advanced cases — such as a rolling booking window that updates every day without manual edits — you can still use `window.supercycleDisabledMatchers` in theme code. See [Legacy theme JSON matchers](/developers/app-blocks/methods#legacy-theme-json-matchers).
# Languages and translations
Source: https://docs.supercycle.com/documentation/online-store/languages
Localize, personalize and translate terms
Languages in Shopify control two things:
* The **storefront language** your customers see (English, Italian, Arabic, etc.)
* The **wording** used for buttons, labels, and messages across your store
Supercycle has its own language settings for app blocks and features.
***
## Add a new language
You can add languages separately in Shopify and Supercycle.
* Adding a language in **Shopify** makes it available for your storefront and theme content.
* Adding a language in **Supercycle** makes it available for Supercycle app blocks and methods.
For a customer to see a second language in Supercycle blocks, that language must be active in **both Shopify and Supercycle**.
1. In your Shopify admin, go to [**Settings > Languages**](https://admin.shopify.com/settings/languages).
2. Select **Add language**, then choose the language you want.
3. Follow [Shopify’s guide to managing languages](https://help.shopify.com/manual/markets/languages) to publish it to your storefront.
1. In your Shopify admin, go to **Supercycle > Settings > Languages**.
2. Add the language you want to use in Supercycle.
3. Save your changes.
If this language is also active in Shopify, customers will see Supercycle content in that language when browsing the translated storefront.
***
## Multiple languages by market
When you add a new language in Shopify, you can assign it to a specific **market** (store or country).
* If your store already has more than one published language, Shopify automatically displays a **language selector** in the storefront header.
* Customers can switch between languages from this dropdown.
* Supercycle respects this selection and shows its content in the chosen language if it’s been added to Supercycle.
***
## Edit wording
Both Shopify and Supercycle allow you to edit wording:
* In **Shopify**, wording changes apply to your storefront theme and general site content.
* In **Supercycle**, wording changes apply to Supercycle app blocks and features.
1. In your Shopify admin, go to [**Supercycle > Settings > Languages**](https://admin.shopify.com/apps/supercycle/settings/languages).
2. Select **Edit content** next to the language you want to update.
3. Change the text and save.
***
# Customer portal
Source: https://docs.supercycle.com/documentation/online-store/portal
Allow customers to manage their accounts
The customer portal lives on Shopify's **new customer accounts** page. Customers manage rentals, returns, memberships, and subscriptions from their account without leaving your storefront.
**Before you start**
Supercycle doesn't currently support Shopify self-returns, so if you have it enabled and a return is made via Shopify returns, it won't be marked as returned in Supercycle.
Features include:
* View rental details
* Create and view returns for a rental
* Return methods — send back with label, home collection
* Change payment method for subscriptions
* Change payment method on a membership
* Pause membership
* Cancel membership
* [Extend calendar rentals](/documentation/manage/cycles/extensions) and pay the difference
Roadmap:
* Pay for outstanding charges
* Purchase a rental item
**Update old portal links**
Supercycle no longer serves a legacy app-proxy dashboard at paths like `/apps/supercycle/`. If your theme navigation, emails, or marketing still link to those URLs, replace them with your [customer accounts dashboard URL](#copy-your-dashboard-url) or remove them.
## Setup
To enable new customer accounts if not already enabled:
From your Shopify admin, click **Settings** > **Customer accounts.**
Select Customer accounts if not already selected. This will update your store to new customer accounts.
In your Shopify admin, go to **Online Store** → **Themes**.
Click **Customize** on the theme you want to edit.
Use the dropdown at the top of the screen (Says "Home page") to select **Checkout and customer accounts**.
In the left-hand menu of the theme editor, click the **Apps** icon (a square symbol).
Scroll to find the **Supercycle** section.
Click the **+** button next to **Dashboard**, then choose **Accounts** to insert the full account view.
Click **Add to menu** to create a navigation link that brings customers to this page. You can rearrange this to make this the first link.
Make sure to save your menu changes. When you've finished adding extensions, click **Save**. To test, login as a customer with a rental.
In your Shopify admin, go to **Supercycle** → **Settings** → **Customer accounts**.
Under **Return methods**, select which return methods you want the customer to be able to use, and configure the settings.
Click **Save**.
## Copy your dashboard URL
From **Supercycle** → **Settings** → **Customer accounts**, copy the **Dashboard URL** and use it anywhere you want customers to open their account — theme menus, email templates, or help pages. Supercycle transactional emails link to this URL automatically.
# Filter by availability
Source: https://docs.supercycle.com/documentation/online-store/search
Allow customers to search by the availability of items
Currently in beta - there are known bugs and limitations. For developer information see the [Methods filter developer docs](/developers/app-blocks/availability-search).
Allow customers to search by the availability of items from the collection page.
## Setup
This is a free Shopify app that you need to install to use the Methods filter.
For the filter to work you need to install the [Shopify Search & Discovery app](https://apps.shopify.com/search-and-discovery).
You need to create a metafield definition for Supercycle Methods to enable filtering by method type.
Go to **Shopify** > **Settings** > **Custom data** > **Products** > **View unstructured metafields**.
Find `supercycle.methods` and click **Add definition**.
Set the following:
* **Name**: Supercycle Methods
* **Type**: List of single line text
Turn on the following options:
* **Filter on the product list and in the Admin API**
* **Use as a condition in smart collections**
Click **Save** to create the metafield definition.
Go to the Search & Discovery app in your Shopify admin.
Go to **Filters** and click **Add filter**.
Select source as **Rental availability** and save.
Click **Add filter** again and select **Supercycle Methods** as the source.
Don't forget to save your changes before leaving the app.
You need to find the section ID of your collection page to configure the Methods filter block.
Go to **Shopify** > **Sales Channels** > **Online Store** > **Customize** and navigate to a collection page.
Right-click on the page and select **Inspect** to open developer tools.
In the developer tools, click on the **Network** tab.
Click the clear button to clear any existing network requests.
Click on one of the existing filters on the page (e.g., the price filter) and apply it. This will create a network request.
In the network log, look for the filter request. If you used the price filter, you should see a request with `.price` in the name. Click on it.
From the request details, copy the section ID value. Close the developer tools when done.
To use the Methods Filter in your theme, you need to add the app block.
From your Shopify admin, go to **Online store** and click **Customize** on the theme you want to add Supercycle to.
Go to a collection page, on the sidebar, click the **Add section** icon and click **apps**, then select the **Methods filter** block.
In the Methods filter block settings, paste the section ID you copied earlier into the **Collection section ID** field.
Edit the app block setting to set what types of filter you want, Membership, Calendar, or everything. (Language can be changed in Settings -> Language)
Don't forget to save your changes before leaving the theme customizer.
Check it all works then you will then need to hide the **Rental availability** Search & Discovery filters with custom css.
# Introduction
Source: https://docs.supercycle.com/documentation/overview/introduction
Add circular models to Shopify with Supercycle.

Supercycle is a circular commerce platform enabling merchants to run rental, product-as-a-service and resale business models from their Shopify store.
Supercycle extends Shopify, handling the front-end customer experience and taking over the back-end inventory management, adding serials, allocation and utilization required for circular commerce models.
## Platform
Explore the Supercycle platform and how it works with Shopify.
What Supercycle does and how it works with Shopify.
The circular methods and business models we support.
## Getting started
Get started with Supercycle and learn how to set up your store.
Install Supercycle on the Shopify App Store.
A step-by-step guide to get started with Supercycle.
Import your products from Shopify to Supercycle.
Set up your circular methods and business models.
## Developers
Create deeper customizations and automations.
Explore the developer documentation.
Integrate and automate using our Admin API.
Deeply customize the frontend using our Storefront API.
# Methods
Source: https://docs.supercycle.com/documentation/overview/methods
Circular commerce is charging for the same item multiple times, we support various models.
Circular at it's core charging for *usage and access* to an item, rather than *ownership*. This can be modelled in many ways, we currently support calendar, membership, subscription and resale.
You can run any combination of methods at the same time and each product can have different methods enabled.
Fixed dates between X and Y.
A recurring fee until the item is returned.
Swapping products within an allowance, like a library.
Selling a serialized item, often from used or refurbished.
# Platform
Source: https://docs.supercycle.com/documentation/overview/platform
Overview of the Supercycle platform and how it works with Shopify
## Supercycle and Shopify
We've built Supercycle natively within Shopify, so that you can offer rental and resale alongside your retail experience.
This gives merchants the full power of Shopify, benefiting from the \$5bn+ of R\&D to date as well as the 3rd party apps and integrations that Shopify has to offer.
| Shopify | Description | Status |
| ----------------- | ---------------------------------------------- | ---------------------------- |
| Online Store | Easily add to a theme via app blocks. | |
| POS | Yes, all 4 Methods are compatible. | |
| Checkout | Yes, including support for Shopify Payments. | |
| Returns | In progress. | |
| Customer Accounts | Add to customer portal via app blocks. | |
| Flow | Easily automate key actions. | |
| Markets | Supported, with more functionality on the way. | |
| B2B | On the roadmap. | |
## Platform overview
### Methods
[Methods](/documentation/overview/methods) are the various ways you can charge for the same item multiple times.
Supercycle currently supports four methods:
* [Calendar](/documentation/methods/calendar/overview) - charge for a set number of days
* [Subscription](/documentation/methods/subscription/overview) - charge on a recurring basis, until returned
* [Membership](/documentation/methods/membership/overview) - charge for an allowance of items on a recurring basis, allowing items to be swapped in and out
* [Resale](/documentation/methods/resale/overview) - selling not-new items, often uniquely identified by serial numbers
### Inventory
Once a product is imported into Supercycle, inventory management for that product is disabled in Shopify and fully managed by Supercycle instead. This allows us to track individual items and manage their availability accurately, essential for models like rental, where multiple orders can be placed against a single item across different time slots.
#### Items (with serials)
[Items](/documentation/manage/inventory/items) represent individual units in your inventory. Each item can be assigned a unique serial number, enabling detailed tracking of its condition, status, and usage history over time.
This serial number can also be physically attached to the item using an RFID tag, barcode, or QR code, making it easy to identify and manage across different systems or touchpoints.
#### Availability
[Ally, our allocation algorithm](/documentation/manage/cycles/allocation), manages product availability by automatically assigning new cycles to the most optimal item. This ensures maximum future availability and flexibility for upcoming customers.
### Orders
Supercycle uses native Shopify orders, meaning whatever a customer checks out with becomes their order. This can include a mix of rental products with different rental methods, alongside retail items.
For any product in the order that is managed by Supercycle, a cycle is automatically created. An order with multiple items will create multiple cycles.
#### Cycles
[Cycles](/documentation/manage/cycles/cycles) are assigned an item and tracks the fulfillment and receival of that item.
### Returns
[Returns](/documentation/manage/returns/returns) are managed independently of Shopify’s return system. Shopify enforces a 1:1 relationship between orders and returns, which doesn’t align with how rental works, especially when customers rent multiple items with overlapping return dates, such as in membership rentals.
When a customer initiates a return through the customer portal, Supercycle creates a return that isn’t tied to a specific Shopify order. This allows for more flexible and accurate return handling.
# POS overview
Source: https://docs.supercycle.com/documentation/point-of-sale/pos-overview
Create and manage rentals from Shopify POS.
Supercycle's Shopify POS integration lets store staff create and manage rentals at the point of sale. You can apply calendar rentals, subscription rentals, add items to existing memberships, and process resales directly from POS.
## Activate Supercycle in Shopify POS
In Shopify admin, go to **Sales channels** > **POS** > **Settings** > **POS apps**.
Select **Supercycle**, then click **Add** on the Smart Grid tile.
***
## Supported rental methods
### Calendar rentals
Create fixed-duration rentals with specific start and end dates.
**What you can do:**
* Select rental duration (e.g., 1 day, 1 week, 1 month)
* Choose a start date for the rental
* Apply to multiple items at once
### Subscription rentals
Start ongoing subscription rentals with minimum commitment terms.
**What you can do:**
* Select minimum term (e.g., 1 month, 3 months, 6 months)
* Choose a start date for the subscription
* Apply to multiple items at once
### Membership rentals
Add items to a customer's existing membership.
**What you can do:**
* Add items to an existing membership
**Limitations:**
* You cannot create a new membership from POS
* Customer must already have an active membership
### Resale
Sell individual serialized items to customers.
**What you can do:**
* Sell specific serialized items (used, refurbished, or unused inventory)
* Process purchases of items at configured resale prices
* Pick the right [pricing option](/documentation/methods/resale/product-setup) when a product has different prices for different item conditions
**Limitations:**
* Limited configuration options available in POS
***
## Choose a condition or option on POS
When a product has more than one [method option](/documentation/manage/products/managing-method-options) that could apply to the items in the cart (for example, a resale product priced differently for **unused** vs **used** items, or a subscription with different tiers), POS prompts you to pick which one to use before the line can be added to the order.
**When this appears:**
* A resale product is priced by item condition and the scanned item could match more than one pricing option.
* A calendar or subscription product has multiple options targeted at different conditions for the variant in the cart.
**How it works:**
After tapping **Cycles** and ticking the product line, POS shows a warning badge, **Condition required** (or **Option required** for non-condition options), next to the line.
A chooser appears below the line listing each available option with its price summary. Tap the one that matches the item.
The chooser stays visible after you pick, so you can switch to a different option without unticking the line. The line summary updates to show the selected condition and price.
If only one option applies, POS picks it automatically and no chooser is shown.
***
## Verify a customer's ID on POS
If [ID verification](/documentation/configuration/risk/identity-verification) is enabled and a customer needs to verify their identity, staff can start the verification flow directly from POS without leaving the order.
The **Verify ID** action appears on the order details and post-purchase screens when a verification is required. Tapping it opens a screen with a QR code and a shareable verification link, so the customer can complete verification on their own phone.
From the order details or post-purchase screen, tap **Verify ID**. POS checks the customer's verification status automatically.
Ask the customer to scan the QR code with their phone, or copy the verification link from the **Verification link** field and send it to them.
The screen polls for status every few seconds and updates automatically once the customer finishes verification on their device. If the customer is already verified, POS shows that no verification is required.
The QR code and link both open the same secure verification page, powered by the same provider you've configured in **Settings > Risk**. Customers don't need to log in to your store to complete verification.
***
## Custom fields on POS rentals
Fill in [rental custom fields](/documentation/configuration/custom-data) as part of the create rentals flow on POS, so in-store bookings capture the same data as rentals created from the admin.
The rental method screen renders your shop's rental custom field definitions below the method options. Values flow through to the cycle at ingestion and appear on the rental record just like a field set from admin.
**Supported field types:**
* Single line text (renders as a text input)
* Multi line text (renders as a text area)
Other custom field types (date, boolean, references, etc.) are not shown on POS. Define text-based fields under **Settings > Custom data** if you need to capture them at the counter.
***
## Add-ons on POS rentals
[Add-ons](/documentation/manage/products/add-ons) attached to the selected rental option are applied on POS the same way as on the online storefront.
When staff apply a rental method, Supercycle reads the intent response and adds any required or optional add-on variants to the cart with the rental line. That includes deposits, damage protection, card authorisation, and any other add-on on the option. Quantity caps are respected: if an add-on is limited to one per cart, a second rental line that shares it will not add another copy.
***
## Contracts on draft orders on POS
If [e-signatures](/documentation/configuration/risk/esignatures) are enabled and **Generate contracts for draft orders** is on under **Settings > Risk**, POS can collect signatures while the cart is still a draft.
On the draft order details screen, staff can:
* See each unsigned contract on the draft
* Share a QR code or signing link for the customer to sign on their phone
* Email the signing request to the customer
Ready-to-sign email is not sent automatically for draft contracts. Use the POS actions when the customer is ready to sign. When the draft is completed as an order, those contracts carry over. See [Contracts on draft orders](/documentation/configuration/risk/esignatures#contracts-on-draft-orders).
***
## Apply a rental method on POS
On the Shopify POS app, a **Cycles** tile appears after setup.\
It may take a few minutes. It will be grayed out until you add eligible products to the cart.
Add the product(s) you want to apply a rental method to the order.
Go back to the tiles section and tap **Cycles**.
Select the product(s) from the list, choose your rental method (Calendar, Subscription, Membership, or Resale), configure the options (duration, start date, minimum term, etc.), and apply it to the cart.\
The original products in the cart are replaced by the rental items.
# Admin setup
Source: https://docs.supercycle.com/documentation/setup/admin-setup
Configure your Shopify admin for Supercycle
## Admin blocks
Supercycle provides admin UI extensions that display Supercycle information directly in your Shopify admin. These blocks appear on customer, order, and product pages, providing quick access to Supercycle data without leaving Shopify's key admin pages.
#### Customer block
Displays rental information on customer detail pages in the Shopify admin.
* Shows active rentals for the customer
* Displays rental status and key details
* Provides a link to view all rentals for the customer in Supercycle
#### Order block
Shows rental information associated with orders in the Shopify admin.
* Lists all rentals associated with the order
* Displays rental status and details in a table format
* Provides a link to view rentals in Supercycle
#### Product inventory block
Displays Supercycle inventory information on product pages in the Shopify admin.
* Shows the inventory for the product
* Displays availability and item counts
* Provides links to view rentals and items in Supercycle
## Enabling admin blocks
Navigate to the relevant page in your Shopify admin (customer, order, or product)
Scroll down the page and look for a section called **blocks**
Click on **+ Blocks** and add the Supercycle block to the page
Click on the **pin icon** to pin it to the page for all staff
# Importing products
Source: https://docs.supercycle.com/documentation/setup/importing-products
Import SKUs into Supercycle to create your rental inventory
To setup products with Supercycle, you'll need to import them from Shopify.
Once you import a product into Supercycle, inventory management is turned off in Shopify and Supercycle takes over responsibility for pricing and inventory management.
If you want Supercycle to automatically create serialized items on import, set quantities for your SKUs before importing.
Alternatively, skip this step and create inventory in Supercycle later.
From the Shopify products page, select the products you'd like to import.
Under bulk actions, scroll down to the bottom and select **Include in Supercycle** under **APPS**.
In the next page, confirm your import.
You should still make changes to product information such as descriptions, SKUs, tags and images from the Shopify product.
# Methods setup
Source: https://docs.supercycle.com/documentation/setup/methods-setup
Configure pricing for the circular methods you want to support on each product
Once you have imported products, you'll need to set up the pricing for them, depending on the methods you want to support.
## Add a method to a product
In Shopify Admin, head to **Supercycle** > [**Products**](https://admin.shopify.com/apps/supercycle/products/) > **Product**.
On the right hand side, select the method you want to enable.
Depending on the method you select, you'll need to set up pricing differently. For example, for a calendar rental, you'll need to set up rental periods and prices for each period.
* [Set pricing for subscriptions](/documentation/methods/subscription/product-setup)
* [Set pricing for calendar](/documentation/methods/calendar/product-setup)
* [Set pricing for membership](/documentation/methods/membership/product-setup)
* [Set pricing for resale](/documentation/methods/resale/overview)
# Getting started
Source: https://docs.supercycle.com/documentation/setup/setup-guide
Get the basics of Supercycle set up, from installation to your first circular method
## Setting up the basics
Supercycle is designed to be easy to set up and use. This guide will help you get started with the basics, including installing the app, adding products, and configuring your rental methods.
Supercycle can be installed from the [Shopify App Store](https://apps.shopify.com/supercycle).
The app is free on development stores and offers a 14 free trial for live stores.
If your products already exist in Shopify, proceed to step 2.
Create products in Shopify from **Products > Add product**
From the Shopify products page, select the products you’d like to import.
Under bulk actions, scroll down to the bottom and select **Include in Supercycle** under **APPS**.
In the next page, confirm your import.
In Shopify Admin, head to **Supercycle** > [**Products**](https://admin.shopify.com/apps/supercycle/products/) > **Product**.
In the variants table, under the status you want to add a product, select the current quantity dropdown followed by **Add inventory**.
On the next page, add a serial number on a new line for each item you’d like to create.
Alternatively, select **Add without serials** and enter a number of items. You can add serials to the newly created items later from their item page.
Click **Review** to continue.
Review the items you’re about to add and click **Add inventory** to complete.
In your Shopify admin, navigate to **Supercycle** > **Products**.
Select the product you want to set up.
On the right hand side, select the method you want to enable.
Click 'Turn on' for the method you want to enable.
Configure the rental periods or pricing groups depending on your method.
Click 'Save'.
In your Shopify admin, navigate to **Sales channels > Online Store.**
Click '**Customize**' on your chosen theme.
On the top-left, select 'App embeds'.
Enable '**Supercycle Engine**'.
## More advanced
[Checkout rules](/documentation/configuration/checkout/checkout-rules) help you ensure that customers can only add items to their cart that are available for the selected rental method and period. This is especially useful if you have multiple methods enabled for a product.
These can be enabled in your Shopify admin under **Settings > Checkout > Checkout rules > Add rule**.
The customer portal is a self-service area where customers can manage their orders, view their rental history, and update their personal information.
For guidance on setting up the customer portal, please refer to the [Customer portal documentation](/documentation/online-store/portal).
# Theme setup
Source: https://docs.supercycle.com/documentation/setup/theme-setup
Add Supercycle to your Shopify theme with the Methods app block and style settings
Supercycle works with Shopify Online Store 2.0. If you're using an older theme, you’ll likely need a developer to help set it up.
### Activate Supercycle in your theme
To activate Supercycle in your theme, you need to enable the app embed. This will add the Supercycle app embed to your theme, allowing you to add app blocks to your store.
From your Shopify admin, go to **Online store** and click **Customize** on the theme you want to add Supercycle to.
On the sidebar, click the **App embed** icon and click the **toggle** beside the Supercycle app embed to activate it.
Don't forget to save your changes before leaving the theme customizer.
***
### Add the Methods app block to your theme
Supercycle's customer-facing functionality is added to your theme as app blocks, allowing you to add rental functionality exactly where you want to use it on your store.
At a minimum, you'll need to add **Methods** app block to your product page.
***
### Update style settings
If you want to change the style or theming of Supercycle blocks, you can do this in the theme editor.
In your Shopify admin, go to **Online store > Themes** and click **Customize** on the theme you want to edit.
In the left panel, select **App embeds**, then click **Supercycle Engine** to expand its settings.
Scroll down to the **Style** section. Here you’ll find all the controls for changing how Supercycle blocks look.
Select **Save** before leaving the theme editor.
***
## FAQs
Supercycle’s methods block uses your theme’s existing **add to cart** button. Make sure the button is present in your product template and remove any “buy now” dynamic checkout buttons.
Yes. You can control the display order of methods by applying custom CSS.\
Use the `order` property to rearrange elements:
```css theme={null}
.supercycle-method--resale {
order: 1;
}
.supercycle-method--calendar {
order: 2;
}
.supercycle-method--membership-join,
.supercycle-method--membership-overview {
order: 3;
}
```
You can control whether Supercycle updates the add to cart button with a JavaScript variable:
* `window.supercycleStopSync = true` stops Supercycle from updating the add to cart button.
* `window.supercycleStopSync = false` re-enables it.
## Troubleshooting
Please reach out to support for assistance.
If the app blocks don't show up, check if the app embed is enabled. If the problem persists, the theme you are using might not be compatible with the app blocks out of the box. Contact support at [support@supercycle.com](mailto:support@supercycle.com) so we can fix it for you.
# Shopify notifications
Source: https://docs.supercycle.com/shopify-notifications
Customize Shopify's order and customer emails for rentals, subscriptions, and charges.
## Overview
Shopify sends its own set of transactional emails — order confirmation, shipping updates, refund notifications, and more — directly from your store. These are separate from [Supercycle notifications](/supercycle-notifications), which cover rental-, return-, and subscription-specific events.
Because Supercycle products are sold through Shopify checkout, many customer-facing communications (and your own staff notifications) are still triggered by Shopify. To make these emails work well for rental, membership, and subscription orders, you can extend Shopify's notification templates with small Liquid snippets that read Supercycle data from the order and line items.
Common reasons to customize these templates:
* Show rental **start** and **end dates** in order confirmations and staff notifications.
* Display different messaging for **subscription** orders versus one-off purchases.
* Tell customers about a **charge** (for example, a late fee or damage charge) created in Supercycle.
* Link customers to their **account portal** so they can manage a subscription.
## Walkthrough
You don't need to be a developer to add these snippets — most templates only need a small edit in Shopify's notification editor.
From your Shopify admin, go to **Settings** then **Notifications**.
Find the notification template you want to edit (for example, **Order confirmation**, **New order**, or **Order edited**) and click to open it.
Copy the snippet you need from the sections below and paste it into the relevant part of the subject line or email body.
Use Shopify's **Preview** to check how the email renders, then **Save**.
From the same screen, send a test email to yourself to confirm the content looks right with real order data.
Order tags are applied to an order after it is created, which means they are not available when the email template is rendered. Don't use tags to branch notification emails — use line item properties instead.
## Snippets
### Order has a subscription
Use to display different content if a line item has a subscription. This matches any order with a subscription — including recurring ones — so keep the message neutral, or combine it with the recurring check below. It can be used to show a link to your customer accounts, where the customer can manage their subscription.
```liquid theme={null}
{% assign has_subscription = false %}
{% for line_item in line_items %}
{% if line_item.selling_plan_allocation %}
{% assign has_subscription = true %}
{% break %}
{% endif %}
{% endfor %}
{% if has_subscription %}
{% endif %}
```
### Order vs recurring subscription Order
Use to display different content if it's a recurring order. Recurring orders created by Supercycle include a `rental_id` line item property — the original checkout order doesn't.
```liquid Email body theme={null}
{% assign is_recurring = false %}
{% for line_item in line_items %}
{% for prop in line_item.properties %}
{% if prop.first == 'rental_id' %}
{% assign is_recurring = true %}
{% endif %}
{% endfor %}
{% endfor %}
{% if is_recurring %}
Thank you for your subscription order
{% else %}
Thank you for your order
{% endif %}
```
To change the email subject too, paste this whole snippet — including the detection loop — into the **Email subject** field. It's the same check, written with `{%-` whitespace control so the subject renders as a single line:
```liquid Email subject theme={null}
{%- assign is_recurring = false -%}
{%- for line_item in line_items -%}
{%- for prop in line_item.properties -%}
{%- if prop.first == 'rental_id' -%}{%- assign is_recurring = true -%}{%- endif -%}
{%- endfor -%}
{%- endfor -%}
{%- if is_recurring -%}
Thanks for your subscription order, {{ customer.first_name }}
{%- else -%}
Thanks for your order, {{ customer.first_name }}
{%- endif -%}
```
Don't use `order.source_name == 'subscription_contract'` to detect recurring orders. Shopify changed `source_name` values without notice, and initial checkout orders can now match this condition too.
### Show start and end dates
Use to show the start and end dates of the line items. This example code works best when all the products have fixed dates enabled.
```liquid theme={null}
{% assign start_date = '' %}
{% assign end_date = '' %}
{% for line_item in order.line_items %}
{% for prop in line_item.properties %}
{% if prop.first == 'Start date' %}
{% assign start_date = prop.last %}
{% elsif prop.first == 'End date' %}
{% assign end_date = prop.last %}
{% endif %}
{% endfor %}
{% endfor %}
{% if start_date != '' %}
Start date: {{ start_date }}
{% endif %}
{% if end_date != '' %}
End date: {{ end_date }}
{% endif %}
```
You can incorporate this into Shopify's default notifications to display the dates in the product list if your template isn't outputting the line item properties.
#### Adding rental dates to staff notifications
To display rental start and end dates in staff notifications (like "New order" notifications), add this code within the line item loop in your notification template:
```liquid theme={null}
{%- assign rental_start_date = '' -%}
{%- assign rental_end_date = '' -%}
{%- for prop in line.properties -%}
{%- if prop.first == 'Start date' -%}
{%- assign rental_start_date = prop.last -%}
{%- elsif prop.first == 'End date' -%}
{%- assign rental_end_date = prop.last -%}
{%- endif -%}
{%- endfor -%}
{%- if rental_start_date != '' or rental_end_date != '' -%}
Rental details
{%- if rental_start_date != '' -%}
Start date: {{ rental_start_date }}
{%- endif -%}
{%- if rental_end_date != '' -%}
End date: {{ rental_end_date }}
{%- endif -%}
{%- endif -%}
```
This code should be placed inside the line item loop (where `line` represents each line item) to display rental dates for each product in the order.
### Check if the order has a charge
Use to show different content if the order notification is a normal order or for a charge created in Supercycle.
```liquid theme={null}
{% assign has_charge = false %}
{% assign charge_reason = '' %}
{% for line_item in order.line_items %}
{% for prop in line_item.properties %}
{% if prop.first == 'Charge' %}
{% assign has_charge = true %}
{% assign charge_reason = prop.last %}
{% endif %}
{% endfor %}
{% endfor %}
{% if has_charge %}
You have been charged: {{ charge_reason }}
{% else %}
Thank you for your order
{% endif %}
```
# Supercycle notifications
Source: https://docs.supercycle.com/supercycle-notifications
Customize and configure Supercycle's transactional customer email notifications
Supercycle has email notifications that are sent to the customer. Notifications are triggered by events, like a new return being requested, or credits being recredited.
## Customer email notifications
These emails are sent to your customers when certain events occur:
Sent when a customer requests a return.
Sent when a return request is approved.
Sent when a return has been received.
Sent when a return is recredited.
Reminds a customer that one or more rented items are due back soon. When [convert to purchase](/documentation/manage/cycles/convert-to-purchase#return-item-reminder-email) is enabled for customers, each eligible rental also gets a **Complete your purchase** button that links to their account to finish the conversion.
Sent when a customer subscribes to a plan.
Sent when a customer's subscription is cancelled from the Supercycle admin or customer account portal.
Sent when a customer's membership is paused from the Supercycle admin or customer account portal.
Sent ahead of a subscription renewal.
Sent when a customer's charge fails.
Sent when a customer has a rental contract that's ready to be signed.
Sent to remind a customer to sign an outstanding rental contract.
Sent once a customer has signed their rental contract.
Sent when a customer needs to complete identity verification before their rental can proceed.
## Editing email notifications
You can edit the wording of your notifications:
From your Shopify admin, go to apps then [Supercycle.](https://admin.shopify.com/apps/supercycle/)
Go to Settings then [Languages](https://admin.shopify.com/apps/supercycle/settings/languages/)
Click on the language you would like to change.
Under Customer mailers choose the email you would like to edit.
Edit the fields, then click **Save**.
## Preview email notifications
To preview an email notification:
From your Shopify admin, go to apps then [Supercycle.](https://admin.shopify.com/apps/supercycle/)
Go to Settings then [Emails.](https://admin.shopify.com/apps/supercycle/settings/emails/)
Hover over the email you want to preview and click **Preview.**
## Customize email branding
Set the logo and accent color used in every Supercycle customer email from **Settings → Emails**, under **Customize**:
* **Logo image URL** — a public HTTPS URL to your shop logo (for example, a file hosted on Shopify CDN).
* **Logo size** — the logo width in pixels, from **0** to **1080**. The default is **80px**. Use the slider to match your brand; very large values can look oversized in some email clients.
* **Accent color** — the color used for buttons and highlights in email templates.
From your Shopify admin, go to apps then [Supercycle.](https://admin.shopify.com/apps/supercycle/)
Go to Settings then [Emails.](https://admin.shopify.com/apps/supercycle/settings/emails/)
Under **Customize**, enter a **Logo image URL**, adjust **Logo size**, and pick an **Accent color**.
Click **Save**, then use **Preview** on any customer email to check how the logo renders.
## Change the reply-to email address
You can change the reply-to email address of the email notifications your customers receive:
From your Shopify admin, go to apps then [Supercycle.](https://admin.shopify.com/apps/supercycle/)
Go to Settings then [Emails.](https://admin.shopify.com/apps/supercycle/settings/emails/)
Edit the Reply to address field, then click **Save**.
The email will be sent from [noreply@notify.supercycle.com](mailto:noreply@notify.supercycle.com). If you want to
change this to a custom domain please get in touch.
## Custom SMTP
By default, Supercycle delivers all transactional emails through its own mail provider. If you'd prefer to send those emails from your own domain and mail infrastructure, you can connect a custom SMTP server.
We recommend using a dedicated transactional email service such as
[Postmark](https://postmarkapp.com/) or [Resend](https://resend.com/) rather
than a general-purpose mailbox. These services offer better deliverability,
bounce handling, and analytics for transactional mail.
When a custom SMTP server is configured and enabled:
* Outgoing customer emails are sent through your SMTP server.
* The **From** address you configure is used in place of Supercycle's default.
* If the SMTP integration is disabled or removed, Supercycle automatically falls back to its default mail provider — no emails are lost.
### Before you start
You'll need the following details from your SMTP provider (for example, Postmark, Resend, Amazon SES, SendGrid, Mailgun, or your own mail server):
* **Host** — the SMTP server hostname (for example, `smtp.sendgrid.net`).
* **Port** — typically `587` for STARTTLS or `465` for implicit TLS.
* **Username** and **password** — credentials for an account authorised to send mail.
* **From address** — the email address that will appear in the **From** header. Make sure this address is authorised by your provider, with SPF, DKIM, and DMARC records configured on your domain.
* **Authentication method** — usually `plain`. `login` and `cram_md5` are also supported.
### Configure custom SMTP
From your Shopify admin, go to apps then [Supercycle](https://admin.shopify.com/apps/supercycle/).
Go to **Settings** then **Emails**.
Scroll to the **Custom SMTP** section at the bottom of the page, toggle it on, then click **Configure SMTP server**.
Fill in **Host**, **Port**, **Username**, **Password**, and **From address**. Choose an **Authentication** method, and optionally set a **HELO domain**. Leave **Enable STARTTLS** checked unless your provider requires otherwise.
Click **Save**. Supercycle stores your credentials securely and your password is encrypted at rest.
### Send a test email
After saving, use **Send test email** to verify the configuration. Supercycle sends a test message to the shop's contact email address using the credentials you provided.
If the test fails, the error message returned by your SMTP server is shown so you can correct the host, port, credentials, or sender address.
### Edit or remove the integration
* To update credentials, click **Edit** on the Custom SMTP section. Leave the password field blank to keep the existing password.
* To stop using your SMTP server, toggle the section off or click **Remove**. Supercycle immediately reverts to its default mail provider for all future emails.