I am wanting a container to hold a set of product features icons… I have seen this on several sites and do not know if it is coded or an app. I tried several badge apps and they are not correct. The icons should be assigned on the products information page (metadata) that then loads only the one assigned on any give product page. They also have tool tips over if possible… Can anyone point me in the right direction on how to make this feature happen ![]()
HI @TRR-Brad
Welcome to the community.
Yes, that is possible with custom code. Have you already defined metadata?
Hi @TRR-Brad , the badges content could come from Metaobjects in your store, which you would then associate to each product through a Metafield. As for the badge block itself, that’s something you’d have to add to Horizon as there isn’t one built-in that has tooltips.
HI @TRR-Brad
Which theme are you using? Normally, you can add a block with metafields to make the content dynamic.
If you’re using the Horizon theme, you can add a Group block, then add an image and connect it to a metafield.
Please check the image for more details.
If you have any difficulties setting up the block or creating this feature on your store, feel free to DM me. I’m happy to help, and I don’t charge any fee.
Hey there @TRR-Brad!
You don’t need an app for this. Badge apps are mostly global or rule-based (sale, new, best seller). They’re not designed for per-product feature icons driven by metafields, which is what you want.
The cleanest and most scalable solution is product metafields + a custom Liquid section in your Horizon theme. It’s flexible, fast, and exactly how larger stores handle feature icons like these.
If interested, I have a helpful YouTube video you can watch that walks through how to use custom fields (metafields) in Shopify: https://youtu.be/cnMwbpJzlQM?si=VwMgMpLhzCautGCn
Hope this helps you out! ![]()
Have you tried asking Shopify AI sidekick to “Generate” you a block you want?
It’s pretty good at doing things like this, maybe the icons would need to be changed…
Hi @TRR-Brad
Use Product Metafields + a small Liquid snippet
This is how premium themes and large stores do it.
Step 1: Create product metafields (Admin)
Go to Settings → Custom data → Products → Add definition
Create one of these two structures (pick ONE):
Option A: Boolean metafields (simplest)
Create one metafield per feature:
| Name | Namespace & key | Type |
|---|---|---|
| Free Shipping | features.free_shipping |
Boolean |
| Eco Friendly | features.eco |
Boolean |
| Handmade | features.handmade |
Boolean |
| Warranty | features.warranty |
Boolean |
You’ll then just toggle ON/OFF per product.
Option B: List of values (more flexible)
Create:
- Name: Product Features
- Namespace & key:
features.list - Type: List of single-line text
Example values per product:
free_shipping
eco
handmade
warranty
(This is better if you expect to add more features later.)
Step 2: Add icons (theme files)
Upload your icons to:
Content → Files
(or theme assets)
Example:
icon-free-shipping.svg
icon-eco.svg
icon-handmade.svg
icon-warranty.svg
Step 3: Add the container to the product page
In your product template (main-product.liquid or similar), add:
{% if product.metafields.features.list != blank %}
<div class="product-features">
{% for feature in product.metafields.features.list %}
<div class="product-feature" data-tooltip="{{ feature | replace: '_', ' ' }}">
<img
src="{{ 'icon-' | append: feature | append: '.svg' | file_url }}"
alt="{{ feature | replace: '_', ' ' }}">
</div>
{% endfor %}
</div>
{% endif %}
Step 4: Tooltip + styling (CSS)
.product-features {
display: flex;
gap: 14px;
margin-top: 16px;
}
.product-feature {
position: relative;
}
.product-feature img {
width: 36px;
height: 36px;
}
.product-feature::after {
content: attr(data-tooltip);
position: absolute;
bottom: -32px;
left: 50%;
transform: translateX(-50%);
background: #111;
color: #fff;
font-size: 12px;
padding: 4px 8px;
border-radius: 6px;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.2s ease;
}
.product-feature:hover::after {
opacity: 1;
}
Best regards,
Devcoder ![]()

