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.
| Surface | Where it shows | Edited in |
|---|---|---|
| Cart label | The discount line in the cart and at checkout | Messaging → Cart label |
| Spend-more nudge | "Add more to save" prompts in the mini-cart, cart, and checkout | Messaging → Spend-more nudge |
| Product-page custom message | A custom line on the product page (Custom Message display mode) | Messaging → Product page |
Cart label tokens
Section titled “Cart label tokens”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.
The two value slots
Section titled “The two value slots”| Slot | Spellings (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.
What each spelling renders
Section titled “What each spelling renders”| Token | Renders | Example |
|---|---|---|
[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 size | Buy [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 type | Tokens 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.
Spend-more nudge tokens
Section titled “Spend-more nudge tokens”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.
| Token | Renders | Example |
|---|---|---|
[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 rule | Spend [amount_left] more → "Spend £15.00 more" |
[qty_left] | Items still needed to reach the next tier — always an integer | Add [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 description | Reach [next_tier] → "Reach £50.00" |
[discount_label] | The complete, kind-agnostic reward label | for [discount_label] → "for 10% off" / "for Free Shipping" |
[discount] | The bare reward number — no % or currency unit, so you supply your own | for [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.
Product-page custom message tokens
Section titled “Product-page custom message tokens”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.
| Token | Renders | Example |
|---|---|---|
[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 type | Buy [X] get [Y] free → "Buy 3 get 1 free" |
[price] | This product's price, formatted in the store's currency | Just [price] each → "Just £20.00 each" |
What [X] resolves to depends on the discount type:
| Discount type | [X] resolves to |
|---|---|
| Buy X Get Y | The buy quantity |
| Mix & Match | The required set size (required_qty) |
| Pooled bundle | The total units one bundle needs (sum of pool quantities) |
| Volume / bulk, Tiered / Spend & Save | The first tier's reward value |
See Product Page Pricing for the display-mode and position controls.
A note on multi-currency and language
Section titled “A note on multi-currency and language”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.
What's next
Section titled “What's next”- Cart Labels — the cart-line label editor
- Upsell Messages — the spend-more nudge editor
- Product Page Pricing — the product-page display block
- Testing with Cart Preview — confirm your tokens resolve before publishing