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.
How it works
Section titled “How it works”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, notorderscount. - What prints: numbers print as plain numbers (
49.5), so wrap money intoMoney. Lists, such astags, print with commas between items. Values that don’t exist, andtrueorfalse, 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.
Variables
Section titled “Variables”Customer
Section titled “Customer”| 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 |
Orders and spend
Section titled “Orders and spend”| 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.
Store credit
Section titled “Store credit”| 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 |
Company and store
Section titled “Company and store”| 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 |
This order
Section titled “This order”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) |
The customer object
Section titled “The customer object”customer holds customer.firstName, customer.lastName, customer.email, customer.tags and customer.metafields. See customer metafields.
VIP status only
Section titled “VIP status only”In a VIP status block, tier, nextTier and amountToNextTier hold the customer’s tier, the next tier and what’s left to reach it.
Helpers
Section titled “Helpers”| 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 |
Formatting
Section titled “Formatting”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.
Personal text in links
Section titled “Personal text in links”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) }})Customer metafields
Section titled “Customer metafields”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 informatDate. 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.
Where it works
Section titled “Where it works”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.
Compared with checkout dynamic text
Section titled “Compared with checkout dynamic text”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 |
Things to know
Section titled “Things to know”- 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,
ordersCountandtotalSpentare 0 andlastOrderDateanddaysSinceLastOrderare blank. - Money for new customers is in your store’s currency. Without orders or store credit,
toMoneyuses the currency your store had when you last saved the block. Give a currency to choose one, for exampletoMoney(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.
