Add a Product Comparison Chart to Your Shopify Store

By Nicholas Drishinski | Published
Are you looking to help your customers make informed purchasing decisions? A product comparison chart is an excellent way to showcase the differences between your products in a clear, organized format. In this guide, I'll show you how to add a mobile-responsive comparison chart to your Shopify store using a custom section.


Prefer Video?

Enjoy, otherwise read on!

What You'll Learn


- How to create a custom section in Shopify
- How to implement a responsive comparison chart
- How to customize the chart for your specific products
- Best practices for product comparison pages


Step 1: Access Your Shopify Theme Files


1. Log into your Shopify admin dashboard
2. Go to Online StoreThemes
3. Click ActionsEdit code on your active theme
4. Navigate to the `sections` folder

Step 2: Create the Comparison Chart Section


1. In the `sections` folder, click Add a new section
2. Name it `comparison-chart.liquid`
3. Copy and paste the following code:


<style>
  .product-comparison {
    width: 100%;
    {% comment %} height: 760px; {% endcomment %}
    background-color: #f8f8f8;
    padding: 40px 20px;
    box-sizing: border-box;
  }

  .comparison-container {
    width: 100%;
    max-width: 1400px;
    margin: 0 auto;
    background-color: white;
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
    {% comment %} height: 680px; {% endcomment %}
    height: 100%;
    display: flex;
    flex-direction: column;
  }

  .comparison-table {
    display: flex;
    flex-direction: column;
    height: 100%;
  }

  .table-header {
    display: flex;
    height: 200px;
    border-bottom: 2px solid #e5e5e5;
    flex-shrink: 0;
  }

  .header-spacer {
    flex: 0 0 200px;
    background-color: #f5f5f5;
    border-right: 2px solid #e5e5e5;
  }

  .product-column-header {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 20px 15px;
    border-right: 1px solid #e5e5e5;
    position: relative;
  }

  .product-column-header:last-child {
    border-right: none;
  }

  .product-column-header.selected {
    border-left: 3px solid #333;
    border-right: 3px solid #333;
    border-top: 3px solid #333;
  }

  .product-column-header.selected:first-child {
    border-left: 3px solid #333;
  }

  .product-column-header.selected:last-child {
    border-right: 3px solid #333;
  }

  .product-image {
    width: 120px;
    height: 90px;
    object-fit: contain;
    margin-bottom: 15px;
  }

  .product-name {
    font-size: 18px;
    font-weight: bold;
    color: #333;
    text-align: center;
  }

  .table-body {
    flex: 1;
    overflow-y: auto;
  }

  .spec-row {
    display: flex;
    min-height: 50px;
    border-bottom: 1px solid #e5e5e5;
  }

  .spec-row:nth-child(even) {
    background-color: #f9f9f9;
  }

  .spec-row:last-child {
    border-bottom: none;
  }

  .spec-label {
    flex: 0 0 200px;
    padding: 15px 20px;
    font-weight: 600;
    color: #333;
    background-color: #f5f5f5;
    border-right: 2px solid #e5e5e5;
    display: flex;
    align-items: center;
  }

  .spec-value {
    flex: 1;
    padding: 15px;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    color: #666;
    border-right: 1px solid #e5e5e5;
  }

  .spec-value:last-child {
    border-right: none;
  }

  .spec-value.selected {
    border-left: 3px solid #333;
    border-right: 3px solid #333;
  }

  .spec-value.selected:first-child {
    border-left: 3px solid #333;
  }

  .spec-value.selected:last-child {
    border-right: 3px solid #333;
  }

  .spec-row:last-child .spec-value.selected {
    border-bottom: 3px solid #333;
  }

  /* Mobile Styles */
  @media (max-width: 768px) {
    .product-comparison {
      height: auto;
      min-height: 600px;
      padding: 20px 10px;
    }
    
    .comparison-container {
      height: auto;
      overflow-x: auto;
    }
    
    .comparison-table {
      min-width: 800px;
    }
    
    .table-header {
      height: 180px;
    }
    
    .product-image {
      width: 80px;
      height: 60px;
    }
    
    .product-name {
      font-size: 14px;
    }
    
    .spec-label {
      flex: 0 0 150px;
      padding: 12px 15px;
      font-size: 14px;
    }
    
    .spec-value {
      padding: 12px 10px;
      font-size: 14px;
    }
    
    .spec-row {
      min-height: 45px;
    }
  }

  @media (max-width: 480px) {
    .product-comparison {
      padding: 15px 5px;
    }
    
    .comparison-table {
      min-width: 700px;
    }
    
    .table-header {
      height: 160px;
    }
    
    .product-image {
      width: 70px;
      height: 50px;
    }
    
    .product-name {
      font-size: 12px;
    }
    
    .spec-label {
      flex: 0 0 120px;
      padding: 10px 12px;
      font-size: 12px;
    }
    
    .spec-value {
      padding: 10px 8px;
      font-size: 12px;
    }
    
    .spec-row {
      min-height: 40px;
    }
  }
