Experience slot search

Search Experience products by individual departure dates.

The experience_slot_search tag searches Experience products and returns one result for each available departure date.

Unlike a product search, which returns products, Experience Slot Search returns individual Experience Slots. This makes it ideal for building search pages where customers browse upcoming departures.

The search only returns public, published departures. Experience slots are excluded if:

  • The parent Experience is unpublished.
  • The departure has been marked as private in Manage product availability.
  • All variants on the slot are hidden or outside their booking window.

Basic usage

{% experience_slot_search
  name: "Beyond",
  duration: { greater_than: 3, less_than: 8 },
  page_size: 12,
  sort: "departure_date_asc"
%}
  {% for item in result.items %}
    <p>{{ item.product.name }} — {{ item.start_on | date: "%d %B %Y" }}</p>
  {% endfor %}

  <div>
    {{ paginate.collection_size }} results
    {{ paginate | default_pagination }}
  </div>
{% endexperience_slot_search %}

The tag makes the following objects available:

ObjectDescription
result.itemsArray of matching Experience Slots.
paginatePaginate object for paginated results.
available_monthsArray of Date objects representing months that contain available departures.

The Search object is also available when the page URL contains ?search[...] query parameters. It reflects the applied URL parameters and is useful for preserving filter state in forms.

Using query parameters

Search parameters can be passed in the URL using the search query parameter:

/search?search[name]=beyond&search[departure_date][greater_or_equal_than]=2024-11-22&search[sort]=departure_date_asc

Query parameters override any matching attributes passed directly to the tag. This allows you to set defaults in the tag and let URL parameters refine the search.

page_size, variant_id, and guest_count are tag-only attributes and cannot be set via URL.

Parameters

ParameterTypeDescription
nameStringPartial text search on experience name (case-insensitive).
categoryString or arrayFilter by experience category (case-sensitive).
subcategoryString or arrayFilter by experience subcategory (case-sensitive).
cityString or arrayFilter by location city (case-insensitive).
countryString or arrayFilter by country code or name.
departure_dateRange hashFilter by departure date.
departure_monthInteger or stringFilter by month across all years.
durationRange hashFilter by experience duration.
duration_unitStringUnit for duration values. Default: "day".
product_idUUID or arrayRestrict to specific experience(s).
variant_idString or arrayFilter to a specific variant. Tag only.
guest_countIntegerAffects stock/sold-out calculations. Tag only.
exclude_sold_out_productsBooleanExclude sold-out slots.
active_promotionBooleanFilter by promotion status.
include_organisation_productsBooleanSearch across the organisation.
sortStringSort order. Default: "departure_date_asc".
page_sizeIntegerResults per page. Default: 10. Tag only.

name

Partial text search on the experience name. Case-insensitive.

{% experience_slot_search name: "my experience" %}
{% endexperience_slot_search %}

URL: ?search[name]=my+experience

category

Filter by experience category. Case-sensitive. Accepts a single value or an array.

{% experience_slot_search category: "Active" %}
{% endexperience_slot_search %}

{% experience_slot_search category: ["Active", "Adventure"] %}
{% endexperience_slot_search %}

URL: ?search[category]=Active

subcategory

Filter by experience subcategory. Case-sensitive. Accepts a single value or an array.

{% experience_slot_search subcategory: "Wellness" %}
{% endexperience_slot_search %}

{% experience_slot_search subcategory: ["4 Star", "5 Star"] %}
{% endexperience_slot_search %}

URL: ?search[subcategory]=Wellness

city

Filter by experience location city. Case-insensitive. Accepts a single value or an array. Products without an address are excluded.

{% experience_slot_search city: "London" %}
{% endexperience_slot_search %}

{% experience_slot_search city: ["London", "Paris"] %}
{% endexperience_slot_search %}

URL: ?search[city]=London or ?search[city][]=London&search[city][]=Paris

country

Filter by country. Accepts ISO 3166 alpha-2 codes (e.g. "FR") or country names (e.g. "France"). Accepts a single value or an array.

{% experience_slot_search country: "FR" %}
{% endexperience_slot_search %}

{% experience_slot_search country: ["FR", "DE"] %}
{% endexperience_slot_search %}

URL: ?search[country]=DE

departure_date

Filter by departure date using a range hash. Date values should be in YYYY-MM-DD format.

{% experience_slot_search departure_date: { greater_or_equal_than: "2024-06-01", less_than: "2024-07-01" } %}
{% endexperience_slot_search %}

Liquid variables can be used for date values:

{% assign latest_date = selected_date %}

{% experience_slot_search departure_date: { greater_or_equal_than: "2024-01-01", less_than: latest_date } %}
{% endexperience_slot_search %}

URL: ?search[departure_date][greater_or_equal_than]=2024-06-01&search[departure_date][less_than]=2024-07-01

departure_month

