Documentation Index
Fetch the complete documentation index at: https://docs.fourthwall.com/llms.txt
Use this file to discover all available pages before exploring further.
Product data is available when iterating over a collection’s products.
{%- assign collection = collections['all'] -%}
{% for product in collection.products limit: 8 %}
{{ product.title }} — {{ product.price | money }}
{% endfor %}
Product types
Every product has a type field that determines which properties are available. The available types are:
| Type | Description |
|---|
Standard | Regular products with variants and options |
Combined | Combined products with variants and options |
GiftCard | Gift card products |
Bundle | A bundle of multiple products sold together |
Bundle products have a different set of properties than Standard, Combined, and GiftCard products. Properties marked with specific type availability are only present on those product types.
Common properties
These properties are available on all product types.
| Property | Type | Description |
|---|
title | string | Product name |
handle | string | URL-safe identifier |
description | string | Full product description (HTML) |
url | string | Product page URL |
available | boolean | Whether the product is in stock |
type | string | Product type (Standard, Combined, GiftCard, Bundle) |
featured_image | image | Main product image |
images | array | All product images |
price | money | Current price (default variant for Single types, bundle price for Bundles) |
compare_at_price | money | Original price (for sales) |
promoted_price | money | Promotional price (if active) |
members_only | boolean | Whether product requires membership |
available_for_all_tiers | boolean | Available to all membership tiers |
required_tiers | array | Tiers required to purchase |
gift | boolean | Whether the product is a gift |
metafields | object | Custom metafields |
promotion_badges | array | Active promotion badges |
promotion_description | string | Promotion description text |
promotion_descriptions | array | All promotion descriptions |
Standard, Combined, and GiftCard properties
These properties are only available when product.type is Standard, Combined, or GiftCard.
Variants
| Property | Type | Description |
|---|
variants | array | All product variants |
options | array | Option names (e.g., ["Size", "Color"]) |
options_with_values | array | Options with their possible values |
default_variant | variant | The default variant |
Each variant object has:
| Property | Type | Description |
|---|
price | money | Variant price |
compare_at_price | money | Original price (for sales) |
available | boolean | Whether variant is in stock |
option1 | string | First option value |
option2 | string | Second option value |
option3 | string | Third option value |
image | image | Variant-specific image |
images | array | All variant images |
Additional pricing
| Property | Type | Description |
|---|
price_min | money | Lowest variant price |
Other
| Property | Type | Description |
|---|
collections | array | Collections the product belongs to |
updated_at | datetime | When the product was last updated |
Bundle properties
These properties are only available when product.type is Bundle.
| Property | Type | Description |
|---|
offers | array | The individual products included in the bundle (each is a Standard/Combined/GiftCard product object) |
pricing_strategy | object | How the bundle is priced |
Pricing strategy
The pricing_strategy.strategy object has a type field indicating the pricing model:
| Strategy type | Description | Additional fields |
|---|
FIXED_PRICE | Bundle has a fixed price | strategy.price.value, strategy.price.currency |
DISCOUNT_BASED | Bundle applies a percentage discount | strategy.discount_percentage |
SAME_AS_INDIVIDUAL | Bundle price equals the sum of individual prices | — |
{% if product.type == 'Bundle' %}
{% assign strategy = product.pricing_strategy.strategy %}
{% if strategy.type == 'DISCOUNT_BASED' %}
<span>{{ strategy.discount_percentage }}% off when bought together</span>
{% endif %}
<p>Includes:</p>
<ul>
{% for offer in product.offers %}
<li>{{ offer.title }} — {{ offer.price | money }}</li>
{% endfor %}
</ul>
{% endif %}
Images
Image object properties
Each image object has:
| Property | Type | Description |
|---|
url | string | Image URL |
alt | string | Alt text |
width | integer | Width in pixels |
height | integer | Height in pixels |
aspect_ratio | float | Width / height ratio |
Use the img_url filter to generate optimized image URLs:
{{ product.featured_image | img_url: 'large' }}
Use money filters to format prices:
{{ product.price | money }}
{{ product.compare_at_price | money }}
Membership restrictions
{% if product.members_only %}
{% if product.available_for_all_tiers %}
<p>Available for all members</p>
{% else %}
<p>Available for:
{% for tier in product.required_tiers %}
{{ tier.name }}{% unless forloop.last %}, {% endunless %}
{% endfor %}
</p>
{% endif %}
{% endif %}
Each badge has type and label properties:
{% if product.promotion_badges %}
{% for badge in product.promotion_badges %}
<span class="badge badge--{{ badge.type }}">{{ badge.label }}</span>
{% endfor %}
{% endif %}
Example: Product card
<div class="product-card">
{% if product.featured_image %}
<img
src="{{ product.featured_image | img_url: 'large' }}"
alt="{{ product.title }}"
loading="lazy"
>
{% endif %}
{% if product.promotion_badges %}
{% for badge in product.promotion_badges %}
<span class="badge badge--{{ badge.type }}">{{ badge.label }}</span>
{% endfor %}
{% endif %}
<h3>{{ product.title }}</h3>
<div class="price">
{% if product.compare_at_price %}
<s>{{ product.compare_at_price | money }}</s>
{% endif %}
<span>{{ product.price | money }}</span>
</div>
{% if product.type == 'Bundle' %}
<p>{{ product.offers.size }} items in this bundle</p>
{% endif %}
{% if product.available %}
<a href="{{ product.url | localized_url }}">View product</a>
{% else %}
<p>Out of stock</p>
{% endif %}
</div>