Markdown Ormuz
Ormuz Markdown is the content format used to compose readable, dynamic messages in processes: information shown to a user, waiting messages, redirects, approvals, and emails. It combines standard Markdown, process variables, and a few extensions dedicated to business content.
Vue d’ensemble
An Ormuz Markdown document is evaluated in two stages. Template blocks between {{ and }} are first replaced with values from execution context. The result is then interpreted and rendered as Markdown.
This separation keeps content easy to read in the editor while injecting an invoice reference, amount, date, node output, or process variable at runtime.
The same Markdown dialect is shared by web interfaces and email. Differences mainly concern URLs: email requires safe absolute links and images, while web surfaces may also use relative paths beginning with /.
Quick start
The following example combines headings, formatting, variables, a formatting function, highlighting, and an action button.
# Invoice {{ input.invoice.source_reference }}
Hello {{ input.company.legal_name }},
The amount of **{{ $format(input.invoice.amount_including_tax, "amount", { "currency": input.invoice.currency }) }}**
became due on =={{ input.invoice.due_date }}==.
:::cta
View invoice
https://app.example/invoices/{{ input.invoice.id }}
:::In the visual editor, type {{ to open the list of available variables. Suggestions depend on process inputs, declared variables, and outputs of nodes whose execution is guaranteed before the current node.
Supported Markdown syntax
Standard Markdown remains valid. Ormuz also supports GFM tables and several extensions described below.
| Element | Syntaxe | Usage |
|---|---|---|
| Title | # Title | Heading levels 1 through 4. |
| Gras | **important** | Highlights a passage. |
| Italique | *detail* | Adds light emphasis. |
| List | - Item | Bulleted or numbered list. |
| Citation | > Information | Quote or context block. |
| Code | `invoice.id` | Inline code or block surrounded by ```. |
| Link | [Ouvrir](https://example.com) | Clickable link when its URL is allowed. |
| Image |  | Image on compatible web surfaces. |
| Tableau | | Column | Value | | GitHub Flavored Markdown table. |
Tableau statique
| Reference | Amount | Status | |---|---:|---| | INV-2026-001 | EUR 1,250.00 | Overdue | | INV-2026-002 | EUR 480.00 | Due |
Colons in the separator row control column alignment: :--- left, :---: center, and
---: right.
Variables and expressions
A template block contains a simple path or JSONata expression. The four public roots are as follows.
| Racine | Contenu | Example |
|---|---|---|
input | Inputs received when the process starts. | {{ input.invoice.due_date }} |
nodes | Outputs of previous nodes, indexed by their identifier in the process. | {{ nodes.calculate_total.total }} |
vars | Process variables declared or updated during execution. | {{ vars.approver_name }} |
env | Merchant environment variables captured for the instance. | {{ env.payment_portal_url }} |
Preview and human formatting
In the Console, templates may preview known or representative scalar values from context, including node outputs. When the surface enables human formatting, Ormuz applies canonical formatters to amounts, dates, and other typed scalars so the preview resembles user-facing rendering without changing the underlying business value.
Chemins simples
Invoice: {{ input.invoice.source_reference }}
Customer: {{ input.company.legal_name }}
Payment: {{ nodes.create_payment.payment.id }}
Reviewer: {{ vars.approver_name }}Spaces around the expression are optional. Prefer a precise scalar property. When a complete object or array is inserted, it is serialized as JSON, which is rarely suitable for user-facing text.
Functions and transformations
Reminder due date: {{ $add_days(input.invoice.due_date, 7) }}
Display name: {{ $coalesce(input.company.trade_name, input.company.legal_name) }}
Amount: {{ $format(input.invoice.amount_including_tax, "amount", { "currency": input.invoice.currency }) }}Conditions, date calculations, aggregations, and available functions are detailed in Expressions. Public paths to use are input, nodes, vars
and env.
Extensions Ormuz
Surlignage
Wrap a passage in two equals signs to draw attention without turning the whole sentence into a heading or bold text.
The invoice is ==overdue== by 7 days.
Block alignment
::: align-center # Payment received Thank you, your payment has been recorded. :::
Accepted values are left, center,
right and justify. The block must be closed by a line containing only :::.
Bouton d’action
:::cta Open the payment portal https://app.example/payments/123 :::
The block contains a useful label followed by a URL. An absolute HTTPS URL is recommended so the button works across all surfaces, including email.
Tableau dynamique
The fonction $markdown_table turns an array of context objects into a Markdown table. It is especially suitable for invoice lines, due dates, payments, or check results.
{{ $markdown_table(
input.line_items,
[
{ "label": "Item", "path": "description" },
{ "label": "Quantity", "path": "quantity", "align": "right" },
{
"label": "Total",
"path": "amount_including_tax",
"format": { "key": "amount", "currency": input.invoice.currency }
}
]
) }}Links, images, and security
The
http:,https:, andmailto:links are allowed. Relative paths beginning with/are also accepted on web surfaces.Unsafe protocols such as
javascript:,data:orftp:are not rendered as clickable links.Raw HTML is not interpreted. Use Markdown syntax or documented extensions rather than HTML tags.
Images must use an allowed URL. In email, use an absolute HTTP(S) URL; the recipient's mail client may still block remote image loading.
An injected value is evaluated before Markdown rendering. Avoid inserting uncontrolled external text into a document when it must not be able to alter formatting. Prefer precise, validated business fields.
Surface compatibility
The Ormuz Markdown contract is shared, but each surface applies its own rendering constraints. The following table helps choose portable syntax.
| Fonction | User Journey | Console preview | |
|---|---|---|---|
| Headings, paragraphs, bold, italics, lists, and quotes | Yes | Yes | Yes |
| Code blocks and inline code | Yes | Yes | Yes |
| Tableaux GFM | Yes | Yes | Yes |
| Surlignage ==texte== | Yes | Yes | Yes |
| Alignement Ormuz | Yes | Yes | Yes |
| Bouton d’action Ormuz | Yes | Yes | Yes |
| Images | Yes | Yes | Yes, with a safe absolute URL |
| GFM strikethrough | Yes | Yes | Yes |
| Relative links /… | Yes | Yes | No |
| Version texte brut automatique | — | — | Yes |
For content reused across contexts, prefer heading levels 1–4, paragraphs, bold, italics, lists, quotes, code, tables, highlighting, alignment, and CTAs with an absolute HTTPS URL.

Recettes courantes
Overdue invoice alert
# Overdue invoice
Invoice **{{ input.invoice.source_reference }}** is
{{ $diff_days(input.invoice.due_date, $today()) }} day(s) overdue.
Invoice amount: **{{ $format(input.invoice.amount_including_tax, "amount", { "currency": input.invoice.currency }) }}**.
:::cta
View invoice
https://app.example/invoices/{{ input.invoice.id }}
:::Approval waiting message
## Your request is under review
We have received your case **{{ input.onboarding_case.id }}**.
> No action is required for now. You will be notified as soon as the decision is available.The node Display Markdown can present this type of content in a User Journey. Markdown fields of communication, approval, and redirect nodes use the same syntax, subject to the surface differences above.
Troubleshooting
| Symptom | Checks |
|---|---|
Autocomplete offers no variable after {{. | Check that the node has accessible inputs and that source nodes are guaranteed ancestors. An output that exists only on another branch is not suggested. |
| A value renders empty. | Check the path and actual instance context. A missing or null value renders as an empty string. |
| The CTA remains displayed as text. | Use exactly :::cta, then the label, URL, and closing ::: on separate lines. |
| A link is not clickable. | Check its protocol. Prefer an absolute HTTPS URL. |
| Email rendering differs from the preview. | Check URLs in particular: replace relative links and images with safe absolute HTTP(S) URLs and verify rendering in the target email client. |
| A table is malformed. | Add a separator row with at least three dashes per column and keep the same number of cells on every row. |