Product Discounts
Product Discounts reduce certain Product Prices.
Product Discounts are useful for scenarios when you want to display a discounted price before adding an item to the Cart. A maximum of 500
Product Discounts can be active at the same time.
For an introduction to Product Discounts and to understand how they work in Composable Commerce, see the Product Discounts overview.
When you create, update, or delete a Product Discount, the Prices are updated in an eventually consistent manner. Both Embedded Prices and StandalonePrices associated to a ProductVariant are updated, regardless of the Product's priceMode value.
The time to update can vary—between a fraction of a second to several hours—depending on the following factors:
- The number of Products and their size
- The number of Products affected by Discount predicates
- The number of Prices to be updated
Learn more about Product Discounts in our self-paced Product Discounts module.
Representations
ProductDiscount
id String | Unique identifier of the ProductDiscount. |
version Int | Current version of the ProductDiscount. |
key String | User-defined unique identifier of the ProductDiscount. MinLength:2 MaxLength: 256 Pattern: ^[A-Za-z0-9_-]+$ |
name | Name of the ProductDiscount. |
description | Description of the ProductDiscount. |
value | Type of Discount and its corresponding value. |
predicate String | Valid ProductDiscount predicate. |
sortOrder String | Unique decimal value between 0 and 1 (stored as String literal) defining the order of Product Discounts to apply in case more than one is applicable and active. A Product Discount with a higher value is prioritized. |
isActive Boolean | If |
references Array of Reference | References of all the resources that are addressed in the |
validFrom | Date and time (UTC) from which the Discount is effective. Take Eventual Consistency into account for calculated discount values. |
validUntil | Date and time (UTC) until which the Discount is effective. Take Eventual Consistency into account for calculated undiscounted values. |
createdAt | Date and time (UTC) the ProductDiscount was initially created. |
createdBy BETA | IDs and references that created the ProductDiscount. |
lastModifiedAt | Date and time (UTC) the ProductDiscount was last updated. |
lastModifiedBy BETA | IDs and references that last modified the ProductDiscount. |
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}
ProductDiscountDraft
key String | User-defined unique identifier for the ProductDiscount. MinLength:2 MaxLength: 256 Pattern: ^[A-Za-z0-9_-]+$ |
name | Name of the ProductDiscount. |
description | Description of the ProductDiscount. |
value | Type of Discount and its corresponding value. |
predicate String | Valid ProductDiscount predicate. |
sortOrder String | Decimal value between 0 and 1 (passed as String literal) that defines the order of ProductDiscounts to apply in case more than one is applicable and active. A ProductDiscount with a higher |
isActive Boolean | Set to |
validFrom | Date and time (UTC) from which the Discount is effective. Take Eventual Consistency into account for calculated discount values. |
validUntil | Date and time (UTC) until which the Discount is effective. Take Eventual Consistency into account for calculated undiscounted values. |
{"value": {"type": "absolute","money": [{"currencyCode": "EUR","centAmount": 100}]},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534"}
ProductDiscountPagedQueryResponse
PagedQueryResult with results containing an array of ProductDiscount.
limit Int | Number of results requested. |
offset Int | Number of elements skipped. |
count Int | Actual number of results returned. |
total Int | Total number of results matching the query.
This number is an estimation that is not strongly consistent.
This field is returned by default.
For improved performance, calculating this field can be deactivated by using the query parameter |
results Array of ProductDiscount | ProductDiscounts matching the query. |
{"limit": 20,"offset": 0,"count": 2,"total": 2,"results": [{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}]},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"},{"id": "29cc032d-8ee3-4763-b2ab-3fe0dda22a2d","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}]},"predicate": "1=1","name": {"en": "test-discount2"},"description": {"en": "test-discount2"},"isActive": false,"sortOrder": "0.9478","references": [],"createdAt": "2016-02-24T10:25:04.206Z","lastModifiedAt": "2016-02-24T10:25:04.295Z"}]}
ProductDiscountReference
Reference to a ProductDiscount.
id String | Unique identifier of the referenced ProductDiscount. |
typeId | "product-discount" References a ProductDiscount. |
obj | Contains the representation of the expanded ProductDiscount. Only present in responses to requests with Reference Expansion for ProductDiscounts. |
ProductDiscountResourceIdentifier
ResourceIdentifier to a ProductDiscount. Either id
or key
is required. If both are set, an InvalidJsonInput error is returned.
id String | Unique identifier of the referenced ProductDiscount. Required if |
key String | User-defined unique identifier of the referenced ProductDiscount. Required if |
typeId | "product-discount" References a ProductDiscount. |
ProductDiscountValue
Abstract parent type for the specific values, distinguished by the type
field - relative, absolute, or external.
ProductDiscountValueRelative
Discounts the product price by a percentage, defined by the permyriad
field.
type String | "relative" |
permyriad Int | Fraction (per ten thousand) the price is reduced by. For example, |
ProductDiscountValueAbsolute
Discounts the Product's Price by a fixed amount, defined by the money
field.
type String | "absolute" |
money Array of CentPrecisionMoney | Money values in different currencies. An absolute ProductDiscount will only match a price if this array contains a value with the same currency. For example, if it contains 10€ and 15$, the matching € price will be decreased by 10€ and the matching $ price will be decreased by 15$. |
ProductDiscountValueExternal
Discounts the Product Price by allowing the client to explicitly set a discounted value. Used when setting discounts using an external service.
type String | "external" |
ProductDiscountValueDraft
Abstract parent draft type for the specific value drafts, distinguished by the type
field - relative, absolute, or external.
ProductDiscountValueRelativeDraft
Discounts the Product Price by a percentage, defined by the permyriad
field.
type String | "relative" |
permyriad Int | Fraction (per ten thousand) the price is reduced by. For example, |
ProductDiscountValueAbsoluteDraft
Discounts the Product Price by a fixed amount, defined by the money
field.
type String | "absolute" |
money Array of Money | Money values in different currencies. An absolute Product Discount will match a price only if the array contains a value with the same currency. For example, if it contains 10€ and 15$, the matching € price will be decreased by 10€ and the matching $ price will be decreased by 15$. If the array has multiple values of the same currency, the API returns an InvalidOperation error. If the array is empty, the discount does not apply. |
ProductDiscountValueExternalDraft
Discounts the Product Price by allowing the client to explicitly set a discounted value. Use this when setting discounts using an external service.
type String | "external" |
QueryPrice
id String | Unique identifier of the given Price. |
value | Money value of the given Price. |
country | Country for which the given Price is valid. Pattern:^[A-Z]{2}$ |
customerGroup | CustomerGroup for which the given Price is valid. |
channel |
|
validFrom | Date from which the given Price is valid. |
validUntil | Date until which the given Price is valid. |
discounted | DiscountedPrice you specify for the given Price. |
tiers Array of PriceTierDraft | Price tier applied when the minimum quantity for the LineItem of a ProductVariant with the related Price is reached in a Cart. If |
custom | Custom Fields for the Price. |
Get ProductDiscount
Get ProductDiscount by ID
view_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
id String |
|
expand | The parameter can be passed multiple times. |
application/json
curl --get https://api.{region}.commercetools.com/{projectKey}/product-discounts/{id} -i \--header "Authorization: Bearer ${BEARER_TOKEN}"
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}
Get ProductDiscount by Key
view_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
key String |
|
expand | The parameter can be passed multiple times. |
application/json
curl --get https://api.{region}.commercetools.com/{projectKey}/product-discounts/key={key} -i \--header "Authorization: Bearer ${BEARER_TOKEN}"
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}
Query ProductDiscounts
view_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
where | The parameter can be passed multiple times. |
/^var[.][a-zA-Z0-9]+$/ Any string parameter matching this regular expression | Predicate parameter values. The parameter can be passed multiple times. |
sort | The parameter can be passed multiple times. |
expand | The parameter can be passed multiple times. |
limit Int | Number of results requested. |
offset Int | Number of elements skipped. |
withTotal Boolean | Controls the calculation of the total number of query results. Set to Default: true |
application/json
curl --get https://api.{region}.commercetools.com/{projectKey}/product-discounts -i \--header "Authorization: Bearer ${BEARER_TOKEN}"
{"limit": 20,"offset": 0,"count": 2,"total": 2,"results": [{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}]},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"},{"id": "29cc032d-8ee3-4763-b2ab-3fe0dda22a2d","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}]},"predicate": "1=1","name": {"en": "test-discount2"},"description": {"en": "test-discount2"},"isActive": false,"sortOrder": "0.9478","references": [],"createdAt": "2016-02-24T10:25:04.206Z","lastModifiedAt": "2016-02-24T10:25:04.295Z"}]}
Check if ProductDiscount exists
Check if ProductDiscount exists by ID
Checks if a ProductDiscount exists for a given id
. Returns a 200 OK
status if the ProductDiscount exists or a 404 Not Found
otherwise.
view_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
id String |
|
curl --head https://api.{region}.commercetools.com/{projectKey}/product-discounts/{id} -i \--header "Authorization: Bearer ${BEARER_TOKEN}"
Check if ProductDiscount exists by Key
Checks if a ProductDiscount exists for a given key
. Returns a 200 OK
status if the ProductDiscount exists or a 404 Not Found
otherwise.
view_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
key String |
|
curl --head https://api.{region}.commercetools.com/{projectKey}/product-discounts/key={key} -i \--header "Authorization: Bearer ${BEARER_TOKEN}"
Check if ProductDiscount exists by Query Predicate
Checks if a ProductDiscount exists for a given Query Predicate. Returns a 200 OK
status if any ProductDiscounts match the Query Predicate, or a 404 Not Found
otherwise.
view_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
where | The parameter can be passed multiple times. |
curl --head https://api.{region}.commercetools.com/{projectKey}/product-discounts -i \--header "Authorization: Bearer ${BEARER_TOKEN}"
Create ProductDiscount
manage_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
expand | The parameter can be passed multiple times. |
application/json
application/json
curl https://api.{region}.commercetools.com/{projectKey}/product-discounts -i \--header "Authorization: Bearer ${BEARER_TOKEN}" \--header 'Content-Type: application/json' \--data-binary @- << DATA{"value" : {"type" : "absolute","money" : [ {"currencyCode" : "EUR","centAmount" : 100} ]},"predicate" : "1=1","name" : {"en" : "test-discount1"},"description" : {"en" : "test-discount1"},"isActive" : false,"sortOrder" : "0.9534"}DATA
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}
Update ProductDiscount
Update ProductDiscount by ID
manage_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
id String |
|
expand | The parameter can be passed multiple times. |
application/json
version Int | Expected version of the ProductDiscount on which the changes should be applied. If the expected version does not match the actual version, a ConcurrentModification error will be returned. |
actions Array of ProductDiscountUpdateAction | Update actions to be performed on the ProductDiscount. |
application/json
curl https://api.{region}.commercetools.com/{projectKey}/product-discounts/{id} -i \--header "Authorization: Bearer ${BEARER_TOKEN}" \--header 'Content-Type: application/json' \--data-binary @- << DATA{"version" : 1,"actions" : [ {"action" : "changeValue","value" : {"type" : "absolute","money" : [ {"currencyCode" : "EUR","centAmount" : 100} ]}} ]}DATA
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}
Update ProductDiscount by Key
manage_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
key String |
|
expand | The parameter can be passed multiple times. |
application/json
version Int | Expected version of the ProductDiscount on which the changes should be applied. If the expected version does not match the actual version, a ConcurrentModification error will be returned. |
actions Array of ProductDiscountUpdateAction | Update actions to be performed on the ProductDiscount. |
application/json
curl https://api.{region}.commercetools.com/{projectKey}/product-discounts/key={key} -i \--header "Authorization: Bearer ${BEARER_TOKEN}" \--header 'Content-Type: application/json' \--data-binary @- << DATA{"version" : 1,"actions" : [ {"action" : "changeValue","value" : {"type" : "absolute","money" : [ {"currencyCode" : "EUR","centAmount" : 100} ]}} ]}DATA
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}
Update actions
Set Key
action String | "setKey" |
key String | Value to set. If empty, any existing value will be removed. MinLength:2 MaxLength: 256 Pattern: ^[A-Za-z0-9_-]+$ |
{"action": "setKey","key": "new-key"}
Change Value
action String | "changeValue" |
value | New value to set. Must not be empty. |
{"action": "changeValue","value": {"type": "relative","permyriad": 2000}}
Change Predicate
action String | "changePredicate" |
predicate String | New value to set. Must be a valid ProductDiscount predicate. |
{"action": "changePredicate","predicate": "product.id = \"{{product-id}}\""}
Change Is Active
action String | "changeIsActive" |
isActive Boolean | New value to set.
If set to |
{"action": "changeIsActive","isActive": false}
Set Valid From
action String | "setValidFrom" |
validFrom | Value to set. If empty, any existing value will be removed. Take Eventual Consistency into account for calculated discount values. |
{"action": "setValidFrom","validFrom": "2018-10-12T14:05:00.000Z"}
Set Valid Until
action String | "setValidUntil" |
validUntil | Value to set. If empty, any existing value will be removed. Take Eventual Consistency into account for calculated undiscounted values. |
{"action": "setValidUntil","validUntil": "2018-10-12T14:05:00.000Z"}
Set Valid From and Until
action String | "setValidFromAndUntil" |
validFrom | Value to set. Take Eventual Consistency into account for calculated undiscounted values. |
validUntil | Value to set. Take Eventual Consistency into account for calculated undiscounted values. |
{"action": "setValidFromAndUntil","validFrom": "2018-10-12T14:00:00.000Z","validUntil": "2018-10-12T14:05:00.000Z"}
Change Name
action String | "changeName" |
name | New value to set. Must not be empty. |
{"action": "changeName","name": {"de": "NewProductDiscountDE","en": "NewProductDiscountEN"}}
Set Description
action String | "setDescription" |
description | Value to set. If empty, any existing value will be removed. |
{"action": "setDescription","description": {"de": "New Product Discount Description DE","en": "New Product Discount Description EN"}}
Change Sort Order
action String | "changeSortOrder" |
sortOrder String | New value to set.
Must not be empty.
The string value must be a number between |
{"action": "changeSortOrder","sortOrder": "0.3"}
Delete ProductDiscount
Delete ProductDiscount by ID
manage_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
id String |
|
version Int | Last seen version of the resource. |
expand | The parameter can be passed multiple times. |
application/json
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/product-discounts/{id}?version={version} -i \--header "Authorization: Bearer ${BEARER_TOKEN}"
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}
Delete ProductDiscount by Key
manage_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
key String |
|
version Int | Last seen version of the resource. |
expand | The parameter can be passed multiple times. |
application/json
curl -X DELETE https://api.{region}.commercetools.com/{projectKey}/product-discounts/key={key}?version={version} -i \--header "Authorization: Bearer ${BEARER_TOKEN}"
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}
Get Matching ProductDiscount
This endpoint can be used to simulate which Product Discounts would be applied if a specified Product Variant had a specified Price. Given Product and Product Variant IDs and a Price, this endpoint will return the ProductDiscount that would have been applied to that Price.
If a Product Discount could not be found that could be applied to the Price of a Product Variant, a NoMatchingProductDiscountFound error is returned.
view_products:{projectKey}
region String | Region in which the Project is hosted. |
projectKey String |
|
application/json
productId String | ID of the specified Product. |
variantId Int | ID of the specified Product Variant. |
staged Boolean | Controls which projected representation is applied for the query.
Set to |
price | Specified Price of the specified Product Variant. |
application/json
curl https://api.{region}.commercetools.com/{projectKey}/product-discounts/matching -i \--header "Authorization: Bearer ${BEARER_TOKEN}" \--header 'Content-Type: application/json' \--data-binary @- << DATA"{n "productId": "123456",n "variantId": 1,n "staged": false,n "price": {n "value": {n "centAmount": 100,n "currencyCode": "EUR"n }n }n}n"DATA
{"id": "d7a204f9-7746-4857-b17e-71f1235a691a","version": 2,"value": {"type": "absolute","money": [{"type": "centPrecision","fractionDigits": 2,"currencyCode": "EUR","centAmount": 100}],"id": "3544d4a3-1279-443c-8699-4220753bf6f5"},"predicate": "1=1","name": {"en": "test-discount1"},"description": {"en": "test-discount1"},"isActive": false,"sortOrder": "0.9534","references": [],"createdAt": "2016-02-24T09:44:57.858Z","lastModifiedAt": "2016-02-24T09:44:57.939Z"}