Table of Contents

Apply a promotion to a product

Outcome: an active promotion EARLY-HLB-10 that takes 10% off the "Halong Bay Day Cruise" activity for orders placed in the next 30 days, capped at 200 total redemptions.

Time: ~5 minutes. Permission: Manager role on the tenant.

Before you start

You need:

Step 1 — Open the Promotions list

  1. Sign in to the Dashboard.

  2. In the left sidebar, expand Travel (or Apps, depending on your sidebar layout) and click Promotions.

    📷 Sidebar: Promotions menu itemScreenshot pending — drop file at images/01-sidebar-promotions.png
  3. The list at /apps/promotions shows existing promotions with Code, Name, Module, Trigger, Validity, Usage, Priority, and Status columns.

Step 2 — Create a new promotion

  1. Click New promotion in the top-right of the list card.
  2. The editor opens at /apps/promotions/edit/0 with empty fields.

Step 3 — Fill the General section

Field Value Notes
Code EARLY-HLB-10 Internal identifier; uppercase + hyphens; immutable after save.
Name Early-bird Halong 10% off Operator-facing label shown in lists and reports.
Description 10% off Halong Bay Day Cruise for the first 30 days. Optional context for other operators.
Currency USD (or your tenant default) Determines how monetary thresholds are interpreted.
Enabled modules Travel Comma-separated. Use Travel,Ecommerce to apply across both.
Valid from Today's date, time 00:00.
Valid to Today + 30 days, time 23:59.
Priority 100 Higher number wins when multiple promotions could apply to the same item. Default 100 is fine.
Sort order 10 Display order in operator lists. Doesn't affect runtime.

Step 4 — Set the trigger

In the Trigger card:

  1. Trigger dropdown → select Automatic.

    • Automatic — applies whenever scope + audience match. Best for time-limited campaigns like this one.
    • PromoCode — requires the customer to enter a code at checkout. Use this for influencer codes or email-only offers.
  2. Leave Promo code empty (only required when trigger = PromoCode).

  3. Minimum order amount — leave blank.

  4. Minimum participants (Travel) — leave blank.

  5. Early-bird days ahead — leave blank.

  6. Usage limit (total)200.

  7. Per-customer limit1 (one redemption per signed-in customer).

    📷 Trigger card filled with Automatic + 200 capScreenshot pending — drop file at images/02-trigger.png

Step 5 — Define the audience (who qualifies)

In the Audience card:

  1. Click + Add audience row.
  2. TypeEveryone. (For a logged-in-only promo, pick RegisteredCustomers; for a tier-gated promo, pick LoyaltyTier and choose the tier.)
  3. Leave Match value empty when Type is Everyone.
Note

If you add multiple audience rows, they OR together — a customer matching any row qualifies.

Step 6 — Define the scope (what the discount applies to)

In the Scope card:

  1. Click + Add scope row.

  2. TypeProduct.

  3. Match valueHLB-DAY-01 (the product code from your earlier guide).

  4. Leave Quantity blank — it applies to any quantity.

    📷 Scope row targeting HLB-DAY-01Screenshot pending — drop file at images/03-scope.png
Tip

To discount a whole Category instead of one product, use Type Category with the category slug. To discount all products in a module, use Type Module with value Travel.

Step 7 — Define the reward (what the customer gets)

In the Reward card:

  1. Click + Add reward.

  2. TypePercentOff.

  3. Value10 (interpreted as 10%).

  4. Apply toScope (apply to scoped items only — not to the whole order).

  5. Leave Max discount blank to allow uncapped percent-off, or set a ceiling (e.g. 50 USD) to cap savings per order.

    📷 Reward row: 10% off scopeScreenshot pending — drop file at images/04-reward.png
Important

Volume tiers (in the Volume Tiers card below Reward) are an advanced feature for "buy N save X%" pricing. Skip that card for a simple percent- off promotion.

Step 8 — Save and verify

  1. Click Save in the top-right action bar.

  2. On success, you're redirected to the promotion list with a green toast: "Promotion saved." The new row shows Status = Active if today is within the validity window.

    📷 Promotions list with new active rowScreenshot pending — drop file at images/05-saved.png
  3. Open the storefront in a new tab and navigate to the Halong Bay product. Expected: a strikethrough on the original price and the discounted price shown next to it, with a "10% off" badge.

  4. Add the product to cart and proceed to checkout. The cart and order summary should both reflect the 10% discount line item.

How to disable or end a promotion early

  • Pause without deleting — open the promotion, set Active toggle off, save. Storefront stops applying it within 60 seconds (cache TTL).
  • End early permanently — change Valid to to a past timestamp. The promotion remains in the list for audit but no longer applies.
  • Delete — from the list, use the row's delete action. Only available if the promotion has zero redemptions.

Common issues

Symptom Cause Fix
Promotion not applying on storefront Outside the validity window. Confirm Valid from ≤ now ≤ Valid to in tenant timezone.
Discount applied twice Two automatic promotions match the same scope. Adjust Priority — only the highest-priority matching promotion applies.
Customer gets "Promo code invalid" Trigger is PromoCode but Promo code field was left empty. Reopen, set the code, save.
Usage stuck at zero on dashboard Counter updates after order is paid, not on add-to-cart. Wait for an order to complete payment.

What's next

  • (Coming soon) Stack two promotions with explicit priority — see the Volume Tier guide.
  • (Coming soon) Schedule a promotion for a future window via Valid from.