Crystallize logo

Promotion Engine: Where Power Meets Play with Crystallize

Crystallize's new Promotion Engine (from the visual UI to API controls) helps businesses capitalize on key moments with powerful discounting and a user-friendly, skill-tree-style interface.

clockPublished May 22, 2025
clock18 minutes
Vasil Dimitrov
Vasil Dimitrov
Promotion Engine: Where Power Meets Play with Crystallize

Who among us hasn’t succumbed to a tempting sale or giveaway in an online store? Often, a special offer – whether free shipping or a buy-one-get-one deal – makes the difference between a customer completing their order or abandoning their cart.

Crystallize’s new Promotion Engine is built to capitalize on these moments. It combines powerful discounting features with a fresh, gamified UI that makes configuring complex campaigns surprisingly fun.

In this in-depth introduction, we’ll explore how to design, configure, and leverage promotions in Crystallize – from the visual skill-tree-style interface to the behind-the-scenes API controls – so both business users and developers can run creative promotional campaigns with confidence.

What Are Promotions in Crystallize?

In Crystallize, a promotion is a pricing campaign or discount rule that applies in the cart/checkout context, rather than a static price on a product. Promotions are cart-level price adjustments (temporary or permanent) that kick in when certain conditions are met. For example, a promotion can automatically apply a discount if a customer puts enough of the right items in their cart or enters a coupon code.

Unlike simply marking an item on sale (which changes the list price for everyone), promotions are dynamic – they only appear (to the shopper) at checkout or in the cart when the trigger conditions are satisfied. This strategy enables all kinds of deals: flash sales, bundle discounts, loyalty rewards for specific customers, coupon campaigns, etc. All these can be configured for the exact products, customer segments, and time frames you want, without any coding.

From a customer’s perspective, promotions enhance the shopping journey by providing pleasant surprises or incentives at checkout (think “Congrats! You got free shipping” or “20% off applied!”). Used wisely, they can boost conversion rates and average order value – for instance, encouraging shoppers to add one more item to get a discount, or rewarding loyal customers with special deals. And because promotions are managed centrally in Crystallize, you can run consistent campaigns across channels (web, mobile app, even in-store if integrated) – true omnichannel strategy. A promotion can be targeted by market or storefront, ensuring the right audience gets the right deal at the right time.

A Gamified, Visual UI for Promotions

Crystallize’s Promotion Engine has an intuitive visual interface inspired by video game skill trees. Configuring a discount feels less like filling out a dull form and more like designing a strategy in a game. You start at the top with the core Mechanism (the type of discount), then branch out to define Triggers (conditions) and Targets (the items to discount). Additional nodes for scheduling (Periods) and fine-tuning rules (Limitations) appear as needed. This playful design makes it clear how each element connects: you literally see the logic flow from if this happens (triggers) to then give this discount (targets). Color coding in the UI reinforces this separation – for example, trigger criteria might be in purple, while target items are in green/teal.

The promotions user interface in Crystallize presents a skill-tree-inspired layout for building discount logic. In the example above, a promotion called “50 Percent Discount” is being defined. Key fields like Mechanism (here a 50% discount) are configured at the top, and a time Period has been scheduled (showing as pending for a future date range).

Below, the interface lets you add Triggers (“Choose what triggers your promotion?”) such as specific products, SKUs, folders (categories), or coupon codes, and Targets (“Choose what targets this promotion should kick in?”) such as products, SKUs, or folders. Because no targets or triggers have been added yet in this screenshot, the promotion would apply site-wide during the set period by default. On the left sidebar, existing promotions are listed with color-coded status indicators (e.g., green for active, yellow for scheduled, gray for always-on) for a quick overview of all campaigns.

Not only is the UI easy on the eyes, but it’s also informative. As you build a promotion, the system can generate a human-readable summary of the rule, for example, “Buy X get Y discount for customers in group Z” – so you can double-check the logic. The design team’s goal was to make configuring promotions “surprisingly fun”, empowering both marketing teams (to experiment with creative deals) and developers (to trust that complex discount logic can be set up without writing custom code).

