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

Calculate the deposit in Liquid using VariantDrop#price and VariantDrop#deposit instead.

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".

On this page