Filter by month across all years. Accepts a month number (1–12) or a 3-letter abbreviation (e.g. "Apr").

For example, departure_month: 4 returns departures in April of every year.

{% experience_slot_search departure_month: "Apr" %}
{% endexperience_slot_search %}

{% experience_slot_search departure_month: 4 %}
{% endexperience_slot_search %}

URL: ?search[departure_month]=Apr or ?search[departure_month]=4

duration

Filter by experience duration using a range hash. Values are interpreted using duration_unit (defaults to days).

{% experience_slot_search duration: { greater_than: 3, less_than: 8 }, duration_unit: "hour" %}
{% endexperience_slot_search %}

URL: ?search[duration][greater_than]=3&search[duration][less_than]=8&search[duration_unit]=hour

duration_unit

Unit for duration values. Accepted values: "day" (default), "hour", "minute".

product_id

Restrict to slots for specific experience ID(s). Accepts a single UUID or an array.

{% experience_slot_search product_id: "abcd1234-1234-abcd-1234-abcd1234abcd" %}
{% endexperience_slot_search %}

{% assign product_ids = products | map: "id" %}
{% experience_slot_search product_id: product_ids %}
{% endexperience_slot_search %}

URL: ?search[product_id]=abcd1234-1234-abcd-1234-abcd1234abcd

variant_id

Filter to slots for a specific variant. Accepts a signed GlobalID (the value returned by variant.id in Liquid). Tag attribute only — not available via URL.

{% experience_slot_search product_id: product.id, variant_id: variant.id %}
{% endexperience_slot_search %}

guest_count

Number of guests. Affects sold_out and remaining_stock calculations on each result by applying occupancy rules. Does not filter which slots are returned. Tag attribute only.

{% experience_slot_search guest_count: 5 %}
{% endexperience_slot_search %}

exclude_sold_out_products

When true, excludes slots where all variants are sold out.

{% experience_slot_search exclude_sold_out_products: true %}
{% endexperience_slot_search %}

URL: ?search[exclude_sold_out_products]=true

active_promotion

When true, returns only slots with an active promotion. When false, returns only slots without.

{% experience_slot_search active_promotion: true %}
{% endexperience_slot_search %}

include_organisation_products

When true, searches across all companies in the organisation rather than just the current company.

{% experience_slot_search include_organisation_products: true %}
{% endexperience_slot_search %}

sort

Sort order for results. Default: "departure_date_asc".

ValueDescription
departure_date_ascDeparture date ascending (default).
departure_date_descDeparture date descending.
name_ascExperience name A–Z.
name_descExperience name Z–A.
duration_ascDuration ascending.
duration_descDuration descending.
{% experience_slot_search sort: "departure_date_asc" %}
{% endexperience_slot_search %}

URL: ?search[sort]=departure_date_asc

page_size

Number of results per page. Default: 10. Tag attribute only — not available via URL.

{% experience_slot_search page_size: 12 %}
{% endexperience_slot_search %}

Range parameters

The departure_date and duration parameters accept a hash with comparison keys:

KeyDescription
equal_toExact match. When set, all other keys are ignored.
greater_thanGreater than value.
greater_or_equal_thanGreater than or equal to value.
less_thanLess than value.
less_or_equal_thanLess than or equal to value. Tag attribute only — not available via URL.

Multiple bounds can be combined. For example, to search a date range:

{% experience_slot_search departure_date: { greater_or_equal_than: "2024-06-01", less_than: "2024-07-01" } %}
{% endexperience_slot_search %}

Pagination

Search results are paginated automatically.

Use the page_size parameter to control how many results are returned per page.

The paginate object can be used to build pagination controls:

{{ paginate | default_pagination }}

Available months

The search exposes an available_months array that can be used to build month filters.

Each item is a Date object representing the first day of a month that contains at least one future experience departure.

Note: available_months reflects all future departures company-wide. It is not filtered by the current search parameters.

A typical use case is building a month selector that submits a departure_month filter:

{% experience_slot_search %}

  <select name="search[departure_month]">
    {% for month in available_months %}
      <option value="{{ month | date: '%m' }}">
        {{ month | date: "%B %Y" }}
      </option>
    {% endfor %}
  </select>

{% endexperience_slot_search %}

Accessing search parameters

Once the search has been executed, the applied URL parameters are available through the search object.

{{ search.departure_date }}

This is useful for preserving filter state in search forms and building navigable search interfaces.

Developer considerations

When implementing Experience Slot Search:

  • Use Experience Slot Search when users are searching for departures rather than products.
  • Access the experience name via item.product.name — slots do not have a top-level name property.
  • Use URL query parameters to build shareable search pages.
  • Build month filters using available_months rather than generating calendar months manually.
  • Use the search object to preserve the current filter state in forms.
  • Use the paginate object to navigate between pages of results.
  • Remember that URL query parameters override values passed directly to the tag.

On this page