Next, let’s break down the components of a promotion: Mechanisms, Targets, Triggers, Scheduling Periods, and Limitations.

Mechanisms: Types of Discounts

The Mechanism is the heart of your promotion – it defines how the discount is calculated or applied. In fact, when creating a new promotion, the mechanism is one of two required elements (the other being an identifier/name). Crystallize supports several mechanism types out of the box:

  • Percentage Discount: Decrease (or increase) the price by a percentage. For example, “20% off” will reduce the item’s price to 80% of its original value. This is great for seasonal sales like “everything is 20% off this weekend.”
  • Cart: Decreases the amount of the cart by a fixed value. The discount is spread across all the target items per quantity.
  • Fixed: Sets a new fixed price value to all target items. It is applied if the fixed price is lower than the current price.
  • X for Y (Volume Deals): The classic “Buy X items for the price of Y” deal. For example, 3-for-2 means the customer gets three items but pays only the price of 2 (essentially a 33% effective discount, with the cheapest item typically being free). Crystallize automatically discounts the cheapest item(s) so the customer pays for only Y out of the X items. This mechanism covers things like “Buy one, get one free” (which is a 2-for-1), “Buy two, get one 50% off” (a variant of X for Y), etc.

Selecting the right mechanism is your first step in configuring a promotion. It answers the question: What kind of deal am I offering? Is it a percentage off, a fixed cut in price, a special fixed price, or a bundle deal?

For example, a store-wide sale might use a percentage mechanism, whereas a clearance of specific SKUs at a set price would use the fixed price mechanism. Volume or bundle promotions naturally use the X for Y type. Once the mechanism is set, you can then define exactly which products it applies to (Targets) and under what conditions (Triggers).

Targets: What Gets Discounted

Targets define the scope of the discount – in other words, which items will receive the price adjustment from the promotion. If you don’t specify any target, the promotion will apply to everything in the catalog by default. That means the discount mechanism could affect all products site-wide (when triggered). However, in most cases, you’ll want to narrow the target to specific items or groups of items. Crystallize lets you target promotions by:

  • Product or Variant – You can select individual products or even specific variants (by SKU). For instance, you might target only the “Blue T-Shirt, size M (SKU 12345)” for a discount.
  • Folder (Category) – You can target all products within a certain folder in your product hierarchy. For example, target the entire “Plants” category or “Furniture” category. This is useful for category-wide sales (e.g., “All Plants 20% off”).
  • Topic (Tag) – If you have topics (tags) assigned to products (say, a “Summer Collection” topic spanning multiple categories), you can target all items with that topic. This gives a cross-category way to target, like a campaign that affects all items labeled “Clearance” or “Summer 2025”.
  • All products – As noted, leaving the target blank means every product can be discounted (effectively a site-wide promotion).

You can mix and match these as needed, and even exclude certain items from a target group. For example, you could target an entire folder except a few premium products in that folder. (The UI supports adding multiple items or folders as targets and marking some as “excluded” so they won’t get the discount)

Think of the target as answering the following: What do I want to discount? It’s essentially the reward.

In a simple sale, the target might be the same as the trigger (e.g., “All shoes 10% off” – the customer just needs shoes in the cart to get the shoes discounted). But in a cross-sell scenario, the target could differ (e.g., “Discount plants when furniture is bought” – here, plants are the target, furniture is the trigger). We’ll see an example of that shortly.

Triggers: When the Promotion Applies

