Orbit web apps
Orbit web apps
Generate Braze Liquid snippets for dates, text transforms, math, and control flow.
Need to compose a full template with multiple variables? Open the Liquid Logic Builder. Drag blocks, chain filters, render live.
Displays the full month name, day number, and four-digit year. Best for formal communications like receipts or account summaries.
{{ ${subscription_end_date} | date: "%B %d, %Y" }}Braze Liquid is the templating language that turns every static email, push, and SMS into a personalized message. Dates, text transforms, math, and if/else control flow are the four primitives you'll use every week — and the four places most lifecycle programs have silent bugs in production.
Every personalized field you render in a Braze campaign — a first name, a subscription end date, a loyalty points balance, a conditionally-shown paragraph — runs through Liquid at send time. Braze's Liquid is a superset of the open-source Shopify Liquid library with added Braze-specific tags like {% connected_content %} and {% abort_message %}.
When a Liquid expression fails, Braze either renders the fallback (if you specified one with | default) or sends the raw {{ ${attribute} }} text directly to the user. Missing defaults are the single most common production bug in lifecycle programs — 'Hi {{${first_name}}}' reaches inboxes more often than most teams realise.
Braze Liquid date formatting follows the same syntax as strftime: %B for full month name, %b for abbreviated month, %d for day-of-month, %Y for four-digit year, %H/%M for 24-hour time, %l/%M %p for 12-hour. To format a Braze datetime attribute: {{ ${renewal_date} | date: '%B %d, %Y' }}. Always pair with | default for empty values.
Two gotchas: dates stored as epoch integers need | date: '%s' treatment differently than ISO strings. And time zones default to UTC unless you explicitly convert — {{ ${renewal_date} | date: '%B %d, %Y', 'Australia/Sydney' }} is the pattern for per-user-timezone rendering in Braze.
The most-used text filters: | capitalize (first letter uppercase, rest unchanged), | upcase (all uppercase — use sparingly, reads as shouting), | downcase (all lowercase — useful as a normalization step before capitalize for clean title-casing), | truncate: 80 (hard character limit with ellipsis, useful for subject lines), | truncatewords: 5 (word-aware truncation that won't break mid-word), | strip (removes leading/trailing whitespace — always run this on user-entered data before any other filter).
Filters chain left-to-right: {{ ${first_name} | strip | downcase | capitalize | default: 'there' }} cleans whitespace, normalizes case, title-cases the first letter, and falls back to 'there' if the whole thing evaluates to blank. This chain is worth memorizing — it's the safest way to greet a user by name.
Math filters (| plus, | minus, | times, | divided_by, | round, | ceil, | floor, | modulo) are how you compute points balances, remaining days in a trial, tier thresholds, and loyalty multipliers in-message. These evaluate at send time so they always reflect the latest attribute values.
For control flow, {% if %} / {% elsif %} / {% else %} / {% endif %} let you branch on attribute values. {% abort_message 'no first name' %} cancels the entire send if a required field is missing — always better than sending 'Hi ,' to 50,000 people. And {% assign %} lets you build reusable variables mid-template, which keeps complex personalization logic readable instead of nesting filters six deep.
Built into Orbit
Orbit's Liquid linter catches the four most common production bugs: missing | default fallbacks, undeclared attribute references, unterminated control flow blocks, and date format strings that don't match Braze's strftime implementation. It runs on every template Orbit generates.
Sign up freeGo deeper
The long-form guides that explain the thinking behind the tool. Written for operators who want to know not just what to do, but why.
craft · 11 min read
Liquid for lifecycle marketers — the complete Braze reference
Every personalised field in every Braze message runs through Liquid. Get it right and personalisation quietly improves every send. Get it wrong and 50,000 people see 'Hi {{${first_name}}}'. This reference covers the syntax and the production habits that stop that happening.
programs · 7 min read
Progressive profiling: asking users for data without scaring them off
Progressive profiling means collecting user data over time in small, contextual prompts instead of one giant signup form. Done well, it transforms personalisation data quality. Done badly, it's irritating surveillance with extra steps.
craft · 7 min read
Custom attributes: the data design that decides what your program can do
Custom attributes are infrastructure. Designed well, they enable every future campaign. Designed badly, they become the reason "can we segment on X?" is a multi-week engineering project instead of a 15-minute one. Here's the design discipline that prevents the mess.
A free Braze Liquid cheatsheet and code generator. Build Liquid snippets for date formatting, text transforms (capitalize, upcase, truncate), math operations, and control flow (if/else, case) with plain-English descriptions. Copy-paste ready.
Braze users who write Liquid personalization: lifecycle marketers, CRM managers, and email developers.
Using Claude?
Inside Orbit for Claude, Liquid is built into every email, push, and Content Block Claude generates. It validates attributes against your actual Braze workspace before they ship, adds sensible fallbacks, and warns when logic will break on edge cases. No more broken {{first_name}} in production. Free for everyone — the Claude extension is the power-user upgrade, not a gated feature.