Skip to content

Upsell Messages

Upsell messages — the Spend-more nudge — are the dynamic prompts that tell shoppers how close they are to unlocking a better deal. They update in real time as the cart changes, and the storefront renders them on three independent surfaces: the mini-cart, the cart page, and the checkout.

This is one of Dino's strongest differentiators. Most discount plugins apply discounts silently — the customer either stumbles into the deal or misses it. The spend-more nudge actively guides shoppers toward the deal:

  • Lifts average order value — shoppers add items to clear the next tier
  • Reduces cart abandonment — "you're $8 from free shipping" beats "checkout" in the conversion path
  • Creates urgency without aggression — the message disappears the moment the threshold is met, so it never nags

Scroll to the Messaging section at the bottom of the rule editor (after Rewards). The Spend-more nudge sub-block sits below Cart label. The block renders three rows — one per surface (mini-cart, cart, checkout) — and each row has both a message input and a position dropdown.

Rule editor scrolled to the Messaging section, with the Spend-more nudge block visible. Token chips above the inputs, mini-cart / cart / checkout rows below.

If the rule doesn't have a tiered reward — for example, a flat % Off Order with no threshold — the block renders a locked-state heading: "Choose a tiered reward to enable the Spend-more nudge." The block is still visible (so you discover that nudges exist) but the inputs collapse until the rule shape unlocks them. This is the locked-state pattern the Messaging section uses everywhere — gating fields stay in view, with a one-line explanation of what to change.

Above the message inputs is a row of click-to-insert token chips. Click any token to drop it into the currently focused input; the storefront swaps each token for the live value at render time.

| Token | Meaning | Example output | |-------|---------|----------------| | [amount_left] | Remaining spend to reach the next tier | Spend [amount_left] more → "Spend $15 more" | | [qty_left] | Remaining items to reach the next tier | Add [qty_left] more → "Add 2 more" | | [next_tier] | Description of the tier that unlocks next | unlock [next_tier] → "unlock 15% off" | | [discount_value] | Bare numeric value of the reward — no % or currency unit, so you add your own | for [discount_value]% off → "for 10% off" | | [discount] | Same bare number as [discount_value] (terse synonym) | for [discount]% off → "for 10% off" | | [discount_label] | Complete formatted reward label | for [discount_label] → "for 10% off" |

Tokens that don't apply to the rule's tier kind render in a locked / greyed-out chip state. For example, [qty_left] is unavailable when the rule uses spend tiers — the inline warning "[qty_left] won't resolve — your rule uses spend tiers" surfaces if you type it manually. Use [amount_left] for spend tiers and [qty_left] for quantity tiers.

Each surface has independent message and position controls:

Short copy — space is tight (Storefront's mini-cart is typically 320–360px wide). Default message: "Spend [amount_left] more for [discount_label]".

| Position | Where it renders | |----------|------------------| | Hidden | Don't show on this surface | | Top (above items) | Above the line items list | | Above buttons | Above the Checkout / View cart buttons | | Below cart items | Below the line items list |

Full-length copy — the cart page has room. Default message: "You're [amount_left] away from [discount_label]. Add a few more items to your cart.".

| Position | Where it renders | |----------|------------------| | Hidden | Don't show on this surface | | Top (above cart table) | Above the cart table | | Above 'Proceed to checkout' | Above the checkout CTA | | Below cart totals | Below the totals block |

Falls back to the default cart-page copy (DEFAULT_CART_MESSAGE) when its own message is blank — leave it empty if you want the standard nudge, or override per-surface. Default position: Above order summary.

| Position | Where it renders | |----------|------------------| | Hidden | Don't show on this surface | | Top (above billing details) | Top of the checkout page | | Above order summary | Above the right-rail summary | | Above payment methods | Between order summary and payment | | Below order review | End of the page |

The nudge respects each shopper's checkout currency[amount_left] is formatted with the cart's currency symbol, not the merchant's base currency. In a multi-currency store, this means a single nudge ("Spend [amount_left] more") renders as "Spend €15 more" or "Spend $18 more" depending on the shopper's region, with no separate rule per currency. See Multi-currency for the per-currency pricing model.

The Spend-more nudge only fires on rules with thresholds — tiered (Spend & Save), volume (bulk pricing), buy-X-get-Y, and bundle (mix-and-match). Rules without a threshold (a flat % Off Order with no minimum spend) have nothing to nudge toward, so the block stays locked.

You can also leave the nudge blank on a threshold rule — the storefront defaults (DEFAULT_MINI_MESSAGE and DEFAULT_CART_MESSAGE) match the merchant-friendly copy the input shows as a placeholder. The placeholder is the exact text the storefront renders when the input is blank.

Every nudge field is also writable via the REST API for bulk imports — nudge_message_mini, nudge_message_cart, nudge_message_checkout, nudge_position_mini, nudge_position_cart, nudge_position_checkout. See the REST API reference.

  • Lead with the action ("Spend $X more"), not the reward. Shoppers respond to the gap, not the prize.
  • Keep mini-cart copy under 8 words — anything longer wraps awkwardly on mobile.
  • Use the Plain English summary in the editor as a sanity check before publishing. If the summary reads "Spend $50 → free shipping," the nudge should read "Spend [amount_left] more for free shipping."
  • Test in Cart Preview — fill a cart $5 under the threshold and confirm the nudge text appears as expected.