If targets are the “what”, Triggers are the “when” (or “if”) of your promotion. A trigger defines the condition that must be satisfied in the cart for the promotion to activate. If you set no trigger by default, the promotion will apply to every cart (i.e., it’s always on whenever the target items are present). But usually, you’ll add triggers to make promotions conditional – this is how you create “if this, then that” deals. Triggers in Crystallize can be based on a wide range of factors:

  • Product(s) or Variant(s) in Cart: e.g., “If the cart contains [Product X]…” For example, “If a laptop is in the cart, then… [give some discount]”. You can specify one or many products or SKUs as triggers.
  • Folder/Category in Cart: e.g,. “If any item from [Category Y] is in the cart…” For example, “If the cart has any Furniture item, then trigger the promotion.” This condition is met by a class of products rather than one specific item.
  • Topic/Tag in Cart: e.g,. “If any item tagged [Topic Z] is in cart…” (Perhaps “Summer Collection” items in cart trigger something.)
  • Cart Total or Quantity: You can trigger a promotion when the cart’s total value exceeds a threshold (min cart value) or the quantity of items exceeds a threshold. For instance, “If cart total is over $100, apply free shipping” or “If at least three items are in cart, apply a 10% discount.”
  • Customer Segment: You can restrict promotions to certain customers or groups. For example, a trigger could be a specific customer ID (to target an individual for a personal offer) or a customer group (like “VIP Members” or “Wholesale Buyers”). This enables personalized campaigns (e.g., “Gold members get an extra 5% off”).
  • Coupon Code: Perhaps the most popular trigger – a code that the customer enters (usually at checkout) to redeem a promotion. You can define one or multiple codes that activate the promo. For instance, trigger the code “SUMMER2025” to give a seasonal discount. (The cart in Crystallize can hold a code to be evaluated against promotions.)
  • Market or Channel: If you operate multiple markets (regions, storefronts, or channels) in Crystallize, you can trigger promotions only for a specific market context. For example, run a promotion only on your EU store, or only in the POS channel but not online, by using market identifiers as triggers.
  • Currency: In multi-currency setups, you could even limit a promotion to orders in USD vs EUR, etc. (e.g., “$10 off” might only make sense for USD prices).

Just like targets, trigger definitions can include multiple conditions and exclusions. You could say “trigger on any product in this folder except these two products,” etc. The promotion will fire if at least one of the included trigger items is in the cart and none of the excluded ones violate the rule. And you can have multiple triggers combined (it’s essentially an OR logic among the trigger list – any trigger condition met can activate the promo, as long as other limitations are satisfied).

Triggers answer the question: What needs to happen before this discount can be applied? 

For example, “if you buy a laptop, you get a case at half price.” In this case, the laptop is the trigger (condition) and the case is the target (discounted item). If the cart doesn’t have the laptop, the promotion stays inactive.

Triggers allow highly strategic campaigns: you can require a certain purchase (buy X to get Y), enforce minimum spends, target specific customer segments for exclusive deals, or run coupon-driven sales. They’re essentially the “IF” part of an if/then promotion rule.

Scheduling Promotions with Periods

Promotions don’t have to run forever – most are tied to a timeframe (e.g., a weekend sale or a holiday campaign). The Period setting lets you schedule when a promotion is active. You can set a simple start and end date/time or multiple periods for a recurring promotion.

For instance, you might configure a promotion to be active from Nov 25th to Nov 28th (for a Black Friday weekend sale). Or you could set up a recurring promo that is active the first week of each month (by defining multiple period entries for those date ranges). During the defined windows, the promotion will automatically activate; outside of them, it’s as if the promotion doesn’t exist.

If no period is specified at all, the promotion takes effect immediately and remains active indefinitely until you disable or delete it. In the Crystallize app’s “Special Prices” section, promotions are listed with color indicators showing their status – for example, a promotion scheduled for the future is marked as pending (often shown in yellow/orange), an active current promo in green, an expired one in red, and a promotion with no end date might appear in gray (always on). This gives a visual timeline of your campaigns, ensuring you don’t accidentally overlap conflicting promotions and that you know what campaigns are running at any given time.

