Shopify
Let hires look up orders, shipping and tracking, customers and products in your Shopify store, tag orders and add notes, and be woken when orders change. Refunds stay with your team.
Explore 7 actions and their permissionsExact inputs, sign-in scopes, access limits and approval rules.
With Shopify connected, a hire can:
- list orders by status, payment, fulfilment or date, or by Shopify search words (a customer's email, a SKU, a tag),
- read an order: what was bought, totals and refunds so far, payment and fulfilment, tracking numbers and links, the customer, the note and tags,
- find customers and read one with their latest orders,
- list products with their stock and prices,
- tag an order (like
needs-follow-up) and add a line to its note.
Money stays with your team
Hires can't refund, cancel, capture payments or edit orders: those aren't tools at all. When a hire thinks a refund or cancellation is due, it asks for your approval with the details, and someone on your team does it in Shopify.
New stores need a registered app, coming later
Since 1 January 2026, Shopify no longer lets stores create the admin custom apps (and their
shpat_ token) that Roster used to connect with. New stores will connect through a registered
Roster app, which isn't available yet. Stores that already have a custom app, or that make a Dev
Dashboard app of their own as below, can connect today, and existing connections keep working.
1. Make an app for Roster in Shopify
Roster uses Shopify's Admin API through an app installed on your store. Either:
- A Dev Dashboard app (for new setups): in Shopify's Dev Dashboard (the form in Roster links there too), in the same organization as your store, create an app, give it the scopes below, and install it on the store. Copy its Client ID and Client secret from its settings.
- A custom app your store already has: in your store's admin, Settings → Apps → Develop
apps. Shopify no longer lets stores make new ones, but existing ones keep working. Copy its
Admin API access token (starts with
shpat_).
Scopes: read_orders, read_customers and read_products; read_all_orders to see orders
older than 60 days; and write_orders if hires should tag orders and add notes. Customer names,
emails and phone numbers are protected data at Shopify: allow the app the customer fields hires
should see.
2. Connect it in Roster
- Open Integrations → Tools → Add a tool, search for Shopify and choose it.
- How Roster signs in: A Dev Dashboard app (paste the client ID and secret), or A custom app's Admin API access token (paste the token).
- Store: your store's
myshopify.comaddress, likebayt-studio.myshopify.com. It's shown under Settings → Domains; your own domain won't work here. - Click Connect. Roster checks the app (or token) with your store, and the connection shows Connected as your store's name. If Shopify refuses it, Roster says so and saves nothing.
3. Give hires access
On the hire's Tools tab, click Give access on Shopify:
- Read only: it can read orders, customers and products, and nothing else.
- Read and write: it can also tag orders and add to their notes.
- Customer details: Names, emails and phone numbers, or Names only to keep customers' contact details from it.
- Tags it may add: leave it empty for any tag.
Watching orders
A hire's responsibility can watch Shopify: it's woken when an order is placed or changes (paid, fulfilled, refunded, cancelled), with the list. Checking costs nothing when nothing changed.
If something goes wrong
- "The app isn't allowed this": the app is missing a scope, or access to a customer field. Add it in Shopify and install the app again.
- "Didn't accept the connection's credential": the token was revoked, or the Dev Dashboard app isn't in the same organization as the store.
- An old order can't be found: the app needs
read_all_ordersfor orders older than 60 days.
Tools and permissions reference
This reference is built from the same definitions Roster uses to connect Shopify and give hires access. It updates with each release.
Authentication and requested permissions
The account or app you connect sets the outer limit. Each hire's access can narrow it further. Connecting a tool gives it to no hire until you give access on that hire's Tools tab.
API key or access token
The custom app's token, starting with shpat_ (API credentials tab).
For: How Roster signs in: A custom app's Admin API access token.
OAuth client credentials
The Dev Dashboard app's client ID and secret (Settings).
For: How Roster signs in: A Dev Dashboard app (client ID and secret).
When making a key, use these permissions from the connection guide:
- read_orders
- read_all_orders (orders older than 60 days)
- read_customers
- read_products
- write_orders (for hires that tag or note orders)
Connection fields
| Field | What to provide |
|---|---|
How Roster signs insignInOptional | Use the value for your account or connection. Choices: A Dev Dashboard app (client ID and secret) (app); A custom app's Admin API access token (token). Starts with: |
Admin API access tokentokenRequired · sealed secret | The custom app's token, starting with shpat_ (API credentials tab). Shown when |
Client IDclientIdOptional | The Dev Dashboard app's client ID and secret (Settings). Shown when |
Client secretclientSecretOptional · sealed secret | Use the value for your account or connection. Shown when |
StoreshopRequired | Your store's myshopify.com address (Settings → Domains shows it), not your own domain. |
Per-hire limits
Read-only hires receive only actions that read. Read-and-write access also allows actions that change things, where the connection itself permits them. An empty resource allowlist usually means everything the connected account can reach; each field below explains its meaning.
| Field | What to provide |
|---|---|
Customer detailscustomersOptional | What it sees of your customers. Names only keeps emails and phone numbers from it. Choices: Names, emails and phone numbers (full); Names only (names). Starts with: |
Tags it may addtagsOptional | Order tags it may add. Leave empty for any. |
Actions
7 actions: 5 only read and 2 change something. A read action may still need approval when your workspace or hire is set to ask. A locked approval requirement always applies.
7 of 7 actions. Open an action for its arguments and full input schema.
list_ordersRead only
Orders in the store, newest first: by status, payment, fulfilment, date, or Shopify search words (a customer's email, a SKU, a tag).
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
statusOptional | "open" | "closed" | "cancelled" | "any" | See input schema below.Default: "any" |
paymentOptional | "paid" | "pending" | "authorized" | "partially_paid" | "partially_refunded" | "refunded" | "voided" | "expired" | See input schema below. |
fulfilmentOptional | "unfulfilled" | "partial" | "fulfilled" | "on_hold" | "scheduled" | "unshipped" | "shipped" | See input schema below. |
sinceOptional | string | only orders made on or after this date |
searchOptional | string | Shopify search words, like email:layla@client.example or sku:MUG-1 |
limitOptional | integer | See input schema below.Default: 20 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"status": {
"default": "any",
"type": "string",
"enum": [
"open",
"closed",
"cancelled",
"any"
]
},
"payment": {
"type": "string",
"enum": [
"paid",
"pending",
"authorized",
"partially_paid",
"partially_refunded",
"refunded",
"voided",
"expired"
]
},
"fulfilment": {
"type": "string",
"enum": [
"unfulfilled",
"partial",
"fulfilled",
"on_hold",
"scheduled",
"unshipped",
"shipped"
]
},
"since": {
"description": "only orders made on or after this date",
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"search": {
"description": "Shopify search words, like email:layla@client.example or sku:MUG-1",
"type": "string",
"maxLength": 200
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 50
}
}
}read_orderRead only
Read one order: what was bought, totals and refunds so far, payment and fulfilment, tracking numbers, the customer, its note and tags.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
orderRequired | string | the order's name like #1001, or its ID |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"order": {
"type": "string",
"minLength": 1,
"description": "the order's name like #1001, or its ID"
}
},
"required": [
"order"
]
}find_customersRead only
Find customers by name, email or phone, with how many orders they've made and what they've spent.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
searchRequired | string | See input schema below. |
limitOptional | integer | See input schema below.Default: 10 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"search": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"limit": {
"default": 10,
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [
"search"
]
}read_customerRead only
Read one customer, with their latest orders.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
idRequired | string | the customer's ID |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "the customer's ID"
}
},
"required": [
"id"
]
}list_productsRead only
Products in the store, with status, stock and variants' prices; by Shopify search words (title, SKU, vendor).
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
searchOptional | string | See input schema below. |
statusOptional | "active" | "draft" | "archived" | "any" | See input schema below.Default: "active" |
limitOptional | integer | See input schema below.Default: 20 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"search": {
"type": "string",
"maxLength": 200
},
"status": {
"default": "active",
"type": "string",
"enum": [
"active",
"draft",
"archived",
"any"
]
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 50
}
}
}tag_orderRead and write
Add tags to an order, for the team to filter by (like needs-follow-up). Changes nothing else.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
orderRequired | string | the order's name like #1001, or its ID |
tagsRequired | string[] | See input schema below. |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"order": {
"type": "string",
"minLength": 1,
"description": "the order's name like #1001, or its ID"
},
"tags": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
}
},
"required": [
"order",
"tags"
]
}note_orderRead and write
Add a line to an order's note, which the team sees in Shopify. What's there already stays.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
orderRequired | string | the order's name like #1001, or its ID |
textRequired | string | See input schema below. |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"order": {
"type": "string",
"minLength": 1,
"description": "the order's name like #1001, or its ID"
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 2000
}
},
"required": [
"order",
"text"
]
}Watches and incoming events
- This integration supports a responsibility that watches for changes. The guide above explains what it checks and how to limit it.
- No incoming webhook handler is declared for this integration.
Limits and troubleshooting
- Permission errors: check both the connected account's rights and the hire's resource and read/write limits.
- Expired or revoked access: reconnect or replace the key on the connection.
- Rate limits and unavailable services can interrupt work. The hire's timecard records the outcome.
- The action schema describes accepted inputs. It does not grant additional access or bypass approvals.