</style>

<section class="product-comparison">
  <div class="comparison-container">
    <div class="comparison-table">
      <!-- Header with product images and names -->
      <div class="table-header">
        <div class="header-spacer"></div>
        <div class="spec-label" style="visibility: hidden;">{{ section.settings.feature_1_label }}</div>
        {% for block in section.blocks %}
          <div class="product-column-header {% if block.settings.is_selected %}selected{% endif %}">
            {% if block.settings.product_image %}
              <img src="{{ block.settings.product_image | img_url: '120x90' }}" 
                   alt="{{ block.settings.product_name }}" 
                   class="product-image">
            {% endif %}
            <div class="product-name">{{ block.settings.product_name }}</div>
          </div>
        {% endfor %}
      </div>

      <!-- Specifications table body -->
      <div class="table-body">
        <!-- Feature 1 Row -->
        {% if section.settings.feature_1_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_1_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_1_value }}</div>
          {% endfor %}
        </div>
        {% endif %}

        <!-- Feature 2 Row -->
        {% if section.settings.feature_2_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_2_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_2_value }}</div>
          {% endfor %}
        </div>
        {% endif %}

        <!-- Feature 3 Row -->
        {% if section.settings.feature_3_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_3_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_3_value }}</div>
          {% endfor %}
        </div>
        {% endif %}

        <!-- Feature 4 Row -->
        {% if section.settings.feature_4_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_4_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_4_value }}</div>
          {% endfor %}
        </div>
        {% endif %}

        <!-- Feature 5 Row -->
        {% if section.settings.feature_5_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_5_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_5_value }}</div>
          {% endfor %}
        </div>
        {% endif %}

        <!-- Feature 6 Row -->
        {% if section.settings.feature_6_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_6_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_6_value }}</div>
          {% endfor %}
        </div>
        {% endif %}

        <!-- Feature 7 Row -->
        {% if section.settings.feature_7_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_7_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_7_value }}</div>
          {% endfor %}
        </div>
        {% endif %}

        <!-- Feature 8 Row -->
        {% if section.settings.feature_8_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_8_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_8_value }}</div>
          {% endfor %}
        </div>
        {% endif %}

        <!-- Feature 9 Row -->
        {% if section.settings.feature_9_label != blank %}
        <div class="spec-row">
          <div class="spec-label">{{ section.settings.feature_9_label }}</div>
          {% for block in section.blocks %}
            <div class="spec-value {% if block.settings.is_selected %}selected{% endif %}">{{ block.settings.feature_9_value }}</div>
          {% endfor %}
        </div>
        {% endif %}
      </div>
    </div>
  </div>
</section>

