# Liquid template tester

Updated 2026-10-22. Free tool, no account: https://notifly.io/tools/liquid-template-tester

Write a notification template in Liquid, the syntax Notifly workflows use for {{ payload.orderId }} and friends, give it a sample payload and subscriber, and see the text it renders to, or the error that stops it. It runs in your browser on the same engine settings Notifly renders with.

Standard Liquid tags and filters work (if, for, assign, default, date, upcase, truncate...), plus Notifly's own filters: digest and toSentence for lists such as "Grace, Linus and 2 others", pluralize for "3 comments", and json for printing an object. The same safety limits apply as in a workflow: a template that runs too long or builds too much text stops with an error instead of hanging.

## How to use it

1. **Write the template.** A subject, SMS or push text with {{ }} variables and {% %} tags.
2. **Give it data.** The variables as JSON: payload from the trigger, subscriber attributes, and any context.
3. **Read the output.** The rendered text updates as you type; a syntax error or unknown filter says where it is.

## Where Notifly uses this

- [Workflows: steps, content and variables](https://notifly.io/docs/workflows)
- [Payload schema: the payload variables a template reads](https://notifly.io/docs/payload-schema)
- [Subscribers: the subscriber attributes a template reads](https://notifly.io/docs/subscribers)

## Use it from code, no key

`POST https://notifly.io/api/tools/render-template` answers JSON, or Markdown with `Accept: text/markdown`. OpenAPI: https://notifly.io/api/tools/openapi.json.

```bash
curl -s https://notifly.io/api/tools/render-template \
  -H "Content-Type: application/json" \
  -d '{"template":"Hi {{ subscriber.firstName }}, order {{ payload.orderId }} shipped.","variables":{"subscriber":{"firstName":"Ada"},"payload":{"orderId":"1042"}}}'
```

## Frequently asked questions

### What is Liquid?

A template language created by Shopify: {{ }} prints a value and {% %} runs logic such as if and for, with filters after a pipe ({{ name | upcase }}). Notifly renders workflow content with it, so the same template works in email, SMS, push, chat and in-app steps.

### What does the digest filter do?

It turns a list into a short sentence: {{ payload.actors | digest: 2, 'name' }} prints "Grace, Linus and 2 others". The first argument is how many names to show, the second the property to read from each item, and an optional third replaces the comma.

### Why did my template stop with a limit error?

Notifly bounds every render: the template's size, the time a render may take, and how much text it may build. A loop over a huge range or a string doubled in a loop hits a limit and fails with an error, here as in a workflow, rather than slowing everything down.

### Can I include another template?

No. include, render and layout read templates from files, and neither Notifly workflows nor this tester have template files to read, so those tags fail.
