> ## Documentation Index
> Fetch the complete documentation index at: https://docs.r28.ai/charter/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Charter works for any HTTP API, including the user's own. The packs are examples of the result, not the limit: an API with no pack is declared the same way, following https://raw.githubusercontent.com/r28ai/charter/main/docs/.mintlify/skills/declaring-charter-tools/SKILL.md.
> Charter is for agents that act in customers' accounts: every call is checked field by field before it's sent, the app says whose account each call is for, and the same declarations list what each tool can reach. https://docs.r28.ai/charter/llms.txt says what it is and lists every page.

# Set up Shopify

> An app in Shopify's Dev Dashboard, installed on your own store, and the client ID and secret the shopify pack mints its tokens from, with a screenshot for each screen.

The [`shopify`](https://docs.r28.ai/charter/charter/packs/shopify) pack needs an app installed on your store.
Since January 2026 you make that app in Shopify's **Dev Dashboard**, and
instead of a token to copy, it gives you a client ID and secret. The pack
trades those for an Admin API token and trades them again before the token's
24 hours are up. It takes about five minutes.

Every Shopify link below opens in a new tab, so this page stays where you left it.

**1. Create the app**

Open the [Dev Dashboard](https://dev.shopify.com/dashboard) and click
**Create app** in the top-right corner.

![Shopify's Dev Dashboard Apps page, with a Create app button in the top-right corner.](https://mintcdn.com/r28-ai-inc/xppyW240SSmPx0hQ/charter/images/setup/shopify/01-dev-dashboard.webp?fit=max\&auto=format\&n=xppyW240SSmPx0hQ\&q=85\&s=53a0d0cc7982ef0273cb0b1ae31432b7)

Under **Start from Dev Dashboard**, give it a name and click **Create**. The
Shopify CLI option beside it is for building an app with its own code, which
this one doesn't need.

![The Create an app page: Start with Shopify CLI on the left, and Start from Dev Dashboard on the right with the app name Example App and a Create button.](https://mintcdn.com/r28-ai-inc/xppyW240SSmPx0hQ/charter/images/setup/shopify/02-create-app.webp?fit=max\&auto=format\&n=xppyW240SSmPx0hQ\&q=85\&s=a9f656e60a30d138bd27b90160dc58bc)

**2. Choose the scopes**

Shopify opens the app's first version. Scroll to **Access** and click
**Select scopes** beside **Scopes**.

![The version's Access section: empty Scopes and Optional scopes fields, each with a Select scopes link, and an empty Redirect URLs field.](https://mintcdn.com/r28-ai-inc/xppyW240SSmPx0hQ/charter/images/setup/shopify/04-scopes.webp?fit=max\&auto=format\&n=xppyW240SSmPx0hQ\&q=85\&s=a333a3aa8ad90d6733a95f563a363937)

Tick the Admin API scopes for whatever the tools you hand out touch: products,
orders, customers, inventory, locations, draft orders and fulfillments. Use
`read_` for tools that only read and `write_` for the rest. Then click **Done**.

![The Select scopes dialog: Admin API resources listed with a read and write checkbox for each, and Cancel and Done buttons.](https://mintcdn.com/r28-ai-inc/xppyW240SSmPx0hQ/charter/images/setup/shopify/05-select-scopes.webp?fit=max\&auto=format\&n=xppyW240SSmPx0hQ\&q=85\&s=20558eddaf4beb078c768ee215b2601a)

You can also type them straight into the field, separated by commas, for
example `read_products,read_orders,read_customers,read_inventory,read_locations`
for a store assistant that only reads. A tool that needs a scope you left out
names it in its error: *"Required access: `read_products` access scope"*.

**3. Release the version**

Click **Release** at the top of the page. Naming the version is optional.
Click **Release** again in the dialog.

![The Release this new version dialog, with an optional version name and message and a Release button.](https://mintcdn.com/r28-ai-inc/xppyW240SSmPx0hQ/charter/images/setup/shopify/07-release.webp?fit=max\&auto=format\&n=xppyW240SSmPx0hQ\&q=85\&s=78ae22c1b8860fb879f848f6025bfef9)

The version then shows as **Active**. Scopes only take effect once a version
with them is released, so if you change scopes later, release again.

![The app's Versions page, with the new version marked Active above the first one.](https://mintcdn.com/r28-ai-inc/xppyW240SSmPx0hQ/charter/images/setup/shopify/08-versions.webp?fit=max\&auto=format\&n=xppyW240SSmPx0hQ\&q=85\&s=6c87947936722712da215308c59e2577)

**4. Install it on your store**

From the app's **Home**, click **Install app**, pick your store, and confirm on
the store's admin.

![The store admin's Install app screen: a notice that the app hasn't been reviewed, the app Example App on My Store, the store data it needs access to, and an Install button.](https://mintcdn.com/r28-ai-inc/xppyW240SSmPx0hQ/charter/images/setup/shopify/10-install.webp?fit=max\&auto=format\&n=xppyW240SSmPx0hQ\&q=85\&s=a54c129e366586f7d66e153cb39f0d05)

*"This app hasn't been reviewed"* is expected. Shopify reviews only apps that
are listed on its App Store, and this one is yours.

The app and the store have to belong to the same organization, otherwise
Shopify refuses the grant the pack uses. A development store made from the
Dev Dashboard's **Dev stores** page is in yours automatically.

**5. Copy the client ID and secret**

Open the app's **Settings**. **Credentials** shows the **Client ID**, and the
**Secret** is revealed with the eye icon.

![The app's Settings page: a Credentials panel with the client ID and a masked secret with reveal, copy and Rotate buttons.](https://mintcdn.com/r28-ai-inc/xppyW240SSmPx0hQ/charter/images/setup/shopify/09-credentials.webp?fit=max\&auto=format\&n=xppyW240SSmPx0hQ\&q=85\&s=4968bb20efb9dd16aaa4a39f999ec5fb)

```bash theme={null}
export SHOPIFY_SHOP=my-store            # my-store.myshopify.com
export SHOPIFY_CLIENT_ID=3c1f6e9a...
export SHOPIFY_CLIENT_SECRET=...
```

That's all the configuration there is. The pack reads the three variables on
its next call, and so does the [MCP server](https://docs.r28.ai/charter/charter/using/mcp.md). The secret mints
every token, so keep it like one, and use **Rotate** if it leaks.

**6. Verify**

```python verify_shopify.py theme={null}
import asyncio

from charter.packs import shopify


async def main():
    print(await shopify.shop_get.ainvoke(variables={}))


asyncio.run(main())
```

Your store's name, domain and currency. It's the cheapest way to confirm the
credentials point at the store you meant.

## A store with an older custom app

A custom app made in the store admin before 2026 keeps its `shpat_` token,
which still works and doesn't expire. Set it as `SHOPIFY_ACCESS_TOKEN` instead
of the client ID and secret. When both are set, the pair wins.

## Your merchants' stores

An app that merchants install on their own stores uses the same Dev Dashboard
app, plus an app URL and a redirect URL, and each store gets its own token
through Shopify's consent flow. [Register a Shopify app](https://docs.r28.ai/charter/charter/auth/apps/shopify.md)
has those screens.

## Related

* [Shopify](https://docs.r28.ai/charter/charter/packs/shopify.md) — the pack, the three credential shapes, and why the store is part of the connection
* [Every pack](https://docs.r28.ai/charter/charter/auth/your-own-account.md) — what the other packs need, in one table


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.