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

Calculate the deposit in Liquid using ExtraDrop#price and ProductDrop#deposit instead.

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

On this page