From shopify-pack
Upgrades Shopify API versions quarterly, migrates REST to GraphQL Admin API, and reviews breaking changes like ProductInput splits.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shopify-pack:shopify-upgrade-migrationThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Guide for upgrading Shopify API versions (quarterly releases) and migrating from the legacy REST Admin API to the GraphQL Admin API. REST was deprecated as a legacy API on October 1, 2024.
Guide for upgrading Shopify API versions (quarterly releases) and migrating from the legacy REST Admin API to the GraphQL Admin API. REST was deprecated as a legacy API on October 1, 2024.
# Check what API version you're using in code
grep -r "apiVersion" src/ --include="*.ts" --include="*.js"
grep -r "api_version" . --include="*.toml"
# Check what versions the store supports
curl -s -H "X-Shopify-Access-Token: $TOKEN" \
"https://$STORE/admin/api/versions.json" \
| jq '.supported_versions[] | {handle, display_name, supported, latest}'
Shopify releases quarterly: 2024-01, 2024-04, 2024-07, 2024-10. Versions are supported for ~12 months after release.
Key breaking changes by version:
| Version | Breaking Change | Migration |
|---|---|---|
| 2024-10 | ProductInput split into ProductCreateInput + ProductUpdateInput | Update mutations to use separate types |
| 2024-10 | REST declared legacy | Migrate to GraphQL Admin API |
| 2024-07 | InventoryItem.unitCost removed | Use InventoryItem.unitCost on InventoryLevel |
| 2024-04 | Cart warnings replace inventory userErrors (Storefront) | Update cart error handling |
| 2025-01 | New public apps must use GraphQL only | No REST for new public apps |
// BEFORE: REST Admin API
const restClient = new shopify.clients.Rest({ session });
const { body } = await restClient.get({
path: "products",
query: { limit: 50, status: "active" },
});
const products = body.products;
// AFTER: GraphQL Admin API
const graphqlClient = new shopify.clients.Graphql({ session });
const response = await graphqlClient.request(`{
products(first: 50, query: "status:active") {
edges {
node {
id
title
status
variants(first: 10) {
edges { node { id price sku } }
}
}
}
pageInfo { hasNextPage endCursor }
}
}`);
const products = response.data.products.edges.map((e: any) => e.node);
Common REST-to-GraphQL mappings:
| REST Endpoint | GraphQL Query/Mutation |
|---|---|
GET /products.json | query { products(first: N) { edges { node { ... } } } } |
POST /products.json | mutation { productCreate(product: $input) { ... } } |
PUT /products/{id}.json | mutation { productUpdate(product: $input) { ... } } |
GET /orders.json | query { orders(first: N) { edges { node { ... } } } } |
GET /customers/{id}.json | query { customer(id: $id) { ... } } |
POST /webhooks.json | mutation { webhookSubscriptionCreate(...) { ... } } |
// src/shopify.ts — update the version
const shopify = shopifyApi({
apiKey: process.env.SHOPIFY_API_KEY!,
apiSecretKey: process.env.SHOPIFY_API_SECRET!,
hostName: process.env.SHOPIFY_HOST_NAME!,
apiVersion: "2024-10", // <-- update this
// ...
});
# shopify.app.toml
[webhooks]
api_version = "2024-10" # Update here too
// BEFORE (pre-2024-10): single ProductInput for create AND update
const OLD_CREATE = `
mutation($input: ProductInput!) {
productCreate(input: $input) { ... }
}
`;
// AFTER (2024-10+): separate types
const NEW_CREATE = `
mutation($input: ProductCreateInput!) {
productCreate(product: $input) {
product { id title }
userErrors { field message }
}
}
`;
const NEW_UPDATE = `
mutation($input: ProductUpdateInput!) {
productUpdate(product: $input) {
product { id title }
userErrors { field message }
}
}
`;
| Error | Cause | Solution |
|---|---|---|
API version unsupported | Version too old | Check supported versions endpoint |
Field not found in type | Field renamed/removed in new version | Check release notes for migration |
ProductInput is not defined | Using old type on 2024-10+ | Use ProductCreateInput / ProductUpdateInput |
REST API 410 Gone | Endpoint removed | Migrate to GraphQL equivalent |
#!/bin/bash
OLD_VERSION="2024-04"
NEW_VERSION="2024-10"
echo "Upgrading Shopify API from $OLD_VERSION to $NEW_VERSION"
# Find all files referencing old version
echo "Files to update:"
grep -rn "$OLD_VERSION" . --include="*.ts" --include="*.js" --include="*.toml" --include="*.json"
# Replace (review diff before committing)
find . -type f \( -name "*.ts" -o -name "*.js" -o -name "*.toml" \) \
-exec sed -i "s/$OLD_VERSION/$NEW_VERSION/g" {} +
echo "Updated. Run tests: npm test"
// Log deprecation warnings from Shopify response headers
function checkDeprecationHeaders(headers: Headers): void {
const sunset = headers.get("x-shopify-api-deprecated-reason");
if (sunset) {
console.warn(`[SHOPIFY DEPRECATION] ${sunset}`);
// Alert your team
}
}
For CI integration during upgrades, see shopify-ci-integration.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin shopify-packProvides deprecated Shopify REST Admin API reference—endpoints, auth, rate limits—and GraphQL migration mappings. Use for legacy maintenance or migration planning.
Identifies Shopify API anti-patterns like ignoring userErrors, outdated versions, REST over GraphQL, missing GDPR webhooks, and timeouts. Reviews code with real examples.
Writes or explains Shopify Admin GraphQL queries and mutations for apps and integrations extending the admin. Use for understanding, designing, or generating operations before execution or config validation.