Skip to content
Log in

Discounts

On this page

Use discounts to reduce a product’s price automatically, with no code and no action from the customer. A discount is the only offer type that changes the price a shopper sees before they add anything to the cart.

A discounted product is listed with its new price beside the original, which is struck through. A discount either adds to other discounts on the same product or replaces them, depending on how you set its behavior.

Discounts and promotions are separate systems, so a promo code can be applied on top of an already discounted product. Discounts do not apply to product bundles, and products inside a bundle ignore them.

If you are weighing a discount against another kind of offer, see Choose the right offer type.

Configuration

From the Discounts object, configure the discount including the amount and scope.

Field Description Notes
Discount Name The name of the discount For internal identification
Calculation Type How the reduction is worked out See the calculation types below
Behaviour when Applied Whether this discount adds to other discounts or replaces them See Discount behavior
Discount Percentage The percentage to take off Used by Discount Percentage
Discount Amount The amount to take off Used by Discount Amount
Discounted Price The price the product is set to Used by Discounted Price
Dynamic Discount Amount A Liquid expression that supplies the amount to take off Used by Dynamic Amount. See Dynamic discounts
Dynamic Discounted Price A Liquid expression that supplies the price to charge Used by Dynamic Price. See Dynamic discounts
Conditions A Liquid expression that further narrows when the discount applies Optional. See Conditions
Active Turns the discount on and off, alongside the dates Must be true for the discount to run
Starts At The date and time the discount begins  
Expires At The date and time the discount ends Leave blank to run indefinitely

Calculation types

Calculation Type Complete this field Result
Discount Percentage Discount Percentage A percentage off the list price
Discount Amount Discount Amount A fixed amount off the list price
Discounted Price Discounted Price The product is sold at this price
Dynamic Amount Dynamic Discount Amount A Liquid expression returns the amount to take off
Dynamic Price Dynamic Discounted Price A Liquid expression returns the price to sell at

Stores that price in points have a points twin for each of these: Discounted Points, Dynamic Discounted Points, and Dynamic Discount Points Amount.

:::note How to Apply the Discount and Rebate Amount appear on the Discount record but are not in use yet. Leave them as they are. :::

Discount scope

The fields under Scope can be used to narrow down on what products are discounted and to whom. The more lookup fields you use, the narrower the scope can be. Stacking multiple discounts can then also open up the scope to include all the products and customers you want to offer discounts to.

As an example, populating the Brand, Product Category and Membership fields will apply the discount only to products of that brand that belong to that category and will only be available to customers who are logged in and have that membership assigned to their account.

Scope Description
All scope fields empty Include all active products and all customers across all stores
Store Include all products in this store
Price Book Include all products in this price book
Brand Include all products from this brand
Product Category Include all products from this specific category and all its subcategories
Product Include only this specific product and any variants
Membership Include contacts from all accounts under this specific membership
Account Include only contacts from this specific account

:::note The Membership and Account scopes depend on knowing who the customer is. On your web store the customer must be signed in. At the POS you must add the customer to the cart, otherwise the discount is skipped. See Discounts at the POS below. :::

Conditions

The optional Conditions field holds a Liquid expression that further refines when the discount applies, on top of the scope fields. Write the expression exactly as you would write the test inside a Liquid {% if %} tag, without the tag itself.

Two objects are available to the expression:

  • discount — the discount record being evaluated
  • product — the product the price is being calculated for

For example, to apply the discount only to products that are currently purchasable:

```liquid

product.can_purchase? ```

Put each condition on its own line. Every line must evaluate to true for the discount to apply, so multiple lines act as an AND. If the expression cannot be evaluated, the discount does not apply.

:::warning Conditions are evaluated on your web store only. At the POS the field is ignored and the discount applies whenever its scope matches. If a discount must never apply at the POS, restrict it with Outlet Scope rather than relying on a condition. :::

Dynamic discounts

The Dynamic Amount and Dynamic Price calculation types work out the figure with a Liquid expression rather than a fixed number, so one discount record can price differently for each customer or each cart. Use them when the reduction depends on something you cannot express as a single percentage or amount, such as a membership tier held on the customer’s record.

Set Calculation Type, then fill in the matching field:

Calculation Type Field to complete What the expression must output
Dynamic Amount Dynamic Discount Amount The amount to take off
Dynamic Price Dynamic Discounted Price The price to charge

The expression must output a number and nothing else. Alongside the standard Liquid variables available to your store, these are available:

  • original_amount — the price before the discount
  • discount — the discount record being evaluated
  • current_customer — the signed-in customer, if there is one
  • current_cart — the current cart

For example, to take 20% off for one membership tier and 15% for another, reading the tier from a custom field on the customer:

```liquid

{%- assign tier = current_customer.data[‘membership_tier__c’] -%} {%- assign percent = 0 -%} {%- if tier contains “Gold” -%} {%- assign percent = 20 -%} {%- elsif tier contains “Silver” -%} {%- assign percent = 15 -%} {%- endif -%} {%- assign remaining = 100 | minus: percent -%} {{- original_amount | times: remaining | divided_by: 100.0 | round: 2 -}} ```

If the expression cannot be evaluated, the discount does not apply.

:::warning Dynamic discounts apply on your web store only. The POS cannot evaluate the expression, so a Dynamic Amount or Dynamic Price discount is skipped entirely at the till: the customer sees the full price and is charged it. If the same reduction must reach the POS, either express it as a Discount Percentage or Discounted Price, or apply it at the till with a POS discount button. See Adjust prices at the POS checkout. :::

Outlet scope

By default, a discount applies to all of your outlets. You can restrict a discount to specific outlets, stores, or store groups using the Outlet Scope field on the Discount record.

The Outlet Scope field stores a JSON structure that supports three scope levels:

Specific outlets — restrict the discount to one or more outlets by their Salesforce record ID:

```json

{“s_c__outlet__c”: {“sfid”: [“a01Mn000000AbCdIAA”, “a01Mn000000AbCeIAA”]}} ```

All outlets in a store — restrict the discount to all outlets belonging to a specific store:

```json

{“s_c__store__c”: {“sfid”: [“a02Mn000000AbCfIAA”]}} ```

All outlets in a store group — restrict the discount to all stores (and their outlets) within a store group:

```json

{“s_c__store_group__c”: {“sfid”: [“a03Mn000000AbCgIAA”]}} ```

When the Outlet Scope field is empty, the discount applies across all outlets.

:::note Outlet scope restricts discounts at POS only. On web checkout, all discounts apply regardless of outlet scope setting. :::

Discounts at the POS

Discounts apply at the POS as well as on your web store. A matching discount reduces the price shown on the product tile and the price charged in the cart, using the same scope, stacking, and behavior rules described above.

Three things behave differently at the till:

  • Account and Membership scoped discounts need the customer on the cart. Until you add the customer, the POS has no account to match against, so a discount scoped to an Account or a Membership is skipped. Adding the customer part-way through a sale re-prices the items already in the cart.
  • A manually adjusted price is not re-priced. If you have already overridden the price of an item, adding the customer leaves that item at the price you set. If re-pricing changes an item that carries a manual POS discount, the POS shows a warning naming the item so you can review it.
  • Dynamic discounts do not apply at all. A discount using the Dynamic Amount or Dynamic Price calculation type is skipped at the POS, in both the price shown and the price charged. Only Discount Percentage, Discount Amount and Discounted Price reach the till. See Dynamic discounts above.

Products and price book entries set to Exclude From Price Reductions are skipped at the POS in the same way as on the web. See Adjust prices at the POS checkout for manual discounts and price overrides at the till.

Product exclusions

Individual products or price book entries can be excluded from discounts entirely, regardless of a discount’s scope configuration. See Exclude products from price reductions for details. ## Discount behavior

Replace existing price

This simply sets the discounted price for the product and will override any other behaviors. If a product is within the scope of multiple discounts that are set to replace existing price, the most recently created discount will be applied.

Replace other discounts

Discounts set to replace others will override any stacked discounts for the same products. If a product is within the scope of multiple discounts that are set to replace others, the most recently created discount will be applied.

Stacked with other discounts

When several discounts are set to stack, they will add to each other to give a greater discount to the products with overlapping scopes. Percentage discounts are calculated off the list price so if a product with a list price of $100 is within the scope of a 5% discount and a 10% discount will sell for $85 (15% off).

Sale price

Each Price Book Entry also has the option to set a sale price. The Sale Price field allows a discount to be applied to the product without using this discount feature. If the Sale Price is lower that the discounts available through this Discounts feature, the Sale Price will be used instead.

Discounts and subscription products

When a discount applies to a subscription product, the discounted price is locked in as the subscription’s recurring payment amount at the time of purchase. All renewal orders are charged at this discounted rate, not the full list price.

If you later remove or change the discount, existing subscriptions are not affected. Only new purchases use the updated price.

For a full breakdown of how discounts, promotions, and vouchers each interact with subscription products, see Subscription products.

Discount credit

Discount Credit records are automatically created when an order has discounts applied. These are a snapshot of each application of your discount and allow you to see what discounts were applied to products for each order.

Each record includes:

  • The discount applied
  • Total amount discounted for the order
  • The order it was applied to
  • Discount Calculation type
  • Discount Percentage
  • Discount Amount
  • Discounted Price

Was this article helpful?

Was this article helpful?