Migration Guide
Moving from Liquid to Quill, with a comparison of syntax and available features.
If you have worked with Liquid before, you will feel at home with Quill. The syntax is the same. The tag names are the same. The filter names are the same. This guide covers the differences so you know what to expect.
What stays the same
Almost everything. Quill uses Liquid syntax, so your existing knowledge transfers directly:
- Output tags:
{{ variable }} - Logic tags:
{% if %},{% for %},{% case %} - Filters:
| upcase,| money,| date - Whitespace control:
{%- -%}and{{- -}} - Comments:
{% comment %}...{% endcomment %} - Variable assignment:
{% assign %},{% capture %} - Looping:
{% for %}withforloopvariables - Includes:
{% render %}withwith,for, and named arguments
If you can write Liquid, you can write Quill.
What is different
Context objects
The main difference is in the data objects available to your templates. Quill uses its own names for some objects:
| Liquid (other platforms) | Quill | Notes |
|---|---|---|
shop | store | Same data, different name |
shop.money_format | Handled by money filter | No format string needed |
article | page | Blog articles map to pages |
linklist | linklists or menus | Both names work |
Product, collection, cart, and customer objects use the same names and the same properties.
Media filters
Image handling uses the QUANTM7 CDN instead of third-party image services:
{{ product.featured_image | img_url: '400x400' }}The syntax is the same. The output URL points to the QUANTM7 CDN. Image resizing happens on the fly.
The image_tag filter generates a full <img> element with srcset, sizes, and lazy loading built in. This is more complete than what most Liquid platforms offer.
Money filters
Money filters read your store's currency settings. Prices are stored in the smallest currency unit (pence, cents). The money filter handles the conversion and formatting.
Multi-currency support is built in. When a visitor picks a different currency, the money filter uses the converted value and the correct symbol. No extra code is needed.
Section schema
The section schema system is similar to other Liquid platforms. The setting types are the same. The visual editor reads the schema and builds the settings form.
One addition: Quill supports the product_list type for selecting multiple products at once:
{ "type": "product_list", "id": "products", "label": "Featured products" }Translation
The t filter works the same way. Locale files use the same JSON format with nested keys:
{{ 'product.add_to_cart' | t }}Quill supports variable interpolation in translations:
{ "cart.item_count": "{{ count }} items in your cart" }{{ 'cart.item_count' | t: count: cart.item_count }}Features not in Quill
A few features from other Liquid platforms are not available yet:
- Metaobjects as standalone template types (metafields on products, collections, and customers work normally)
- Section rendering API for loading sections via AJAX
- Predictive search API (handled through the platform's own search system)
These may be added in future releases.
Migrating a template
To move a template from another platform to Quill:
- Copy the template code. The Quill tags and filters are the same.
- Replace
shopwithstoreif used. - Check image URLs. Replace any platform-specific image CDN helpers with
img_urlandimage_tag. - Test the
moneyfilter. Prices in Quill are in the smallest unit, so confirm the values are correct. - Update any platform-specific includes (like
content_for_index) with the Quill equivalents. - Move locale files to
locales/and confirm the keys match yourtfilter calls.
Most templates will work with minimal changes. The biggest adjustment is usually image handling and money formatting.