Using dynamic text variables
Dynamic text variables in Bundlex Bundles are placeholders you type into an offer's text fields, like {{saved_percentage}} or {{product_title}}. They fill in automatically with the right product name, quantity, price, and savings when the widget renders on your storefront, so one piece of copy works across every product the bundle applies to.
How variables work
Wherever a text field supports variables, you can type a placeholder by hand or insert it from the variable picker. In the field, each variable shows as a grey block named after its picker entry, such as Saved percentage, and one Backspace removes it whole. Benefit bullets are the exception: their Variables button inserts the placeholder as plain text, such as {{saved_percentage}}, which you edit like any other text. It resolves to a real value at render time, both in the dashboard preview and on the live storefront widget.
You don't need to memorize the syntax. Each supported field shows a curly-brace icon next to its label. Click it to open the Variables dropdown and pick one.
- Place your cursor where you want the value to appear in the text field.
- Click the curly-brace icon for that field.
- Choose a variable from the dropdown.
The variable is inserted at the cursor position, with a single space added before or after only when it would otherwise butt up against your text, and the cursor lands right after it so you can keep typing.
Available variables
These variables are available in the standard offer text fields. The price examples use three $10 items with a 20% discount. The BOGO quantities illustrate a separate Buy 2, get 1 free offer.
| Variable | Description | Example output |
|---|---|---|
{{product_title}} | Product title | Classic T-Shirt |
{{quantity}} | Offer quantity threshold | 3 |
{{buy_quantity}} | Buy quantity (for BOGO offers, the items the customer pays for) | 2 |
{{get_quantity}} | Free quantity (for BOGO offers, the free items) | 1 |
{{saved_percentage}} | Discount percentage | 20% |
{{saved_per_item}} | Savings per item | $2.00 |
{{saved_total}} | Total savings | $6.00 |
{{price_per_item}} | Discounted price per item | $8.00 |
{{price_total}} | Total discounted price | $24.00 |
{{compare_price_per_item}} | Original price per item | $10.00 |
{{compare_price_total}} | Total original price | $30.00 |
{{bundle_saved_total}} | Whole-bundle savings, including required bundle products | $6.00 |
{{bundle_saved_percentage}} | Whole-bundle savings as a percentage of the bundle's selling price | 20% |
Prices use the widget's currency formatting. Check the rendered values after choosing variants and quantities, particularly for bundles that contain different products.
Savings against compare-at prices
Main offer fields also offer {{saved_percentage_compare}}, {{saved_per_item_compare}} and {{saved_total_compare}}. These measure savings against the product's compare-at price, while the plain {{saved_*}} variables measure savings against its selling price. If no compare-at price is set, the compare-at savings fall back to selling-price savings.
These three variables are separate from the option that changes the crossed-out price. They appear in the picker for offer titles, discount labels, subtitles, badges and benefits. Check the actual product page before publishing savings copy; see compare-at prices for the related display setting.
BOGO quantities
The picker offers the buy/get quantities when you edit a BOGO offer. A normal quantity-break picker does not list them.
For a Buy X Get Y offer, {{buy_quantity}} is the number of items the customer pays for and {{get_quantity}} is the number of free items. For every other discount type, {{buy_quantity}} equals {{quantity}} and {{get_quantity}} is 0, so it's best to use the BOGO variables only on BOGO offers.
Where you can use each variable
Not every field supports every variable. Here's where each set applies.
Offer text fields
The offer title, discount label, subtitle, badge, and benefit bullets support all of the variables listed above, including the BOGO quantities.
- Title:
Buy {{quantity}}, save {{saved_percentage}} - Discount label:
{{saved_percentage}} off - Subtitle:
Only {{price_per_item}} each - Badge:
Save {{saved_total}} - Benefit bullet:
You save {{saved_total}}
Gift and cross-sell titles
The title field of a free gift or a cross-sell extra supports the standard table variables except {{buy_quantity}}, {{get_quantity}}, {{bundle_saved_total}} and {{bundle_saved_percentage}}. The compare-at savings variables are not offered for extras. These fields use the extra's own product and price. For example, Free {{product_title}} shows the gift's name, and {{saved_percentage}} off reflects the extra's own discount. The Upsell offer block's item title and subtitle use this same set.
Gift-selection instructions
Gift-selector headings and status messages use {{max_quantity}}, {{selected}} and {{remaining}}. For example, Choose {{max_quantity}} gifts describes the limit and {{selected}} of {{max_quantity}} selected shows progress. These fields do not use the offer-price variables.
Subscription labels
The subscription title and subtitle support {{product_title}}, {{subscription_discount}}, {{offer_discount}} and {{total_subscription_discount}}. The combined discount accounts for the offer and selling-plan discounts together; do not add the two percentages yourself. One-time purchase labels support {{product_title}} only. See subscriptions for setup and pricing behavior.
Sticky add-to-cart title
In scroll-to-offers mode, the sticky add-to-cart title supports the standard offer variables, resolved against the currently selected offer. For example: {{product_title}}, save {{saved_percentage}}. Add-to-cart mode instead displays the selected offer's title.
Countdown timer
The countdown fields (compact title, full title, and full subtitle) support the standard offer variables, resolved against the selected offer. The compact title also offers {{timer}} for the countdown value, for example: Routine timer: {{timer}}. The timer updates every second. Reaching zero does not end the discount, so do not promise an offer expires unless you manage its end separately.
Low-stock alert
The low-stock alert message supports only one variable, {{stock}}, which shows the remaining stock count. For example: Only {{stock}} left in stock!
How values resolve on the storefront
For a product bundle, price totals can include required bundle products, but the {{saved_*}} variables describe the main offer's savings. They do not add discounts on cross-sell products. {{bundle_saved_total}} and {{bundle_saved_percentage}} also count the savings on required bundle products, so a bundle whose saving sits on its extra product does not show 0%. On an offer that is not a bundle, they equal {{saved_total}} and {{saved_percentage}}. Per-item price divides the bundle total by the number of main-product units, not by every item in the set. Use wording such as "per set" when that is what the displayed amount represents.
On the live widget, the product title fills in immediately on first render. The price-based variables (per-item and total prices, savings, and percentage) fill in once the widget has loaded the product's prices, and they refresh whenever the shopper switches variant or selects a different offer tier. The countdown's {{timer}} updates on every tick. The dashboard preview resolves everything against the offer you're previewing, so you can confirm your copy reads correctly before publishing.
Tip: if a price variable looks blank for a moment in the dashboard preview or on first load, it's waiting on the offer's prices. Select an offer tier to see the resolved values.
Unknown tokens, such as {{5%}}, remain literal text. Choose a supported variable from the field's picker instead.
Was this article helpful?
Your feedback helps us improve our docs.