Anchor to section titled 'undefined'

productDuplicate
mutation

Requires write_products 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 ProductDuplicateAsyncV2.


Anchor to includeImages
includeImages
default:false

Specifies whether or not to duplicate images.

Anchor to includeTranslations
includeTranslations
default:false

Specifies whether or not to duplicate translations.

The new status of the product. If no value is provided the status will be inherited from the original product.

The new title of the product.

Anchor to productId
productId
required

The ID of the product to be duplicated.

Anchor to synchronous
synchronous
default:true

Specifies whether or not to run the mutation synchronously.


Was this section helpful?

The asynchronous job that duplicates the product images.

The duplicated product.

The product duplicate operation, returned when run in asynchronous mode.

The user's shop.

The list of errors that occurred from executing the mutation.


Was this section helpful?

Examples

Hide code
DescriptionCopy
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/2025-01/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();
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)
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"
    },
  },
});
use Shopify\Clients\Graphql;

$client = new Graphql("your-development-store.myshopify.com", $accessToken);
$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]);
Hide code
Input variables
Copy
{
  "productId": "gid://shopify/Product/20995642",
  "newTitle": "Copy of Product",
  "includeImages": true,
  "newStatus": "ACTIVE"
}
Hide code
Response
JSON
{
  "productDuplicate": {
    "newProduct": {
      "id": "gid://shopify/Product/1072481071",
      "title": "Copy of Product",
      "vendor": "Arbor",
      "productType": "Snowboards",
      "variants": {
        "nodes": [
          {
            "id": "gid://shopify/ProductVariant/1070325098",
            "title": "151cm"
          }
        ]
      }
    },
    "imageJob": null,
    "userErrors": []
  }
}