Scheduling is straightforward: you pick the date/time range for start and end. The engine uses these to enable or disable the promo automatically. There’s no need for a midnight manual switch – you can plan sales in advance (e.g., a “Summer Sale” set to go live next month) or have promotions auto-expire. This feature supports global time zones as well, so you can run region-specific timing if needed (tied to markets).

Fine-Tuning Rules with Limitations

To cover advanced scenarios, Crystallize offers Limitations on promotions. These are like additional rules or caps constraining how a promotion is used, ensuring your discount logic doesn’t over-apply or combine in unintended ways.

You’ll typically use limitations to control usage frequency and combination logic:

  • Usage Limits: You can limit how many times a promotion can be used in total (maxUsage) – e.g., a coupon code might only be valid for the first 100 redemptions. You can also limit usage per customer (maxUsagePerCustomer) – e.g., each customer can only use the “WELCOME10” discount once. Additionally, a promotion can be marked one-time per cart or not repeatable by setting repeatable = false. For example, suppose you have a “$5 off for every $50 spent” promotion. In that case, you might want it to apply only once no matter if the cart is $100 or $200 (non-repeatable), or conversely you might allow it to apply multiple times (repeatable) so $100 cart gets $10 off, etc. Similarly, quantityPerTrigger can specify how many times the discount can be applied per trigger condition (for instance, in a “buy 2 get 1 free” XforY deal, you might set quantityPerTrigger to 1 if you want to give at most one free item even if 6 items are bought, or make it repeatable to allow two free items for 6 purchased).
  • Combining Promotions (Stacking): In many cases, you might run multiple promotions simultaneously – the question is, can they stack on top of each other, or should the customer only get one? By default, Crystallize’s engine will not double-discount an item; it will pick the best available discount for the customer if two promos could apply to the same item/cart. This prevents “over-stacking” by accident. However, you have control to allow stacking in specific ways. There is a cumulativeDiscount flag and a canBeCombinedWith setting for promotions. If you mark promotions as cumulative (and specifically allow certain promotions to combine), the engine can apply them together. For example, you might have a site-wide 10% off Black Friday sale and also a “VIP customers get an extra 5% off” promotion. If you configure the VIP promo to be cumulative with the Black Friday promo, your VIP customers would get a combined ~15% off (the engine would apply one discount, then the next on the new price) – effectively stacking the deals. If you don’t allow cumulative stacking, a VIP eligible for both would get the better of the two discounts (in this case, 10% vs 5%, so 10% wins). Crystallize even allows sequential deals like “Buy 3, pay for 2, then take 20% off the result” if you explicitly want that kind of compound promotion – but again, you must opt in to that behavior via the settings, otherwise the customer just gets whichever single promotion gives the max benefit.
  • Combination Exclusions: Beyond stacking, you might want certain promotions to never coincide. The canBeCombinedWith list lets you specify exactly which other promotion IDs are allowed to combine. By implication, you can exclude others. For instance, Promotion A can combine with B, but not with C. This gives granular control if you have overlapping campaigns. For most cases, though, it’s enough to decide whether a promo is generally cumulative or not.

These limitations ensure your promotion strategies remain under control. They are the advanced knobs you turn for edge cases, like controlling a viral coupon’s usage or orchestrating complex tiered discounts without unintended giveaways. The recommendation (as the Crystallize team suggests) is to refer to documentation and plan out limitations carefully when using them, since they add complexity. But it’s good to know the system can handle these scenarios when needed.

▶️Promotions LIVESTREAM

Promotions in Crystallize are cool, but you're still not sure how to do them. Check out LIVESTREAM on promotions where Vasil and Bard walk you through real-world examples, show how to stack and schedule promotions, and explore how this new interface empowers developers and business teams. Whether you're running flash sales, seasonal campaigns, or loyalty rewards, we've got you covered😎

CHECK THE CRYSTALLIZE PROMOTIONS LIVESTREAM ON YOUTUBE

Example: “Buy Furniture, Get a Plant 20% Off”

