Channel API guide
Getting channel details
Use channel
query to get channel details.
Channel query requires channel ID, but from Saleor 3.6 it can be executed with channel slug too.
Available fields:
id
: Channel object IDslug
: When using channel-dependant queries, the slug is used to select the right one (for example, when requesting Product details)name
: Channel nameisActive
: Flag signalling that the channel is available for shop customers.currencyCode
: Currency code used by the channel.hasOrders
: Returnstrue
when there are already created orders using that channel. If that's the only channel using this currency, you won't be able to remove it.defaultCountry
: Default country for the channel. The default country will be used in checkout to determine the stock quantities or calculate taxes when the country was not explicitly provided, either as a query parameter or through a shipping address.warehouses
: Warehouses that are available in the given channel.countries
: List of shippable countries for the channel.availableShippingMethodsPerCountry
: Shipping methods that are available for the channel.stockSettings
: contains all stock-related settings, e.g. the allocation strategy for the channel.orderSettings
: Channel-specific order settings.
Request:
query {
channel(slug: "mobile") {
id
slug
name
isActive
currencyCode
hasOrders
defaultCountry {
code
country
}
warehouses {
slug
}
countries {
code
country
}
availableShippingMethodsPerCountry {
countryCode
shippingMethods {
id
name
}
}
stockSettings {
allocationStrategy
}
orderSettings {
allowUnpaidOrders
}
}
}
Response:
{
"data": {
"channel": {
"id": "Q2hhbm5lbDo0MzM=",
"slug": "mobile",
"name": "Mobile",
"isActive": false,
"currencyCode": "USD",
"hasOrders": true,
"defaultCountry": {
"code": "US",
"country": "United States of America"
},
"warehouses": [
{
"slug": "oceania"
},
{
"slug": "europe"
}
],
"availableShippingMethodsPerCountry": [
{
"countryCode": "AD",
"shippingMethods": [
{
"id": "U2hpcHBpbmdNZXRob2Q6Mg==",
"name": "DHL"
},
{
"id": "U2hpcHBpbmdNZXRob2Q6Mw==",
"name": "UPS"
},
{
"id": "U2hpcHBpbmdNZXRob2Q6NA==",
"name": "Registered priority"
},
{
"id": "U2hpcHBpbmdNZXRob2Q6NQ==",
"name": "DB Schenker"
}
]
}
// ... more countries
],
"stockSettings": {
"allocationStrategy": "PRIORITIZE_HIGH_STOCK"
},
"orderSettings": {
"allowUnpaidOrders": false
}
}
}
}
Permissions
Listing channels is allowed only for users with the active isStaff
flag.
You need the MANAGE_CHANNELS
permission to create, edit, and remove channels.
Changing ChannelListing
does not require additional permissions. For example, changing Product availability requires only MANAGE_PRODUCTS
permission.
Objects with customized per-channel visibility are restricted by channel permissions. If a user with restricted channel access fetches per-channel objects, only objects from accessible channels will be returned. You can read more about channel permissions here.
Creating a new channel
You can create a new channel using channelCreate
mutation.
During checkout creation, you can define the allocation strategy. Right now the
two possible options are available: PRIORITIZE_HIGH_STOCK
and PRIORITIZE_SORTING_ORDER
,
the PRIORITIZE_SORTING_ORDER
strategy is used as default.
You can read more about the allocation strategies here
.
Request:
mutation {
channelCreate(
input: {
currencyCode: "USD"
defaultCountry: US
name: "Mobile"
slug: "mobile"
stockSettings: { allocationStrategy: PRIORITIZE_HIGH_STOCK }
}
) {
channel {
id
isActive
name
slug
currencyCode
defaultCountry {
code
country
}
stockSettings {
allocationStrategy
}
}
errors {
code
field
message
}
}
}
Response:
{
"data": {
"channelCreate": {
"channel": {
"id": "Q2hhbm5lbDo0MzM=",
"isActive": false,
"name": "Mobile",
"slug": "mobile",
"currencyCode": "USD",
"defaultCountry": {
"code": "US",
"country": "United States of America"
},
"stockSettings": {
"allocationStrategy": "PRIORITIZE_HIGH_STOCK"
}
},
"errors": []
}
}
}
Channel list
Because some of the channels may be considered non-public (for example - a channel for business partners), non-staff users cannot use the channels
query.
Request:
query {
channels {
name
}
}
Response:
{
"data": {
"channels": [
{
"name": "Mobile"
},
{
"name": "Website"
}
]
}
}
Activate / Deactivate channel
If you want to make the channel unavailable for customers, you can change its status to deactivated
using channelDeactivate
mutation:
mutation {
channelDeactivate(slug: "default-channel") {
channel {
name
isActive
}
errors {
message
}
}
}
Response:
{
"data": {
"channelDeactivate": {
"channel": {
"name": "Facebook",
"isActive": false
},
"channelErrors": []
}
}
}
And to reverse the previous operation use the channelActivate
mutation:
mutation {
channelActivate(slug: "default-channel") {
channel {
name
isActive
}
errors {
message
}
}
}
Response:
{
"data": {
"channelDeactivate": {
"channel": {
"name": "Facebook",
"isActive": true
},
"channelErrors": []
}
}
}
Reorder warehouses within channels
The warehouses assigned to the channel can be sorted. The provided order defines the
warehouses' order used in PRIORITIZE_SORTING_ORDER
allocation strategy.
The sort_order
in moves
input represents the new relative position of the item.
So when 1 is provided, the item will be moved one position forward; when -1 - one
position backward.
Let's assume that we have a channel
with three warehouses in the following order.
{
"data": {
"channel": {
"id": "Q2hhbm5lbDox",
"warehouses": [
{
"id": "V2FyZWhvdXNlOjU1NTZiOWI0LTc1ZTItNGI3YS1hZWM1LTQxOTY4NDA2OGE4OA==",
"slug": "europe"
},
{
"id": "V2FyZWhvdXNlOjQwZWY1MTQwLWQ5OTYtNDVlNy04NzUzLTlkZThkMTdhMjg1Yw==",
"slug": "oceania"
},
{
"id": "V2FyZWhvdXNlOjY4M2FkMzZhLTRmNjktNDI2ZS1iYzUyLTMyZGJiZTQ2NjUyZA==",
"slug": "americas"
}
]
}
}
}
To move the americas
warehouse to the first place and the europe
warehouse to
third, we can run the following mutation.
mutation {
channelReorderWarehouses(
channelId: "Q2hhbm5lbDox"
moves: [
{
# move for `americas` warehouse
id: "V2FyZWhvdXNlOjY4M2FkMzZhLTRmNjktNDI2ZS1iYzUyLTMyZGJiZTQ2NjUyZA=="
sortOrder: -2
}
{
# move for `europe` warehouse
id: "V2FyZWhvdXNlOjU1NTZiOWI0LTc1ZTItNGI3YS1hZWM1LTQxOTY4NDA2OGE4OA=="
sortOrder: 1
}
]
) {
channel {
id
warehouses {
id
slug
}
}
errors {
field
code
message
warehouses
}
}
}
And as a response, we get:
{
"data": {
"channelReorderWarehouses": {
"channel": {
"id": "Q2hhbm5lbDox",
"warehouses": [
{
"id": "V2FyZWhvdXNlOjY4M2FkMzZhLTRmNjktNDI2ZS1iYzUyLTMyZGJiZTQ2NjUyZA==",
"slug": "americas"
},
{
"id": "V2FyZWhvdXNlOjQwZWY1MTQwLWQ5OTYtNDVlNy04NzUzLTlkZThkMTdhMjg1Yw==",
"slug": "oceania"
},
{
"id": "V2FyZWhvdXNlOjU1NTZiOWI0LTc1ZTItNGI3YS1hZWM1LTQxOTY4NDA2OGE4OA==",
"slug": "europe"
}
]
},
"errors": []
}
}
}
Removing a channel
Channels can be removed only when:
- There are no orders created in them.
- If there are orders created,
targetChannel
is required. Its currency has to be the same as the channel you are about to delete. All orders will be moved totargetChannel
.
channelDelete
mutation takes input:
id
: ID of the Channel that will be deletedchannelId
: all existing orders will be moved into this channel
channelDelete(
id: ID!
input: ChannelDeleteInput
): ChannelDelete
input ChannelDeleteInput {
channelId: ID! # ID of the channel to migrate orders from origin channel.
}
Errors
type ChannelError {
field: String
message: String
code: ChannelErrorCode!
}
enum ChannelErrorCode {
ALREADY_EXISTS
GRAPHQL_ERROR
INVALID
NOT_FOUND
REQUIRED
UNIQUE
CHANNEL_TARGET_ID_MUST_BE_DIFFERENT
CHANNELS_CURRENCY_MUST_BE_THE_SAME
}
ChannelErrorCode
values:
ALREADY_EXISTS
: Object already exists in the databaseGRAPHQL_ERROR
: Wrong queryINVALID
: Invalid data providedNOT_FOUND
: Could not found objectREQUIRED
: Missing required fieldsUNIQUE
: Provided value for field needs to be uniqueCHANNEL_TARGET_ID_MUST_BE_DIFFERENT
: Cannot move orders into the channel you want to deleteCHANNELS_CURRENCY_MUST_BE_THE_SAME
: Target channel has to have the same currency