Add an existing source to a collection
Description
Add an existing shareable source to a collection. Use `linkedSource` with a `sourceId` when an app
has already created a reusable source and wants to link it to another collection.
Query
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}
Variables
{
"collection": {
"id": "gid://shopify/Collection/142458073",
"sourcesToCreate": [
{
"linkedSource": {
"sourceId": "gid://shopify/CollectionConditionsSource/129168209"
}
}
]
}
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/unstable/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation CollectionUpdate($collection: CollectionUpdateInput!) { collectionUpdate(collection: $collection) { collection { id title sources { __typename id title } } userErrors { field message } } }",
"variables": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"sourcesToCreate": [
{
"linkedSource": {
"sourceId": "gid://shopify/CollectionConditionsSource/129168209"
}
}
]
}
}
}'
React Router
import { authenticate } from "../shopify.server";
export const loader = async ({request}) => {
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}`,
{
variables: {
"collection": {
"id": "gid://shopify/Collection/142458073",
"sourcesToCreate": [
{
"linkedSource": {
"sourceId": "gid://shopify/CollectionConditionsSource/129168209"
}
}
]
}
},
},
);
const json = await response.json();
return json.data;
}
Ruby
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"collection": {
"id": "gid://shopify/Collection/142458073",
"sourcesToCreate": [
{
"linkedSource": {
"sourceId": "gid://shopify/CollectionConditionsSource/129168209"
}
}
]
}
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}`,
"variables": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"sourcesToCreate": [
{
"linkedSource": {
"sourceId": "gid://shopify/CollectionConditionsSource/129168209"
}
}
]
}
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}' \
--variables \
'{
"collection": {
"id": "gid://shopify/Collection/142458073",
"sourcesToCreate": [
{
"linkedSource": {
"sourceId": "gid://shopify/CollectionConditionsSource/129168209"
}
}
]
}
}'
Direct API Access
const response = await fetch('shopify:admin/api/unstable/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}
`,
variables: {
"collection": {
"id": "gid://shopify/Collection/142458073",
"sourcesToCreate": [
{
"linkedSource": {
"sourceId": "gid://shopify/CollectionConditionsSource/129168209"
}
}
]
}
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"collectionUpdate": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "All snowboards",
"sources": [
{
"__typename": "CollectionConditionsSource",
"id": "gid://shopify/CollectionConditionsSource/129168209",
"title": "Shareable Source Owned By Shopify Web"
}
]
},
"userErrors": []
}
}
Apply a rule on a manual collection
Description
Trying to apply a rule on a manual collection returns an error.
Query
mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
userErrors {
field
message
}
}
}
Variables
{
"input": {
"id": "gid://shopify/Collection/442946009",
"ruleSet": {
"rules": [
{
"column": "IS_PRICE_REDUCED",
"relation": "IS_NOT_SET",
"condition": ""
}
],
"appliedDisjunctively": true
}
}
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/unstable/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation updateCollectionRules($input: CollectionInput!) { collectionUpdate(input: $input) { collection { id title description handle ruleSet { rules { column relation condition } appliedDisjunctively } } userErrors { field message } } }",
"variables": {
"input": {
"id": "gid://shopify/Collection/442946009",
"ruleSet": {
"rules": [
{
"column": "IS_PRICE_REDUCED",
"relation": "IS_NOT_SET",
"condition": ""
}
],
"appliedDisjunctively": true
}
}
}
}'
React Router
import { authenticate } from "../shopify.server";
export const loader = async ({request}) => {
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
userErrors {
field
message
}
}
}`,
{
variables: {
"input": {
"id": "gid://shopify/Collection/442946009",
"ruleSet": {
"rules": [
{
"column": "IS_PRICE_REDUCED",
"relation": "IS_NOT_SET",
"condition": ""
}
],
"appliedDisjunctively": true
}
}
},
},
);
const json = await response.json();
return json.data;
}
Ruby
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"input": {
"id": "gid://shopify/Collection/442946009",
"ruleSet": {
"rules": [
{
"column": "IS_PRICE_REDUCED",
"relation": "IS_NOT_SET",
"condition": ""
}
],
"appliedDisjunctively": true
}
}
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
userErrors {
field
message
}
}
}`,
"variables": {
"input": {
"id": "gid://shopify/Collection/442946009",
"ruleSet": {
"rules": [
{
"column": "IS_PRICE_REDUCED",
"relation": "IS_NOT_SET",
"condition": ""
}
],
"appliedDisjunctively": true
}
}
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
userErrors {
field
message
}
}
}' \
--variables \
'{
"input": {
"id": "gid://shopify/Collection/442946009",
"ruleSet": {
"rules": [
{
"column": "IS_PRICE_REDUCED",
"relation": "IS_NOT_SET",
"condition": ""
}
],
"appliedDisjunctively": true
}
}
}'
Direct API Access
const response = await fetch('shopify:admin/api/unstable/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
userErrors {
field
message
}
}
}
`,
variables: {
"input": {
"id": "gid://shopify/Collection/442946009",
"ruleSet": {
"rules": [
{
"column": "IS_PRICE_REDUCED",
"relation": "IS_NOT_SET",
"condition": ""
}
],
"appliedDisjunctively": true
}
}
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"collectionUpdate": {
"collection": null,
"userErrors": [
{
"field": [
"id"
],
"message": "Cannot update rule set of a custom collection"
}
]
}
}
Create a new metafield and update another on an existing collection
Description
Create a new metafield `my_field.subtitle` and update an
existing metafield `my_fields.target_audience` on a specific
collection.
Alternatively, refer to the
[metafieldsSet](https://shopify.dev/api/admin-graphql/latest/mutations/metafieldsset) mutation
to create and/or update metafields on collection resources.
Query
mutation updateCollectionMetafields($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
metafields(first: 3) {
edges {
node {
id
namespace
key
value
}
}
}
}
userErrors {
message
field
}
}
}
Variables
{
"input": {
"metafields": [
{
"namespace": "my_field",
"key": "subtitle",
"type": "single_line_text_field",
"value": "Bold Colors"
},
{
"id": "gid://shopify/Metafield/1069229037",
"value": "New Mothers"
}
],
"id": "gid://shopify/Collection/79210309"
}
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/unstable/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation updateCollectionMetafields($input: CollectionInput!) { collectionUpdate(input: $input) { collection { id metafields(first: 3) { edges { node { id namespace key value } } } } userErrors { message field } } }",
"variables": {
"input": {
"metafields": [
{
"namespace": "my_field",
"key": "subtitle",
"type": "single_line_text_field",
"value": "Bold Colors"
},
{
"id": "gid://shopify/Metafield/1069229037",
"value": "New Mothers"
}
],
"id": "gid://shopify/Collection/79210309"
}
}
}'
React Router
import { authenticate } from "../shopify.server";
export const loader = async ({request}) => {
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation updateCollectionMetafields($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
metafields(first: 3) {
edges {
node {
id
namespace
key
value
}
}
}
}
userErrors {
message
field
}
}
}`,
{
variables: {
"input": {
"metafields": [
{
"namespace": "my_field",
"key": "subtitle",
"type": "single_line_text_field",
"value": "Bold Colors"
},
{
"id": "gid://shopify/Metafield/1069229037",
"value": "New Mothers"
}
],
"id": "gid://shopify/Collection/79210309"
}
},
},
);
const json = await response.json();
return json.data;
}
Ruby
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation updateCollectionMetafields($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
metafields(first: 3) {
edges {
node {
id
namespace
key
value
}
}
}
}
userErrors {
message
field
}
}
}
QUERY
variables = {
"input": {
"metafields": [
{
"namespace": "my_field",
"key": "subtitle",
"type": "single_line_text_field",
"value": "Bold Colors"
},
{
"id": "gid://shopify/Metafield/1069229037",
"value": "New Mothers"
}
],
"id": "gid://shopify/Collection/79210309"
}
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation updateCollectionMetafields($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
metafields(first: 3) {
edges {
node {
id
namespace
key
value
}
}
}
}
userErrors {
message
field
}
}
}`,
"variables": {
"input": {
"metafields": [
{
"namespace": "my_field",
"key": "subtitle",
"type": "single_line_text_field",
"value": "Bold Colors"
},
{
"id": "gid://shopify/Metafield/1069229037",
"value": "New Mothers"
}
],
"id": "gid://shopify/Collection/79210309"
}
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation updateCollectionMetafields($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
metafields(first: 3) {
edges {
node {
id
namespace
key
value
}
}
}
}
userErrors {
message
field
}
}
}' \
--variables \
'{
"input": {
"metafields": [
{
"namespace": "my_field",
"key": "subtitle",
"type": "single_line_text_field",
"value": "Bold Colors"
},
{
"id": "gid://shopify/Metafield/1069229037",
"value": "New Mothers"
}
],
"id": "gid://shopify/Collection/79210309"
}
}'
Direct API Access
const response = await fetch('shopify:admin/api/unstable/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation updateCollectionMetafields($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
metafields(first: 3) {
edges {
node {
id
namespace
key
value
}
}
}
}
userErrors {
message
field
}
}
}
`,
variables: {
"input": {
"metafields": [
{
"namespace": "my_field",
"key": "subtitle",
"type": "single_line_text_field",
"value": "Bold Colors"
},
{
"id": "gid://shopify/Metafield/1069229037",
"value": "New Mothers"
}
],
"id": "gid://shopify/Collection/79210309"
}
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"collectionUpdate": {
"collection": {
"id": "gid://shopify/Collection/79210309",
"metafields": {
"edges": [
{
"node": {
"id": "gid://shopify/Metafield/1069229037",
"namespace": "my_fields",
"key": "target_audience",
"value": "New Mothers"
}
},
{
"node": {
"id": "gid://shopify/Metafield/1069229038",
"namespace": "my_field",
"key": "subtitle",
"value": "Bold Colors"
}
}
]
}
},
"userErrors": []
}
}
Remove a source from a collection
Description
Remove a source from a collection by passing the source ID to `sourcesToDelete`.
Query
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}
Variables
{
"collection": {
"id": "gid://shopify/Collection/247865063",
"sourcesToDelete": [
"gid://shopify/CollectionConditionsSource/562928290"
]
}
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/unstable/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation CollectionUpdate($collection: CollectionUpdateInput!) { collectionUpdate(collection: $collection) { collection { id title sources { __typename id title } } userErrors { field message } } }",
"variables": {
"collection": {
"id": "gid://shopify/Collection/247865063",
"sourcesToDelete": [
"gid://shopify/CollectionConditionsSource/562928290"
]
}
}
}'
React Router
import { authenticate } from "../shopify.server";
export const loader = async ({request}) => {
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}`,
{
variables: {
"collection": {
"id": "gid://shopify/Collection/247865063",
"sourcesToDelete": [
"gid://shopify/CollectionConditionsSource/562928290"
]
}
},
},
);
const json = await response.json();
return json.data;
}
Ruby
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"collection": {
"id": "gid://shopify/Collection/247865063",
"sourcesToDelete": [
"gid://shopify/CollectionConditionsSource/562928290"
]
}
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}`,
"variables": {
"collection": {
"id": "gid://shopify/Collection/247865063",
"sourcesToDelete": [
"gid://shopify/CollectionConditionsSource/562928290"
]
}
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}' \
--variables \
'{
"collection": {
"id": "gid://shopify/Collection/247865063",
"sourcesToDelete": [
"gid://shopify/CollectionConditionsSource/562928290"
]
}
}'
Direct API Access
const response = await fetch('shopify:admin/api/unstable/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
sources {
__typename
id
title
}
}
userErrors {
field
message
}
}
}
`,
variables: {
"collection": {
"id": "gid://shopify/Collection/247865063",
"sourcesToDelete": [
"gid://shopify/CollectionConditionsSource/562928290"
]
}
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"collectionUpdate": {
"collection": {
"id": "gid://shopify/Collection/247865063",
"title": "Collection Snowboards",
"sources": []
},
"userErrors": []
}
}
Update a collection and add a source
Description
Update collection details and add a source that determines which products are included. This example
demonstrates how to update collection metadata, SEO fields, metafields, an image, and source-based
membership in a single mutation.
Query
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
descriptionHtml
handle
sortOrder
templateSuffix
image {
url
altText
}
seo {
title
description
}
metafields(first: 10) {
nodes {
namespace
key
value
}
}
sources {
__typename
id
title
... on CollectionConditionsSource {
inclusion {
matchType
conditions {
__typename
id
... on CollectionSourceInclusionConditionProductTag {
relation
values
matchType
}
}
selections(first: 10) {
nodes {
product {
id
title
}
variantIds
}
}
}
}
}
}
job {
id
done
}
userErrors {
field
message
}
}
}
Variables
{
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated spring styles",
"descriptionHtml": "Updated products for the <strong>spring</strong> season.",
"handle": "updated-spring-styles",
"redirectNewHandle": true,
"templateSuffix": "spring",
"sortOrder": "MANUAL",
"image": {
"src": "tmp/26371970/collections/f478bbc6-31d8-43fd-bada-cc802a8192e7/test_file.txt",
"altText": "Updated spring collection image"
},
"seo": {
"title": "Updated spring styles collection",
"description": "Browse updated spring products."
},
"metafields": [
{
"namespace": "custom",
"key": "updated_season",
"type": "single_line_text_field",
"value": "spring"
}
],
"sourcesToCreate": [
{
"source": {
"title": "Updated source",
"inclusion": {
"matchType": "ALL",
"conditions": [
{
"productTag": {
"relation": "TAGGED_WITH",
"values": [
"spring"
],
"matchType": "ANY"
}
}
],
"selections": [
{
"productId": "gid://shopify/Product/20995642"
}
]
}
}
}
]
}
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/unstable/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation CollectionUpdate($collection: CollectionUpdateInput!) { collectionUpdate(collection: $collection) { collection { id title descriptionHtml handle sortOrder templateSuffix image { url altText } seo { title description } metafields(first: 10) { nodes { namespace key value } } sources { __typename id title ... on CollectionConditionsSource { inclusion { matchType conditions { __typename id ... on CollectionSourceInclusionConditionProductTag { relation values matchType } } selections(first: 10) { nodes { product { id title } variantIds } } } } } } job { id done } userErrors { field message } } }",
"variables": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated spring styles",
"descriptionHtml": "Updated products for the <strong>spring</strong> season.",
"handle": "updated-spring-styles",
"redirectNewHandle": true,
"templateSuffix": "spring",
"sortOrder": "MANUAL",
"image": {
"src": "tmp/26371970/collections/f478bbc6-31d8-43fd-bada-cc802a8192e7/test_file.txt",
"altText": "Updated spring collection image"
},
"seo": {
"title": "Updated spring styles collection",
"description": "Browse updated spring products."
},
"metafields": [
{
"namespace": "custom",
"key": "updated_season",
"type": "single_line_text_field",
"value": "spring"
}
],
"sourcesToCreate": [
{
"source": {
"title": "Updated source",
"inclusion": {
"matchType": "ALL",
"conditions": [
{
"productTag": {
"relation": "TAGGED_WITH",
"values": [
"spring"
],
"matchType": "ANY"
}
}
],
"selections": [
{
"productId": "gid://shopify/Product/20995642"
}
]
}
}
}
]
}
}
}'
React Router
import { authenticate } from "../shopify.server";
export const loader = async ({request}) => {
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
descriptionHtml
handle
sortOrder
templateSuffix
image {
url
altText
}
seo {
title
description
}
metafields(first: 10) {
nodes {
namespace
key
value
}
}
sources {
__typename
id
title
... on CollectionConditionsSource {
inclusion {
matchType
conditions {
__typename
id
... on CollectionSourceInclusionConditionProductTag {
relation
values
matchType
}
}
selections(first: 10) {
nodes {
product {
id
title
}
variantIds
}
}
}
}
}
}
job {
id
done
}
userErrors {
field
message
}
}
}`,
{
variables: {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated spring styles",
"descriptionHtml": "Updated products for the <strong>spring</strong> season.",
"handle": "updated-spring-styles",
"redirectNewHandle": true,
"templateSuffix": "spring",
"sortOrder": "MANUAL",
"image": {
"src": "tmp/26371970/collections/f478bbc6-31d8-43fd-bada-cc802a8192e7/test_file.txt",
"altText": "Updated spring collection image"
},
"seo": {
"title": "Updated spring styles collection",
"description": "Browse updated spring products."
},
"metafields": [
{
"namespace": "custom",
"key": "updated_season",
"type": "single_line_text_field",
"value": "spring"
}
],
"sourcesToCreate": [
{
"source": {
"title": "Updated source",
"inclusion": {
"matchType": "ALL",
"conditions": [
{
"productTag": {
"relation": "TAGGED_WITH",
"values": [
"spring"
],
"matchType": "ANY"
}
}
],
"selections": [
{
"productId": "gid://shopify/Product/20995642"
}
]
}
}
}
]
}
},
},
);
const json = await response.json();
return json.data;
}
Ruby
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
descriptionHtml
handle
sortOrder
templateSuffix
image {
url
altText
}
seo {
title
description
}
metafields(first: 10) {
nodes {
namespace
key
value
}
}
sources {
__typename
id
title
... on CollectionConditionsSource {
inclusion {
matchType
conditions {
__typename
id
... on CollectionSourceInclusionConditionProductTag {
relation
values
matchType
}
}
selections(first: 10) {
nodes {
product {
id
title
}
variantIds
}
}
}
}
}
}
job {
id
done
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated spring styles",
"descriptionHtml": "Updated products for the <strong>spring</strong> season.",
"handle": "updated-spring-styles",
"redirectNewHandle": true,
"templateSuffix": "spring",
"sortOrder": "MANUAL",
"image": {
"src": "tmp/26371970/collections/f478bbc6-31d8-43fd-bada-cc802a8192e7/test_file.txt",
"altText": "Updated spring collection image"
},
"seo": {
"title": "Updated spring styles collection",
"description": "Browse updated spring products."
},
"metafields": [
{
"namespace": "custom",
"key": "updated_season",
"type": "single_line_text_field",
"value": "spring"
}
],
"sourcesToCreate": [
{
"source": {
"title": "Updated source",
"inclusion": {
"matchType": "ALL",
"conditions": [
{
"productTag": {
"relation": "TAGGED_WITH",
"values": [
"spring"
],
"matchType": "ANY"
}
}
],
"selections": [
{
"productId": "gid://shopify/Product/20995642"
}
]
}
}
}
]
}
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
descriptionHtml
handle
sortOrder
templateSuffix
image {
url
altText
}
seo {
title
description
}
metafields(first: 10) {
nodes {
namespace
key
value
}
}
sources {
__typename
id
title
... on CollectionConditionsSource {
inclusion {
matchType
conditions {
__typename
id
... on CollectionSourceInclusionConditionProductTag {
relation
values
matchType
}
}
selections(first: 10) {
nodes {
product {
id
title
}
variantIds
}
}
}
}
}
}
job {
id
done
}
userErrors {
field
message
}
}
}`,
"variables": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated spring styles",
"descriptionHtml": "Updated products for the <strong>spring</strong> season.",
"handle": "updated-spring-styles",
"redirectNewHandle": true,
"templateSuffix": "spring",
"sortOrder": "MANUAL",
"image": {
"src": "tmp/26371970/collections/f478bbc6-31d8-43fd-bada-cc802a8192e7/test_file.txt",
"altText": "Updated spring collection image"
},
"seo": {
"title": "Updated spring styles collection",
"description": "Browse updated spring products."
},
"metafields": [
{
"namespace": "custom",
"key": "updated_season",
"type": "single_line_text_field",
"value": "spring"
}
],
"sourcesToCreate": [
{
"source": {
"title": "Updated source",
"inclusion": {
"matchType": "ALL",
"conditions": [
{
"productTag": {
"relation": "TAGGED_WITH",
"values": [
"spring"
],
"matchType": "ANY"
}
}
],
"selections": [
{
"productId": "gid://shopify/Product/20995642"
}
]
}
}
}
]
}
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
descriptionHtml
handle
sortOrder
templateSuffix
image {
url
altText
}
seo {
title
description
}
metafields(first: 10) {
nodes {
namespace
key
value
}
}
sources {
__typename
id
title
... on CollectionConditionsSource {
inclusion {
matchType
conditions {
__typename
id
... on CollectionSourceInclusionConditionProductTag {
relation
values
matchType
}
}
selections(first: 10) {
nodes {
product {
id
title
}
variantIds
}
}
}
}
}
}
job {
id
done
}
userErrors {
field
message
}
}
}' \
--variables \
'{
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated spring styles",
"descriptionHtml": "Updated products for the <strong>spring</strong> season.",
"handle": "updated-spring-styles",
"redirectNewHandle": true,
"templateSuffix": "spring",
"sortOrder": "MANUAL",
"image": {
"src": "tmp/26371970/collections/f478bbc6-31d8-43fd-bada-cc802a8192e7/test_file.txt",
"altText": "Updated spring collection image"
},
"seo": {
"title": "Updated spring styles collection",
"description": "Browse updated spring products."
},
"metafields": [
{
"namespace": "custom",
"key": "updated_season",
"type": "single_line_text_field",
"value": "spring"
}
],
"sourcesToCreate": [
{
"source": {
"title": "Updated source",
"inclusion": {
"matchType": "ALL",
"conditions": [
{
"productTag": {
"relation": "TAGGED_WITH",
"values": [
"spring"
],
"matchType": "ANY"
}
}
],
"selections": [
{
"productId": "gid://shopify/Product/20995642"
}
]
}
}
}
]
}
}'
Direct API Access
const response = await fetch('shopify:admin/api/unstable/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation CollectionUpdate($collection: CollectionUpdateInput!) {
collectionUpdate(collection: $collection) {
collection {
id
title
descriptionHtml
handle
sortOrder
templateSuffix
image {
url
altText
}
seo {
title
description
}
metafields(first: 10) {
nodes {
namespace
key
value
}
}
sources {
__typename
id
title
... on CollectionConditionsSource {
inclusion {
matchType
conditions {
__typename
id
... on CollectionSourceInclusionConditionProductTag {
relation
values
matchType
}
}
selections(first: 10) {
nodes {
product {
id
title
}
variantIds
}
}
}
}
}
}
job {
id
done
}
userErrors {
field
message
}
}
}
`,
variables: {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated spring styles",
"descriptionHtml": "Updated products for the <strong>spring</strong> season.",
"handle": "updated-spring-styles",
"redirectNewHandle": true,
"templateSuffix": "spring",
"sortOrder": "MANUAL",
"image": {
"src": "tmp/26371970/collections/f478bbc6-31d8-43fd-bada-cc802a8192e7/test_file.txt",
"altText": "Updated spring collection image"
},
"seo": {
"title": "Updated spring styles collection",
"description": "Browse updated spring products."
},
"metafields": [
{
"namespace": "custom",
"key": "updated_season",
"type": "single_line_text_field",
"value": "spring"
}
],
"sourcesToCreate": [
{
"source": {
"title": "Updated source",
"inclusion": {
"matchType": "ALL",
"conditions": [
{
"productTag": {
"relation": "TAGGED_WITH",
"values": [
"spring"
],
"matchType": "ANY"
}
}
],
"selections": [
{
"productId": "gid://shopify/Product/20995642"
}
]
}
}
}
]
}
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"collectionUpdate": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated spring styles",
"descriptionHtml": "Updated products for the <strong>spring</strong> season.",
"handle": "updated-spring-styles",
"sortOrder": "MANUAL",
"templateSuffix": "spring",
"image": {
"url": "https://cdn.shopify.com/s/files/1/2637/1970/collections/test_file.jpg?v=1781273020",
"altText": "Updated spring collection image"
},
"seo": {
"title": "Updated spring styles collection",
"description": "Browse updated spring products."
},
"metafields": {
"nodes": [
{
"namespace": "notes",
"key": "descriptionription",
"value": "Collection descriptionription"
},
{
"namespace": "definition",
"key": "some_list",
"value": "[\"valid value 0\",\"valid value 1\",\"valid value 2\"]"
},
{
"namespace": "definition",
"key": "some_integer",
"value": "5"
},
{
"namespace": "global",
"key": "title_tag",
"value": "Updated spring styles collection"
},
{
"namespace": "global",
"key": "description_tag",
"value": "Browse updated spring products."
},
{
"namespace": "custom",
"key": "updated_season",
"value": "spring"
}
]
},
"sources": [
{
"__typename": "CollectionConditionsSource",
"id": "gid://shopify/CollectionConditionsSource/1047893300",
"title": "Updated source",
"inclusion": {
"matchType": "ALL",
"conditions": [
{
"__typename": "CollectionSourceInclusionConditionProductTag",
"id": "gid://shopify/CollectionSourceInclusionConditionProductTag/977278334",
"relation": "TAGGED_WITH",
"values": [
"spring"
],
"matchType": "ANY"
}
],
"selections": {
"nodes": [
{
"product": {
"id": "gid://shopify/Product/20995642",
"title": "Element"
},
"variantIds": null
}
]
}
}
}
]
},
"job": null,
"userErrors": []
}
}
Update the collection's rule set
Description
If a collection with the specified ID doesn't exist, then the mutation returns an error.
Query
mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
job {
id
done
}
userErrors {
field
message
}
}
}
Variables
{
"input": {
"id": "gid://shopify/Collection/142458073",
"ruleSet": {
"rules": [
{
"column": "VARIANT_PRICE",
"relation": "LESS_THAN",
"condition": "200"
},
{
"column": "TAG",
"relation": "EQUALS",
"condition": "board"
}
],
"appliedDisjunctively": true
}
}
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/unstable/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation updateCollectionRules($input: CollectionInput!) { collectionUpdate(input: $input) { collection { id title description handle ruleSet { rules { column relation condition } appliedDisjunctively } } job { id done } userErrors { field message } } }",
"variables": {
"input": {
"id": "gid://shopify/Collection/142458073",
"ruleSet": {
"rules": [
{
"column": "VARIANT_PRICE",
"relation": "LESS_THAN",
"condition": "200"
},
{
"column": "TAG",
"relation": "EQUALS",
"condition": "board"
}
],
"appliedDisjunctively": true
}
}
}
}'
React Router
import { authenticate } from "../shopify.server";
export const loader = async ({request}) => {
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
job {
id
done
}
userErrors {
field
message
}
}
}`,
{
variables: {
"input": {
"id": "gid://shopify/Collection/142458073",
"ruleSet": {
"rules": [
{
"column": "VARIANT_PRICE",
"relation": "LESS_THAN",
"condition": "200"
},
{
"column": "TAG",
"relation": "EQUALS",
"condition": "board"
}
],
"appliedDisjunctively": true
}
}
},
},
);
const json = await response.json();
return json.data;
}
Ruby
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
job {
id
done
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"input": {
"id": "gid://shopify/Collection/142458073",
"ruleSet": {
"rules": [
{
"column": "VARIANT_PRICE",
"relation": "LESS_THAN",
"condition": "200"
},
{
"column": "TAG",
"relation": "EQUALS",
"condition": "board"
}
],
"appliedDisjunctively": true
}
}
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
job {
id
done
}
userErrors {
field
message
}
}
}`,
"variables": {
"input": {
"id": "gid://shopify/Collection/142458073",
"ruleSet": {
"rules": [
{
"column": "VARIANT_PRICE",
"relation": "LESS_THAN",
"condition": "200"
},
{
"column": "TAG",
"relation": "EQUALS",
"condition": "board"
}
],
"appliedDisjunctively": true
}
}
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
job {
id
done
}
userErrors {
field
message
}
}
}' \
--variables \
'{
"input": {
"id": "gid://shopify/Collection/142458073",
"ruleSet": {
"rules": [
{
"column": "VARIANT_PRICE",
"relation": "LESS_THAN",
"condition": "200"
},
{
"column": "TAG",
"relation": "EQUALS",
"condition": "board"
}
],
"appliedDisjunctively": true
}
}
}'
Direct API Access
const response = await fetch('shopify:admin/api/unstable/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation updateCollectionRules($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
ruleSet {
rules {
column
relation
condition
}
appliedDisjunctively
}
}
job {
id
done
}
userErrors {
field
message
}
}
}
`,
variables: {
"input": {
"id": "gid://shopify/Collection/142458073",
"ruleSet": {
"rules": [
{
"column": "VARIANT_PRICE",
"relation": "LESS_THAN",
"condition": "200"
},
{
"column": "TAG",
"relation": "EQUALS",
"condition": "board"
}
],
"appliedDisjunctively": true
}
}
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"collectionUpdate": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "All snowboards",
"description": "",
"handle": "snowboards",
"ruleSet": {
"rules": [
{
"column": "VARIANT_PRICE",
"relation": "LESS_THAN",
"condition": "200"
},
{
"column": "TAG",
"relation": "EQUALS",
"condition": "board"
}
],
"appliedDisjunctively": true
}
},
"job": {
"id": "gid://shopify/Job/b10b434b-02be-4d75-b176-3c7b15d60d22",
"done": false
},
"userErrors": []
}
}
Updates an existing custom collection
Query
mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}
Variables
{
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Collection Title",
"handle": "updated-collection-handle"
}
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/unstable/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation CollectionUpdate($input: CollectionInput!) { collectionUpdate(input: $input) { collection { id title description handle } userErrors { field message } } }",
"variables": {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Collection Title",
"handle": "updated-collection-handle"
}
}
}'
React Router
import { authenticate } from "../shopify.server";
export const loader = async ({request}) => {
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}`,
{
variables: {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Collection Title",
"handle": "updated-collection-handle"
}
},
},
);
const json = await response.json();
return json.data;
}
Ruby
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Collection Title",
"handle": "updated-collection-handle"
}
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}`,
"variables": {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Collection Title",
"handle": "updated-collection-handle"
}
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}' \
--variables \
'{
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Collection Title",
"handle": "updated-collection-handle"
}
}'
Direct API Access
const response = await fetch('shopify:admin/api/unstable/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}
`,
variables: {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Collection Title",
"handle": "updated-collection-handle"
}
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"collectionUpdate": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Collection Title",
"description": "",
"handle": "updated-collection-handle"
},
"userErrors": []
}
}
Updates an existing smart collection
Query
mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}
Variables
{
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Smart Collection",
"handle": "updated-smart-collection"
}
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/unstable/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation CollectionUpdate($input: CollectionInput!) { collectionUpdate(input: $input) { collection { id title description handle } userErrors { field message } } }",
"variables": {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Smart Collection",
"handle": "updated-smart-collection"
}
}
}'
React Router
import { authenticate } from "../shopify.server";
export const loader = async ({request}) => {
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}`,
{
variables: {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Smart Collection",
"handle": "updated-smart-collection"
}
},
},
);
const json = await response.json();
return json.data;
}
Ruby
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Smart Collection",
"handle": "updated-smart-collection"
}
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}`,
"variables": {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Smart Collection",
"handle": "updated-smart-collection"
}
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}' \
--variables \
'{
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Smart Collection",
"handle": "updated-smart-collection"
}
}'
Direct API Access
const response = await fetch('shopify:admin/api/unstable/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation CollectionUpdate($input: CollectionInput!) {
collectionUpdate(input: $input) {
collection {
id
title
description
handle
}
userErrors {
field
message
}
}
}
`,
variables: {
"input": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Smart Collection",
"handle": "updated-smart-collection"
}
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"collectionUpdate": {
"collection": {
"id": "gid://shopify/Collection/142458073",
"title": "Updated Smart Collection",
"description": "",
"handle": "updated-smart-collection"
},
"userErrors": []
}
}