Product Page Pricing
When a discount applies to a product, Dino can advertise it on the product page itself — before the shopper adds it to their cart. The display is controlled by the Product page block in the Messaging section of the rule editor.
What shoppers see
Section titled “What shoppers see”Depending on the discount type and the display mode you pick, customers see one of:
- Tier table — for tiered or volume discounts, the table of quantity / spend tiers and what each one earns (a volume table also shows the price each and the saving, or for a fixed amount off, the amount off the set)
- Promo message — a single line such as “Buy 2 Shirts — get free shipping”, either written by you or generated from the rule
Dino does not change the product’s displayed price or add a sale badge — the discount itself is applied in the cart.
The display updates whenever the rule changes — raise a tier from 10% to 15% and the tier table follows.
Where to edit the product-page display
Section titled “Where to edit the product-page display”Whether a rule advertises on the product page — and in what words — is set per rule. Where the display lands is a single store-wide choice, so every product-page promo appears in the same place.
Per rule. Scroll to the Messaging section at the bottom of the rule editor. The Product page sub-block is a checkbox that expands:
- Show on product page — the on/off switch. Unticked, this rule renders nothing on the product page.
- Display mode — a segmented control with two options: Tier Table or Custom Message. It stays visible while the box is unticked, just greyed out — and picking a mode ticks the box for you.
When Display mode is Custom Message, a Custom message input appears for the message copy, with token chips above it (see Message tokens). Leave it blank and bundle (Buy X Get Y / Mix & Match) discounts get a generated message such as “Buy 2 Shirts — get free shipping”; for other discount types a blank custom message shows nothing.
Store-wide. The placement lives on the Message Settings tab, in the Product-page promo card — a single Position dropdown with two options:
- Above Add to Cart — above the Add-to-Cart form. Works with standard WooCommerce templates and most page builders.
- Below price — immediately after the price in the product summary. Needs a standard WooCommerce product template.
There is no product-tab placement: the display always renders in the product summary at one of the two positions above, never as a separate tab alongside Description and Reviews.

