> ## 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

> Access product data including pricing, images, and variants

Product data is available when iterating over a collection's products.

```liquid theme={null}
{%- 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 |

<Note>
  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.
</Note>

## 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 | —                                                 |

```liquid theme={null}
{% 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](/html/filters/image) to generate optimized image URLs:

```liquid theme={null}
{{ product.featured_image | img_url: 'large' }}
```

## Formatting prices

Use [money filters](/html/filters/money) to format prices:

```liquid theme={null}
{{ product.price | money }}
{{ product.compare_at_price | money }}
```

## Membership restrictions

```liquid theme={null}
{% 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 %}
```

## Promotions

Each badge has `type` and `label` properties:

```liquid theme={null}
{% if product.promotion_badges %}
  {% for badge in product.promotion_badges %}
    <span class="badge badge--{{ badge.type }}">{{ badge.label }}</span>
  {% endfor %}
{% endif %}
```

## Example: Product card

```liquid theme={null}
<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>
```