{% schema %}
{
  "name": "Product Comparison Chart",
  "settings": [
    {
      "type": "header",
      "content": "Feature Labels"
    },
    {
      "type": "text",
      "id": "feature_1_label",
      "label": "Feature 1 Label",
      "default": "Motor"
    },
    {
      "type": "text",
      "id": "feature_2_label",
      "label": "Feature 2 Label",
      "default": "Battery"
    },
    {
      "type": "text",
      "id": "feature_3_label",
      "label": "Feature 3 Label",
      "default": "Gears"
    },
    {
      "type": "text",
      "id": "feature_4_label",
      "label": "Feature 4 Label",
      "default": "Estimated Max Range"
    },
    {
      "type": "text",
      "id": "feature_5_label",
      "label": "Feature 5 Label",
      "default": "Speed"
    },
    {
      "type": "text",
      "id": "feature_6_label",
      "label": "Feature 6 Label",
      "default": "Suspension"
    },
    {
      "type": "text",
      "id": "feature_7_label",
      "label": "Feature 7 Label",
      "default": "Recommended Height Use"
    },
    {
      "type": "text",
      "id": "feature_8_label",
      "label": "Feature 8 Label",
      "default": "Brake"
    },
    {
      "type": "text",
      "id": "feature_9_label",
      "label": "Feature 9 Label",
      "default": "Max Load"
    }
  ],
  "blocks": [
    {
      "type": "product_model",
      "name": "Product",
      "settings": [
        {
          "type": "text",
          "id": "product_name",
          "label": "Product Name",
          "default": "Product Name"
        },
        {
          "type": "image_picker",
          "id": "product_image",
          "label": "Product Image"
        },
        {
          "type": "checkbox",
          "id": "is_selected",
          "label": "Highlight this column",
          "default": false
        },
        {
          "type": "text",
          "id": "feature_1_value",
          "label": "Feature 1 Value",
          "default": "Value 1"
        },
        {
          "type": "text",
          "id": "feature_2_value",
          "label": "Feature 2 Value",
          "default": "Value 2"
        },
        {
          "type": "text",
          "id": "feature_3_value",
          "label": "Feature 3 Value",
          "default": "Value 3"
        },
        {
          "type": "text",
          "id": "feature_4_value",
          "label": "Feature 4 Value",
          "default": "Value 4"
        },
        {
          "type": "text",
          "id": "feature_5_value",
          "label": "Feature 5 Value",
          "default": "Value 5"
        },
        {
          "type": "text",
          "id": "feature_6_value",
          "label": "Feature 6 Value",
          "default": "Value 6"
        },
        {
          "type": "text",
          "id": "feature_7_value",
          "label": "Feature 7 Value",
          "default": "Value 7"
        },
        {
          "type": "text",
          "id": "feature_8_value",
          "label": "Feature 8 Value",
          "default": "Value 8"
        },
        {
          "type": "text",
          "id": "feature_9_value",
          "label": "Feature 9 Value",
          "default": "Value 9"
        }
      ]
    }
  ],
  "presets": [
    {
      "name": "Product Comparison Chart",
      "settings": {
        "feature_1_label": "Motor",
        "feature_2_label": "Battery",
        "feature_3_label": "Gears",
        "feature_4_label": "Estimated Max Range",
        "feature_5_label": "Speed",
        "feature_6_label": "Suspension",
        "feature_7_label": "Recommended Height Use",
        "feature_8_label": "Brake",
        "feature_9_label": "Max Load"
      },
      "blocks": [
        {
          "type": "product_model",
          "settings": {
            "product_name": "S6",
            "feature_1_value": "2000W",
            "feature_2_value": "52V 50Ah",
            "feature_3_value": "Shimano 7 Gears",
            "feature_4_value": "140Miles",
            "feature_5_value": "32mph",
            "feature_6_value": "Dual",
            "feature_7_value": "5'5\" - 6'5\"",
            "feature_8_value": "Hydraulic disc brake",
            "feature_9_value": "330LBS"
          }
        },
        {
          "type": "product_model",
          "settings": {
            "product_name": "S8",
            "feature_1_value": "2*1000W",
            "feature_2_value": "48V 25Ah",
            "feature_3_value": "Shimano 7 Gears",
            "feature_4_value": "75Miles",
            "feature_5_value": "35mph",
            "feature_6_value": "Dual",
            "feature_7_value": "5'5\" - 6'5\"",
            "feature_8_value": "Hydraulic disc brake",
            "feature_9_value": "330LBS"
          }
        },
        {
          "type": "product_model",
          "settings": {
            "product_name": "V9-G60",
            "feature_1_value": "1000W",
            "feature_2_value": "48V 20Ah",
            "feature_3_value": "Shimano 7 Gears",
            "feature_4_value": "70Miles",
            "feature_5_value": "32mph",
            "feature_6_value": "Dual",
            "feature_7_value": "5'5\" - 6'5\"",
            "feature_8_value": "Mechanical disc brake",
            "feature_9_value": "330LBS",
            "is_selected": true
          }
        },
        {
          "type": "product_model",
          "settings": {
            "product_name": "EB26",
            "feature_1_value": "1000W",
            "feature_2_value": "48V 15Ah",
            "feature_3_value": "Shimano 7 Gears",
            "feature_4_value": "60Miles",
            "feature_5_value": "28mph",
            "feature_6_value": "Front",
            "feature_7_value": "5'5\" - 6'5\"",
            "feature_8_value": "Mechanical disc brake",
            "feature_9_value": "330LBS"
          }
        },
        {
          "type": "product_model",
          "settings": {
            "product_name": "ARES",
            "feature_1_value": "2000W",
            "feature_2_value": "52V 25AH",
            "feature_3_value": "Shimano 7 Gears",
            "feature_4_value": "80Miles",
            "feature_5_value": "32mph",
            "feature_6_value": "Dual",
            "feature_7_value": "5'5\" - 6'5\"",
            "feature_8_value": "Hydraulic disc brake",
            "feature_9_value": "330LBS"
          }
        }
      ]
    }
  ]
}
{% endschema %}

