Extra
An optional add-on that can be purchased alongside a variant.
An optional add-on that can be purchased alongside a variant.
Behaviour varies by context: when initialised with a slot mapping, stock and price methods reflect that slot; otherwise they aggregate across upcoming slots or use the extra's default configuration.
Properties
address
The address associated with this extra.
Returns: AddressDrop
availability_status
A high-level availability signal for this extra, 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
booking_fee_rate
The extra booking fee rate as a decimal between 0 and 1.
Returns: Float
country
The country name of the parent product.
Returns: String or nil
deposit
The deposit configured on this extra. Extras don't inherit the parent product's deposit, and always use the default balance due date threshold.
When accessed through an ExperienceSlotDrop, the due date is based on that slot's start date.
Returns: DepositDrop
{% if extra.deposit.enabled %}Pay a deposit today{% endif %}deposit_amount
Deprecated
A humanised deposit amount for this extra.
Returns: String or nil — nil when there is no current currency.
{% assign deposit_price = extra.price.fractional | times: extra.product.deposit.rate %}
{{ deposit_price | money }}experience_slot
The experience slot this extra drop is scoped to, when initialised with a slot mapping.
Returns: ExperienceSlotDrop or nil
has_infinite_stock
Whether this extra has unlimited stock.
Returns: Boolean
hero_image
The parent product's hero image.
Returns: ImageDrop or nil
id
The extra's GlobalID, used as its unique identifier in Liquid.
Returns: String
image
The extra's image when one is attached.
Returns: ImageDrop or nil
initial_stock
Initial stock for this extra 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 extra, including post-checkout groups.
Not recommended on pre-checkout pages — use
extra.pre_checkout_modifier_groups for choices the customer must make
before checkout.
Returns: Array (Variant::ModifierGroupDrop)
name
The extra name.
Returns: String
overview_image
The parent product's overview image.
Returns: ImageDrop or nil
parent
The parent product or variant this extra belongs to.
Returns: ProductDrop or VariantDrop
payment_plan
The payment plan configured on this extra, when it can be paid off before the start date. Extras don't inherit the parent product's payment plan.
When accessed through an ExperienceSlotDrop, the start date is that slot's start date. Otherwise it's the parent experience's latest slot, or none for accommodations.
Returns: PaymentPlanDrop or nil — nil when the extra has no payment plan or
the plan is no longer eligible.
pre_checkout_modifier_groups
Modifier groups the customer must choose before checkout.
Returns: Array (Variant::ModifierGroupDrop)
price
The extra price 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 > Extras in the admin.
Rendering the drop without calling a method on the returned object (outputting
extra.price alone) falls back to a legacy humanised string for backwards
compatibility.
Returns: VariantPriceDrop or nil — nil when there is no current currency.
{{ extra.price.fractional | money }}{{ extra.price | money }}{{ extra.price }}prices
Price tiers for this extra. Extras expose a single tier.
Returns: Array (VariantPriceDrop) — an empty array when there is no current currency.
product
The product this extra belongs to.
Returns: ProductDrop
promotion
The extra's currently active promotion, when one applies.
Returns: PromotionDrop or nil
remaining_stock
Remaining stock for this extra 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. Manually marked as sold out contributes 0.
Returns: Integer or nil — nil when any mapping has infinite stock.
segment_name
The name of the segment this extra belongs to, when assigned.
Returns: String or nil
segment_position
The position of the segment this extra belongs to, when assigned.
Returns: Integer or nil
sold_out
Whether this extra 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, when there are no upcoming
slots, or when all slots are in the past.
Returns: Boolean
tagline
A short marketing line for the extra.
Returns: String or nil
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 object type string, always "extra". Useful when iterating a mixed
list of VariantDrop and ExtraDrop objects.
Returns: String