productDuplicate
Requires access scope. Also: The user must have a permission to duplicate a product.
Duplicates a product.
If you need to duplicate a large product, such as one that has many variants that are active at several locations, you might encounter timeout errors.
To avoid these timeout errors, you can instead duplicate the product asynchronously.
In API version 2024-10 and higher, include synchronous: false
argument in this mutation to perform the duplication asynchronously.
In API version 2024-07 and lower, use the asynchronous .
Metafield values are not duplicated if the unique values capability is enabled.
Arguments
- Anchor to includeImagesinclude•
Images BooleanDefault:false Specifies whether or not to duplicate images.
- Anchor to includeTranslationsinclude•
Translations BooleanDefault:false Specifies whether or not to duplicate translations.
- Anchor to newStatusnew•
Status The new status of the product. If no value is provided the status will be inherited from the original product.
- Anchor to newTitlenew•
Title String!required The new title of the product.
- Anchor to productIdproduct•
Id ID!required The ID of the product to be duplicated.
Anchor to ProductDuplicatePayload returnsProductDuplicatePayload returns
- Anchor to imageJobimage•
Job The asynchronous job that duplicates the product images.
- Anchor to newProductnew•
Product The duplicated product.
- Anchor to shopshop•Shop!non-null
The user's shop.
- Anchor to userErrorsuser•
Errors [UserError!]! non-null The list of errors that occurred from executing the mutation.
- Duplicate a product
- Duplicate a product asynchronously and return productDuplicateOperation
- productDuplicate reference
Examples
mutation DuplicateProduct($productId: ID!, $newTitle: String!, $includeImages: Boolean, $newStatus: ProductStatus) {
productDuplicate(productId: $productId, newTitle: $newTitle, includeImages: $includeImages, newStatus: $newStatus) {
newProduct {
id
title
vendor
productType
variants(first: 1) {
nodes {
id
title
}
}
}
imageJob {
id
done
}
userErrors {
field
message
}
}
}
curl -X POST \
https://your-development-store.myshopify.com/admin/api/2024-04/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation DuplicateProduct($productId: ID!, $newTitle: String!, $includeImages: Boolean, $newStatus: ProductStatus) { productDuplicate(productId: $productId, newTitle: $newTitle, includeImages: $includeImages, newStatus: $newStatus) { newProduct { id title vendor productType variants(first: 1) { nodes { id title } } } imageJob { id done } userErrors { field message } } }",
"variables": {
"productId": "gid://shopify/Product/20995642",
"newTitle": "Copy of Product",
"includeImages": true,
"newStatus": "ACTIVE"
}
}'
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation DuplicateProduct($productId: ID!, $newTitle: String!, $includeImages: Boolean, $newStatus: ProductStatus) {
productDuplicate(productId: $productId, newTitle: $newTitle, includeImages: $includeImages, newStatus: $newStatus) {
newProduct {
id
title
vendor
productType
variants(first: 1) {
nodes {
id
title
}
}
}
imageJob {
id
done
}
userErrors {
field
message
}
}
}`,
{
variables: {
"productId": "gid://shopify/Product/20995642",
"newTitle": "Copy of Product",
"includeImages": true,
"newStatus": "ACTIVE"
},
},
);
const data = await response.json();
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation DuplicateProduct($productId: ID!, $newTitle: String!, $includeImages: Boolean, $newStatus: ProductStatus) {
productDuplicate(productId: $productId, newTitle: $newTitle, includeImages: $includeImages, newStatus: $newStatus) {
newProduct {
id
title
vendor
productType
variants(first: 1) {
nodes {
id
title
}
}
}
imageJob {
id
done
}
userErrors {
field
message
}
}
}`,
"variables": {
"productId": "gid://shopify/Product/20995642",
"newTitle": "Copy of Product",
"includeImages": true,
"newStatus": "ACTIVE"
},
},
});
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 DuplicateProduct($productId: ID!, $newTitle: String!, $includeImages: Boolean, $newStatus: ProductStatus) {
productDuplicate(productId: $productId, newTitle: $newTitle, includeImages: $includeImages, newStatus: $newStatus) {
newProduct {
id
title
vendor
productType
variants(first: 1) {
nodes {
id
title
}
}
}
imageJob {
id
done
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"productId": "gid://shopify/Product/20995642",
"newTitle": "Copy of Product",
"includeImages": true,
"newStatus": "ACTIVE"
}
response = client.query(query: query, variables: variables)