Create a Discount Campaign
How It Worksβ
Discounts are evaluated in real time when a transaction arrives at the Streaming API:
- The engine fetches all active discounts for the company.
- Each discount's conditions (Victory Conditions and Application Conditions) are checked against the cart and customer.
- Qualifying discounts are ranked by priority; stackability rules are applied.
- The final set of discounts is applied to the cart and the response returns the adjusted prices.
Configurationβ
Go to Loyalty and Promotional engine β Discounts β New Discount in the Owner App.
The form is organized into sections:
1. Descriptionβ
| Field | Required | Description |
|---|---|---|
| Name | β | Discount name. Can be configured in multiple languages when shown in customer-facing experiences. |
| Description | Optional internal note. Informational only; it does not affect discount eligibility, calculation, application, or checkout behavior. | |
| Status | β | Active or Inactive |
| Availability | Start and end date for when the discount can fire | |
| Currency | β | Defines the campaign's country scope and monetary unit. See Currency scope below. |
| Category | β | Defines the campaign's application group and priority. Categories with a lower priority number are evaluated first; within the same category, campaigns can compete (highest discount wins) or stack. Also used for reporting and filtering. See Stackability. |
| Recurrence type | β | How often the discount can fire per customer: Daily, Weekly (select days), Monthly (select days 1β31), Monthly β last day, or no recurrence |
| Recurrence days | Conditional | Required when recurrence = Weekly (days of week) or Monthly (days 1β31) |
| Coupon required | When enabled, the promotion can only be applied by presenting a coupon code. Reveals the Coupon section below. |
Currency scope: the selected currency limits the countries where the campaign can apply. Create separate campaigns for different currencies to keep country scope, budgets, and reporting clear. A campaign configured in EUR should target EUR countries; a GBP campaign should be a separate campaign with its own limits and availability. If the selected currency differs from the company's base currency, a conversion rate between both currencies must exist.
2. Eventsβ
For discounts, the trigger is always Cart β the discount is evaluated against the live transaction at checkout.
3. Select Customersβ
Controls which customers are eligible for this discount:
| Option | Behavior |
|---|---|
| All customers | Applied to all customers, enrolled or not |
| Loyalty members | Applied only to enrolled loyalty members; optionally filter by Registration Countries, Tiers, or Custom Properties |
| Targeted | Discount is delivered exclusively via Targeted Delivery campaigns to a specific audience |
4. Victory Conditionsβ
Configure the conditions that must be met for the discount to apply. Conditions are grouped by category:
Cart-level conditions
| Condition | What it checks |
|---|---|
| Total | Minimum cart total (after previous discounts) |
| Original total | Minimum cart total before any discount |
| Total minus additional cost | Total minus configured additional costs (e.g. shipping) |
| Country | Country of the store where the purchase occurs |
| Store | Specific store(s) |
| Store Category | Group of stores by category |
| Payment | Payment method used |
Line-level conditions
| Condition | What it checks |
|---|---|
| Item Product | Specific products in the cart (by product ID or product code) |
| Item Product Category | Product categories present in the cart |
| Product ID | Raw list of product IDs or codes (comma-separated) |
| Item Attributes | Custom line-item attributes on cart lines |
Customer-level conditions (available in Loyalty Members mode)
| Condition | What it checks |
|---|---|
| Tier | Customer's current loyalty tier |
| Customer Registration Countries | Country used when the customer enrolled |
| Client Attributes | Custom customer profile attributes |
| Calculated Attributes | Auto-derived customer KPIs (e.g. average cart, purchase frequency) |
| Customer ID | Specific customer IDs |
All conditions within a group can be combined with AND or OR logic.
5. Application Conditionsβ
Optional secondary conditions that restrict where the effect is applied within the cart. Victory Conditions decide whether the discount can apply; Application Conditions decide which lines or cart components receive the discount.
Cart event β available application conditions:
| Condition | Purpose |
|---|---|
| Item Product | Apply the discount only to specific products selected from the catalog |
| Item Product Category | Apply the discount only to products in specific categories |
| Product ID / Code | Apply the discount to products by raw product ID or code list |
| Item Attributes | Apply the discount only to lines matching custom attributes |
| Additional cost | Apply the discount to a specific cart additional cost, such as shipping or service fees, when configured |
Discount Application Conditions are intentionally line/additional-cost scoped. They are used to answer: "where does the discount land after the campaign has qualified?"
Use this when the trigger and the benefit are different:
| Business case | Victory Conditions | Application Conditions |
|---|---|---|
| Cart threshold discount on a category | Cart total β₯ β¬50 | Apply 20% only to Beverages |
| Cross-category offer | Customer buys Product A | Apply discount to Product B |
| Bundle / BOGO | Customer buys the required group | Apply benefit to the item(s) selected by the bundle |
These filters belong in Victory Conditions, not Application Conditions:
| Filter | Why |
|---|---|
| Customer, tier, registration country, calculated attributes | They decide whether the customer is eligible |
| Country, store, store category | They decide whether the cart context qualifies |
| Cart total, original total, total minus additional cost | They decide whether the cart amount qualifies |
| Payment method | It decides whether the payment context qualifies |
For cart percentage and ratio effects, Application Conditions are usually required so the engine knows which lines provide the calculation base.
For integration-level detail on rule_application, see Discounts β Application.
6. Promotion Effectsβ
Select the effect type and configure its value. One effect is configured per discount campaign.
The create page gives the operator-level explanation. The most complete technical reference for field names, JSON shape, distributions, effect limits, and integration troubleshooting is Reading from GET β Effects.
| Effect | What it does | Example | Key constraints |
|---|---|---|---|
| Percentage | Reduces the eligible amount by a percentage. | 20% off Beverages for loyalty members. | Supports Distribution, Limit of effects, and Bundle/Group. |
| Direct Value | Subtracts a fixed monetary amount from the eligible amount. | β¬5 off when cart total is at least β¬50. | Supports Distribution and Limit of effects; can be used with Bundle/Group for grouped fixed discounts. |
| Ratio | Grants a spend-scaled monetary effect for each configured monetary unit. | β¬1 benefit for every β¬10 spent on eligible items. | Supports Distribution and Limit of effects; useful for proportional benefits. |
| Combo Price | Sets a fixed final price for a qualifying group of items. | Product A + Product B for β¬10; 3 items from a category for β¬9.99. | Cart-only. Use total or individual_items_pro_rata distribution. Usually works with Bundle/Group and is always Highest Discount. |
| Strikethrough | Replaces the line price with a promotional price from a product-to-price map. | Product sent at β¬3.00, promotional price β¬1.00 β β¬2.00 discount and line treated as β¬1.00. | Cart-only. Applies line by line, uses individual_items, and is always Highest Discount. |
| Formula | Uses a pre-calculated promotional price sent by an external pricing engine. | External system sends promoPrice; Loyal Guru calculates cart line total minus promoPrice. | Cart-only. Requires the agreed line attribute, uses individual_items, and does not use Bundle/Group. |
Distribution determines how the effect is spread across matching lines:
| Distribution | Behavior |
|---|---|
total | Applies the effect once to the total qualifying amount or group. |
individual_items | Applies the effect per qualifying unit or line. |
individual_items_pro_rata | Calculates the total benefit and splits it proportionally across qualifying lines. |
Limit of effects caps how many times the effect applies per transaction. With simple line effects, it usually caps units. With Bundle/Group mechanics, each complete group counts as one application.
Bundle / Group links the victory conditions (items that trigger the discount) to the application conditions (items that receive the benefit), enabling BOGO, combo, and cross-category group mechanics. For the concept and examples, see Discount Types β Bundles.
Effect limits and bundles (API)β
Only for Cart events with percentage, direct_value, or combo_price effects:
| Option | Description |
|---|---|
Effect limit (limits) | Max effect applications per transaction (0 = unlimited). With bundles, each application is usually one group (e.g. limits: 2 = at most two 2x1 groups). |
Bundle / group (rule_group) | Forms groups from nested quantity in victory conditions (group size) and applies benefit per nested quantity in application (units per group). Detailed 2x1 / bundle examples: Reading from GET β Bundle mechanics. |
Effect limits and bundles are not available for Custom Event, Trigger, or Challenge events.
7. Limitsβ
Dedicated section after Effects. Controls campaign-level frequency and budget caps:
| Setting | Description |
|---|---|
| Chances to accrue | Maximum number of times this discount can fire across all customers (campaign-total cap). Soft limit β refreshed every ~5 minutes. |
| Chances to accrue per customer | Maximum number of times a single customer can benefit from this discount. Real-time check per transaction. |
| Campaign budget | Maximum total monetary discount value issued (in the company's default currency). Soft limit β refreshed every ~5 minutes. |
| Maximum discount per transaction | Cap on the discount amount applied in a single transaction. Applied in real time. |
Leave any limit field empty for unlimited. For the full model β enforcement order, examples, and the company-wide global cap β see Limits.
8. Stackabilityβ
| Setting | Description |
|---|---|
| Stackable | This discount can combine with other active discounts |
| Highest discount | Only the single highest-value discount applies (excludes others at the same level) |
| Priority | Numeric priority β higher value takes precedence in conflicts |
Stackability is automatically set to Highest Discount when the effect type is Combo Price, Strikethrough, or has Bundle/Group enabled.
For the full model β categories, priority, Highest Discount, Stackable, and evaluation order β see Stackability.
9. Partnersβ
Optional. Associate this discount with a specific partner (e.g., a CPG brand co-funding the promotion). Used for partner ROI reporting.
10. Couponβ
Visible only when Coupon required is enabled in the Description section.
| Sub-section | Fields |
|---|---|
| Codes | Universal (one shared code) or per-customer codes |
| Static code | Define a specific code string (e.g. SUMMER20). Leave blank for auto-generated codes. |
| Auto redeem | When enabled, the coupon is applied automatically without customer action |
| Activation | When the coupon becomes valid β from delivery date or from activation date |
| Expiration | Days after activation or fixed dates |
| Printable | Allow the coupon to be printed at POS; configure separate print activation/expiration window |
| External ID / Key | Optional integration identifiers for external system mapping |
Creating campaigns via APIβ
Campaigns created in the Owner App are evaluated automatically when a transaction reaches the Streaming API. You control how discounts are applied per transaction using the apply_discounts flag in POST /carts:
| apply_discounts | What Loyal Guru does |
|---|---|
true (default) | Evaluates campaigns, calculates the discount, and modifies the cart line values in the response. The POS applies the returned prices directly. |
false | Evaluates campaigns and returns which promotions apply, but does not modify cart line values. The POS or e-commerce system applies the discount amounts itself. |
For the full API schema and integration guide, see Discounts β Integrations.