AddonDrop
Represents an installed app or addon for the shop. Accessible via `shop.addons`. Use `key` to identify the addon and conditionally render its widgets.
keykeyReturns [String] The addon's key identifier.Auto-generated on 2026-07-07 · 103 drops · 60 filters · 43 tags
Bolder storefronts are rendered using Liquid, a safe and expressive templating language. Your theme is a collection of .html template files that Liquid processes on each request, injecting live store data — products, collections, cart contents, customer info — into your markup.
The system is multi-tenant: each store is served under its own subdomain (yourstore.bolder.net or a custom domain), and the rendering pipeline is isolated per shop. Every template has access to a set of Liquid Drops — Ruby objects exposed to the template layer — which provide the store's data in a safe, read-only way.
You can customise themes directly from the Bolder admin editor, or locally using the Bolder CLI, which lets you edit files in your preferred code editor and sync changes in real time.
When a visitor loads a page, Bolder:
There is no build step — Liquid renders server-side on every request. Assets (CSS, JS, images) are uploaded to the theme and served from Bolder's CDN via the asset_url filter.
A Bolder theme is a set of Liquid template files. Each file is rendered for a specific route or purpose.
{% content_for_layout %}.| File | Inserted location |
|---|---|
custom_head.html | Inside <head> |
custom.css | Extra CSS after theme stylesheet |
before_header.html | Before the shop header |
after_header.html | After the shop header |
custom_foot.html | Before closing </body> |
Liquid has three building blocks: output tags, logic tags, and filters.
{{ shop.name }}
{{ product.price | money }}
{{ 'Hello, ' | append: customer.name }}
{% if product.available %}
<button>Add to cart</button>
{% else %}
<span>Out of stock</span>
{% endif %}
{% for variant in product.variants %}
<option value="{{ variant.id }}">{{ variant.title }}</option>
{% endfor %}
| Variable | Description |
|---|---|
shop | The current store |
cart | The visitor's current shopping cart |
customer | The logged-in customer (nil if not logged in) |
collections | All product collections |
products | All products (paginated) |
blog | The blog object |
Bolder automatically generates resized versions of product images. Reference preset sizes or generate custom crops on the fly.
| Name | Dimensions |
|---|---|
thumbnail | 75 × 75 px |
small | 240 × 180 px |
medium | 500 × 375 px |
large | 800 × 600 px |
{{ product.images.first | resize: '300x300' }}
{{ product.images.first | resize: '600x400!' }}
{{ product.images.first | resize: '300x300#' }}
! = force exact · # = crop to fill · > = only shrinkThe Bolder CLI lets you edit theme files locally and sync changes to your store in real time.
gem install bolder_cli bolder themes clone bolder themes watch
| Command | What it does |
|---|---|
bolder themes compare | Diff local vs remote |
bolder themes pull | Download remote changes |
bolder themes push | Upload all local files |
bolder themes watch | Auto-upload on save |
bolder themes publish | Publish dev theme to production |
Ruby objects exposed to Liquid templates. Click a chip to jump to its full description below the card.
Represents an installed app or addon for the shop. Accessible via `shop.addons`. Use `key` to identify the addon and conditionally render its widgets.
keykeyReturns [String] The addon's key identifier.has_console_loginReturns [Boolean] whether the account has console login capability.liquid_method_missing(addon_key)addons.subscription_products Returns [AddonDrop, nil] the addon drop for the given key.Represents a postal address. Exposed on branch locations, customer records, and order shipments. Provides street, locality, region, and country data along with formatted display strings.
as_json(opts = {})Returns [Hash] A hash representation of the address for JSON serialization.idReturns [Integer] The address identifier.place_idReturns [String, nil] The Google Places identifier for this address.latlongReturns [Array, nil] The [latitude, longitude] array, or nil if not available.has_coordinatesReturns true if the address has GPS coordinates attached.coordinatesReturns the [latitude, longitude] pair, or nil if not geocoded.nameReturns the label/contact name for this address (e.g. "Home", "Office").streetReturns the full street line (street_1 + street_2 combined).street_1Returns the first street line (street number and name).street_2Returns the second street line (apartment, floor, etc.), or nil.locality_nameReturns the city or locality name.locality_idReturns the locality/city identifier code.region_nameReturns the region/state/province name.region_codeReturns the region/state ISO code.country_nameReturns the country name.country_codeReturns the ISO 3166-1 alpha-2 country code (e.g. "CL", "AR", "MX").postal_codeReturns the postal/ZIP code.shortestReturns the minimal address string (city and region only).shortReturns a short address string (street, city, region — no country).fullReturns the full address string excluding country.gmaps_linkReturns a Google Maps URL that displays this address on the map.gmaps_directions_linkReturns a Google Maps directions URL pointing to this address.to_sReturns the full address string (same as `full`). alias for `full`collectionsReturns [TermCollectionDrop, nil] Collection facets for the search results.product_typesReturns [TermCollectionDrop, nil] Product type facets for the search results.vendorsReturns [TermCollectionDrop, nil] Vendor facets for the search results.tagsReturns [TermCollectionDrop, nil] Tag facets for the search results.attributesReturns [Array<KeyValuesDrop>] Attribute facets grouped by key for the search results.Represents a product image or file asset. Provides URL helpers for all standard image sizes and metadata about the file.
self to_s webp type size is_image is_video is_file is_default_image is_landscape_image is_portrait_image is_square_image human_size related_variant_id has_variants variants available_variants variant_ids available_variant_ids has_hotspots hotspots_config thumbnail medium small large original base_name actual_file_name url protected_path(size = 'original') resizer as_json(opts = {}) source_variantsidtitlefile_nameextensiondescriptionseller_idupdated_onimage_widthimage_heightselfReturns the default image for the given context, or the default placeholder.to_sReturns the generated resize URL string.webpReturns the resized URL converted to WebP format.typeReturns the MIME content type of the file (e.g. "image/jpeg").sizeReturns the file size in bytes.is_imageReturns true if the asset is an image.is_videoReturns true if the asset is a video.is_fileReturns true if the asset is neither an image nor a video (e.g. PDF, font).is_default_imageReturns true if no real image has been uploaded (placeholder is shown).is_landscape_imageReturns true if the image width is greater than its height.is_portrait_imageReturns true if the image height is greater than its width.is_square_imageReturns true if the image width and height are equal.human_sizeReturns a human-readable file size string (e.g. "240 KB" or "1 MB").has_variantsReturns true if the asset has variants.variantsReturns a VariantsDrop containing all variants for this asset.available_variantsReturns a VariantsDrop containing only available online variants.variant_idsReturns an array of variant IDs for this asset.available_variant_idsReturns an array of available online variant IDs.has_hotspotsReturns true if the asset has hotspots.hotspots_configReturns the hotspots configuration hash, or nil if no hotspots exist.thumbnailhttps://o.btcdn.co/29/original/151073-bannercarteras.png Returns the thumbnail-size image URL (approx. 100×100 px crop).mediumReturns the medium-size image URL (approx. 480×480 px).smallReturns the small-size image URL (approx. 240×240 px).largeReturns the large-size image URL (approx. 800×800 px).originalReturns the original full-resolution image URL.base_nameReturns the file name without its extension.actual_file_nameReturns the actual file name with prefix ID.urlReturns the original image URL. Useful as a generic accessor for non-image assets. This alias makes sense for non-image assetsprotected_path(size = 'original')Returns the protected path URL for the given size.resizerReturns a Resizer instance for this asset, or nil if it's a default image.as_json(opts = {})Returns a hash representation of the asset for JSON serialization.source_variantsinit_drop(model)init_drop(model)Represents the blog section. Exposed as `blog` in blog templates. Provides access to paginated posts, calendar archives, and category tags. Can be filtered by date (year/month/day) or tag.
month_num year post_countmonth_numyearpost_countdateReturns [Time, False] the parsed date, or false if no year/month.yearReturns [Integer, Nil] the year from params.monthReturns [Integer, Nil] the month from params.month_nameReturns [String] localized month name.dayReturns [Integer, Nil] the day from params.postsReturns [PostsDrop] the posts collection.each(&block)Make these drops iterable Returns [Enumerator] an enumerator over posts.calendarReturns [Array<CalendarItemDrop>] calendar items for archives.categoriesReturns [BlogTagsDrop] available post categories.title post_countnameslugtitleReturns [String] the tag name (for consistency with other drops).post_countReturns [Integer] number of posts in this tag.slugs include?(obj) init_drop(model)slugsReturns [Array<String>] the slugs for all blog tags.include?(obj)Returns [Boolean] whether the given object is included in the tags.init_drop(model)Returns [BlogTagDrop, nil] a new BlogTagDrop instance for the model.Represents a physical store location (branch). Exposed as items in `shop.branches`, `shop.pickup_branches`, and `shop.shipping_branches`. Provides address, contact details, and fulfilment (pickup/shipping) availability.
images main_image has_main_image address phone_number primary_number secondary_number shipping_paused provides_shipping pickup_paused provides_pickup has_delivery_windows shipping_schedule delivery_schedule has_available_times open_hours as_json(opts = {})cover_image → main_image has_cover_image → has_main_imageidnametypestock_location_idmanager_nameemail_addressimagesReturns all images associated with this branch as an AssetsDrop.main_imageReturns the primary cover image for this branch as an AssetDrop, or nil.has_main_imageReturns true if this branch has a cover image set.addressReturns the branch's physical address as an AddressDrop.phone_numberReturns the primary contact phone number (alias for primary_number).primary_numberReturns the primary phone number as a ContactNumberDrop, or nil if not set.secondary_numberReturns the secondary phone number as a ContactNumberDrop, or nil if not set.shipping_pausedReturns true if shipping from this branch is temporarily suspended.provides_shippingReturns true if this branch currently offers home delivery for the active customer.pickup_pausedReturns true if local pickup at this branch is temporarily suspended.provides_pickupReturns true if this branch currently allows in-store pickup for the active customer.has_delivery_windowsReturns true if this branch uses delivery time windows for scheduling.shipping_scheduleAlias for delivery_schedule.delivery_scheduleReturns the branch's delivery window schedule as a DeliveryWindowScheduleDrop, or nil.has_available_timesReturns true if the branch has configured opening hours.open_hoursReturns formatted opening hours as an HTML string (days grouped, lines separated by `<br />`).as_json(opts = {})Returns a Hash representation of this branch for JSON serialization.Represents the current shopping cart. Exposed as `cart` in all Liquid templates. Use it to display item counts, totals, and line items.
to_sReturns the cart code as a string representation.as_jsonReturns an empty hash for JSON serialization.codeReturns the unique identifier for this cart session.has_overbought_itemsReturns true if any line item quantity exceeds available stock.unitsReturns the total number of individual units across all line items.overbought_itemsReturns line items whose requested quantity exceeds available stock.has_removed_itemsReturns true if the cart contains items that were automatically removed (e.g. went out of stock).removed_itemsItems that were removed from the cart since the last load (e.g. due to stock changes).line_itemsReturns an array of line item hashes, each with product title, variant, quantity, and price data.formatted_totalReturns the cart grand total as a pre-formatted string including the currency symbol.formatted_net_totalReturns the cart net total (excluding taxes) as a pre-formatted string.promotionReturns the active promotion applied to the cart, if any.weightReturns the total weight of all items in the cart, in grams.discountsReturns an array of discount objects applied to the cart.discount_totalReturns the total monetary value of all discounts applied to the cart, in cents.to_sReturns [String] JSON representation of the requirements list.listReturns [Array<Hash>] List of requirements as validation entries.Represents a product collection (category). Exposed as `collection` on collection pages and as items in `shop.collections` or `product.collections`. Use it to list the collection's products, images, and metadata.
id slug title body num_product_typestype to_param name translated_name description translated_description images product_types vendors description first_product has_products size products available_products has_attributes meta_description meta_fields product_attributes filterable_product_attributes variant_options promotions each(&block) ids_to_show_first products_order_for_es as_jsonattributes → meta_fieldsidslugtitlebodynum_product_typestitlebodytypeReturns [String] the type of this drop.to_paramReturns [String] the URL-safe slug for this collection.nameReturns [String] the collection name (alias for title).translated_nameReturns [String] the translated collection name.descriptionReturns the collection's body text (alias for the `body` attribute).translated_descriptionReturns [String] the translated collection's description (alias for translated_body).imagesReturns all images associated with this collection as an AssetsDrop.product_typesReturns the product types (sub-categories) that have products in this collection.vendorsReturns the vendors that have products in this collection.descriptionReturns the collection's body text (alias for the `body` attribute).first_productReturns the first product in this collection, or nil if empty.has_productsReturns true if this collection has at least one product.sizeReturns the total number of products in this collection.productsReturns all products in this collection as a ProductsDrop, respecting manual sort order.available_productsReturns only in-stock products in this collection (excludes out-of-stock unless unlimited-stock is set). only products in stock or available_if_no_stock: truehas_attributesReturns [Boolean] true if the collection has any custom attributes.meta_descriptionReturns [String, nil] the meta description for this collection.meta_fieldsReturns [MetaFieldsDrop] the custom meta fields for this collection.product_attributesReturns [ProductAttributesDrop] the product attributes for this collection.filterable_product_attributesReturns [ProductAttributesDrop] the filterable product attributes for this collection.variant_optionsProductAttributesDrop has same behaviour we want for variant_optionspromotionsReturns [PromotionsDrop] the promotions available for this collection.each(&block)Make these drops iterableids_to_show_firstthese two methods are called from renderers, so need to be publicproducts_order_for_esmanual order doesn't work in ES, so only pass order if differentas_jsonReturns [Hash] a JSON representation of this collection.each(&block) as_json(opts = {})each(&block)Returns [void] Yields each color mapping object to the block.as_json(opts = {})Returns [Hash] A hash suitable for JSON serialization with color names as keys and hex values.to_sReturns the group name as a string representation. Returns the group name as a string representation.idReturns the unique identifier for this contact group. Returns the unique identifier for this contact group.nameReturns the name of the contact group. Returns the name of the contact group.provides_shippingReturns true if this group provides shipping services. Returns true if this group provides shipping services.provides_pickupReturns true if this group provides pickup services. Returns true if this group provides pickup services.shipping_branchesReturns an array of shipping branches available for this group. Returns an array of shipping branches available for this group.pickup_branchesReturns an array of pickup branches available for this group. Returns an array of pickup branches available for this group.price_list_idReturns the price list ID associated with this contact group.to_sReturns the contact number as a string. Returns the contact number as a string.stripReturns the contact number with non-numeric characters removed. Returns the contact number with non-numeric characters removed.typeReturns the type of contact number (e.g., 'whatsapp', 'telegram', or nil). Returns the type of contact number (e.g., 'whatsapp', 'telegram', or nil).urlReturns a clickable URL for the contact number (tel:, wa.me, or t.me). Returns a clickable URL for the contact number (tel:, wa.me, or t.me).formatReturns a human-readable formatted contact number with delimiters.Represents the currently logged-in customer. Exposed as `customer` in all templates. Check `customer.is_logged_in` before accessing other properties. Nil if no customer session is active.
name full_name first_name last_name email company company_id_number last_logged_on logged_in is_logged_in tags tag_list has_tags has_price_list has_contact_group price_list contact_group price_list_id contact_group_id membership has_membership has_subscriptions subscriptions last_ordered_products has_favorite_products favorite_products salesperson wallet_points promotions cart_requirementsnameAlias for full_name.full_nameReturns the customer's full name.first_nameReturns only the customer's first name.last_nameReturns the customer's last name (everything after the first word).emailReturns the customer's email address.companyReturns the customer's company name, or nil if not set.company_id_numberReturns the customer's tax ID or company ID number, or nil if not set.last_logged_onReturns the date and time the customer last logged in.logged_inAlias for is_logged_in.is_logged_inReturns true if the customer currently has an active session.tagsReturns the customer's assigned tags as a TagsDrop (used for segmentation and access control).tag_listReturns an array of tag strings associated with the customer.has_tagsReturns true if the customer has any tags assigned.has_price_listReturns true if the customer is assigned to a specific price list.has_contact_groupReturns true if the customer belongs to a contact group.price_listReturns the customer's assigned price list as a PriceListDrop, or nil.contact_groupReturns the customer's contact group as a ContactGroupDrop, or nil.price_list_idReturns the customer's price list ID, or nil if not assigned.contact_group_idReturns the customer's contact group ID, or nil if not assigned.membershipReturns the customer's membership as a CustomerMembershipDrop, or nil.has_membershipReturns true if the customer has an active membership.has_subscriptionsReturns true if the customer has any subscriptions.subscriptionsReturns the customer's subscriptions as a CustomerSubscriptionsDrop, or nil.last_ordered_productsReturns the customer's recently ordered products as a ProductsDrop, or nil.has_favorite_productsReturns true if the customer has any favorite products.favorite_productsReturns the customer's favorite products as a ProductsDrop, or nil.salespersonReturns the customer's assigned salesperson as a SalespersonDrop, or nil.wallet_pointsReturns the customer's wallet points balance.promotionsReturns the customer's available promotions as a PromotionsDrop, or nil.cart_requirementsReturns the cart requirements list for the customer's contact group, or nil.Represents the logged-in customer's active membership plan. Accessed via `customer.membership`. Use it to show plan-specific content or gating.
idplan_idplan_nameto_sReturns [String] The plan name.id product_nameidproduct_namestateReturns [String] The subscription state.to_sReturns [String] The product name.total_renewal_feeReturns [Integer] The total renewal fee.last_payment_onReturns [String] The date of the last payment.paid_setup_feeReturns [Integer] The paid setup fee.next_payment_onReturns [String] The date of the next payment.Wraps a Ruby Time/DateTime for use in Liquid templates. Returned by date attributes such as `product.updated_on`, `post.published_on`, `promotion.starts_at`, etc. Supports Liquid's built-in `date` filter via `strftime`.
to_sReturns the ISO 8601 string representation (default string output).wdayReturns the day of week as an integer (0 = Sunday, 6 = Saturday).dayReturns the day of the month (1–31).monthReturns the month number (1–12).yearReturns the four-digit year.strftime(str)Formats the date/time using a strftime-compatible format string, respecting locale. Also invoked by Liquid's built-in `date` filter.dateReturns a human-readable localized date string (e.g. "14 de abril, 2026").timeReturns the time portion as a string (e.g. "14:30 PM").unixReturns the Unix timestamp (seconds since epoch) as an integer.to_iReturns the Unix timestamp as an integer.iso8601Returns the ISO 8601 formatted date/time string.has_same_day_deliveryReturns [Boolean] Whether same day delivery is available.has_delivery_windowsReturns [Boolean] Whether delivery windows are available.available_delivery_windows(args = {})Returns [Array<Hash>] Available delivery windows with date and time slot info.titleReturns [String] The name of the linkslugReturns [String] The parameterized slug of the nameto_paramReturns [String] The slug (alias for to_param)linkableReturns [Object, nil] The linkable object if anyliquid_method_missing(meth)Returns [nil] Always returns nil for undefined methodslinkable_urlReturns [String] The path for the linksizesizeReturns [Integer]webpReturns [void]has_hotspotsReturns [Boolean]hotspots_configReturns [nil]urlReturns [String]streamReturns [String, nil]thumbnailReturns [String]smallReturns [String]mediumReturns [String]largeReturns [String]originalReturns [String]protected_path(size = 'original')Returns [void]resizerReturns [void]Represents a contact or custom form page. Inherits page properties from SectionDrop. Exposes field groups (contact, company, custom), validation errors, and the form's POST endpoint. Use `sent` to check if the form was just submitted successfully.
referrertitle body success_messagetype post_path post_url images main_image has_main_image relations has_relations has_errors sent is_multipart contact_fields company_fields custom_fields has_address_fields has_custom_fields has_company_fields errors success_messagecover_image → main_image has_cover_image → has_main_imagereferrertitlebodysuccess_messagetypeReturns the type of drop, always 'form'.post_pathReturns the relative POST path for submitting this form (e.g. "/forms/contact").post_urlReturns the absolute POST URL for submitting this form.imagesReturns an empty array (forms do not have images).main_imageReturns nil (forms do not have cover images).has_main_imageReturns false (forms do not have cover images).relationsReturns an empty array (forms do not have relations).has_relationsReturns false (forms do not have relations).has_errorsReturns true if the form has validation errors (e.g. after a failed submission).sentReturns false on the initial form page; overridden to true in SentFormDrop after successful submission.is_multipartReturns true if the form contains a file-upload field, requiring multipart encoding.contact_fieldsReturns the standard contact fields (name, email, phone, message) as an array of FormFieldDrop.company_fieldsReturns company-specific fields as an array of FormFieldDrop.custom_fieldsReturns the form's custom fields as an array of FormFieldDrop.has_address_fieldsReturns true if the form has an address field group.has_custom_fieldsReturns true if the form has any custom fields.has_company_fieldsReturns true if the form has any company fields.errorsReturns the list of validation errors as ErrorDrop objects.success_messageReturns the localised success message shown after a successful form submission.Represents a single form field within a FormDrop. Renders itself as an HTML input via the `html` method. Field type determines the subclass used: text, email, textarea, select, checkbox, file, etc.
self self html as_json(opts = {})selfReturns [FormFieldDrop] a new instance of the appropriate field type class.selfReturns [FormFieldDrop] a new instance of the appropriate field type class.htmlReturns [String] the HTML representation of the field.as_json(opts = {})Returns [Hash] a JSON representation of the field.liquid_method_missing(item_slug)Represents an image gallery. Iterable — loop over it to access GalleryItemDrop entries. Accessible via page relations or `shop.galleries`.
titleslugnameReturns [String] the gallery title.to_sReturns [String] the gallery slug.itemsReturns [self] self (gallery is iterable).linksReturns [self] links (alias for items).has_itemsReturns [Boolean] whether gallery has items.has_linksReturns [Boolean] whether gallery has links (alias for has_items).sizeReturns [Integer] number of items in gallery.firstReturns [GalleryItemDrop, Nil] the first gallery item.lastReturns [GalleryItemDrop, Nil] the last gallery item.first_itemReturns [GalleryItemDrop, Nil] the first item (alias for first).last_itemReturns [GalleryItemDrop, Nil] the last item (alias for last).to_aReturns [Array<GalleryItemDrop>] gallery items as array.each(&block)Yields each gallery item.as_json(opts = {})Returns [Hash] JSON representation of gallery.galleryReturns [GalleryDrop] the parent gallery.imageReturns [AssetDrop, Nil] the gallery item image.titleReturns [String] image title.descriptionReturns [String] image description.meta_fieldsReturns [MetaFieldsDrop] meta fields for this item.attributesReturns [MetaFieldsDrop] attributes (alias for meta_fields).as_json(opts = {})Returns [Hash] JSON representation of gallery item.Represents a gift card product. Behaves like a ProductDrop but `is_gift_card` returns true and variant-selection methods return nil (gift cards use a custom denomination input instead).
product_classReturns [String] 'gift_card'.variants_countReturns [Integer] 0.is_gift_cardReturns [Boolean] true.has_multiple_pricesReturns [Boolean] false.keyReturns the key string (slugified name). Returns the key string (slugified name).slugReturns the slug (same as key). Returns the slug (same as key).nameReturns the name as a string. Returns the name as a string.typeReturns the type as a string. Returns the type as a string.valuesReturns the array of values. Returns the array of values.mappingsReturns the mappings hash.sizeReturns the number of values. Returns the number of values.is_booleanReturns true if the values represent a boolean type. Returns true if the values represent a boolean type.as_json(opts = {})Returns a hash suitable for JSON serialization.Represents a single navigation link. Inherits page properties from SectionDrop and adds URL resolution, external-link detection, and submenu support. Accessed as items within a MenuDrop.
type menu html url target path is_external linkable to_param has_submenu has_submenu_with_links submenu liquid_method_missing(meth) is_usable_as_filter linkable_group_name linkable_type as_json(opts = {}) child_menu dynamic_submenu linkable_first(meth) linkable_has?(meth) is_http_uri_or_path?(str) linkable_url uri_or_url(&block) path_and_query(uri) current_host?(host) liquify_linkables(obj) liquify_linkable(item)typeReturns 'link'.htmlReturns a ready-to-use `<a>` HTML tag for this link. External links include rel="noopener noreferrer" and target="_blank".urlReturns the fully-qualified URL for this link, including the host.targetReturns "_blank" if the link should open in a new tab, "_self" otherwise.pathReturns the path portion of the URL (without host). Returns "" for external links to other domains.is_externalReturns true if the link points to a different domain than the current storefront.linkableReturns the Drop representing the linked resource (e.g. CollectionDrop, ProductDrop), or nil for raw URL links.to_paramReturns the URL-safe slug or identifier for this link.liquid_method_missing(meth)link.has_product_types link.has_tags link.product_types link.products link.first_product etc... Handles dynamic method calls for linkable associations (e.g. has_products, product_types).is_usable_as_filterReturns true if this link can be used as a filter (Collection, ProductType, Vendor, or Tag).linkable_group_nameReturns the pluralized class name of the linkable (e.g. "collections", "product_types").linkable_typeReturns the type of the linkable (e.g. "Collection", "Product", "URL").as_json(opts = {})Returns a hash representation of this link for JSON serialization.linkable_first(meth)Returns the first item of an association (e.g. first_product) from the linkable.linkable_has?(meth)Returns true if the linkable responds to the given method and it has any items.is_http_uri_or_path?(str)Returns true if the string starts with a slash or "http".linkable_urlReturns the URL string of the linkable, stripped of whitespace.uri_or_url(&block)Parses the linkable URL and yields the URI to the block, or returns the URL as-is.path_and_query(uri)Returns the path and query string of the URI, including the path prefix.current_host?(host)Returns true if the given host matches the current storefront's host.liquify_linkables(obj)Converts linkable objects to their Liquid drop representations.liquify_linkable(item)Returns a Liquid drop for the given item (Product, Collection, ProductType, Vendor, or Tag).init_drop(model)init_drop(model)Returns [LinkDrop] a new drop for the model.is_blocked is_bundle is_gift_card is_membership_plan has_options assets images variants first_asset first_image first_file vendor product_type google_category has_tags has_attributes to_s updated_on meta_fields attributes membership_fees url path price_includes_tax has_sale_price has_volume_discount has_multiple_prices price regular_pricename → model title → modelidmodeldescriptionclass_slugslugcurrency_codeis_blockedReturns [Boolean] Whether the plan is blocked.is_bundleReturns [Boolean] Always false for membership plans.is_gift_cardReturns [Boolean] Always false for membership plans.is_membership_planReturns [Boolean] Always true for membership plans.has_optionsReturns [Boolean] Always true (plans can't be added from listing pages).assetsReturns [AssetsDrop] The assets for this plan.imagesReturns [AssetsDrop] The images for this plan.variantsReturns [Array] Empty array (no variants for membership plans).first_assetReturns [AssetDrop, nil] The first asset.first_imageReturns [AssetDrop, nil] The first image.first_fileReturns [FileDrop, nil] The first file.vendorReturns [VendorDrop, nil] The vendor for this plan.product_typeReturns [ProductTypeDrop, nil] The product type.google_categoryReturns [nil] Always nil for membership plans.has_tagsReturns [Boolean] Always false.has_attributesReturns [Boolean] Always false.to_sReturns [String] The model name.updated_onReturns [Date] The updated timestamp.meta_fieldsReturns [MetaFieldsDrop] Custom meta fields.attributesalias_method macro does not work because it would have to be declared in every subclass Returns [MetaFieldsDrop] Alias for meta_fields.membership_feesReturns [Array<SubscriptionFeeDrop>] Membership fees.urlReturns [String] The URL path to the plans page.pathReturns [String] The path to the plans page.price_includes_taxReturns [Boolean] Always true.has_sale_priceReturns [Boolean] Always false.has_volume_discountReturns [Boolean] Always false.has_multiple_pricesReturns [Boolean] Whether there are multiple prices.priceReturns [MoneyDrop] The price (alias for regular_price).regular_priceReturns [MoneyDrop] The regular price.Represents a navigation menu containing an ordered list of links. Accessible via `shop.menus` or the `{% menu %}` tag. Iterate directly over a MenuDrop to loop through its links.
Represents a collection of menus for a shop.
Represents a single custom metadata field on a product, collection, or page. Accessed via `product.meta_fields`, `product.attributes`, or `collection.meta_fields`. `to_s` (and `value`) returns the field's value formatted according to its type.
namekeyto_sReturns the field's formatted value as a string (same as `value.to_s`).slugReturns the field's key (alias for `key`).field_typeReturns the field type string (e.g. "string", "int", "boolean", "split_string").is_featuredReturns true if this field is marked as featured (highlighted in the storefront).valueReturns the field value formatted according to its type. Booleans return a localised yes/no string; integers are cast; split_string values are joined.boolean_stringReturns the localized yes/no string for boolean fields.has_valueReturns true if the field has a non-blank value.has_multiple_valuesReturns true if the field is a split_string type with more than one value.valuesReturns the array of split string values, or nil for other field types.is_integer(value)Returns true if the value can be parsed as an integer.as_json(opts = {})Returns a hash representation of the meta field for JSON serialization.to_s name slug meta_fields has_attributes attributesnamekeyto_sReturns [String]nameReturns [String]slugReturns [String]meta_fieldsmeta_fields from groups already comes sort by positionhas_attributesReturns [Boolean]attributesReturns [MetaFieldsDrop]each(&block) to_a init_drop(model)each(&block)Returns [Enumerator]to_aReturns [Array<MetaFieldGroupDrop>]init_drop(model)Returns [MetaFieldGroupDrop]allReturns [ModelCollectionDrop]presentReturns [Array<MetaFieldDrop>]get(field_name)Returns [MetaFieldDrop, nil]each(&block)Returns [Enumerator]to_aReturns [Array<MetaFieldDrop>]has_attributesReturns [Boolean]associationoverwrite attr_reader method and filter hidden attrs and sort Returns [Array<MetaField>]liquid_method_missing(field_name)Returns [MetaFieldDrop, nil]init_drop(model)Returns [MetaFieldDrop]Base class for collections of Liquid drops. Wraps an ActiveRecord association and provides iteration, size, and first/last methods.
allsizehandle group results, for which rails returns a hash instead of an integercountfirstlasteach(&block)Make these drops iterablepaginate(*args)Make them paginatableas_json(opts = {})to_awith_available_promotionsReturns [ModelCollectionWithProductsDrop] A new collection with available promotions.nonemptyReturns [ModelCollectionWithProductsDrop] A new collection with nonempty items.slugsReturns [Array<String>] Array of slugs for all models in the collection.include?(obj)Extends ModelCollectionDrop with a service object for pagination and lazy loading.
paginate(*args)paginate(*args)Base class for all Liquid drops representing a single model (product, collection, etc). Provides attribute delegation, JSON serialization, and i18n support.
titledescriptionto_paramas_json(options = {})to_sto_paramresource_namekeyspathExtends ModelDrop with a service object for accessing API data. Used for lazy loading relationships and accessing shop context.
to_liquid(service = nil) shopto_liquid(service = nil)shopRepresents a product modifier — an optional add-on a customer can select when ordering (e.g. gift wrapping, engraving, custom text). Exposed via `product.modifiers`. May carry an additional price and custom input fields collected at checkout.
id name slug description max_countidnameslugdescriptionmax_counthas_additional_price_globalReturns true if this modifier has a flat additional price (applied once per order line).additional_price_globalReturns the flat additional price as a MoneyDrop, or nil if none is set.has_additional_price_per_unitReturns true if this modifier has a per-unit additional price.additional_price_per_unitReturns the per-unit additional price as a MoneyDrop, or nil if none is set.is_multipartReturns true if any custom field on this modifier is a file-upload field.custom_fieldsReturns the modifier's custom input fields as an array of FormFieldDrop.has_custom_fieldsReturns true if the modifier has any custom input fields.error_messages_for(key)Represents a monetary value with currency-aware formatting. Returned by price attributes on products and variants. Supports arithmetic operators so you can add, subtract, multiply, and divide prices in Liquid.
centsformat to_number money with_thousand_separator without_symbol without_symbol_with_thousand_separator numeric number to_f positive zero abs currency_codeto_s → formatcentsformatReturns [String] the formatted price string including the currency symbol (e.g. "$12.99"). Includes "from" prefix for products with multiple prices, and tax labels when applicable.to_numberReturns [MoneyDrop] self for use in math operations.moneyReturns [Money] the underlying Money object.with_thousand_separatorReturns [String] the formatted price with a thousands separator (e.g. "$1,299.00").without_symbolReturns [String] the numeric amount as a string without the currency symbol (e.g. "12.99").without_symbol_with_thousand_separatorReturns [String] the numeric amount without symbol, with a thousands separator.numericReturns [Integer] the raw integer amount in the smallest currency unit (cents for USD). Useful for passing prices to JavaScript or comparing values.numberReturns [Integer] Alias for numeric. Returns the raw integer amount in cents.to_fReturns [Integer] Alias for numeric. Returns the raw integer amount in cents.positiveReturns [Boolean] true if the amount is greater than zero.zeroReturns [Boolean] true if the amount is zero.absReturns [MoneyDrop] the absolute value of this monetary amount.currency_codeReturns [String] the ISO 4217 currency code (e.g. "USD", "EUR").to_skeyshas?(key)get(key)so we can call this from tags (e.g. AddToCartTag)as_json(options = {})total_entriesReturns [Integer]total_itemsReturns [Integer]each(&block)Returns [void] Yields each item in the set.init_drop(model)Returns [Liquid::Drop, nil]init_drop(model)init_drop(model)Returns [Liquid::Drop, nil]Represents a payment method available at checkout (e.g. credit card, bank transfer, PayPal). Exposed as items in `shop.payment_methods`. Includes logo URL and optional surcharge info.
nameReturns the localised display name of the payment method.logoReturns the URL of the payment method's logo image (150 px PNG).has_surchargeReturns true if this payment method charges an additional surcharge fee.surcharge_amountReturns the surcharge amount (numeric value; use with a money filter for display).surcharge_typeReturns the surcharge type: "percentage" or "fixed".token_based?Returns true if this payment method uses a saved token (e.g. Webpay Oneclick, PayPal Wallet).Represents a single blog post. Exposed as `post` in blog post templates and as items in `blog.posts`. Supports navigation to previous/next posts.
name user_name description meta_description previous next images main_image tag_list has_main_image path_segments main_assetcover_image → main_image has_cover_image → has_main_imageidtitleslugpublished_onupdated_onuser_nameuser_emailtitlebodynameReturns the post title. Alias for title.user_nameReturns the display name of the author who wrote this post.descriptionReturns the post's short description or excerpt.meta_descriptionReturns the short_description if set, otherwise falls back to description. Used in SEO meta tags.previousReturns the previous post as a PostDrop (by publication date), or nil if this is the first post.nextReturns the next post as a PostDrop (by publication date), or nil if this is the last post.imagesReturns all images attached to this post as an AssetsDrop.main_imageReturns the post's primary/featured image as an AssetDrop, or nil if none is set.tag_listReturns a plain array of tag name strings associated with this post.has_main_imageReturns true if the post has a designated cover/featured image.path_segmentsReturns an array of path segments for building the post URL.main_assetReturns the primary/first post asset, or nil if none.tagged_with(tag_list)posts.tagged_with.recetas Returns [PostsDrop] posts matching the given tag list.liquid_method_missing(str)Returns [PostsDrop, Array, Nil] posts matching the method name.latest(num)Returns [PostsDrop] the latest num posts.Represents a customer-specific price list. Accessible via `customer.price_list`. When active, all product prices shown to the customer come from this list instead of public prices.
to_sReturns the price list name (default string output).idReturns the unique identifier of this price list.nameReturns the display name of this price list.tax_nameReturns the name of the tax applied to this price list (e.g. "IVA").tax_rateReturns the tax rate as a decimal (e.g. 0.19 for 19% VAT).prices_include_taxReturns true if the prices in this list already include tax.used in ProductsDrop#attributes and in ShopDrop#variant_options and ShopDrop#product_attributes
first last to_a each(&block)firstReturns [KeyValuesDrop, nil] the first product attribute.lastReturns [KeyValuesDrop, nil] the last product attribute.to_aReturns [Array<KeyValuesDrop>] all product attributes as an array.each(&block)Yields each product attribute as KeyValuesDrop.Represents a product bundle — a fixed or customizable set of products sold together. Inherits from ProductDrop; `is_bundle` returns true. Use `bundle_config` for the full JSON configuration needed by the add-to-cart form.
product_class is_bundle variants_count has_bundle_discount bundle_price_mode has_valid_volume_discount has_dynamic_price has_multiple_prices is_single_item savings_amount unbundled_items_price bundle_items products_in_bundle any_available has_unlimited_stock stock weight_in_gr has_custom_bundle_price bundle_configproduct_classReturns [String] the product class identifier.is_bundleReturns [Boolean] whether this is a bundle.variants_countReturns [Integer] the number of variants (always 0 for bundles).has_bundle_discountReturns [Boolean] whether the bundle has a bundle discount.bundle_price_modeReturns [String] the bundle price mode.has_valid_volume_discountReturns [Boolean] whether the bundle has a valid volume discount.has_dynamic_priceReturns [Boolean] whether the bundle has a dynamic price.has_multiple_pricesReturns [Boolean] whether the product has multiple prices.is_single_itemReturns [Boolean] true if bundle has no options and contains a single fixed item.savings_amountReturns [MoneyDrop, nil] the savings amount compared to buying items separately.unbundled_items_priceReturns [MoneyDrop, nil] the total price of all items if bought unbundled.bundle_itemsReturns [Array<ProductBundleItemDrop>] the fixed bundle items.products_in_bundleReturns [Array<ProductBundleItemDrop>] the products in the bundle.any_availablehas_unlimited_stockReturns [Boolean] whether the bundle has unlimited stock.stockReturns [Integer] the available stock.weight_in_grReturns [Integer] the weight in grams.has_custom_bundle_priceReturns [Boolean] whether the bundle has a custom price.bundle_configsourceReturns [ProductDrop] the source product.availableReturns [Boolean] whether the bundle item is available.is_availableReturns [Boolean] whether the bundle item is available.nameReturns [String] the product + variant name.product_nameReturns [String] the product name.variant_nameReturns [String] the variant name.translated_nameReturns [String] the translated product + variant name.translated_product_nameReturns [String] the translated product name.translated_variant_nameReturns [String] the translated variant name.imageReturns [AssetDrop] the image for this bundle item.bundle_item_productReturns [ProductDrop] the product for this bundle item.bundle_item_variantReturns [VariantDrop] the variant for this bundle item.is_optionalReturns [Boolean] whether the option is optional (min_count == 0).has_variable_countReturns [Boolean] whether the option has a variable count.bundle_itemsReturns [Array<ProductBundleItemDrop>] the bundle items in this option.translated_nameReturns [String] the translated name.titleReturns [String] the title of the comparison table.descriptionReturns [String] the description of the comparison table.productsReturns [ProductsDrop] the products being compared.products_countReturns [Integer] the number of products being compared.attributesReturns [ProductAttributesDrop] the attributes for comparison.Represents a product in the store. Exposed as `product` in product and collection templates. Provides access to pricing, images, variants, inventory, tags, and promotional data.
id title slug class_slug description short_description currency_code updated_on cart_max_quantity cart_quantity_multiplehas_short_description product_class as_json(opts = {}) cart_json selected_branch_id contact_group_id price_list_id price_from_list plans_with_access is_restricted_to_members accessible_to_customer is_bundle is_gift_card is_membership_plan is_intangible is_deliverable tracks_stock is_blocked notifies_when_restocked is_dynamic_bundle has_options has_options_for_slideout to_param has_collections first_collection collections tag_list tags first_tag vendor product_type bundle_config google_category weight_in_gr weight_in_kg price_per_kg meta_field_groups attribute_groups meta_fields featured_meta_fields attributes has_attributes meta_description meta_keywords can_show_price_publicly has_dynamic_price price_if_static has_multiple_prices price price_for_meta regular_price sale_price has_sale_price is_sale_price_set sale_price_starts_at sale_price_ends_at has_discount discount_percentage price_comparison has_price_comparison price_comparison_percentage has_savings savings_amount savings_percentage volume_discount_comparison_price has_public_price public_price has_price_list_savings price_list_savings_amount price_list_savings_percentage tax price_with_tax prices_from_lists has_promotions promotions promotions_for_customer promotions_as_count_group promotions_as_count_group_for_widget promotions_as_count_group_for_customer_in_widget promotions_by_discount_group has_modifiers modifiers has_similar_products similar_products has_related_products related_products has_matching_bundles matching_bundles minimum_stock has_stock_in_multiple_branches stock_in_branches stock_in_selected_branch stock online_stock all_stock available_in_selected_branch available_in_any_branch available_online any_available is_available not_available shipping_option_couriers has_estimated_days_to_delivery estimated_days_to_delivery available_for_shipping available_for_pickup has_unlimited_stock has_unlimited_stock_by_selected_branch variants available_variants unavailable_variants variants_for_json(hide_unavailable: false, sort: false) variants_count has_variants can_select_variant initial_selected_variant default_variant_id available_variant_id has_variant_options available_variant_options_matrix variant_options_matrix variant_options_tree variant_option_type has_colors has_color_variant_option has_image_variant_option color_map variant_option_names variant_option_name custom_variant_option_name assets images videos files asset_count image_count video_count file_count has_assets has_images has_videos has_files first_asset first_image first_video first_file cart_max_quantity_by_type cart_quantity_multiple_by_type unit_of_measure unit_display_quantity price_per_display_unit has_volume_discountmodel → title name → title translated_title → translated_model translated_name → translated_modelidtitleslugclass_slugdescriptionshort_descriptioncurrency_codeupdated_oncart_max_quantitycart_quantity_multiplemodeldescriptionopt1_nameopt2_nameopt3_namehas_short_descriptionReturns true if a short description is present for this product.product_classReturns the class type of this drop for internal classification.as_json(opts = {})Returns a JSON representation of the product for API rendering.cart_jsonReturns a JSON representation of the product optimized for cart rendering.selected_branch_idReturns the ID of the currently selected branch for this request context.contact_group_idReturns the contact group ID associated with the service for this product.price_list_idReturns the active price list ID for the current request context.price_from_listReturns true if a price list is currently active for this product.plans_with_accessReturns an array of membership plans that grant access to this product.is_restricted_to_membersReturns true if this product is restricted to specific membership plan holders.accessible_to_customerReturns true if the current customer has access to view/purchase this product.is_bundleReturns false — standard products are not bundles. Returns false — standard products are not bundles.is_gift_cardReturns false — standard products are not gift cards.is_membership_planReturns false — standard products are not membership plans.is_intangibleReturns false — standard products are tangible (shippable). Returns false — standard products are tangible (shippable).is_deliverableReturns true — standard products can be delivered.tracks_stockis_blockedReturns true if this product is blocked from purchase.notifies_when_restockedReturns true if the product should show a "Notify when restocked" option.is_dynamic_bundleReturns true if this is a dynamic bundle with multiple options.has_optionsReturns true if the product requires the customer to choose an option before adding to cart. True for gift cards, subscriptions, or products with multiple selectable variants. used in add to cart tag to determine whether to show 'view options' or 'add to cart' in list viewhas_options_for_slideoutReturns true if this product has options that can be shown in a slideout panel.to_paramReturns the slug for URL parameter representation of this product.has_collectionsReturns true if the product belongs to at least one collection.first_collectionReturns the first collection this product belongs to.collectionsReturns all collections this product belongs to as a CollectionsDrop.tag_listReturns the product's tags as a plain array of tag name strings.tagsReturns all tags associated with this product as a TagsDrop.first_tagReturns the product's first tag, or nil if none exist.vendorReturns the product's vendor/brand as a VendorDrop, or nil if not set.product_typeReturns the product type classification as a ProductTypeDrop, or nil if not assigned.bundle_configReturns the bundle configuration hash for dynamic bundle products.google_categoryReturns the Google product category ID for this product's type.weight_in_grReturns the product weight in grams.weight_in_kgReturns the product weight in kilograms.price_per_kgReturns the price per kilogram for this product.meta_field_groupsReturns custom field groups as a MetaFieldGroupsDrop.attribute_groupsReturns attribute groups (alias for meta_field_groups).meta_fieldsReturns custom attributes (meta fields) defined on this product as a MetaFieldsDrop.featured_meta_fieldsReturns featured custom fields as a MetaFieldsDrop.attributesReturns custom attributes (meta fields) defined on this product as a MetaFieldsDrop.has_attributesReturns true if this product has any custom attributes defined.meta_descriptionReturns the meta description for SEO purposes.meta_keywordsReturns the meta keywords for SEO purposes.can_show_price_publiclyReturns true if prices can be shown to public visitors.has_dynamic_priceReturns true if the product has a dynamic price that varies by context.price_if_staticReturns the static price when dynamic pricing is not active.has_multiple_pricesReturns true if this product has multiple pricing tiers (e.g., subscription plans).priceThe current selling price. Returns sale_price when active, otherwise regular_price.price_for_metawe do allow sale prices to be showed in _product_meta Returns the price to display in product metadata.regular_priceThe standard list price as a MoneyDrop. Includes a "from" prefix when the product has multiple variant prices.sale_priceThe discounted sale price as a MoneyDrop, or nil if no sale is active.has_sale_priceReturns true if a sale price is currently active on this product.is_sale_price_setReturns true if a sale price has been configured for this product.sale_price_starts_atReturns the start date and time for the sale price as a DateTimeDrop.sale_price_ends_atReturns the end date and time for the sale price as a DateTimeDrop.has_discountReturns true if the product has an active discount.discount_percentageReturns the sale discount as an integer percentage of the regular price (e.g. 20 for 20% off).price_comparisonReturns the comparison price (original price before discount) as a MoneyDrop.has_price_comparisonReturns true if a comparison price is available for display.price_comparison_percentageReturns the percentage difference between comparison price and regular price.has_savingsReturns true if the product has any savings (sale price or volume discount).savings_amountReturns the savings amount as a MoneyDrop.savings_percentageReturns the savings percentage as a formatted string.volume_discount_comparison_priceReturns the comparison price used for volume discount calculations.has_public_priceReturns true if a public price is defined for this product.public_priceReturns the public (catalog) price as a MoneyDrop.has_price_list_savingsReturns true if there are savings available from a price list.price_list_savings_amountReturns the savings amount from price list as a MoneyDrop.price_list_savings_percentageReturns the savings percentage from price list as a formatted string.taxReturns the tax amount for this product (currently returns nil).price_with_taxReturns the price including tax.prices_from_listsReturns prices from all price lists as an array.has_promotionsReturns true if any promotions are available for this product.promotionsReturns promotions applicable to this product for an anonymous visitor as a PromotionsDrop.promotions_for_customerReturns promotions applicable to this product for the logged-in customer.promotions_as_count_groupReturns promotions for this product grouped by quantity tier for anonymous visitors.promotions_as_count_group_for_widgetReturns promotions for this product grouped by quantity tier for widgets (anonymous).promotions_as_count_group_for_customer_in_widgetReturns promotions for this product grouped by quantity tier for logged-in customers in widgets.promotions_by_discount_groupReturns promotions for this product grouped by discount type.has_modifiersReturns true if the product has customization modifiers (e.g. gift wrapping, engraving options).modifiersReturns the available customization modifiers as a ModifiersDrop.has_similar_productsReturns true if this product has similar products defined.similar_productsReturns similar products for this product as a ProductsDrop.has_matching_bundlesReturns true if this product has matching bundles.matching_bundlesReturns matching bundles for this product as a ProductsDrop.minimum_stockReturns the minimum stock threshold for this product.has_stock_in_multiple_branchesReturns true if stock exists in multiple branches.stock_in_branchesReturns stock information for each branch as an array of ProductStockInBranchDrop.stock_in_selected_branchReturns the stock count in the currently selected branch.stockReturns the available stock count for the active context (selected branch or online).online_stockReturns the number of units available for purchase online.all_stockReturns the combined stock across all locations.available_in_selected_branchReturns true if stock is available in the currently selected branch.available_in_any_branchReturns true if there is stock in any branch or online location.available_onlineReturns true if the product can be purchased online right now.any_availableReturns true if any variants are available for purchase (considers stock and blocking).is_availableReturns true if the product has at least one purchasable variant in the current context.not_availableReturns true if no variants are currently available for purchase.shipping_option_couriersReturns available courier options for this product's shipping.has_estimated_days_to_deliveryReturns true if estimated days to delivery are available for this product.estimated_days_to_deliveryReturns estimated delivery time range as a hash with 'min' and 'max' keys.available_for_shippingReturns true if the product is available for shipping.available_for_pickupReturns true if the product is available for pickup.has_unlimited_stockReturns true if any variants allow unlimited stock (negative stock allowed).has_unlimited_stock_by_selected_branchReturns true if unlimited stock is allowed in the currently selected branch.variantsReturns all variants of the product as a VariantsDrop, including unavailable ones.available_variantsReturns only the variants that are currently available for purchase.variants_for_json(hide_unavailable: false, sort: false)Returns variants formatted for JSON rendering.variants_countReturns the total number of variants for this product.has_variantsReturns true if this product has more than one variant.can_select_variantReturns true if the product has multiple variants that can be selected.initial_selected_variantReturns the first available variant for this product.default_variant_idUsed in old cart forms. DEPRECATED as the variant might not be available!available_variant_idReturns the ID of the first available variant.has_variant_optionsReturns true if this product has variant options (e.g., Size, Color).available_variant_options_matrixReturns the variant options matrix for available variants only.variant_options_matrixReturns the variant options matrix for all variants.variant_options_treeReturns the variant options tree for this product.variant_option_typeReturns the first variant option type (e.g., 'color', 'size').has_colorsReturns true if this product has color variant options.has_color_variant_optionReturns true if the product has a color variant option.has_image_variant_optionReturns true if the product has an image variant option.color_mapReturns the color map for this product as a ColorMapDrop.variant_option_namesReturns all variant option names as an array.variant_option_nameReturns the first variant option name.custom_variant_option_nameReturns the custom variant option name if different from default.assetsReturns all assets (images, videos, and files) attached to this product.imagesReturns all images attached to this product as an AssetsDrop. Falls back to a placeholder if no images have been uploaded.videosReturns video assets attached to this product.filesReturns downloadable file assets attached to this product.asset_countReturns the total number of assets attached to this product.image_countReturns the total number of images attached to this product.video_countReturns the total number of videos attached to this product.file_countReturns the total number of files attached to this product.has_assetsReturns true if this product has any assets attached.has_imagesReturns true if this product has any images attached.has_videosReturns true if this product has any videos attached.has_filesReturns true if this product has any files attached.first_assetReturns the first asset attached to this product.first_imageReturns the first image attached to this product.first_videoReturns the first video attached to this product.first_fileReturns the first file attached to this product.cart_max_quantity_by_typeReturns the maximum cart quantity allowed by product type.cart_quantity_multiple_by_typeReturns the cart quantity multiple required by product type.unit_of_measureReturns the unit of measure for this product (e.g., 'kg', 'lb').unit_display_quantityReturns the display quantity for the unit of measure.price_per_display_unitReturns the price per display unit as a MoneyDrop.has_volume_discountReturns true if this product has a volume discount available.liquid_method_missing(str)liquid_method_missing(str)Returns [CollectionDrop, ProductTypeDrop, ProductSetDrop, VendorDrop, TagDrop, nil] the product group drop for the given type and slug.Represents a saved product set — a dynamic collection defined by a search query. Exposed as items in `shop.product_sets`. Iterable directly to loop through its products.
nameslugnameto_paramReturns [String] the slug for URL parameter.has_productsReturns [Boolean] true (avoids unnecessary query).productsReturns [ProductsDrop] the products in this set.each(&block)Make these drops iterable Yields each product in the set.slugs include?(obj)slugsReturns [Array<String>] the slugs of all product sets.include?(obj)stock_locationReturns [StockLocationDrop] The stock location drop if foundbranchReturns [BranchDrop] The branch drop if foundallows_negative_in_locationReturns [Boolean] Whether any variant allows negative stock in this locationvariant_stocksReturns [Array<Hash>] List of variant stocks with variant_id, available_stock, and allows_negativemethod_missing(key, args = nil)Returns [Object] The value for the given key from source or public method.liquid_method_missing(key)Returns [Object] The value for the given key from source or public method.as_json(opts = {})Returns [Hash] JSON representation of the stock dataRepresents a product type classification (analogous to a category in other platforms). Exposed as `product_type` on type pages and via `product.product_type`. Can hold custom attributes shared by all products of that type.
id name description slug products_count cart_max_quantity_per_product cart_quantity_multiple unit_of_measure unit_display_quantity to_paramname descriptiontype to_param images has_products first_product products available_products product_attributes filterable_product_attributes variant_options scoped_tags promotions vendors as_jsontitle → name short_description → nameidnamedescriptionslugproducts_countcart_max_quantity_per_productcart_quantity_multipleunit_of_measureunit_display_quantityto_paramnamedescriptiontypeto_paramReturns [String] the slug for URL parameter.imagesReturns [AssetsDrop] the images associated with this product type.has_productsReturns [Boolean] true if the product type has products.first_productReturns [ProductDrop, nil] the first product in the collection.productsproducts with both type and tags Returns [ProductsDrop] products matching both the product type and tag.available_productsReturns [ProductsDrop] products in stock or available_if_no_stock: true. only products in stock or available_if_no_stock: trueproduct_attributesReturns [ProductAttributesDrop] the product attributes for this type.filterable_product_attributesReturns [ProductAttributesDrop] the filterable product attributes.variant_optionsProductAttributesDrop has same behaviour we want for variant_options Returns [ProductAttributesDrop] the variant options for products of this type.scoped_tagstags for this type with products filtered by the type Returns [Array<ScopedTagDrop>] tags scoped to this product type.promotionsReturns [PromotionsDrop] the available promotions for this product type.vendorsReturns [VendorsDrop] the vendors for this product type.as_jsonReturns [Hash] a JSON representation of the product type.include?(obj)recently_updatedReturns [RecentlyUpdatedProductsDrop] products sorted by recent updates.sorted_byReturns [SortedProductsDrop] products sorted by the given mode. (eg. 'products.sorted_by.name')tagged_withReturns [TaggedProductsDrop] products with the given tags. (eg. 'products.tagged_with.foo+bar' (tag slugs))with_typeReturns [TypedProductsDrop] products of the given type. (eg. products.with_type.a-product-type (slug))with_vendorReturns [VendoredProductsDrop] products from the given vendor. (eg. products.with_vendor.a-vendor (slug))tagsReturns [TagsDrop] all tags from products in the collection.attributesReturns [ProductAttributesDrop] the product attributes.attribute_listReturns [ProductAttributesDrop] the product attributes.variant_namesReturns [Array<String>] all variant names from products in the collection.Represents a discount promotion. Exposed as items in `product.promotions`. Provides discount type, value, validity dates, and activation rules.
is_public has_product_count_group product_count_group product_count_group_name product_count_group_type has_product_discount_group product_discount_group product_discount_group_name product_discount_group_type has_discount_group_filter discount_group_filter_mode discount_group_filter_interval discount_group_filter_desc price_range_from price_range_to discount_type discount discount_over(price) starts_at expires_at is_expired is_upcoming is_cumulative non_cumulative activation_mode is_automatic by_code for_payment_method payment_method_name for_fulfillment_method for_shipping_option for_local_pickup fulfillment_method_name fulfillment_method_desc code has_main_image main_imagehas_cover_image → has_main_image cover_image → main_imageidnameusage_countusage_limitremaining_usesproduct_range_fromproduct_range_tocontact_tagis_publicReturns true if this promotion is visible to anonymous visitors. Code-based money discounts are kept private; all others are public.has_product_count_groupReturns true if this promotion has a product count group defined.product_count_groupReturns the product count group as a Liquid-compatible object, or nil.product_count_group_nameReturns the name of the product count group.product_count_group_typeReturns the type of the product count group.has_product_discount_groupReturns true if this promotion has a product discount group defined.product_discount_groupReturns the product discount group as a Liquid-compatible object, or nil.product_discount_group_nameReturns the name of the product discount group.product_discount_group_typeReturns the type of the product discount group.has_discount_group_filterReturns true if a discount group filter is active.discount_group_filter_modeReturns the discount group filter mode.discount_group_filter_intervalReturns the discount group filter interval.discount_group_filter_descReturns a human-readable description of the discount group filter.price_range_fromReturns the lower bound of the price range as a MoneyDrop, or nil.price_range_toReturns the upper bound of the price range as a MoneyDrop, or nil.discount_typeReturns the discount type: "percentage", "fixed", or "free_shipping".discountReturns a formatted discount string (e.g. "−20%", "−$5.00", or "Free shipping").discount_over(price)Returns the discount amount applied over a given price as a MoneyDrop.starts_atReturns the promotion start date as a DateTimeDrop, or nil if no start date is set.expires_atReturns the promotion expiry date as a DateTimeDrop, or nil if it never expires.is_expiredReturns true if the promotion's expiry date has passed.is_upcomingReturns true if the promotion start date is in the future.is_cumulativeReturns true if this promotion can stack with other promotions.non_cumulativeReturns true if this promotion cannot be combined with others.activation_modeReturns the activation mode string: "code", "auto", "fulfillment", or "payment".is_automaticReturns true if the promotion is applied automatically (no coupon code required).by_codeReturns true if the promotion requires a coupon code to be activated.for_payment_methodReturns true if this promotion is tied to a specific payment method.payment_method_nameReturns the name of the associated payment method, or a fallback message. Returns the name of the associated payment method, or a fallback message.for_fulfillment_methodReturns true if this promotion is tied to a specific fulfillment method. Returns true if this promotion is tied to a specific fulfillment method.for_shipping_optionReturns true if this promotion is tied to a shipping option. Returns true if this promotion is tied to a shipping option.for_local_pickupReturns true if this promotion is for local pickup at a branch. Returns true if this promotion is for local pickup at a branch.fulfillment_method_nameReturns the name of the fulfillment method. Returns the name of the fulfillment method.fulfillment_method_descReturns a human-readable description of the fulfillment method.codeReturns the coupon code string if the promotion is public and code-based, otherwise nil.has_main_imageReturns true if the promotion has a cover/banner image.main_imageReturns the promotion's cover image as an AssetDrop, or nil.associationliquid_method_missing(promo_name)Returns [PromotionDrop, nil]liquid_method_missing(param)liquid_method_missing(param)each(&block)liquid_method_missing(param)name description slugnamedescriptionslugurlReturns [nil]typeReturns [String] The child type underscored (e.g., 'product_type', 'gallery', 'collection', 'tag', 'vendor')objectReturns [Object] The child or parent object depending on targetparentReturns [Object] The parent object if visible, otherwise nilchildReturns [Object] The child object if visible, otherwise nilhas_productsReturns [Boolean] Whether the object has productsproductsReturns [Array] List of products if availableinit_drop(model)init_drop(model)idnameemailRepresents a static page (also called a section). Exposed as `page` in page templates. Pages can have images, custom meta fields, a body with Markdown/HTML, and related links. LinkDrop inherits from this class, so links share the same base properties.
title body success_messageslug type menu name description images main_image has_main_image has_attributes meta_fields meta_description resource_namecover_image → main_image has_cover_image → has_main_image attributes → meta_fieldstitlesenttitlebodysuccess_messageslugReturns [String] the URL-friendly slug for this section.typeReturns [String] the type of this section (e.g. "page").nameReturns [String] the name of this section (alias for title).descriptionReturns [String] the description or body content of this section.imagesReturns [AssetsDrop] the collection of images for this section.main_imageReturns [AssetDrop, nil] the cover image for this section, if any.has_main_imageReturns [Boolean] whether this section has a cover image.has_attributesReturns [Boolean] whether this section has any meta attributes with values.meta_fieldsReturns [MetaFieldsDrop] the meta fields for this section.meta_descriptionReturns [String, nil] the meta description for this section, if type is 'page'.resource_nameReturns [String] the resource name (alias for type).A FormDrop variant returned after a form is successfully submitted. Identical to FormDrop but `sent` always returns true, so templates can show a success message.
sentsentReturns [Boolean] Always true to indicate form was sent successfully.Represents an order shipment with fulfilment status and optional carrier tracking. Used in transactional email templates to display delivery progress, status bar, and tracking events.
has_trackingReturns true if carrier tracking data is available for this shipment.is_status_noneReturns true if the current delivery status is "none" (unfulfilled).current_statusReturns the current delivery status object.statusReturns the shipment status string (carrier status if tracked, otherwise the order fulfillment status).contact_nameReturns the recipient's name.localized_delivery_statusReturns the localised label for the current delivery status.delivery_statusReturns the effective delivery status key (e.g. "queued", "shipped", "delivered").delivery_statusesReturns all delivery status steps as DeliveryStatusDrop objects, with completion state.delivery_status_barReturns the subset of delivery statuses used to render a progress bar.tracking_dataReturns carrier tracking information as a ShipmentTrackingDrop, or nil if unavailable.courier_nameReturns the carrier name for this shipment.tracking_codeReturns the carrier tracking code for this shipment.order_codeReturns the order's short code (e.g. "#1234").destReturns a short destination string (street, city, region), or nil if no address is set.has_same_day_deliveryReturns [Boolean] True if same day delivery is available.has_delivery_windowsReturns [Boolean] False (delivery windows not supported).available_delivery_windows(args = {})Represents the current shop (store). Exposed as `shop` in all Liquid templates. Provides access to store settings, branding assets, branches, and cart configuration.
name short_name description subdomain currency_code custom_header custom_footer can_show_prices_publicly unavailable_products_mode checkout_orders_quote_flow products_cross_stock_modename descriptionnameshort_namedescriptionsubdomaincurrency_codecustom_headercan_show_prices_publiclycheckout_orders_quote_flowproducts_cross_stock_modenamedescriptionRepresents the shop's inventory/stock location. Accessible via `shop.stock_location`. Used internally to scope stock queries; `name` is the only public attribute.
namenameRepresents a subscription plan's fee structure — one-time setup fee plus a recurring renewal fee. Exposed as items in `product.subscription_fees` for subscribable products.
interval → payment_intervalidReturns the unique identifier of the subscription fee.setup_feeReturns the one-time setup/activation fee as a MoneyDrop.renewal_feeReturns the recurring renewal fee as a MoneyDrop (includes the billing interval).interval_labelReturns a localised label describing the billing interval (e.g. "monthly", "annually").payment_intervalReturns the billing interval key (e.g. "month", "year").variant_idReturns the variant ID associated with this subscription fee.as_json(opts = {})Returns a hash representation of the subscription fee for JSON serialization.Represents a product tag. Tags cross-categorize products across collections. Exposed as `tag` on tag pages and as items in `product.tags`.
nameslugcolorproducts_countvisibleiconidReturns [String] the tag's ID (slug) for JSON compatibility.is_visibleReturns [Boolean] whether the tag is visible.typeReturns [String] 'tag'.to_paramReturns [String] the tag's slug.titleReturns [String] the tag's name.has_productsReturns [Boolean] whether the tag has products.first_productReturns [ProductDrop, nil] the first product.productsReturns [ProductsDrop] all products for this tag.available_productsReturns [ProductsDrop] available products (in stock).promotionsReturns [PromotionsDrop] available promotions.as_jsonReturns [Hash] a JSON representation of the tag.selfReturns [ThemeAssetDrop] a new instance from a URL.selfReturns [ThemeAssetDrop] a new instance from a URL.urlReturns [String] the URL of the theme asset.to_sReturns [String] the URL representation.titleReturns [String] the title (base name) of the asset.extensionReturns [String] the file extension.base_nameReturns [String] the base name without extension.human_sizeReturns [String, nil] the human-readable file size (e.g., "1.5 MB").geometrySets the geometry for image resizing.resizerReturns [AssetDrop::Resizer] the resizer instance for this asset.is_landscape_imageReturns [Boolean] whether this is a landscape image.is_portrait_imageReturns [Boolean] whether this is a portrait image.is_square_imageReturns [Boolean] whether this is a square image.has_variantsReturns [Boolean] always false (theme assets don't have variants).idReturns [nil]descriptionReturns [nil]shop_idReturns [nil]variantsReturns [Array] empty array.variant_idsReturns [Array] empty array.thumbnailReturns [String] the URL (thumbnail size).mediumReturns [String] the URL (medium size).smallReturns [String] the URL (small size).largeReturns [String] the URL (large size).originalReturns [String] the URL (original size).protected_path(size = 'original')Raises [RuntimeError] unsupported for theme assets.Represents a specific product variant — a unique combination of option values (e.g. "Blue / Large"). Provides pricing, stock, image, and option data for a single purchasable SKU.
translated_title opt1 opt2 opt3 product weight_in_gr weight_in_kg price_per_kg has_color online_stock stock is_available_if_no_stock has_unlimited_stock is_available stock_in_selected_branch has_volume_discount raw_price price regular_price sale_price has_sale_price discount_percentage has_price_comparison price_comparison price_comparison_percentage price_comparison_or_nil public_price tax price_with_tax related_assets asset_ids assets images files asset_count image_count file_count has_assets has_images has_files first_asset first_image first_file option_values option_assets_ids opt1_asset_id variant_option1_image option_images_urls price_per_unit price_per_display_unit as_json(opts = {})name → titletitleidskucoloroption_valuesweight_in_gramsopt1opt2opt3translated_titleReturns the variant title translated into the current locale.opt1opt2opt3productReturns the parent ProductDrop for this variant.weight_in_grAlias for weight_in_grams.weight_in_kgReturns the variant weight in kilograms.price_per_kgReturns the price per kilogram, or nil if weight is not set.has_colorReturns true if the variant has a non-default color value assigned.online_stockReturns the number of units available for online purchase.stockReturns the stock count for the currently selected branch, or online stock if no branch is selected.is_available_if_no_stockReturns true if this variant is configured to remain purchasable even when out of stock.has_unlimited_stockAlias for is_available_if_no_stock.is_availableReturns true if this variant can currently be purchased. Takes into account stock levels, selected branch, and unlimited-stock settings.stock_in_selected_branchReturns the stock count for the selected branch, or nil if no branch is selected.has_volume_discountReturns true if this variant has an active volume discount.raw_priceused in ItemWithTax Returns the raw (unformatted) price for this variant.priceThe current selling price. Returns sale_price if a sale is active, otherwise regular_price.regular_priceThe standard list price as a MoneyDrop.sale_priceThe discounted sale price as a MoneyDrop, or nil if no sale is active.has_sale_priceReturns true if a sale price is currently active.discount_percentageReturns the discount percentage relative to the regular price, or nil if no sale is active.has_price_comparisonReturns true if a comparison price (strikethrough price) is available to display.price_comparisonReturns the comparison price (strikethrough price), or nil if not available.price_comparison_percentageReturns the discount percentage relative to the regular price.price_comparison_or_nilkeeping this method for backwards compatpublic_priceReturns the public price for this variant, or nil if not set.taxReturns nil (tax is not calculated at variant level).price_with_taxReturns the price including tax (same as price for variants).asset_idsReturns an array of asset IDs for this variant's product.assetsReturns all assets for this variant as an AssetsDrop.imagesReturns images specifically associated with this variant as an AssetsDrop.filesReturns downloadable file assets attached to this variant.asset_countReturns the total number of assets (images + files) for this variant.image_countReturns the number of images for this variant.file_countReturns the number of file assets for this variant.has_assetsReturns true if the variant has any assets.has_imagesReturns true if the variant has any images.has_filesReturns true if the variant has any downloadable files.first_assetReturns the first asset for this variant.first_imageReturns the first image for this variant.first_fileReturns the first downloadable file for this variant.option_valuesReturns an array of the variant's option values (e.g. ["Blue", "Large"]).option_assets_idsReturns an array of asset IDs for option values.opt1_asset_idReturns the asset ID for the first option value.variant_option1_imageReturns the image asset for the first option value.option_images_urlsReturns an array of image URLs for option values.price_per_unitReturns the price per unit as a MoneyDrop, or nil if not available.price_per_display_unitReturns the price per display unit as a MoneyDrop, or nil if not available.as_json(opts = {})used in dynamic variants template to build list in view define here so we don't do BooticClient::Entity#as_json for Api Productsoption → name slug → keykeyoptions_countoptionoptionshas_multiple_optionsvariantshas_variantsRepresents a product vendor or brand. Exposed as `vendor` on vendor pages and via `product.vendor`. Supports filtering and browsing products by brand.
name descriptionidnameslugdescriptionproducts_countnamedescriptiontypeReturns [String] 'vendor'.to_paramReturns [String] the vendor's slug.imagesReturns [AssetsDrop, nil] the vendor's images.has_productsReturns [Boolean] whether the vendor has products.first_productReturns [ProductDrop, nil] the first product.productsReturns [ProductsDrop] all products for this vendor.available_productsonly products in stock or available_if_no_stock: true Returns [ProductsDrop] only products in stock.product_typesReturns [ProductTypesDrop] product types for this vendor.product_attributesReturns [ProductAttributesDrop] product attributes.filterable_product_attributesReturns [ProductAttributesDrop] filterable product attributes.variant_optionsProductAttributesDrop has same behaviour we want for variant_options Returns [ProductAttributesDrop] variant options.promotionsReturns [PromotionsDrop] available promotions.as_jsonReturns [Hash] a JSON representation of the vendor.Represents a volume (tiered) discount applied to a product or group of products. Accessible via `product.volume_discount`. Defines tiers, discount type, and how savings accumulate.
title type is_cumulative cumulative_mode repeating_tier single_tier apply_to_all completing_mode_apply_individually completing_mode_apply_globally is_completing_mode tiers is_fixed is_percentage is_group_percentage is_sale_price_trigger first_tier last_tier each(&block) has_products products products_countidnameslugdiscount_typeapply_modetitleReturns the name of the volume discount.typeReturns the discount type string (e.g., 'percentage', 'fixed').is_cumulativeReturns true if quantities from multiple products are counted together to reach a tier.cumulative_modeReturns the cumulative mode string ("global") or nil for non-cumulative discounts.repeating_tierReturns true if the last tier repeats for quantities beyond its threshold.single_tierReturns true if there is exactly one tier and it does not repeat.apply_to_allReturns true if the discount applies to every item in the order (not just group members).completing_mode_apply_individuallyReturns true if completing mode applies to each qualifying product individually.completing_mode_apply_globallyReturns true if completing mode applies to all qualifying products together.is_completing_modeReturns true if the discount uses "completing" mode (discount is applied once a threshold is reached).tiersReturns the array of discount tier hashes (each with quantity threshold and discount value).is_fixedReturns true if this is a fixed-amount (per-unit) volume discount.is_percentageReturns true if this is a percentage-based volume discount.is_group_percentageReturns true if the discount is a percentage applied across an entire product group.is_sale_price_triggerReturns true if the discount is triggered by reaching a sale price threshold.first_tierReturns the first (lowest-threshold) tier hash.last_tierReturns the last (highest-threshold) tier hash.each(&block)Yields each tier hash for iteration in Liquid templates. {% for tier in product.volume_discount %} ... {% endfor %}has_productsReturns true if this volume discount has associated products.productsReturns the collection of products associated with this volume discount.products_countReturns the number of products associated with this volume discount.completing_first_priceReturns [String, nil] HTML string for completing first tier price, or nil if not in completing mode.first_tier_msgReturns [String] HTML string for the first tier message.tiersReturns [Array<Hash>] Array of tier hashes with MoneyDrop values.with_available_promotionswith_available_promotionsCustom filters extending Liquid’s built-in set.
resized_image_url(filename_with_extension, geometry_string)resize(image, geometry_string)greyscale(image)webp(image)translate(str, args = nil)localize(str, args = nil)split_text(post_or_str, link_text = t('titles.read_more')split(post_or_str, link_text = t('titles.read_more')to_bool(var)to_slug(str)titleize(str)to_money(str)with_discount_from(product_price, promo)format_text(input)render_markdown(text, options = {})simple_format(text, options = {})simple_format(text, options = {})to_json(obj)bool_to_yesno(num)json_escape(text)escape_quotes(str)meta_escape(str, limit = nil)escape_html(text)strip_tags(html)print_if_equal(text, one, two)print_if_matches(text, one, two)print_if_included(text, needle, haystack)print_if_filter_active(text, params, link)if_current_page(text, link)if_within_section(text, link)if_within_catalog(text)image_url(product, size = 'large')asset_url(filename_with_extension)theme_asset_url(filename_with_extension)protected_asset_path(filename_with_extension, size = 'original')js_bundle_url(filenames)css_bundle_url(filenames)scss_bundle_url(filenames)asset_url_no_timestamp(filename_with_extension)image_tag(url_or_asset, alt_text = nil)lazy_image_tag(url_or_asset, alt_text = nil)image_tag_with_webp(url_or_asset, alt_text = nil)lazy_image_tag_with_webp(url_or_asset, alt_text = nil)stylesheet_tag(url, media = 'all')stylesheet_tag_with_preload(url, media = 'all')javascript_tag(url, append = '')async_javascript_tag(url)tagged_resource_path(resource, tag, page = 1)typed_collection_path(collection, type, page = 1)tagged_collection_path(collection, tag, page = 1)vendored_collection_path(collection, vendor, page = 1)tagged_typed_products_path(type, tag, page = 1)vendored_typed_products_path(type, vendor, page = 1)tagged_vendored_products_path(vendor, tag, page = 1)vendored_products_path(vendor, page = 1)pagination(paginated_list, opts = {})more_results(paginated_list, opts = {})page_numbers(paginated_list, opts = {})next_page(paginated_list, opts = {})Custom block/inline tags available in Liquid templates.
{% add_to_cart %}{% add_to_cart_in_branch %}{% add_to_cart_js %}{% add_to_cart_no_variants %}{% async_partial %}{% bootic_header %}{% bootic_js %}{% branch_chooser %}{% bundle_option_configurator %}{% cart_table %}{% cart_table_template %}{% comments %}{% compare_products %}{% contact_form_fields %}{% currency_select %}{% current_description %}{% current_title %}{% delivery_setup %}{% dynamic_cart_table %}{% embed_form %}{% find_in_block %}{% fulfillment_info %}{% include_optional %}{% include_partial %}{% language_select %}{% loop %}{% notify_restocked_form %}{% product_comparison_table %}{% product_filters %}{% promotions_for %}{% random_number %}{% render_component %}{% sale_price_countdown_for %}{% shipping_calculator %}{% signup_form %}{% stock_status %}{% subscribe_form %}{% toggle_quote_cart %}{% unit_price %}{% variant_colors %}{% volume_discount_table %}