configurator-cli
Configurator CLI
Overview
The Saleor Configurator CLI syncs your YAML configuration with a live Saleor instance. You define your store in config.yml, then use CLI commands to preview and apply changes.
In non-TTY mode (pipes, CI, subprocesses), all commands automatically output a JSON envelope. Use --json to force JSON in a terminal, or --text to force human-readable in non-TTY.
When to Use
- "How do I deploy my config?"
- "How do I pull the current store configuration?"
- "How do I preview changes before deploying?"
- "What flags does deploy support?"
- "How do I set up CI/CD for my store?"
- "What do the exit codes mean?"
- "How do I validate my config without network?"
- When NOT modeling products or writing YAML -- use
product-modelingorconfigurator-schemainstead
Core Commands
validate
Validates config.yml against the schema locally (no network required).
pnpm dlx @saleor/configurator validate
pnpm dlx @saleor/configurator validate --config custom-config.yml
pnpm dlx @saleor/configurator validate --json
introspect
Pulls the current configuration from a Saleor instance into config.yml.
pnpm dlx @saleor/configurator introspect --url=$SALEOR_URL --token=$SALEOR_TOKEN
Use cases: initial setup, backup before changes, restore from known-good state.
deploy
Pushes local config.yml changes to a Saleor instance.
pnpm dlx @saleor/configurator deploy --url=$SALEOR_URL --token=$SALEOR_TOKEN
Important flags:
--plan-- preview changes without applying (replaces--dry-run)--plan --json-- machine-readable deployment plan--fail-on-delete-- abort if any deletions would occur (exit code 6)--fail-on-breaking-- abort if breaking changes detected (exit code 7)--include <types>-- only deploy specific entity types--exclude <types>-- skip specific entity types--report-path <file>-- custom path for deployment report (default: auto-generated in CWD)--skip-media-- skip media file uploads
diff
Compares local config.yml with the remote Saleor instance.
pnpm dlx @saleor/configurator diff --url=$SALEOR_URL --token=$SALEOR_TOKEN
Output markers: + CREATE (new), ~ UPDATE (modified), - DELETE (removed).
Entity scoping:
--entity-type "Categories"-- filter to one entity type--entity "Categories/electronics"-- filter to one specific entity
Quick Reference
| Flag | Commands | Description |
|---|---|---|
--url |
deploy, diff, introspect | Saleor GraphQL endpoint URL |
--token |
deploy, diff, introspect | Saleor API authentication token |
--json |
All | Force JSON envelope output |
--text |
All | Force human-readable output |
--drift-check |
introspect | Exit code 1 if remote differs from local |
--include |
deploy, diff, introspect | Comma-separated entity types to include |
--exclude |
deploy, diff, introspect | Comma-separated entity types to exclude |
--fail-on-delete |
deploy | Exit code 6 if deletions detected |
--fail-on-breaking |
deploy | Exit code 7 if breaking changes detected |
--plan |
deploy | Show plan without executing changes |
--report-path |
deploy | Custom path for deployment report |
--skip-media |
deploy, diff | Skip media file comparison/upload |
--entity-type |
diff | Filter to one entity type |
--entity |
diff | Filter to one specific entity (Type/name) |
Environment Variables
Set credentials via .env.local (auto-loaded) or environment variables:
export SALEOR_URL="https://your-store.saleor.cloud/graphql/"
export SALEOR_TOKEN="your-api-token"
pnpm dlx @saleor/configurator deploy # No flags needed
JSON Envelope
In non-TTY mode, all commands output:
{
"command": "deploy",
"version": "1.3.0",
"exitCode": 0,
"result": { },
"logs": [{ "level": "info", "ts": "...", "message": "..." }],
"errors": []
}
Parse with jq:
OUTPUT=$(pnpm dlx @saleor/configurator validate --json 2>/dev/null)
echo "$OUTPUT" | jq '.result.valid'
echo "$OUTPUT" | jq '.result.errors[]'
Exit Codes
| Code | Meaning | Action |
|---|---|---|
| 0 | Success | Operation completed |
| 1 | Unexpected error | Check error message and logs |
| 2 | Authentication error | Verify URL and token |
| 3 | Network error | Check connectivity |
| 4 | Validation error | Fix config.yml syntax/schema |
| 5 | Partial failure | Some operations failed, check errors array |
| 6 | Deletion blocked | --fail-on-delete triggered |
| 7 | Breaking blocked | --fail-on-breaking triggered |
Common Workflows
Optimal Agent Workflow
# 1. Validate locally first
pnpm dlx @saleor/configurator validate --json
# 2. Compare with remote
pnpm dlx @saleor/configurator diff --json
# 3. Preview deployment
pnpm dlx @saleor/configurator deploy --plan --json
# 4. Execute deployment
pnpm dlx @saleor/configurator deploy --json
Safe CI/CD Deployment
pnpm dlx @saleor/configurator deploy --fail-on-delete
Entity-Scoped Debugging
# Drill into a specific entity type
pnpm dlx @saleor/configurator diff --entity-type "Categories" --json
# Drill into a specific entity
pnpm dlx @saleor/configurator diff --entity "Categories/electronics" --json
Selective Deployment
# Deploy only channels and products
pnpm dlx @saleor/configurator deploy --include channels,products
# Deploy everything except products
pnpm dlx @saleor/configurator deploy --exclude products
Common Mistakes
| Mistake | Fix |
|---|---|
| Deploying without previewing first | Always run diff or deploy --plan before deploy |
| Wrong URL format | URL must end with /graphql/ (e.g., https://store.saleor.cloud/graphql/) |
| Expired or invalid token | Regenerate your API token in Saleor Dashboard |
Not using --drift-check for CI drift detection |
Use introspect --drift-check to fail CI if remote config has drifted |
Forgetting --fail-on-delete in CI |
Prevents accidental deletions |
Using SALEOR_API_URL |
Correct env var is SALEOR_URL |
diff vs deploy --plan
diff |
deploy --plan |
|
|---|---|---|
| Purpose | Show field-level differences between local and remote | Show what operations deploy would execute |
| Output | Per-field changes (old -> new values) | Operation summary (creates, updates, deletes) |
| Scoping | --entity-type, --entity for drill-down |
No entity-level scoping |
| Use when | Debugging what changed, reviewing individual fields | Pre-deploy safety check, CI gates |
Recommended workflow: Use diff to understand changes, then deploy --plan to confirm the execution plan.
Rollback & Recovery
Configurator doesn't have a built-in rollback command, but you can recover using these patterns:
Before deploying (recommended):
# Save current remote state as backup
pnpm dlx @saleor/configurator introspect --config=backup-config.yml
After a bad deploy:
# Restore from backup
pnpm dlx @saleor/configurator deploy --config=backup-config.yml
Using git:
# Revert config.yml to last known good state
git checkout HEAD~1 -- config.yml
pnpm dlx @saleor/configurator deploy
Partial recovery (only fix specific entities):
# Deploy only the entity types that need fixing
pnpm dlx @saleor/configurator deploy --include=categories,products
See Also
- For complete command reference, see references/commands.md
- For all flags and options, see references/flags.md
- For error code details, see references/error-codes.md
- For CI/CD setup, see references/ci-cd.md
Related Skills
configurator-schema- Config.yml structure and validation rulessaleor-domain- Entity relationships and Saleor conceptsagent-output-parsing- JSON envelope parsing and drill-down patterns
More from saleor/configurator
creating-changesets
Creates changesets for semantic versioning. Use when adding changesets, preparing releases, determining version bumps (patch/minor/major), generating changelog entries, or documenting breaking changes.
66reviewing-typescript-code
Reviews TypeScript code for project-specific quality patterns. Use when writing entities, services, repositories, comparators, formatters, bootstrap methods, deployment stages, diff support, or reviewing PRs with functional patterns. Do NOT use for general TypeScript tutorials or non-Configurator projects.
38designing-zod-schemas
Designs Zod schemas following Zod-first development. Use when creating validation schemas, branded types, discriminated unions, transforms, refinements, or inferring TypeScript types with z.infer.
22understanding-saleor-domain
Explains Saleor e-commerce domain and Configurator business rules. Use when working with entity identification (slug vs name), YAML config structure, entity relationships, deployment pipeline stages, or synchronization logic. Do NOT use for general TypeScript questions or non-Saleor e-commerce platforms.
21analyzing-test-coverage
Creates and analyzes tests using Vitest and MSW patterns. Use when writing unit tests, integration tests, analyzing coverage gaps, setting up MSW handlers, vi.fn mocks, test builders, or debugging test failures. Do NOT use for non-test TypeScript code.
18writing-graphql-operations
Creates GraphQL queries and mutations using gql.tada and urql. Use when writing operations, implementing repositories, updating schema, or testing GraphQL code.
18