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:
| Object | Description |
|---|---|
result.items | Array of matching Experience Slots. |
paginate | Paginate object for paginated results. |
available_months | Array 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_ascQuery 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
| Parameter | Type | Description |
|---|---|---|
name | String | Partial text search on experience name (case-insensitive). |
category | String or array | Filter by experience category (case-sensitive). |
subcategory | String or array | Filter by experience subcategory (case-sensitive). |
city | String or array | Filter by location city (case-insensitive). |
country | String or array | Filter by country code or name. |
departure_date | Range hash | Filter by departure date. |
departure_month | Integer or string | Filter by month across all years. |
duration | Range hash | Filter by experience duration. |
duration_unit | String | Unit for duration values. Default: "day". |
product_id | UUID or array | Restrict to specific experience(s). |
variant_id | String or array | Filter to a specific variant. Tag only. |
guest_count | Integer | Affects stock/sold-out calculations. Tag only. |
exclude_sold_out_products | Boolean | Exclude sold-out slots. |
active_promotion | Boolean | Filter by promotion status. |
include_organisation_products | Boolean | Search across the organisation. |
sort | String | Sort order. Default: "departure_date_asc". |
page_size | Integer | Results 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".
| Value | Description |
|---|---|
departure_date_asc | Departure date ascending (default). |
departure_date_desc | Departure date descending. |
name_asc | Experience name A–Z. |
name_desc | Experience name Z–A. |
duration_asc | Duration ascending. |
duration_desc | Duration 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:
| Key | Description |
|---|---|
equal_to | Exact match. When set, all other keys are ignored. |
greater_than | Greater than value. |
greater_or_equal_than | Greater than or equal to value. |
less_than | Less than value. |
less_or_equal_than | Less 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_monthsreflects 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-levelnameproperty. - Use URL query parameters to build shareable search pages.
- Build month filters using
available_monthsrather than generating calendar months manually. - Use the
searchobject to preserve the current filter state in forms. - Use the
paginateobject to navigate between pages of results. - Remember that URL query parameters override values passed directly to the tag.