With over 240 Shopify themes available, choosing the best theme to build on as a developer can be tricky. This article judges some of the themes we've worked with in the last year so you can better understand their features, performance, pitfalls, and level of support.
Prestige
Cost: $400
Customer reviews: 91% positive
In September 2025, we launched Gladstone / Hellen onto their first e-commerce store using the Prestige theme.
The Prestige theme fully utilises the Shopify 'color scheme' system out of the box, saving you a lot work if you need to build a store which gives its merchant as much power as possible to customise the design of their store.
Changing the whole colour scheme of a section becomes a simple dropdown, while ensuring consistency across the whole store.
Prestige goes so far with empowering its merchants that trying to modify its network of variables can feel a bit overwhelming as developer.
Fortunately, that doesn't last long. It's consistent in converting the colours in its theme settings to CSS variables as RGB values, unlike other themes where you often have to double check whether as a variable has been saved as RGB, hex, or both.
It uses the full range of Shopify colour filters to cut corners where it can. Below is an example in its css-variables.liquid file where it automatically sets the sale badge's text to white or grey depending on the colour brightness of the theme setting's accent colour.
{%- assign product_on_sale_accent_brightness = settings.product_on_sale_accent | color_brightness -%}
--on-sale-badge-text: {% if product_on_sale_accent_brightness < 150 %}255 255 255{% else %}0 0 0 / 0.85{% endif %};Maestrooo's website documentation for Prestige is pretty thorough, including:
and theme basics to pass on to your merchant.
{{ Talk about it still using css.liquid }}
{{ Test how performant the demo store is }}
{{ Talk about the quantity of documentation/code comments }}
Habitat
Cost: $320
Customer reviews: 94% positive
With three of our partnership stores running on Habitat (Including the newly launched Hilton Herbs store), it's been the theme we've worked with the most in the last year.
{{ Test how performant the demo store is }}
{{ Talk about the quantity of documentation/code comments }}
Fuel Themes' website documentation for Habitat has 51 articles.
One points deduction for Habitat is it has a filter bug that remains in its latest version (7.0.0 as of time of writing).
The issue will happen on any store which has products which don't have a value set for a filter. Say if you have a product filter for the metafield 'Vegan', but you've only applied the value 'Yes' to products which are vegan, and haven't applied the value 'No' to products which aren't.
If filter A is applied which happens to narrow products down to those which don't have a value for a filter B, the Habitat Liquid correctly won't render filter B. But currently the Habitat JS doesn't try and de-render or re-render filter B when filter A is applied or removed, it just tries to swap around the HTML for the filters it expects to be there. This leads to duplicate filter UI showing, broken filter UI not being removed, and JS crashes when it tries to update HTML for filter UI that isn't in the DOM.
We've sent over the JavaScript we wrote to fix this issue to the theme support so hopefully this will be fixed in future releases, but definitely worth double checking if it is happening to any stores where you have Habitat installed.
Symmetry
Cost: $380
Customer reviews: 95% positive
Our Bristol Blue Glass theme refresh will be launching on the latest version of Symmetry next month.
Symmetry has a handy 'Custom option' product template block which gives clients an easy way of adding inputs for line item properties without getting their hands dirty with code.
Symmetry is particularly good with documentation within its files, below is the intro to its breadcrumbs.liquid file.
{%- comment -%}
Parameters:
- show_collection_listing_link {boolean} [optional] - Whether to show the collections list link. Default is false.
- show_next_prev {boolean} [optional] - Whether to show next/previous product links (product template). Default is false.
- show_rss_link {boolean} [optional] - Whether to show an rss link (blog template). Default is false.
- divider {string} [optional] - Markup to use for the divider.
- prev_icon {string} [optional] - Markup to use for the previous (product) button.
- next_icon {string} [optional] - Markup to use for the next (product) button.
Example usage:
{%- capture divider -%}
<span class="feather-icon">{% render 'feather-chevron-right' %}</span>
{%- endcapture -%}
{% render 'breadcrumbs', divider: divider, show_next_prev: true %}
{%- endcomment -%}One thing to keep in mind when working with Symmetry is that it isn't afraid to use negative margins when positioning elements. While maybe not as objectively bad practice as some would say, negative margins can catch you out if you aren't expecting them and a <div> feels like it learned how to position itself from Microsoft Word.
Clean Canvas' website documentation for Symmetry is easy to navigate, with a particularly handy Technical guides section.
{{ Test how performant the demo store is }}
{{ Talk about the quantity of code comments }}
Impulse
Cost: $400
Customer reviews: 95% positive
In March 2025, we updated Shibumi onto the latest version of Impulse along with a cosmetic refresh.
While very well reviewed, Impulse felt the less initiative of the themes we've worked with in the last year.
It's commonly used grid CSS class isn't actually a grid, but instead uses float and width to position its children.
This was a problem for us when we wanted to make each of our product card child elements (Image, title, price, reviews) the same height across all the row of product cards via a subgrid.
Although if you're targeting an audience that is more likely to be using legacy browsers, maybe you might see its use of float as a plus. As of writing, CSS grid is supported for 97.21% of users.
{{ Talk about it still using css.liquid }}
{{ Test how performant the demo store is }}
{{ In-file comments are pretty minimal, some introduction liquid and some JS comments }}
Impulse does have a nifty way of merging blocks together like the size guide and variant picker in the product template.
Before it starts rendering anything in its product template, it creates a boolean at the start of its template. If the 'A' block is positioned next to the 'B' block, it sets that boolean to true. Then using that boolean it can avoid rendering 'A' on it's own and instead render it inside of the 'B' block.
As shown above, when the "Men's Size Chart' block can be positioned on its own, it seamlessly snaps into the 'Variant picker' block when positioned above it.
Another clever shortcut Impulse utilises is storing all the main translation strings in a theme.strings property in its theme.liquid file. While it takes some maintaining when adding or removing translations, it makes obtaining the translations in JavaScript very easy. {{Also happens for Habitat, need to check other themes }}
Archetype theme's website documentation for Impulse is one of the weaker we've covered due to being lighter on content and featuring some blank articles.
Each of these theme are diligent about keeping their release notes up to date on their theme store page, which is handy for keeping up with the possible features and fixes you might want to incorporate into your store.