Limits
Limits protect your promotional budget and prevent abuse before it happens. They operate at two levels: company-wide (a global ceiling across all campaigns) and per campaign (specific caps on a single promotion). The same system applies to both Discount and Points campaigns.
Two evaluation modes β understand this before configuring any limit:
| Mode | How it works | Which limits use it |
|---|---|---|
| β Real time | Checked on every transaction, at the moment the cart is evaluated. Enforced immediately β no overshoot. | Company global cap Β· Chances to accrue per customer Β· Max per transaction Β· Limit of effects |
| β± Background worker (~5 min) | A background job recalculates the counter approximately every 5 minutes and writes it to the database. The streaming engine reads the last written value. If many transactions arrive before the next refresh, the campaign may fire a few extra times. | Chances to accrue (campaign total) Β· Campaign budget |
For hard financial caps (e.g. "this campaign must not exceed β¬10,000"), use real-time limits or set the soft limit ~5β10% below the true ceiling to absorb the overshoot window.
Company-wide global limitβ
Evaluation: real time
Configured in Configuration β Promotions β Points & Wallet β Points β Limits.
This setting defines the maximum monetary value a single customer can accumulate from any campaign in a given period, across the entire company. On every transaction, the engine queries the customer's accumulated total for the current period and compares it to this ceiling. If the ceiling is reached, no further discount or points campaigns apply to that customer's cart until the period resets.
| Setting | What it controls |
|---|---|
| Period | The time window for the cap: daily, monthly (relative or natural), or yearly (relative or natural). |
| Value | Maximum amount in company currency a customer can accumulate in that period. |
| Country | The cap can be configured per country for multi-market companies. |
This is a monetary cap on accumulation β it tracks the total value awarded to the customer across all campaigns, not the number of redemptions. It applies to both discount and points campaigns.
Example: Cap set to β¬50/month. A customer has already received β¬47 in discounts this month. At checkout, the engine calculates that the next campaign would give them β¬8 off β but only β¬3 of headroom remains. The campaign is skipped entirely (not partially applied). At the start of the next month the counter resets and the cap applies fresh.
Per-campaign limitsβ
Set on each campaign individually in the Limits section of the campaign form β a dedicated accordion block that appears after the Effects section, also accessible when editing an existing campaign.
Chances to accrue β campaign totalβ
Evaluation: soft limit (~5 min refresh)
A cap on the total number of times this campaign can fire across all customers in a period. The engine pre-filters campaigns using a counter column (chance_to_accrue_limit_reached) that a background worker refreshes approximately every 5 minutes. Once that counter reaches the configured limit, the campaign is excluded from evaluation for all customers.
| Period option | Behavior |
|---|---|
| Always | No campaign-wide cap (default). |
| Per day | Resets daily. |
| Per month | Resets monthly (relative or natural month). |
| Per year | Resets yearly (relative or natural year). |
| Total | Lifetime cap β campaign stops permanently once reached. |
Because this is a soft limit, there is a window of up to ~5 minutes where the campaign may continue to fire after the limit is reached. For example, if the limit is 1,000 uses and 10,000 transactions arrive in a short burst, the campaign may fire 1,020β1,050 times before the worker stops it.
Example: Flash campaign limited to 500 uses total. At 08:00, 600 customers transact simultaneously. By 08:05 (next worker refresh), the campaign has fired ~510β530 times before being deactivated. If the limit must be strictly enforced, set it slightly below your target (e.g., 480) to account for the overshoot window.
Chances to accrue per customerβ
Evaluation: real time
Controls how many times a single customer can benefit from this campaign in a period. On every transaction, the engine queries the database for that customer's previous uses of this specific campaign in the current period. If the limit is reached, the campaign is skipped for that customer only β others are unaffected.
| Period option | Behavior |
|---|---|
| Always | No per-customer cap (default). |
| Per day | Up to N times per customer per calendar day. |
| Per month | Up to N times per customer per month (relative or natural). |
| Per year | Up to N times per customer per year (relative or natural). |
| Total | Maximum N times per customer over the campaign's lifetime. |
- For campaigns targeting All customers, this field is forced to Always β it cannot be changed.
- For Targeted campaigns with a coupon, only Always and Total are available.
Example: "10% off for loyalty members, max 3 times per month." Customer A has used it twice this month. On their third purchase this month, the campaign fires (2 < 3). On their fourth purchase, the engine queries the DB, finds 3 prior uses, and skips the campaign β silently, with no error shown.
Campaign budgetβ
Evaluation: soft limit (~5 min refresh)
A monetary cap on the total value this campaign can award across all customers. Like the campaign-total cap, the engine uses a pre-computed budget_limit_reached counter updated by the same background worker. Once the cumulative awarded value reaches the threshold, the campaign is excluded from evaluation.
| Period option | Behavior |
|---|---|
| Unlimited | No budget cap (default). |
| Per day | Budget resets daily. |
| Per month | Budget resets monthly (relative month). |
| Per year | Budget resets yearly (relative year). |
The budget value is always in the company's base currency.
Same overshoot risk as Chances to accrue β the soft counter may allow a small amount over budget during high-traffic windows before the worker refreshes. For tight budget control, configure the limit ~5β10% below the actual ceiling.
Example: Campaign budget of β¬10,000 per month. By the 20th of the month, β¬9,980 has been awarded. Five large carts arrive simultaneously, each generating a β¬15 discount. The worker hasn't refreshed yet β all five fire, awarding β¬75 more. The final amount awarded is ~β¬10,055. The worker then sets the campaign as exhausted, stopping further applications.
Maximum amount per transactionβ
Evaluation: real time
A hard cap on the value applied in a single transaction, regardless of what the campaign would otherwise calculate. Applied during cart computation β if the calculated discount or points award exceeds this limit, it is reduced to the configured maximum.
- For Discount campaigns: maximum discount amount applied per cart.
- For Points campaigns: maximum points or wallet amount awarded per event.
Example: Campaign gives 5% off on all electronics. A customer buys a β¬2,000 TV β 5% would be β¬100. Max per transaction is set to β¬50. The engine caps the discount at β¬50 and returns that value. The remaining β¬50 is not carried forward.
Limit of effectsβ
Evaluation: real time Β· Configured in: Effects section of the campaign form, not in Limits
The Limit of effects field is part of the Effect configuration β it controls how many times the effect fires within a single transaction. Documented here for completeness because it interacts with the Limits system during evaluation. Particularly relevant for bundle and BOGO mechanics.
| Setting | Behavior |
|---|---|
| 0 / blank | No limit β effect fires as many times as conditions are met. |
| N | Effect fires at most N times per transaction. |
Only available for Cart events with percentage, direct_value, ratio, or combo_price effects.
Example: 2Γ1 campaign (Buy 2 Coca-Cola, get 1 free), limit of effects = 2. A customer adds 8 Coca-Colas to the cart. Without a limit, the engine would apply the 2Γ1 three times (3 free units). With limit = 2, it applies twice β 2 free units. The remaining 2 extra units receive no discount.
How limits are evaluatedβ
At the moment a transaction arrives, limits are checked in this order:
- Company global cap (real time) β the engine queries the customer's accumulated value for the current period. If the ceiling is reached, evaluation stops immediately β no campaigns of any type are returned.
- Campaign budget pre-filter (soft) β campaigns where the budget counter β₯ budget value are excluded from the query entirely before evaluation begins.
- Chances to accrue pre-filter (soft) β campaigns where the use counter β₯ the campaign-total limit are similarly excluded at query time.
- Per-customer frequency check (real time) β the engine counts prior uses by this customer for each remaining campaign. Campaigns where the customer has reached their limit are skipped.
- Per-transaction cap (real time) β applied during cart calculation; the awarded amount is capped if it would exceed the configured maximum.
- Effect-level limit (real time) β applied during effect application; caps how many times the effect fires within the transaction.
If a limit is reached at any step, the campaign is skipped silently. No error is shown to the customer.
Summary tableβ
| Limit | Scope | Evaluation | Where to configure |
|---|---|---|---|
| Global accumulation cap | All campaigns, per customer | β Real time | Configuration β Promotions β Points & Wallet β Points β Limits |
| Chances to accrue | Campaign total (all customers) | β± Soft (~5 min) | Campaign β Limits section |
| Chances to accrue per customer | Per customer, per campaign | β Real time | Campaign β Limits section |
| Campaign budget | Campaign total value | β± Soft (~5 min) | Campaign β Limits section |
| Max per transaction | Single transaction | β Real time | Campaign β Limits section |
| Limit of effects | Per evaluation, per effect | β Real time | Campaign β Effects section |
See also: Stackability & Priority to control how multiple simultaneous campaigns combine.