To make all this more concrete, let’s walk through a UI-based example promotion: “Buy furniture, get a plant 20% off.” This kind of cross-category promotion is great for upselling (encouraging customers who buy a big-ticket item to add a smaller item to their cart). We’ll configure this step by step in Crystallize:

  1. Create a New Promotion: In the Crystallize App, go to Special Prices → Promotions and add a new promotion. Give it a name, like “Furniture Combo”; an identifier will be auto-generated (you can adjust it if needed).
  2. Set the Mechanism: Choose Percentage discount and set the value to 20 (for 20% off). This defines how much discount we’re giving on the target.
  3. Define the Target: Select the “Plants” folder (or a specific plant product or SKU, depending on your goal) as the target for the discount. In our scenario, we want the discount to apply to plant products. By choosing the entire folder, we include all plant items as eligible for the 20% off.
  4. Define the Trigger: Add a trigger for the “Furniture” folder. This means the promotion will only activate if at least one furniture item is in the cart. (If needed, we could be even more specific – e.g., trigger on a particular furniture SKU – but using the folder allows any furniture to qualify.)
  5. (Optional) Set a Period: If this is a limited-time campaign (say a month-long combo deal), you could add a period with start/end dates. If left blank, the promotion is active immediately and indefinitely until turned off.
  6. Save and Test: With the mechanism, trigger, and target in place, the promo rule is complete. Now, if a customer adds a furniture item to their cart and then adds a plant, the system automatically discounts the plant’s price by 20% in the cart. If the customer removes the furniture item, the plant discount is also removed because the trigger condition is no longer met.

This example highlights the interplay of mechanism, trigger, and target: 20% off (mechanism) on plants (target) triggered by furniture in the cart (trigger). The Crystallize UI would even summarize this rule in plain language for you as you configured it. For shoppers, it works seamlessly – they might see a message like “Add a plant to your order to get 20% off, because you bought a furniture item!” This kind of cross-sell promotion can increase the average order value and help move related products (in our case, perhaps encouraging people who buy a desk or shelf to also buy a nice potted plant to go with it).

More Use Cases: Volume Deals, Coupons, and Personalization

The Promotion Engine is very flexible. Here are a few other common promotion scenarios and how you’d handle them in Crystallize:

  • “3 for 2” Volume Deal: Suppose you want to offer a buy 3, get 2 (pay for 2) deal on a category of products (e.g., plants). You would choose the X for Y mechanism (set X=3, Y=2) and set the target to the Plants folder. With no additional trigger, this means any time a cart has 3 or more plant items, the cheapest one will be free (100% discounted) as the promotion kicks in. The engine automatically calculates this, as demonstrated in a Crystallize demo. Adding three plant products to the cart resulted in one of them (the cheapest) getting a 100% discount, clearly showing that the 3-for-2 promotion was applied.

  • Coupon Code Promotion: You can easily run a promo that only applies when a customer enters a specific code. For example, imagine a summer campaign where entering “SUMMER2025” gives 30% off plants. In Crystallize, you’d configure a Percentage 30% mechanism, set the target to the Plants folder, and add a trigger of type Coupon with code “SUMMER2025”. Now the 30% discount will apply to plant items only if the customer provides that code at checkout. You could combine this with a period (e.g., only valid during the summer months) or with other triggers (maybe also require a minimum cart value, etc.). If you don’t want certain items (like furniture) to ever be discounted by this coupon, simply leave them out of the target (or explicitly exclude the furniture folder) – in our example, we targeted only plants, so furniture is naturally excluded from the discount.
  • Loyalty/Personalized Discount: Suppose you want to give your VIP customer group an additional 10% off on top of regular promotions. You could create a promotion with a 10% Percentage mechanism, with a trigger set to a Customer Group = “VIP”. The target might be left broad (all products) or specific, depending on what you intend. You’d also mark this promotion as cumulative with other ongoing discounts. As a result, VIP customers would see an extra 10% drop in prices at checkout, even if items are already on sale or part of another promotion. Non-VIP customers wouldn’t get this, since they don’t fulfill the trigger.

