Delete a product option that doesn't have associated variants
Description
Delete a [product option](https://shopify.dev/docs/api/admin-graphql/latest/objects/ProductOption)
from an existing product. This example demonstrates how to remove an option that doesn't have associated variants.
When the `strategy` field isn't specified or is set to `DEFAULT`, the mutation only deletes options
that don't conflict with existing product variants. If deleting an option results in conflicting variants,
then an error is returned instead. The response includes the product's updated option list and the IDs of the
successfully deleted options.
Query
mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
Variables
{
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272168"
]
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/2026-04/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) { productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) { userErrors { field message code } deletedOptionsIds product { id options { id name values position optionValues { id name hasVariants } } } } }",
"variables": {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272168"
]
}
}'
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 deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}`,
{
variables: {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272168"
]
},
},
);
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 deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
QUERY
variables = {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272168"
]
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}`,
"variables": {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272168"
]
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}' \
--variables \
'{
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272168"
]
}'
Direct API Access
const response = await fetch('shopify:admin/api/2026-04/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
`,
variables: {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272168"
]
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"productOptionsDelete": {
"userErrors": [],
"deletedOptionsIds": [
"gid://shopify/ProductOption/328272168"
],
"product": {
"id": "gid://shopify/Product/20995642",
"options": [
{
"id": "gid://shopify/ProductOption/328272167",
"name": "Title",
"values": [
"151cm",
"155cm",
"158cm"
],
"position": 1,
"optionValues": [
{
"id": "gid://shopify/ProductOptionValue/141051426",
"name": "151cm",
"hasVariants": true
},
{
"id": "gid://shopify/ProductOptionValue/258076414",
"name": "155cm",
"hasVariants": true
},
{
"id": "gid://shopify/ProductOptionValue/129596849",
"name": "158cm",
"hasVariants": true
}
]
}
]
}
}
}
Delete a product option that has associated variants
Description
Delete a [product option](https://shopify.dev/docs/api/admin-graphql/latest/objects/ProductOption)
using the `POSITION` delete strategy. This example demonstrates how to remove an option that has multiple values
and is associated with existing product variants. When the strategy is set to `POSITION`, the mutation
deletes duplicate variants that would result from removing the option, keeping only variants with unique
combinations of the remaining option values. Variants with the lowest position are prioritized when duplicates
are found. The response returns the updated product with its remaining options and variants, along with the
IDs of the successfully deleted options.
Query
mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
Variables
{
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
],
"strategy": "POSITION"
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/2026-04/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) { productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) { userErrors { field message code } deletedOptionsIds product { id options { id name values position optionValues { id name hasVariants } } } } }",
"variables": {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
],
"strategy": "POSITION"
}
}'
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 deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}`,
{
variables: {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
],
"strategy": "POSITION"
},
},
);
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 deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
QUERY
variables = {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
],
"strategy": "POSITION"
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}`,
"variables": {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
],
"strategy": "POSITION"
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}' \
--variables \
'{
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
],
"strategy": "POSITION"
}'
Direct API Access
const response = await fetch('shopify:admin/api/2026-04/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
`,
variables: {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
],
"strategy": "POSITION"
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"productOptionsDelete": {
"userErrors": [],
"deletedOptionsIds": [
"gid://shopify/ProductOption/328272167"
],
"product": {
"id": "gid://shopify/Product/20995642",
"options": [
{
"id": "gid://shopify/ProductOption/328272169",
"name": "Title",
"values": [
"Default Title"
],
"position": 1,
"optionValues": [
{
"id": "gid://shopify/ProductOptionValue/141051427",
"name": "Default Title",
"hasVariants": true
}
]
}
]
}
}
}
Deleting an option linked to variants without a strategy returns an error
Description
This example shows an attempt to delete a [product option](https://shopify.dev/docs/api/admin-graphql/latest/objects/ProductOption)
that has multiple option values associated with existing product variants, without specifying a delete strategy.
The mutation demonstrates the validation that prevents deleting options when it would result in conflicting
or duplicate variants. Since no `strategy` field is provided (defaulting to `DEFAULT` behavior), the mutation
can't safely remove the option without potentially creating variant conflicts. The response returns the
product's ID, an empty list of deleted options, and a user error indicating that the option cannot be deleted
due to its multiple values being linked to variants.
Query
mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
Variables
{
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
]
}
cURL
curl -X POST \
https://your-development-store.myshopify.com/admin/api/2026-04/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) { productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) { userErrors { field message code } deletedOptionsIds product { id options { id name values position optionValues { id name hasVariants } } } } }",
"variables": {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
]
}
}'
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 deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}`,
{
variables: {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
]
},
},
);
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 deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
QUERY
variables = {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
]
}
response = client.query(query: query, variables: variables)
Node.js
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}`,
"variables": {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
]
},
},
});
Shopify CLI
shopify app execute \
--query \
'mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}' \
--variables \
'{
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
]
}'
Direct API Access
const response = await fetch('shopify:admin/api/2026-04/graphql.json', {
method: 'POST',
body: JSON.stringify({
query: `
mutation deleteOptions($productId: ID!, $options: [ID!]!, $strategy: ProductOptionDeleteStrategy) {
productOptionsDelete(productId: $productId, options: $options, strategy: $strategy) {
userErrors {
field
message
code
}
deletedOptionsIds
product {
id
options {
id
name
values
position
optionValues {
id
name
hasVariants
}
}
}
}
}
`,
variables: {
"productId": "gid://shopify/Product/20995642",
"options": [
"gid://shopify/ProductOption/328272167"
]
},
}),
});
const { data } = await response.json();
console.log(data);
Response
{
"productOptionsDelete": {
"userErrors": [
{
"field": [
"options"
],
"message": "Cannot delete an option with multiple values.",
"code": "CANNOT_DELETE_OPTION_WITH_MULTIPLE_VALUES"
}
],
"deletedOptionsIds": [],
"product": {
"id": "gid://shopify/Product/20995642",
"options": [
{
"id": "gid://shopify/ProductOption/328272167",
"name": "Title",
"values": [
"151cm",
"155cm",
"158cm"
],
"position": 1,
"optionValues": [
{
"id": "gid://shopify/ProductOptionValue/141051426",
"name": "151cm",
"hasVariants": true
},
{
"id": "gid://shopify/ProductOptionValue/258076414",
"name": "155cm",
"hasVariants": true
},
{
"id": "gid://shopify/ProductOptionValue/129596849",
"name": "158cm",
"hasVariants": true
}
]
}
]
}
}
}