Promotions

Set up discounts and loyalty promotions, and work with them through the API.

Promotions give customers a discount (or extra loyalty points) automatically when a sale meets your rules. The register checks your promotions as items are added, so staff don't have to remember them. You set them up in the app or through the API.

In the app

Go to Sales → Promotions. Create a promotion, choose the discount, which products and stores it applies to, who it's for, and when it runs.

The main settings

SettingAPI fieldWhat it does
NamenameShown to staff and on the sale line.
Discount typediscount_typePercentage, Fixed Item Amount or Fixed Total Amount. If you run a loyalty program, Fixed Loyalty Points and Multiply Loyalty Points give points instead of money off.
DiscountdiscountThe amount, percentage or points, depending on the type.
Productsproduct_ids, product_tags, product_types, product_vendors, option1–option3Which products it covers.
Product filterproduct_filterrequire_any, require_all or exclude_all: how the product rules are applied.
Markdownsproduct_marked_downWhether marked-down products count.
Storesstore_ids, store_tags, store_filterWhich stores it runs in. store_filter is in or not_in.
Marketmarket_idLimit it to one market.
Customercustomer_required, customer_loyalty_tierRequire a customer on the sale, or limit it to a loyalty tier.
Datesfrom_date, to_dateWhen it runs.
Requirementsminimum_item_quantity_requirement, minimum_order_total_requirement and friendsQuantity or spend the sale has to reach.
Usage limitslimit_usage, limit_customer_usage, limit_customer_usage_monthsHow many times it can be used, in total and per customer. used_times counts uses so far.
Suggest on POSshow_on_posSuggest the promotion to staff at the register.
StackablestackableWhether it can combine with other promotions.
Discount reasondiscount_reasonThe reason recorded on discounted lines.

Promo codes are managed on the promotion in the app.

Through the API

Here's 20% off everything tagged summer, in every store, for November:

{
  "name": "Summer 20% off",
  "discount_type": "Percentage",
  "discount": 20,
  "product_tags": ["summer"],
  "product_filter": "require_any",
  "store_filter": "in",
  "from_date": "2026-11-01T00:00:00+11:00",
  "to_date": "2026-11-30T23:59:59+11:00",
  "show_on_pos": true
}
📘

Update with the whole promotion

Fetch the promotion first, change what you need and send it all back with its id.

See which promotions were used

Each sale line records the promotions applied to it in item_promotions, so you can report on them with List sale lines or a report.

Prices vs promotions

A promotion is a rule the register applies. If you just want a different price for a product, maybe for a set period or a market, use a price instead (Sales → Prices, or Bulk create or update prices).

React to changes in Glue

promotion_create, promotion_update and promotion_delete fire when promotions change, so you can mirror them to your website or let the team know.

Example: Post new promotions to Teams

Trigger: System Hook, promotion_create.

  1. API Request: Get Private Data for your Teams webhook, Response variable teams_res.

  2. Script: Read the promotion

    var promo = JSON.parse($.default);
    $.promo = promo;
    $.promo_dates = (promo.from_date || "now") + " to " + (promo.to_date || "no end date");
    var pd = JSON.parse($.teams_res.body);
    $.teams_url = pd[Object.keys(pd)[0]].trim();
  3. Send Notification: Tell the stores, Channel Microsoft Teams, Webhook URL {{ teams_url }}, Title New promotion: {{ promo.name }}, Message {{ promo.discount_type }} {{ promo.discount }}, running {{ promo_dates }}.

See Slack and Teams notifications for setting up the webhook.


Did this page help you?