# Discourse Workflows

**URL:** https://meta.discourse.org/t/discourse-workflows/407100
**Category:** Plugin
**Tags:** official, included-in-core, workflows
**Created:** [July 13, 2026, 1:54am UTC](https://meta.discourse.org/t/discourse-workflows/407100 "2026-07-13T01:54:16Z")
**Posts on this page:** 1
**Showing post:** 59

<div class="post-metadata">

### Author: ![Ethsim2](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ethsim2/32/522255_2.png) [@Ethsim2](https://meta.discourse.org/u/Ethsim2)
#### Post date: [September 12, 2026, 8:39am UTC](https://meta.discourse.org/t/discourse-workflows/407100/59 "2026-09-12T08:39:00Z")

</div>

> [@Lou](#):
>
> what templating language is used?

It appears to be **Discourse Workflows’ own JavaScript expression system** , evaluated server-side in a sandbox rather than a separate templating language such as Liquid or Handlebars.

So, for example:

```plaintext
={{ $json.topic.title.toLowerCase() }}

```

works because the contents of `{{ ... }}` are evaluated as JavaScript, and `toLowerCase()` is the normal JavaScript string method.

The implementation is in `plugins/discourse-workflows/lib/discourse_workflows/expression_resolver.rb`; it exposes workflow-specific globals such as `$json`, `$input`, `$itemIndex`, `$trigger`, `$execution`, and `$()`.

The syntax and concepts are quite n8n-like. There is actually an explicit n8n reference elsewhere in the Workflows source:

the oneboxed commit below added the merge-node combine behavior and includes a test described as:

> `defaults clash handling to add_suffix (matches n8n position combine)`

> <https://github.com/discourse/discourse/commit/bc639cad0f743ae39f86775a8882fdff1e5af55a>
>
> In discourse workflows you can now choose the combine operation on the
> merge nod…e. This operation will allow you to transform multiple items
> into one, useful for gathering multiple reports for example.

So there is evidence that parts of Workflows deliberately match n8n behavior, although I couldn’t find anything explicitly saying that the **expression language itself** is copied from or based on n8n. I’d therefore describe it as **sandboxed JavaScript expressions provided by Discourse Workflows** , with some n8n-like conventions.

---

_[View the full topic](https://meta.discourse.org/t/discourse-workflows/407100)._
