26 June 2025
Product catalogImportGraphQL
You can now configure and use Product Attributes for Products. This feature is currently available in public beta. You can manage Attributes that are common to all variants in one central location at the Product level, instead of using the
sameforall constraint. This helps reduce the size of API response payloads, thereby improving data storage efficiency and enhancing performance.With this release, we have updated the following Attribute-related terminologies to improve clarity:
- Product Attributes: to refer to Attributes defined at the Product level.
- Variant Attributes: to refer to Attributes defined at the Variant level. They were previously known as "Product Attributes."
Product Attributes are supported across the following resources and features:
- Product Types, Products, Product Projections, Product Search
- Product Tailoring, Product Discounts
- Carts, Orders, Quotes, Shopping Lists
- Product Draft Import, Product Type Import, and Order Import in the Import API
Changes:
- [API] Added the
levelfield to AttributeDefinition and AttributeDefinitionDraft. - [API] Added the
attributesfield to ProductData and ProductDraft, and ProductProjection. - [API] Added the Set Product Attribute update action to the Product API.
- [API] Added the Set Product Attribute update action to the Product Tailoring API.
- [API] Added the
attributesfield to ProductTailoringData, ProductTailoringDraft, and ProductTailoringInStoreDraft. - [API] Added the
attributesfield to Product Tailoring Created Message. - [API] Added the
attributesfield to ProductImport, ProductDraftImport. - [API] Added the
levelfield to the AttributeDefinition in ProductTypeImport. - [GraphQL API] Added the
attributesRawfield to theProductData, theProductProjection, and theProductTailoringCreatedtype. - [GraphQL API] Added the
attributesfield to theProductDrafttype. - [GraphQL API] Added the
setProductAttributefield to theProductUpdateActiontype. - [GraphQL API] Added the
SetProductAttribute, theSetProductLevelAttribute, and theProductLevelAttributeInputtypes to the GraphQL schema.
The following changes were introduced in terms of GraphQL SDL:
extend type ProductData {
"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"
attributesRaw: [RawProductAttrType!]!
}
extend input ProductDraft {
"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"
attributes: [ProductAttributeInput!] = []
}
extend input ProductUpdateAction {
"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"
setProductAttribute: SetProductAttribute
}
extend type ProductProjection {
"BETA: This feature can be subject to change and should be used carefully in production. https://docs.commercetools.com/api/contract#public-beta"
attributesRaw: [RawProductAttrType!]!
}
input SetProductAttribute{
name: String
value: String
staged: Boolean = true
}
input SetProductLevelAttribute {
name: String!
value: String!
}
extend type ProductTailoringCreated {
attributesRaw: [RawProductAttribute!]!
}
"""
An input object used to define a ProductAttribute.
You should pass the value in the form of an escaped JSON.
Examples for `value`:
* FieldType `String`: `"\"This is a string\""`
* FieldType `DateTimeType`: `"\"2018-10-12T14:00:00.000Z\""`
* FieldType `Number`: `"4"`
* FieldType `Set` with an elementType of `String`: `"[\"This is a string\", \"This is another string\"]"`
* FieldType `Reference`: `"{\"id\": \"b911b62d-353a-4388-93ee-8d488d9af962\", \"typeId\": \"product\"}"`
"""
input ProductLevelAttributeInput {
name: String!
"""
You should pass the value in the form of an escaped JSON.
Examples for `value`:
* FieldType `String`: `"\"This is a string\""`
* FieldType `DateTimeType`: `"\"2018-10-12T14:00:00.000Z\""`
* FieldType `Number`: `"4"`
* FieldType `Set` with an elementType of `String`: `"[\"This is a string\", \"This is another string\"]"`
* FieldType `Reference`: `"{\"id\": \"b911b62d-353a-4388-93ee-8d488d9af962\", \"typeId\": \"product\"}"`
"""
value: String!
}