4. Click Save

Step 3: Add the Section to Your Page


1. Go to Online StoreProduct Template (or wherever you want to add the comparison chart)
2. Create a new page or edit an existing one
3. Click 'Add section'
4. Select 'Product Comparison Chart' from the list
5. Click 'Add'

Step 4: Customize Your Comparison Chart


Configure Feature Labels
In the section settings, you can customize up to 9 feature labels, for example:

- Motor
- Battery
- Gears
- Estimated Max Range
- Speed
- Suspension
- Recommended Height Use
- Brake
- Max Load

Add Products

1. Click 'Add block' → 'Product'
2. For each product, configure:
- 'Product Name': The name that will appear in the header
- 'Product Image': Upload or select an image (120x90px recommended)
- 'Highlight this column': Check this to add a border around the selected product
- 'Feature Values': Fill in the corresponding values for each feature

Step 5: Mobile Responsiveness


The comparison chart is fully responsive and includes:

- Desktop: Full-width table with all features visible
- Tablet (768px and below): Horizontal scroll with adjusted sizing
- Mobile (480px and below): Compact layout with smaller text and images

Conclusion

A well-designed product comparison chart can significantly improve your customers' shopping experience by helping them make informed decisions. This Shopify section provides a professional, mobile-responsive solution that you can easily customize for your specific products and features.

Remember to:
- Choose relevant features for your product category
- Use high-quality product images
- Highlight your best or most popular products
- Test thoroughly on mobile devices
- Keep the information accurate and up-to-date

With this comparison chart, you'll give your customers the tools they need to confidently choose the right product for their needs, potentially increasing your conversion rates and reducing returns.

Nick Drishinski

Nick Drishinski is a Senior Software Engineer with over 5 years of experience specializing in Shopify development. When not programming Nick is often creating development tutorials, blogs and courses or training for triathlons.