Tags & Filters Reference
Complete reference of every dynamic tag (by context) and filter pipe available.
Complete reference of every dynamic tag and filter pipe available. This list stays in sync with the picker UI and MCP server — what appears here is what actually works.
Part A — Dynamic Tags
1. Product Context
Resolves in single_product and single_bundle templates. Most also resolve inside a Query Loop whose data source iterates products — the tag binds to the current row.
| Tag | Description | Kind | Sample | Suggested Filter |
|---|---|---|---|---|
{product_title} | Product name. | string | Cotton T-Shirt | — |
{product_price} | Pre-formatted price. Deprecated — use _raw + |currency. | string | Rp 250.000 | — |
{product_price_raw} | Raw price as a number. | number | 250000 | currency |
{product_sale_price_raw} | Active sale price (empty when no sale). | number | 199000 | currency |
{product_original_price_raw} | Pre-sale price — good for strikethrough. | number | 250000 | currency |
{product_description} | Sanitized HTML description. | html | <p>Long...</p> | — |
{product_image} | Featured image URL. | image | media.alus.io/... | image_url:cardMedium |
{product_gallery_images} | JSON array of gallery URLs (consumed by productImageGallery). Page-level only — not exposed inside Query Loop. | json | ["..."] | — |
{product_sku} | First variant SKU (empty when no variants). Page-level only. | string | SKU-001 | — |
{product_url} | Canonical URL of the product page. | url | /product/cotton-t-shirt | — |
{product_sale_ends_at} | ISO 8601 sale end timestamp. Page-level only. | date | 2026-05-27T00:00:00Z | date:long |
{product_in_stock} | "true" / "false". Page-level only. | boolean | true | — |
{product_stock_status} | Readable stock label. Page-level only. | string | In stock | — |
2. Post Context
Resolves in single_post templates and inside a Query Loop iterating posts.
| Tag | Description | Kind | Sample | Suggested Filter |
|---|---|---|---|---|
{post_title} | Post title. | string | Hello World | — |
{post_content} | Sanitized HTML body. | html | <p>...</p> | — |
{post_excerpt} | Short summary of the post. | string | Brief summary... | — |
{post_author} | Author display name. | string | Author Name | — |
{post_date} | Publish date. | date | May 5, 2026 | date:long |
{post_category} | Primary category. | string | News | — |
{post_featured_image} | Featured image URL. | image | media.alus.io/... | image_url:cardWide |
{post_url} | Canonical URL of the post detail page. | url | /blog/hello-world | — |
3. Page Context
Resolves in single_page templates only — page tags are not exposed inside Query Loop.
| Tag | Description | Kind | Sample | Suggested Filter |
|---|---|---|---|---|
{page_title} | Page title. | string | About Us | — |
{page_content} | Sanitized HTML body. | html | <p>...</p> | — |
{page_featured_image} | Hero image URL. | image | media.alus.io/... | image_url:hero |
4. Course Context
Resolves in single_course templates and inside a Query Loop iterating courses.
| Tag | Description | Kind | Sample | Suggested Filter |
|---|---|---|---|---|
{course_title} | Course name. | string | Learn React from Scratch | — |
{course_description} | Sanitized HTML description. | html | <p>...</p> | — |
{course_image} | Thumbnail URL. | image | media.alus.io/... | image_url:cardWide |
{course_instructor} | Instructor name. | string | Instructor Name | — |
{course_price_raw} | Raw price as a number. | number | 500000 | currency |
{course_url} | Canonical URL of the course detail page. | url | /course/learn-react-from-scratch | — |
5. Archive Context
Resolves in post_archive, shop_catalog, and course_archive templates.
{product_*} / {post_*} / {course_*}).
| Tag | Description | Kind | Sample |
|---|---|---|---|
{archive_title} | Archive title (category / catalog). | string | All Products |
{archive_description} | Archive description. | html | <p>Browse...</p> |
{post_count} | Items in the archive (post archive only). | number | 12 |
6. Loop Context — Inside a Query Loop
When an element has queryLoop.enabled = true, its descendants render once per query row. The regular entity tags resolve against the current row — a postQuery loop sees {post_*}, a product loop sees {product_*}, a course loop sees {course_*}.
In addition, loop metadata tags keep the double-brace syntax because they have no entity-level equivalent:
| Tag | Description | Kind | Sample |
|---|---|---|---|
{{loop.index}} | 0-based index of the current iteration. | number | 0 |
{{loop.number}} | 1-based index (friendlier for display). | number | 1 |
{{loop.count}} | Total items in the loop. | number | 12 |
{{loop.first}} | "true" on the first iteration, else "false". Useful in Display Conditions. | boolean | true |
{{loop.last}} | "true" on the final iteration, else "false". | boolean | false |
7. Global Context
Resolves in ALL contexts — always available regardless of template type.
| Tag | Description | Kind | Sample | Suggested Filter |
|---|---|---|---|---|
{site_name} | Site name from Settings. | string | Acme Store | — |
{site_tagline} | Site tagline from Settings. | string | Endless Possibilities | — |
{site_logo} | Site logo URL. | image | media.alus.io/sites/1/logo.png | image_url:logo |
{site_year} | Four-digit current year. | string | 2026 | — |
{cart_count} | Cart item count (placeholder, no runtime yet). | number | 3 | — |
{cart_total} | Pre-formatted cart total (placeholder, no runtime yet). | string | Rp 750.000 | — |
Part B — Filters & Pipe Syntax
Syntax
{tag|filter1:arg1:arg2|filter2}
The pipe (|) chain runs left-to-right. Arguments are separated by :. Arguments with spaces must be quoted:
{post_author|default:"No author"}
The 9 Filters
| Filter | Description | Args | Example | Applies To |
|---|---|---|---|---|
currency |
Format a raw number as currency (uses site settings). | currency (ISO code, optional) |
{product_price_raw|currency}→ Rp 250.000 |
number, string |
truncate |
Strip HTML + truncate to N characters + add ellipsis. | length (number) |
{product_description|truncate:120} |
string, html |
image_url |
Apply a preset transformation (resize/crop). Pass-through when transforms disabled. | preset |
{product_image|image_url:cardMedium} |
image, url |
date |
Format an ISO date. | format (optional, default long) |
{post_date|date:long}→ May 5, 2026 |
date, string |
default |
Fallback string when the tag value is empty. | fallback (string literal) |
{post_author|default:"Anonymous"} |
all kinds |
upper | UPPERCASE. | — | {product_title|upper} | string |
lower | lowercase. | — | {product_title|lower} | string |
strip_html | Remove all HTML tags. | — | {product_description|strip_html} | html, string |
raw | Explicit pass-through (overrides suggested filter). | — | {product_price_raw|raw}→ 250000 | all kinds |
Presets for image_url
Valid preset names (from IMAGE_PRESETS): thumbnail, cardMedium, cardWide, productMain, hero, avatar, logo, invoice.
Presets for date
Valid preset names: long (May 5, 2026), short (5/5/2026), iso, year, month, day, time.
Chaining Filters
Filters can be chained — execution is left-to-right:
{product_description|strip_html|truncate:120}
→ Strip HTML first, then truncate to 120 characters.