Skip to content

Personal text

Personal text fills in details about the customer when their page loads: their first name, how many orders they’ve placed, their store credit, the order they’re looking at. Put a value between double curly brackets, {{ }}, in almost any text, button label or link of an account block. Everything else shows as written.

Welcome back, {{ firstName || "there" }}! You've placed {{ ordersCount }} orders with us.

In the block editor, many blocks list the most common values under their text fields, with an All variables link to this page.

The part between the brackets is a small piece of JavaScript, so you can do math, compare values and choose between texts:

{{ storeCredit > 0 ? "You have " + toMoney(storeCredit) + " to spend." : "Earn store credit with every review." }}
  • Fallbacks: {{ firstName || "there" }} shows “there” when the customer has no first name.
  • Names are case-sensitive: ordersCount, not orderscount.
  • What prints: numbers print as plain numbers (49.5), so wrap money in toMoney. Lists, such as tags, print with commas between items. Values that don’t exist, and true or false, print as nothing.
  • A broken expression shows nothing. If an expression has a mistake, such as a typo in a name or a missing quote, that expression is left blank and the rest of the text still shows.
Variable What it holds Example
firstName The customer’s first name Jane
lastName Their last name Cooper
fullName Their full name Jane Cooper
email Their email address jane@example.com
tags Their customer tags, as a list vip, newsletter
memberSince The date their account was created Mar 3, 2024
Variable What it holds Example
ordersCount Their number of orders that weren’t cancelled 4
totalSpent The total of those orders, as a number, in the currency of their latest order. Orders paid in another currency are converted. Use toMoney(totalSpent). 320
lastOrderDate The date of their latest order that wasn’t cancelled Sep 12, 2026
daysSinceLastOrder Days since that order. Blank for customers without orders. 25
currencyCode The currency of their latest order, otherwise of their store credit or this order, otherwise your store’s currency. toMoney uses it. CAD

These count the customer’s 500 most recent orders from the last 60 days: Shopify doesn’t let apps see older orders yet. A customer whose last order was 90 days ago has an ordersCount of 0 and a blank daysSinceLastOrder.

Variable What it holds Example
storeCredit Their store credit balance, as a number 25
storeCreditExpiring How much of their credit expires on storeCreditExpiryDate, as a number 10
storeCreditExpiryDate The soonest date some of their credit expires Oct 30, 2026
Variable What it holds Example
companyName The B2B customer’s company. Blank for other customers. Acme Inc
shopName Your store’s name Your store
shopUrl Your online store’s address, for links to it https://your-store.myshopify.com

On the Order status page, in order buttons, and in announcements on the Order status page. Blank elsewhere.

Variable What it holds Example
orderName The order’s name #1001
orderNumber The order number without the # 1001
orderId The order’s ID, the number at the end of its admin URL 5551234567890
orderTotal The order’s total, as a number. Use toMoney(orderTotal). 49.5
order The same details as an object: order.name, order.number, order.total, order.currencyCode, and order.id (the full Shopify ID)

customer holds customer.firstName, customer.lastName, customer.email, customer.tags and customer.metafields. See customer metafields.

In a VIP status block, tier, nextTier and amountToNextTier hold the customer’s tier, the next tier and what’s left to reach it.

Helper What it does Example
toMoney(amount) Formats a number as money in the customer’s currency and language. Add a currency code to choose another: toMoney(amount, "EUR"). {{ toMoney(totalSpent) }} → $320.00
formatDate(date) Formats a date in the customer’s language. {{ formatDate(customer.metafields.checkout_buddy.birthday) }} → May 14, 1990

Text fields such as Text, Intro, Answer, Before the first tier and When something is overdue also support:

Type this You get
**Free returns** Bold text
[Returns policy](https://example.com/returns) A link. Links to other websites open in a new tab; links to your store open in the same tab.
A line break A new paragraph. Empty lines are ignored.

Headings, button text, labels and questions show personal text but not bold or links. Announcement bars show one line of plain text.

In link fields, such as Button link, Main button link and Second button link, the order button’s Link and each Quick links Link, values are URL-encoded: #1001 becomes %231001 and spaces become %20, so they don’t break the address.

https://example.com/track?order={{ orderNumber }}&email={{ email }}

Values in a [label](…) link inside text aren’t encoded. Encode them yourself, and keep spaces out of the address:

[Track your order](https://example.com/track?email={{ encodeURIComponent(email) }})

Show any customer metafield with customer.metafields. followed by its namespace and key:

Your member number: {{ customer.metafields.custom.member_number }}
  • The metafield needs a definition in Shopify under Settings → Custom data → Customers. Shopify only lets customer accounts read metafields whose definition allows it.

  • Checkout Buddy turns on that access when you save the block. It gives the existing definition customer account read access. A metafield without a definition is left alone and prints nothing: add the definition, then save the block again.

  • Write the full path in the text. Checkout Buddy loads the metafields it finds written as customer.metafields.namespace.key. Namespaces and keys can only use letters, numbers, - and _.

  • Add a fallback with || for customers without a value:

    {{ customer.metafields.custom.member_number || "not set yet" }}
  • Values are the raw metafield value. A date prints as 1990-05-14, so wrap it in formatDate. A list prints with its brackets and quotes.

  • Profile field answers are customer metafields, so they work here too, for example {{ customer.metafields.checkout_buddy.birthday }}. Checkout Buddy creates their definitions for you. See profile fields.

The same definitions are needed for the Customer metafield and Birthday is this month conditions.

Personal text works in almost every text, button label and link in account blocks, in their translations too, and in Discount code fields.

It doesn’t work in image links, document links, Then go to, the account manager’s details, Order guide headings and metafield values, or the choices of profile fields.

Personal text uses the same {{ }} brackets as dynamic text in checkout blocks, but it’s a separate feature:

Checkout dynamic text Personal text
Values The cart and checkout: totals, delivery, line items The customer, their orders, store credit and this order
Formatting Bold, colors, small text, tooltips, discount tags, links Bold and links only
toMoney Needs the currency: toMoney(amount, currencyCode) Uses the customer’s currency unless you give one
A broken expression Can hide the whole block Leaves only that expression blank
  • Check it in the preview. The editor’s Preview fills in personal text for each sample customer, so you can test an expression before you publish.
  • Plan for customers without orders. For a new customer, ordersCount and totalSpent are 0 and lastOrderDate and daysSinceLastOrder are blank.
  • Money for new customers is in your store’s currency. Without orders or store credit, toMoney uses the currency your store had when you last saved the block. Give a currency to choose one, for example toMoney(200 - totalSpent, "CAD").
  • Customers who aren’t logged in on an order status page have no name or other details, so personal text about them is blank.