Skip to content

Message Token Reference

Dino Discounts lets you write shopper-facing copy with tokens — short [bracketed] placeholders the storefront swaps for live values at render time. A single string like [ccy][amount_discount] off when you spend [ccy][threshold_reached] renders as "£5 off when you spend £50" for one shopper and "€5 off when you spend €50" for another, with no per-currency re-save.

There are three independent token vocabularies, one per surface. A token that works on one surface does not necessarily work on another — each is substituted by its own engine code, so this page lists them separately.

SurfaceWhere it showsEdited in
Cart labelThe discount line in the cart and at checkoutMessaging → Cart label
Spend-more nudge"Add more to save" prompts in the mini-cart, cart, and checkoutMessaging → Spend-more nudge
Product-page custom messageA custom line on the product page (Custom Message display mode)Messaging → Product page

The cart label is substituted by the engine (AbstractStrategy::replace_placeholders) at the moment the cart line renders. There are two value slots plus the currency token. Each slot has several interchangeable spellings — a canonical name, a legacy short form, and descriptive names chosen per discount type by the chip toolbar.

SlotSpellings (all interchangeable)Resolves to
Currency[ccy]The shopper's checkout-currency symbol (£ / / $)
Primary value[discount_value], [X], [percentage_discount], [amount_discount], [buy_quantity]The rule's primary number — percent value, fixed amount, or buy quantity
Secondary value[second_value], [Y], [threshold_reached], [quantity_reached], [pay_quantity]The rule's secondary number — pay quantity, or the spend / item-count threshold crossed

The descriptive spellings ([percentage_discount], [threshold_reached], …) are pure aliases of the same two slots — they exist so the chip toolbar can name the value for what it actually represents. The engine treats every primary spelling identically and every secondary spelling identically; there is no data migration when a rule is saved with one spelling or another.

TokenRendersExample
[ccy]Checkout currency symbol[ccy]10 off → "£10 off"
[percentage_discount]The percent number (no %)[percentage_discount]% off → "15% off"
[amount_discount]The fixed-amount number (no symbol)[ccy][amount_discount] off → "£5 off"
[buy_quantity]The buy quantity / bundle set sizeBuy [buy_quantity] → "Buy 3"
[threshold_reached]The spend threshold crossed (money)spend [ccy][threshold_reached] → "spend £50"
[quantity_reached]The item-count threshold crossed[quantity_reached]+ items → "5+ items"
[pay_quantity]The pay quantity (BOGO)get [pay_quantity] free → "get 1 free"
[discount_value] / [X]Generic primary value (canonical / legacy)[X]% off → "15% off"
[second_value] / [Y]Generic secondary value (canonical / legacy)Buy [X] get [Y] → "Buy 3 get 1"

Which tokens the toolbar offers per discount type

Section titled “Which tokens the toolbar offers per discount type”

The chip toolbar offers only the tokens that resolve for the rule's shape, so you never insert a placeholder that the engine will strip. (You can still hand-type any spelling, but a cross-type token resolves to this rule's slot value, so prefer the chips.)

Discount typeTokens offered
% off cart (no threshold)[percentage_discount]
Fixed $ off cart (no threshold)[ccy], [amount_discount]
Spend & Save — % off at a spend threshold[ccy], [percentage_discount], [threshold_reached]
Spend & Save — fixed $ off at a spend threshold[ccy], [amount_discount], [threshold_reached]
Volume / bulk — % off at a quantity threshold[percentage_discount], [quantity_reached]
Volume / bulk — fixed $ off at a quantity threshold[ccy], [amount_discount], [quantity_reached]
Buy X Get Y (BOGO)[buy_quantity], [pay_quantity]
Mix & Match (Bundle)[buy_quantity] (the bundle set size)
Pooled bundle — money reward (bundle price / amount off)[ccy]
Pooled bundle — non-money reward (%, free items, free gift, free shipping)none — the label needs no token

If you leave the cart label blank, Dino renders the localised string "Discount" — never the internal coupon code. See Cart Labels for the editor walkthrough.

The nudge is substituted by SpendMoreNudge::resolve_placeholders. It only fires on rules with a threshold to progress toward — Spend & Save (tiered), volume (bulk), and Mix & Match (bundle). A flat discount, or a Buy X Get Y rule, has no spend/quantity gap to nudge toward, so no nudge renders.

TokenRendersExample
[amount_left]How much more is needed to reach the next tier. Formatted as money on a spend (cart_subtotal) rule, as an integer on a quantity ruleSpend [amount_left] more → "Spend £15.00 more"
[qty_left]Items still needed to reach the next tier — always an integerAdd [qty_left] more → "Add 2 more"
[next_tier]The next threshold value the shopper is heading toward — the target spend (money) or item count, not a reward descriptionReach [next_tier] → "Reach £50.00"
[discount_label]The complete, kind-agnostic reward labelfor [discount_label] → "for 10% off" / "for Free Shipping"
[discount]The bare reward number — no % or currency unit, so you supply your ownfor [discount]% off → "for 10% off"
[discount_value]Synonym of [discount] — same bare number, descriptive spelling[discount_value]% off → "10% off"

Defaults (the exact copy rendered when an input is left blank):

  • Mini-cart: Spend [amount_left] more for [discount_label]
  • Cart & checkout: You're [amount_left] away from [discount_label]. Add a few more items to your cart.

See Upsell Messages for the per-surface editor.

When the Product page block's display mode is Custom Message, the message is substituted by StorefrontDisplay::replace_placeholders. These tokens are case-insensitive[x], [X], [PRICE] all resolve.

TokenRendersExample
[X]The rule's primary quantity / value (see per-type table below)Buy [X] to save → "Buy 3 to save"
[Y]The pay quantity — Buy X Get Y rules only; blank on every other typeBuy [X] get [Y] free → "Buy 3 get 1 free"
[price]This product's price, formatted in the store's currencyJust [price] each → "Just £20.00 each"

What [X] resolves to depends on the discount type:

Discount type[X] resolves to
Buy X Get YThe buy quantity
Mix & MatchThe required set size (required_qty)
Pooled bundleThe total units one bundle needs (sum of pool quantities)
Volume / bulk, Tiered / Spend & SaveThe first tier's reward value

See Product Page Pricing for the display-mode and position controls.

Every money token ([ccy], [amount_discount], [threshold_reached], [amount_left], [next_tier], [price]) resolves against the shopper's checkout currency, not the store's base currency — so one rule's copy reads correctly in every currency without a separate rule per region.

Tokens are locale-neutral: they substitute the same way regardless of the language you type the surrounding copy in. For multilingual stores, model each language as a separate rule scoped with Zone targeting — see Cart Labels → Multilingual stores for the pattern.