The locked-state pattern
Section titled “The locked-state pattern”The Product page block is gated — it only lights up when the rule is scoped to specific items (a category, tag, attribute or SKU in Which items qualify the rule? under What triggers it?, or on the reward’s item target). On a cart-wide rule with no item scope, the block collapses to a heading with the line “Product-page messaging applies when you scope this rule to a product, category, SKU, tag, or attribute.” and a Set an item condition link to the section that owns the gating field.
Inside the unlocked block, Tier Table mode has its own gate: it requires the rule to carry at least one tier with a threshold above zero. On a flat-discount rule, the Tier-Table tile is disabled (with a tooltip explaining why); Custom Message remains available, and unticking Show on product page always does.
This is the Messaging section’s locked-state pattern everywhere — gating fields stay in view, with a one-line explanation of what to change to unlock them.
How rule shape maps to the storefront
Section titled “How rule shape maps to the storefront”Only tiered and volume discounts can render a tier table. Every other type shows a promo message:
| Discount type | Storefront element |
|---|---|
| Tiered (% off / Spend & Save) | Tier Table: spend or quantity tiers and the discount at each. Custom Message: your message |
| Volume (bulk pricing) | Tier Table: every quantity threshold, the price each and the saving (a fixed amount off shows only the amount off the set). Custom Message: your message |
| Buy X Get Y / Mix & Match (bundle) | A promo message — yours, or a generated one such as “Buy 2 Shirts — get free shipping” |
| Coupon-activated | Nothing until the shopper’s cart carries one of the rule’s codes |
How multiple rules combine on one product
Section titled “How multiple rules combine on one product”The product page shows one promo, however many rules target the product. When two or more rules of the same shape (both tiered on spend, say) target the same product and all have Display mode set to Tier Table, the storefront merges them into a single table and, at every threshold, shows the best offer the shopper would actually get. Any other mix shows just one rule — the one with the best reward.
Worked example
Section titled “Worked example”Two rules target the same product (call it “Widget”):
- Rule 1 — “20% off at £50, 30% off at £100” (a tiered discount).
- Rule 2 — “Free shipping at £50” (a flat free-shipping reward).
Without merging, the product page would render two separate tables and the shopper would have to mentally combine them. With merging, the Widget product page shows one table:
| Spend | What you get |
|---|---|
| £50 | Free shipping |
| £100 | 30% off |
The £50 row reads “Free shipping” because — at that threshold — free shipping is the headline benefit a shopper is told about. The £100 row reads “30% off” because at that threshold the tiered discount is the better offer. All three rewards (20% off, 30% off, free shipping) still apply at checkout — the merging is purely a display decision so the merchant’s product page is not crowded with overlapping tables.
The tie-break ladder
Section titled “The tie-break ladder”For merchants tuning multi-rule setups, the comparator (StorefrontFilter::reward_beats()) picks the displayed row at each threshold in this order:
- Free shipping and free gift outrank value-bearing rewards (% off, fixed off, fixed price). They are flagged on the table because they are the merchant’s most visible upgrade.
- Within the same kind, the larger value wins —
30% offbeats20% off,£10 offbeats£5 off. - Cross-kind ties at the same threshold (e.g.
15% offvs£10 offneither uniquely better) — the first rule listed in the admin discounts table wins.
The merchant cares about #1 and #2; #3 is documented here for completeness but should rarely matter in practice — design the rule set so each threshold has one obvious “best” reward.
What this is NOT
Section titled “What this is NOT”- Not stacking. Stacking is a checkout-time decision controlled by the Stacking mode — the When discounts overlap dropdown in the Discounts tab toolbar. The merged table is a display choice; the engine still evaluates every rule independently when the cart is calculated.
- Not deduplication. None of the contributing rules are dropped. Delete a “duplicate” rule and the next-best offer at each threshold slides into its slot — sometimes leaving an empty row.
- Not best-in-the-cart. The merging is per-product on the product page. The cart still shows the per-rule discount lines under whatever Stacking mode you’ve configured.
You cannot split the merged table by moving one rule elsewhere on the page — Position is store-wide, so every product-page promo shares one slot. To keep a rule out of the merged table, untick Show on product page for that rule.
Do not reach for Custom Message to demote a rule instead. Merging requires every advertised rule on the product to be in Tier Table mode; a single rule set to Custom Message makes the whole group non-mergeable, and the product page falls back to rendering just one rule. Demoting rule C that way costs you rules A and B’s merged table too.
Currency-matching gate
Section titled “Currency-matching gate”The storefront display also respects the shopper’s checkout currency. A rule scoped to a currency only advertises to shoppers paying in that currency, and a rule with a money amount but no currency is hidden rather than rendering a mismatched amount — there is no FX conversion. See Multi-currency compatibility for running a money deal in several currencies.
Zone scoping
Section titled “Zone scoping”The display also honours the rule’s Where does it apply? zones. A rule scoped to “EU zone” only shows the discounted price on the product page when the shopper resolves to an EU country — shoppers outside the zone see no promo. The same zone check the cart uses decides this, so the product page and the cart don’t drift.
Audience gate
Section titled “Audience gate”The display also honours the rule’s Who is this for? conditions. A rule for logged-in shoppers, first-time customers, a minimum order count or lifetime spend, time since their last order, or a customer role only shows on the product page to a shopper who meets them — everyone else sees no promo. The same audience checks the cart runs decide this, so the product page never advertises a discount to a shopper the cart would turn away for who they are or which code they hold. Cart conditions — a spend or quantity threshold, a usage limit — are not checked here: the promo is there to tell a shopper about a discount they have not qualified for yet. A coupon-activated rule follows the same idea: it shows only once the shopper’s cart carries one of its codes.
How it interacts with themes
Section titled “How it interacts with themes”Dino hooks into WooCommerce’s standard product-page hooks (woocommerce_before_add_to_cart_form for Above Add to Cart, woocommerce_single_product_summary for Below price), so it works with most themes out of the box. Prices in the display use WooCommerce’s price formatting (currency symbol, decimal places, position).
If your theme uses non-standard price markup, the display may need CSS adjustments. The plugin uses clearly named CSS classes (.dd-*) for all output, making it straightforward to style.
Programmatic editing
Section titled “Programmatic editing”The display settings are writable via the REST API for bulk imports, as the rule’s messaging.storefront object. It is either null (nothing renders on the product page) or { display_kind, message } — display_kind is badge (Tier Table) or banner (Custom Message). There is no per-rule position: a position key sent here is dropped on save, and placement comes from the store-wide setting described above. See the REST API reference.
What’s next
Section titled “What’s next”- Cart Labels — the cart-line label lives in the same Messaging section
- Upsell Messages — the spend-more nudge lives in the same Messaging section
- Testing with Cart Preview — verify the display before publishing