shopify-common-errors
'Diagnose and fix common Shopify API errors including 401, 403, 422,
Allowed Tools
Provided by Plugin
shopify-pack
Claude Code skill pack for Shopify (30 skills)
Installation
This skill is included in the shopify-pack plugin:
/plugin install shopify-pack@claude-code-plugins-plus
Click to copy
Instructions
Shopify Common Errors
Overview
Quick-reference guide for the most common Shopify API errors with real error messages, causes, and fixes.
Prerequisites
- Shopify app with API credentials configured
- Access to application logs or console output
Instructions
Step 1: Identify the Error Type
Check whether the error is an HTTP status code error or a GraphQL userErrors response.
Step 2: Match Error Below and Apply Fix
401 Unauthorized
Response: "[API] Invalid API key or access token (unrecognized login or wrong password)"
Causes: Access token expired (merchant uninstalled/reinstalled), wrong header, or using Storefront token for Admin API.
Fix: Verify token format (shpat_ + 32 hex chars) and test with a simple shop.json GET request.
403 Forbidden
Response: "This action requires merchant approval for read_orders scope."
Fix: Add the needed scope to shopify.app.toml under [access_scopes] and re-trigger OAuth.
404 Not Found
Causes: Wrong API version in URL, resource was deleted, or store domain is incorrect.
Fix: Verify the API version exists by checking /admin/api/versions.json.
422 Unprocessable Entity
Common triggers: Missing required fields, duplicate handle/slug, invalid metafield type, price format issues (must be string like "29.99"), invalid country/province codes.
Fix: Check the errors object or userErrors array for specific field-level messages.
429 Too Many Requests (Rate Limited)
REST returns 429 with Retry-After header. GraphQL returns 200 with THROTTLED error code in the body and zero currentlyAvailable points.
Fix: See shopify-rate-limits skill for complete backoff implementation.
GraphQL userErrors (200 with Errors)
Critical: Shopify returns HTTP 200 even when mutations fail. Always check userErrors after every mutation:
const result = response.data.productCreate;
if (result.userErrors.length > 0) {
for (const err of result.userErrors) {
console.error(`Field ${err.field?.join(".")}: ${err.message} (${err.code})`);
}
throw new Error("Shopify validation failed");
}
5xx Server Errors
Shopify internal errors -- not your fault. Retry with exponential backoff and capture the X-Request-Id header for support tickets.
Output
- Error identified by HTTP status or GraphQL userErrors
- Root cause determined
- Fix applied and verified
Error Handling
| Status | Name | Retryable | Action |
|---|---|---|---|
| 401 | Unauthorized | No | Re-authenticate, verify token |
| 403 | Forbidden | No | Add missing scope, re-OAuth |
| 404 | Not Found | No | Check URL, API version, resource ID |
| 422 | Unprocessable | No | Fix validation errors in request body |
| 429 | Throttled | Yes | Backoff using Retry-After header |
| 500 | Server Error | Yes | Retry with backoff, report X-Request-Id |
| 503 | Unavailable | Yes | Shopify is overloaded, retry later |
Examples
Quick Diagnostic Script
Run auth, scope, and API version checks in one pass.
See Diagnostic Script for the complete shell script.