Saleor Channels
Before writing code
Fetch live docs:
- Fetch
https://docs.saleor.io/docs/developer/channels for channels overview
- Web-search
site:docs.saleor.io channel configuration currency countries for channel setup reference
- Web-search
site:docs.saleor.io per-channel pricing product for channel-aware pricing
- Web-search
site:docs.saleor.io warehouse allocation channels for warehouse-channel mapping
- Web-search
site:docs.saleor.io multi-brand multi-tenant channels for multi-brand patterns
Channel Concept
A channel represents a distinct sales context within a single Saleor instance. One Saleor deployment can serve multiple storefronts, regions, brands, or business models -- each as a separate channel.
| Aspect |
Detail |
| One instance |
Single Saleor backend, shared catalog and infrastructure |
| Many channels |
Each channel has its own currency, countries, pricing, and settings |
| Isolation |
Customers see only channel-scoped data (prices, availability) |
| Staff access |
Staff can manage all channels from one Dashboard |
Channel Configuration Fields
| Field |
Type |
Purpose |
name |
string |
Human-readable channel name |
slug |
string |
URL-safe identifier (used in API queries) |
currencyCode |
string |
ISO 4217 currency code (e.g., USD, EUR, GBP) |
defaultCountry |
string |
ISO 3166-1 alpha-2 country code |
countries |
string[] |
Countries where this channel operates |
isActive |
boolean |
Whether the channel is publicly accessible |
stockSettings.allocationStrategy |
enum |
PRIORITIZE_HIGH_STOCK or PRIORITIZE_SORTING_ORDER |
orderSettings.automaticallyConfirmAllNewOrders |
boolean |
Auto-confirm orders |
orderSettings.automaticallyFulfillNonShippableGiftCard |
boolean |
Auto-fulfill digital gift cards |
checkoutSettings.useLegacyErrorFlow |
boolean |
Legacy vs new error handling |
Per-Channel Pricing
Products have base prices, but each channel can define its own pricing:
| Pricing Layer |
Scope |
Purpose |
| Product variant price |
Per channel |
Base selling price in channel currency |
| Cost price |
Per channel |
Cost of goods for margin calculation |
| Channel currency |
Per channel |
All prices in this channel use this currency |
| Tax configuration |
Per channel |
Tax calculation rules |
| Discounts |
Per channel |
Promotions scoped to specific channels |
Pricing Assignment
| Entity |
Channel-Scoped Fields |
| Product variant |
channelListings.price, channelListings.costPrice |
| Product |
channelListings.isPublished, channelListings.publishedAt, channelListings.isAvailableForPurchase |
| Collection |
channelListings.isPublished, channelListings.publishedAt |
| Shipping method |
channelListings.price, channelListings.minimumOrderPrice, channelListings.maximumOrderPrice |
| Voucher |
channelListings.discountValue, channelListings.minSpent |
Country Assignment
Each channel defines a set of countries it serves:
| Aspect |
Detail |
| Shipping |
Only shipping methods for assigned countries are available |
| Tax |
Tax rules are applied based on channel country settings |
| Address validation |
Checkout validates against channel's country list |
| Warehouse selection |
Warehouses are linked to countries within channels |
Warehouse Allocation
Warehouses and channels are connected through country assignments:
| Concept |
Relationship |
| Warehouse |
Has a list of shipping zones it serves |
| Shipping zone |
Has a list of countries |
| Channel |
Has a list of countries |
| Allocation |
Saleor allocates stock from warehouses that serve the channel's countries |
Allocation Strategies
| Strategy |
Behavior |
PRIORITIZE_SORTING_ORDER |
Allocate from warehouses in their configured sort order (default) |
PRIORITIZE_HIGH_STOCK |
Allocate from the warehouse with the most stock |
Channel-Aware GraphQL Queries
Most storefront queries require a channel argument:
| Query |
Channel Behavior |
products(channel: "us") |
Returns products published in the US channel |
product(slug: "tee", channel: "us") |
Returns US-channel pricing and availability |
collections(channel: "us") |
Returns collections published in the US channel |
checkout(channel: "us") |
Creates checkout with US currency and settings |
shippingMethods(channel: "us") |
Returns methods available for US channel countries |
Queries without the channel argument are reserved for staff/admin operations and return data across all channels.
Channel Creation via GraphQL
| Mutation |
Purpose |
channelCreate |
Create a new channel with currency and country settings |
channelUpdate |
Modify channel settings (countries, stock strategy) |
channelDelete |
Remove a channel (irreversible) |
channelActivate |
Make a channel publicly accessible |
channelDeactivate |
Hide a channel from public access |
Channel Creation Fields
| Input Field |
Required |
Purpose |
name |
Yes |
Display name |
slug |
Yes |
URL-safe identifier |
currencyCode |
Yes |
Channel currency |
defaultCountry |
Yes |
Primary country |
addCountries |
No |
Additional countries |
stockSettings |
No |
Allocation strategy |
orderSettings |
No |
Auto-confirm, fulfillment rules |
Multi-Brand Architecture
Channels enable multi-brand commerce from a single Saleor instance:
| Brand |
Channel |
Storefront |
Currency |
| Brand A (US) |
brand-a-us |
brand-a.com |
USD |
| Brand A (EU) |
brand-a-eu |
brand-a.eu |
EUR |
| Brand B (US) |
brand-b-us |
brand-b.com |
USD |
| Wholesale |
wholesale |
wholesale.brand-a.com |
USD |
Multi-Brand Considerations
| Aspect |
Approach |
| Product catalog |
Shared catalog, per-channel publication and pricing |
| Customers |
Shared customer base across channels |
| Orders |
Each order belongs to one channel |
| Staff permissions |
Channel-level access control for staff members |
| Apps |
Apps can be channel-aware or cross-channel |
| Warehouses |
Shared warehouses, per-channel allocation |
Channel Permissions
| Permission |
Scope |
MANAGE_CHANNELS |
Create, update, delete channels |
| Channel-restricted staff |
Staff members can be limited to specific channels |
| App permissions |
Apps operate across all channels unless filtered |
Best Practices
- Create separate channels for each currency -- Saleor requires one currency per channel
- Use channel slugs that are descriptive and URL-friendly (e.g.,
us-store, eu-store)
- Assign countries to channels carefully -- shipping and tax rules depend on this
- Use the
PRIORITIZE_SORTING_ORDER allocation strategy when warehouse priority matters
- Publish products to channels explicitly -- unpublished products are invisible to storefronts
- Restrict staff access to relevant channels using channel-level permissions
- Use one channel per storefront for clear data isolation
- Plan channel structure before going live -- migrating orders between channels is not supported
Fetch the Saleor channels documentation for exact mutation inputs, allocation strategy details, and multi-brand configuration patterns before implementing.
1---2name: saleor-channels3description: Configure Saleor channels — multi-currency, multi-region, per-channel pricing, warehouse allocation, and multi-brand setups. Use when managing multi-channel commerce.4---56# Saleor Channels78## Before writing code910**Fetch live docs**:111. Fetch `https://docs.saleor.io/docs/developer/channels` for channels overview122. Web-search `site:docs.saleor.io channel configuration currency countries` for channel setup reference133. Web-search `site:docs.saleor.io per-channel pricing product` for channel-aware pricing144. Web-search `site:docs.saleor.io warehouse allocation channels` for warehouse-channel mapping155. Web-search `site:docs.saleor.io multi-brand multi-tenant channels` for multi-brand patterns1617## Channel Concept1819A channel represents a distinct sales context within a single Saleor instance. One Saleor deployment can serve multiple storefronts, regions, brands, or business models -- each as a separate channel.2021| Aspect | Detail |22|--------|--------|23| One instance | Single Saleor backend, shared catalog and infrastructure |24| Many channels | Each channel has its own currency, countries, pricing, and settings |25| Isolation | Customers see only channel-scoped data (prices, availability) |26| Staff access | Staff can manage all channels from one Dashboard |2728## Channel Configuration Fields2930| Field | Type | Purpose |31|-------|------|---------|32| `name` | string | Human-readable channel name |33| `slug` | string | URL-safe identifier (used in API queries) |34| `currencyCode` | string | ISO 4217 currency code (e.g., `USD`, `EUR`, `GBP`) |35| `defaultCountry` | string | ISO 3166-1 alpha-2 country code |36| `countries` | string[] | Countries where this channel operates |37| `isActive` | boolean | Whether the channel is publicly accessible |38| `stockSettings.allocationStrategy` | enum | `PRIORITIZE_HIGH_STOCK` or `PRIORITIZE_SORTING_ORDER` |39| `orderSettings.automaticallyConfirmAllNewOrders` | boolean | Auto-confirm orders |40| `orderSettings.automaticallyFulfillNonShippableGiftCard` | boolean | Auto-fulfill digital gift cards |41| `checkoutSettings.useLegacyErrorFlow` | boolean | Legacy vs new error handling |4243## Per-Channel Pricing4445Products have base prices, but each channel can define its own pricing:4647| Pricing Layer | Scope | Purpose |48|--------------|-------|---------|49| Product variant price | Per channel | Base selling price in channel currency |50| Cost price | Per channel | Cost of goods for margin calculation |51| Channel currency | Per channel | All prices in this channel use this currency |52| Tax configuration | Per channel | Tax calculation rules |53| Discounts | Per channel | Promotions scoped to specific channels |5455### Pricing Assignment5657| Entity | Channel-Scoped Fields |58|--------|----------------------|59| Product variant | `channelListings.price`, `channelListings.costPrice` |60| Product | `channelListings.isPublished`, `channelListings.publishedAt`, `channelListings.isAvailableForPurchase` |61| Collection | `channelListings.isPublished`, `channelListings.publishedAt` |62| Shipping method | `channelListings.price`, `channelListings.minimumOrderPrice`, `channelListings.maximumOrderPrice` |63| Voucher | `channelListings.discountValue`, `channelListings.minSpent` |6465## Country Assignment6667Each channel defines a set of countries it serves:6869| Aspect | Detail |70|--------|--------|71| Shipping | Only shipping methods for assigned countries are available |72| Tax | Tax rules are applied based on channel country settings |73| Address validation | Checkout validates against channel's country list |74| Warehouse selection | Warehouses are linked to countries within channels |7576## Warehouse Allocation7778Warehouses and channels are connected through country assignments:7980| Concept | Relationship |81|---------|-------------|82| Warehouse | Has a list of shipping zones it serves |83| Shipping zone | Has a list of countries |84| Channel | Has a list of countries |85| Allocation | Saleor allocates stock from warehouses that serve the channel's countries |8687### Allocation Strategies8889| Strategy | Behavior |90|----------|----------|91| `PRIORITIZE_SORTING_ORDER` | Allocate from warehouses in their configured sort order (default) |92| `PRIORITIZE_HIGH_STOCK` | Allocate from the warehouse with the most stock |9394## Channel-Aware GraphQL Queries9596Most storefront queries require a `channel` argument:9798| Query | Channel Behavior |99|-------|-----------------|100| `products(channel: "us")` | Returns products published in the US channel |101| `product(slug: "tee", channel: "us")` | Returns US-channel pricing and availability |102| `collections(channel: "us")` | Returns collections published in the US channel |103| `checkout(channel: "us")` | Creates checkout with US currency and settings |104| `shippingMethods(channel: "us")` | Returns methods available for US channel countries |105106Queries without the `channel` argument are reserved for staff/admin operations and return data across all channels.107108## Channel Creation via GraphQL109110| Mutation | Purpose |111|----------|---------|112| `channelCreate` | Create a new channel with currency and country settings |113| `channelUpdate` | Modify channel settings (countries, stock strategy) |114| `channelDelete` | Remove a channel (irreversible) |115| `channelActivate` | Make a channel publicly accessible |116| `channelDeactivate` | Hide a channel from public access |117118### Channel Creation Fields119120| Input Field | Required | Purpose |121|-------------|----------|---------|122| `name` | Yes | Display name |123| `slug` | Yes | URL-safe identifier |124| `currencyCode` | Yes | Channel currency |125| `defaultCountry` | Yes | Primary country |126| `addCountries` | No | Additional countries |127| `stockSettings` | No | Allocation strategy |128| `orderSettings` | No | Auto-confirm, fulfillment rules |129130## Multi-Brand Architecture131132Channels enable multi-brand commerce from a single Saleor instance:133134| Brand | Channel | Storefront | Currency |135|-------|---------|-----------|----------|136| Brand A (US) | `brand-a-us` | `brand-a.com` | USD |137| Brand A (EU) | `brand-a-eu` | `brand-a.eu` | EUR |138| Brand B (US) | `brand-b-us` | `brand-b.com` | USD |139| Wholesale | `wholesale` | `wholesale.brand-a.com` | USD |140141### Multi-Brand Considerations142143| Aspect | Approach |144|--------|----------|145| Product catalog | Shared catalog, per-channel publication and pricing |146| Customers | Shared customer base across channels |147| Orders | Each order belongs to one channel |148| Staff permissions | Channel-level access control for staff members |149| Apps | Apps can be channel-aware or cross-channel |150| Warehouses | Shared warehouses, per-channel allocation |151152## Channel Permissions153154| Permission | Scope |155|------------|-------|156| `MANAGE_CHANNELS` | Create, update, delete channels |157| Channel-restricted staff | Staff members can be limited to specific channels |158| App permissions | Apps operate across all channels unless filtered |159160## Best Practices161162- Create separate channels for each currency -- Saleor requires one currency per channel163- Use channel slugs that are descriptive and URL-friendly (e.g., `us-store`, `eu-store`)164- Assign countries to channels carefully -- shipping and tax rules depend on this165- Use the `PRIORITIZE_SORTING_ORDER` allocation strategy when warehouse priority matters166- Publish products to channels explicitly -- unpublished products are invisible to storefronts167- Restrict staff access to relevant channels using channel-level permissions168- Use one channel per storefront for clear data isolation169- Plan channel structure before going live -- migrating orders between channels is not supported170171Fetch the Saleor channels documentation for exact mutation inputs, allocation strategy details, and multi-brand configuration patterns before implementing.