skills/saleor-domain/SKILL.md
Saleor e-commerce entity types, relationships, and identifier rules. Use before answering any question about Saleor entities, how they connect, identifier rules (slug vs name), channels, or what Configurator manages.
npx skillsauth add saleor/configurator saleor-domainInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Saleor is a headless e-commerce platform with a GraphQL API. This skill covers the core entities you'll work with in Configurator -- what they are, how they relate, and the rules that govern them.
product-modeling insteadconfigurator-schema insteadSales channels represent storefronts, marketplaces, or regions. Each has its own currency, country, product visibility, and pricing.
Defines the structure for a group of products: which attributes are shared (product-level) and which create variants (variant-level), plus shipping and tax settings.
Products are the items you sell. Each belongs to one product type and one category. Variants are the purchasable SKUs -- each with a unique SKU, specific attribute values, channel-specific pricing, and inventory tracking.
Typed fields attached to product types. Product-level attributes (Brand, Material) are shared across variants. Variant-level attributes (Size, Color) create separate SKUs.
Hierarchical product organization (tree structure). Each product belongs to one category. Used for navigation and filtering.
Curated product groupings that can span categories. A product can belong to many collections. Used for promotions and merchandising.
Inventory locations with stock tracking per variant. Associated with shipping zones.
Geographic shipping regions with country-based targeting and multiple shipping methods.
Channel ─────────────────────────────────────────────┐
├── Product Listings (visibility, pricing) │
├── Variant Listings (price, availability) │
└── Checkout/Order settings │
│
ProductType ─────────────────────────────────────────┤
├── productAttributes ──> Attribute │
├── variantAttributes ──> Attribute │
└── taxClass ──> TaxClass │
│
Product ─────────────────────────────────────────────┤
├── productType ──> ProductType │
├── category ──> Category │
├── collections ──> Collection[] │
└── variants ──> ProductVariant[] │
├── warehouse ──> Warehouse │
└── channelListings ────────────┘
Category (tree) └── subcategories ──> Category[]
ShippingZone └── warehouses ──> Warehouse[]
Each entity is identified by either its slug or name. This is how Configurator matches your local config to remote entities.
| Entity | Identifier | Mutable? |
|--------|------------|----------|
| Channel, Category, Collection, Product, Warehouse, Menu, Page | slug | No -- creates new |
| ProductType, PageType, Attribute, TaxClass, ShippingZone | name | No -- creates new |
Important: Changing an identifier creates a new entity and may orphan the old one. If you need to "rename" something, delete the old entity and create a new one.
Configurator manages your store's structure. Some things are runtime-only:
| Configurator Manages | Runtime Only | |---------------------|--------------| | Product structure and pricing | Orders | | Categories and collections | Customers | | Attributes and channels | Checkouts | | Warehouses and shipping zones | Payments | | Tax classes | Webhooks |
Here are practical examples showing how entities reference each other:
# A product references its type (by name), category (by slug path),
# and channels (by slug) for pricing:
products:
- name: "Classic T-Shirt"
slug: "classic-t-shirt"
productType: "T-Shirt" # -> matches productTypes[].name
category: "clothing/t-shirts" # -> matches category slug path
variants:
- sku: "TSHIRT-S-RED"
channelListings:
- channel: "us-store" # -> matches channels[].slug
price: 29.99
stocks:
- warehouse: "main-wh" # -> matches warehouses[].slug
quantity: 100
# A shipping zone references warehouses and targets countries:
shippingZones:
- name: "US Shipping"
countries: [US]
warehouses:
- "main-wh" # -> matches warehouses[].slug
| Mistake | Fix |
|---------|-----|
| Confusing slug-based vs name-based entities | Check the Identifier Rules table -- some use slug, others use name |
| Changing an identifier to "rename" | This creates a duplicate. Delete old + create new instead. |
| Creating products before their product type exists | Product types must be defined first. Configurator handles deploy order, but the type must be in your config. |
| Not understanding channel scope | Products aren't visible until they have a channel listing. Each channel has independent pricing. |
| Mixing up Categories (taxonomy) vs Collections (curation) | Categories = hierarchical, 1 per product, for navigation. Collections = flat, many per product, for merchandising. |
configurator-schema - Config.yml structure and validation rulesproduct-modeling - Product type design and attribute selectionconfigurator-cli - CLI commands for deploying configurationstools
Product type design, attribute selection, and variant planning for Saleor. Use whenever user mentions products, variants, SKUs, attributes, catalogs, or product types. Not for YAML syntax (use configurator-schema) or CLI commands (use configurator-cli).
development
Transforms external product data into Saleor config.yml format. Use whenever importing, migrating, or converting data from CSV, Excel, Shopify, or any external source. Not for manual config editing (use configurator-schema).
tools
End-to-end deployment workflow for Saleor Configurator: validate, diff, plan, deploy. Use whenever deploying, syncing, or debugging store configuration, or when building automation that chains CLI commands.
tools
Deployment failure diagnosis for Saleor Configurator. Use whenever any CLI command fails, when analyzing error messages, exit codes, or deployment reports, or when debugging partial failures.