# Product predicate language A product discount predicate evaluates an individual variant price record. The same variant can have one matching EUR price and another non-matching price. Optional channel, country, and customer-group dimensions belong to that price record, not to the shopper's current browser state. ## Supported fields | Field | Value | | --- | --- | | `sku` | Variant SKU | | `country_code` | Price country or null | | `channel.id` | Price channel ID or null | | `customer_group.id` | Price customer-group ID or null | | `price.id` | Price ID | | `price.amount` | Integer minor-unit amount | | `price.currency` | Currency code | | `product.id`, `product.name`, `product.slug` | Product identity and labels | | `product.collections` | Collection entries with `id`, `name`, and `slug` | | `variant.id`, `variant.name` | Variant identity and label | Product tags, categories, and cart fields are not part of this context. Use a supported collection, SKU, or identity condition instead. ## Target one SKU and currency SKU and currency ```text sku == "LAMP-BLACK" && price.currency == "EUR" ``` This affects eligible EUR price records for that SKU. It does not automatically affect another currency or create a base price. ## Target a collection Collection ```text price.currency == "EUR" && product.collections.any(collection => collection.slug == "desk-refresh") ``` Use collection IDs for relationships that must survive slug changes. ## Narrow a price dimension Price channel ```text channel.id != null && channel.id == "" && price.currency == "EUR" ``` Replace the placeholder with an actual channel ID. A rule requiring a channel ID does not also match a price with no channel dimension. The same distinction applies to customer-group and country constraints. ## Verify timing and amounts The base price's `validFrom` and `validTo` window and the discount's `validFrom` and `validUntil` window are separate. Verify both when a scheduled reduction is missing. Pair `price.amount` comparisons with a currency condition, and test the boundary in minor units. Read [Product discounts](/concepts/discounts/product-discounts) for lifecycle and [Predicate language](/concepts/predicate-language) for shared syntax.