# Product discounts Product discounts reduce eligible variant prices before they are displayed as catalog sale prices. They are useful when a campaign should appear on product listings and detail pages. The rule evaluates a product-price context, not a cart. ## Target price records One variant can have several prices, and only some may match a rule. For a sale on a specific lamp SKU priced in EUR, a predicate can be: Product predicate ```text sku == "LAMP-BLACK" && price.currency == "EUR" ``` Use the [product predicate reference](/concepts/product-predicate-language) for supported fields. Product tags and categories are not available in that context. Do not copy a search filter or a cart line-item predicate into this field. ## Value, schedule, and priority The create input accepts either a relative or absolute value and an optional `validFrom` and `validUntil` schedule. The underlying price has its own validity window. The discount cannot supply a missing base price or publish a hidden variant. Use deliberate priorities and verify the selected discounted price when rules overlap. Do not assume multiple matching product discounts add together. For a relative value, follow the input's documented `factor` units rather than sending an unverified percentage representation. ## Test the buyer's result Read one matching and one non-matching variant in the actual store, price channel, country, currency, and customer context. Verify the effective and original prices exposed by the API. Test the beginning and end of a scheduled campaign. See [ProductDiscountCreateInput](/api/admin-graphql/inputs/product-discount-create-input) for configuration. For basket-level offers, use [Cart discounts and targets](/concepts/discounts/cart-discounts).