How variables work
Template variables use double curly braces:{{ variable.path }}. When an email is sent, each variable is replaced with the actual value from the transaction.
Variables are grouped by scope: each email type has access to different scopes depending on the data available at send time.
Conditions and loops
Show a block only when a value is set with@if(...) / @else / @endif, and repeat a block per order line with @each(product in products) / @endeach (@foreach / @endforeach work too):
{{ purchase.customer_first_name }}. Values fill in when the email is sent, or when you send a test. An @elseif shows as an If block inside the Else block of the one before it.
Brand variables (all emails)
Every email template has access to these brand-level variables:Purchase variables
Available in: purchase, refund, shipped, cancelled, renewal-success, renewal-failed, pre-renewal, subscription-paused, subscription-canceled, payment-method-expiring, dunning-final.Shipping / billing address fields
Gift order fields
Orders where the buyer sent bonuses to a friend carry these fields. The default order and shipped emails use them.Product variables (inside @each)
Available inside @each(product in products) loops:
Subscription variables
Available in subscription-related emails (renewal-success, renewal-failed, pre-renewal, subscription-paused, subscription-canceled, payment-method-expiring, dunning-final):Course variables
Available in course enrollment, course magic link, and course comment notification emails:Login variables
Available in member login verification code and magic link emails:Refund request variables
Available in the refund request received email: Usespurchase.* variables (see above) plus brand.support_email and brand.support_phone.