As you can see, by mixing and matching triggers and targets, you can construct highly tailored deals: from omnichannel campaigns (using market-specific triggers to run a promotion only in certain regions or store views) to personalized offers (using customer or group triggers) and strategic order incentives (using cart value/quantity triggers to encourage bigger baskets). The Promotion Engine acts as a rules-based system that covers most marketing scenarios out of the box – and it’s all configurable through a friendly UI, so your marketing team can iterate on promotions without constantly involving developers.

Developer’s Corner: API Integration and Promotion Resolution

Under the hood, Crystallize’s Promotion Engine is powered by the Shop API, which means all promotion configurations and results are also accessible programmatically. Developers can manage promotions via API – for example, creating or updating promotions using GraphQL mutations, which is useful for tasks like migrating campaign rules from another system or integrating with external marketing tools. The Shop API also handles the promotion resolution during cart and checkout calculations. When a frontend (web or mobile) calls Crystallize to calculate a cart or generate an order total, the engine evaluates all active promotions against the cart’s contents (and context like customer, market, etc.) in real time.

By default, the engine will automatically apply the best possible discount for each item or order, ensuring the customer gets the most favorable deal if multiple promotions apply. As noted earlier, it won’t stack promotions unless you enable cumulative combinations. This means developers don’t have to implement complex pricing logic on the frontend – you can simply trust the API to return the correct prices after promotions. The response from the Shop API will typically include details of any promotions applied (e.g., promotion identifiers or descriptions), which you can use to display messages like “Promo code applied” or “Multi-buy discount applied” in the UI.

Omnichannel support is inherently achieved since the same API and promotion configurations serve all channels. Whether the cart comes from your website, a mobile app, or a point-of-sale system, as long as it goes through Crystallize’s API, the defined promotions and rules will consistently apply. This central source of truth ensures a customer gets the same deal everywhere and prevents discrepancies.

For developers looking to extend or control the promotion logic, you have a few options:

  • Use the API to enable/disable or modify promotions on the fly (for instance, if an external system decides to end a campaign early, an API call could update the promotion’s end date).
  • Leverage the cart and order APIs to fetch applied promotions. For example, you might show in the checkout summary: “Applied promotion: 3 for 2 (saved $15)”—this information can be derived from the API’s response, which lists the discounts.
  • Monitor promotion usage (the API could help track how many times a promo was used if you need to enforce limits, though Crystallize also does this internally when you set maxUsage, etc.).

In short, the Promotion Engine is developer-friendly: it’s powered by APIs and documented schemas, so you can script and automate campaigns as needed, or just let the business users configure everything in the UI and consume the results. There’s no black box magic – you can always peek into the logic via the API, but happily, you don’t need to reinvent any discount calculations in your code.

Promotion Engine for the Future

Crystallize’s Promotion Engine truly brings “power meets play” to the realm of e-commerce promotions. It offers a potent range of discounting capabilities – percentage cuts, fixed deals, bundle offers, conditional triggers of all stripes, scheduling, stacking rules, and more – all wrapped in an approachable and fun user experience.

Marketers and e-commerce managers get a playground for crafting creative campaigns (from flash sales to loyalty perks) with immediate visual feedback. At the same time, developers can rest assured that a robust backend will enforce these rules consistently across every channel and integration.

By bridging the needs of both business and tech teams, the promotion engine allows for rapid experimentation and optimization of campaigns, ultimately driving more engaging customer experiences and higher conversion rates.

Whether you’re looking to run a simple holiday sale or orchestrate an omnichannel personalized discount strategy, Crystallize provides the tools to do so easily and confidently.

Now, go forth and level up your promotional campaigns – your customers (and your bottom line) will thank you!

OR

Set up a personal 1-on-1 Crystallize demo, tailor-made to your use case first to see how we fit.