Having trouble?

{{ … }}

Email variables

Personalize the subject and message of your scheduled and recurring invoice emails with placeholders that resolve to real values — the send date, the billing period, the invoice number — at the moment each email goes out.

How to use them

  1. 1

    Open Save & Schedule on an invoice (or edit a recurring rule under Settings → Automations). Variables work in the email subject and the email message.

  2. 2

    Type {{ anywhere — an autocomplete dropdown appears with every variable. Keep typing to filter, then press Enter to insert. You can also write them by hand.

  3. 3

    A live preview appears under the field showing exactly how your text resolves. Anything that can't be resolved is highlighted so you can fix a typo before it sends.

  4. 4

    Hit Send test to email yourself the real thing — same template, same data, same rendering as the client's email.

Variable interpolation

A variable is a placeholder wrapped in double curly braces. When the email sends, each placeholder is replaced with the real value from the invoice — the client's name, the invoice number, the total. Type two opening braces in the subject or message and autocomplete lists everything available.

You write

Hello {{ client }}, invoice {{ invoice_number }} is attached.

It sends as

Hello Acme Co, invoice 2026-0074 is attached.

Dates and formatting

Date variables resolve at the moment the email sends. Add the date filter with a format string to control how they read, and shift them with add_days or add_months — useful for payment deadlines.

You write

Sent {{ today | date: "dddd, MMMM Do" }} — due {{ today | add_days: 14 | date: "MMM D, YYYY" }}.

It sends as

Sent Sunday, June 14th — due Jun 28, 2026.

Invoice number math

The add filter bumps the trailing number of your invoice number while keeping its prefix and zero-padding intact, and ordinal turns it into 1st / 2nd / 74th — handy for referencing this invoice or the next one in a series.

You write

Your {{ invoice_number | ordinal }} invoice ({{ invoice_number }}); the next is {{ invoice_number | add: 1 }}.

It sends as

Your 74th invoice (2026-0074); the next is 2026-0075.

Chaining filters

Filters run left to right, each transforming the result of the previous one. Here a date is shifted back a month, formatted, then upper-cased.

You write

{{ today | add_months: -1 | date: "MMMM YYYY" | upper }}

It sends as

MAY 2026

Putting it together

A recurring monthly invoice whose subject carries the invoice number as an ordinal and the billing window — written once, correct on every future send.

You write

{{ invoice_number | ordinal }} Monthly Invoice ({{ period_start | date: "MMM D, YYYY" }} – {{ period_end | date: "MMM D, YYYY" }})

It sends as

74th Monthly Invoice (May 14, 2026 – Jun 14, 2026)

Variables

Each variable resolves against the invoice being sent and the moment it sends.

VariableExample
{{ invoice_number }}2026-0074
{{ client }}Acme Co
{{ sender }}Jane Doe
{{ total }}$5,000.00
{{ doc_type }}Invoice
{{ today }}Jun 13, 2026
{{ tomorrow }}Jun 14, 2026
{{ yesterday }}Jun 12, 2026
{{ issue_date }}Jun 13, 2026
{{ due_date }}Jun 30, 2026
{{ period_start }}May 14, 2026
{{ period_end }}Jun 13, 2026

Filters

Filters transform a value — chain them after a variable with the | character. Date formats use tokens: YYYY (2026), MMMM (June), MMM (Jun), MM (06), DD (13), D (13), Do (13th), dddd (Saturday).

FilterExample
| date: "MMMM D, YYYY"June 13, 2026
| add: 12026-0075
| add_days: 7Jun 20, 2026
| add_months: -1May 13, 2026
| ordinal2026-0074 → 74th
| truncate: 20BitterBrains Intern…
| capitalizeJune

Good to know

  • Anything unknown is sent exactly as written — a typo like {{ cliennt }} stays visible instead of silently disappearing. The preview flags these in amber.
  • period_start / period_end use the rule's real cadence window; on one-off sends they default to the month ending at the send.
  • If the invoice is in Spanish, month and weekday names render in Spanish (junio, sábado) with day-first dates.
  • Dates like {{ today }} resolve in your timezone — captured when you schedule — so a late-night send doesn't drift to the wrong day.