Experience variant
A bookable experience variant with per-person or per-unit pricing.
A bookable experience variant with per-person or per-unit pricing.
Behaviour varies by context: when initialised with a slot mapping, stock and price methods reflect that slot; otherwise they aggregate across upcoming slots.
Properties
availability_status
A high-level availability signal for this variant, so themes can show "limited"/"running low" states without deriving them from the raw remaining count. Prefers the stock manager's own status (letting an external provider's signal come through) and falls back to the percentage-based rule when it doesn't have one.
Returns: String — one of "available", "limited", or "sold_out".
See also: StockManagement::AvailabilityStatus
deposit
The deposit for this variant, accounting for the slot start date when set.
Returns: DepositDrop or nil — nil when the variant has no deposit or the
balance cannot be paid before the experience starts.
deposit_amount
Deprecated
A humanised deposit amount for this variant.
Returns: String or nil — nil when there is no current currency.
{% assign deposit_price = variant.price.fractional | times: variant.deposit.rate %}
{{ deposit_price | money }}experience_slot
The experience slot this variant drop is scoped to, when initialised with a slot mapping.
Returns: ExperienceSlotDrop or nil
has_infinite_stock
Whether this variant has unlimited stock.
Returns: Boolean
initial_stock
Initial stock for this variant when all mappings use fixed inventory.
Returns: Integer or nil — nil when any mapping has infinite stock.
limited
Whether stock is running low but not yet sold out. Convenience predicate
over #availability_status.
Returns: Boolean
modifier_groups
All modifier groups for this variant, including post-checkout groups.
Not recommended on pre-checkout pages — use
variant.pre_checkout_modifier_groups for choices the
customer must make before checkout.
Returns: Array (Variant::ModifierGroupDrop)
payment_plan
The payment plan for this variant when it can be paid off before the start date.
Returns: PaymentPlanDrop or nil
pre_checkout_modifier_groups
Modifier groups the customer must choose before checkout.
Returns: Array (Variant::ModifierGroupDrop)
price
The variant price at max occupancy in the current currency, excluding promotions. Returns a VariantPriceDrop for use with math filters.
When accessed through an ExperienceSlotDrop, returns the price for that slot. When accessed through a product or independently, returns the default price from Experience > Variants in the admin.
Rendering the drop without calling a method on the returned object (outputting
variant.price alone) falls back to a legacy humanised string for
backwards compatibility.
Returns: VariantPriceDrop or nil — nil when there is no current currency.
{{ variant.price.fractional | money }}{{ variant.price | money }} Per Person{{ variant.price }}prices
Price tiers for each possible adult count, capped at 50 tiers.
When accessed through an ExperienceSlotDrop, returns prices for that slot. When accessed through a product or independently, returns default prices from Experience > Variants in the admin.
Returns: Array (VariantPriceDrop) — an empty array when there is no current currency.
{% assign price = variant.prices | first %}
{{ price.fractional | money }}pricing_strategy_per_item
Whether this variant uses per-item pricing. When true, the price comes
from the price tier for the chosen occupancy.
Returns: Boolean
pricing_strategy_per_person
Whether this variant uses per-person pricing. When true, the price scales
with occupancy according to the configured price tiers.
Returns: Boolean
remaining_stock
Remaining stock for this variant when all mappings use fixed inventory.
When accessed through an ExperienceSlotDrop, returns remaining stock for that slot. When accessed through a product or independently, returns the sum across all upcoming slots. Variants manually marked as sold out contribute 0.
Returns: Integer or nil — nil when any mapping has infinite stock, or when
summing across upcoming slots for a variant that uses resource stock and
whose experience has an ongoing or future recurring schedule.
sold_out
Whether this variant is sold out for customers.
When accessed through an ExperienceSlotDrop, returns true when sold out
on that slot. When accessed through a product or independently, returns
true when sold out across all upcoming slots, or when there are no
upcoming slots. Always returns false when the variant uses resource stock
and the experience has an ongoing or future recurring schedule.
Returns: Boolean
total_booking_fee_after_promotion_fractional
Total booking fee in the subunit of the current currency, after promotions.
Returns: Integer or nil — nil when there is no current currency.
total_booking_fee_fractional
Total booking fee in the subunit of the current currency, before promotions.
Returns: Integer or nil — nil when there is no current currency.
type
The variant type identifier.
Returns: String — always "experience_variant".