Dynamic text (personalization variables)
Dynamic text inserts visitor-specific values into widgets and campaigns, such as the visitor's first name, their city, the UTM campaign they came from, or today's day of the week. You write a variable in curly braces, for example {visitor.firstName or 'there'}, and Personizely replaces it with the value for each visitor when the content is shown. Dynamic text was previously called "placeholders"; it's different from Embedded widgets and placeholders, which mark where an embedded widget appears.
Available on: all platforms. Company values need the Clearbit or Albacross integration.
Syntax
{namespace.key}
{namespace.key or 'fallback text'}- Use single curly braces and a dot between the namespace and the key: {geo.city}.
- The fallback goes after or, in single quotes. It's shown when the value is missing, empty, 0 or false.
- The fallback can't contain a single quote ('). Write "you are" instead of "you're", or use a typographic apostrophe.
- Without a fallback, a missing value renders as nothing, so write the surrounding text so it still reads well.
- {datetime.*} values always exist and take no fallback.
Examples:
You write | Visitor | Result |
|---|---|---|
Hi {visitor.firstName or 'there'}! | Identified as Jane | Hi Jane! |
Hi {visitor.firstName or 'there'}! | Anonymous | Hi there! |
Free shipping to {geo.countryName} | In France | Free shipping to France |
Happy {datetime.dayOfWeek}! | Any, on a Friday | Happy Friday! |
Inserting dynamic text
- Widgets: in the text editor toolbar, click Placeholder (the { } icon). Choose a Type, then the Value and an optional Fallback, and confirm. Selected text becomes the default fallback. You can also type the syntax directly.
- Campaigns: type the syntax into text you edit in the visual editor, or into HTML, links and image sources.
Namespaces and values
visitor: profile fields
Variable | Value |
|---|---|
{visitor.email}, {visitor.firstName}, {visitor.lastName}, {visitor.phone} | Profile fields, once the visitor is Identifying visitors |
{visitor.companyName}, {visitor.companyTitle}, {visitor.address}, {visitor.bio} | Profile fields |
{visitor.utmSource}, {visitor.utmMedium}, {visitor.utmCampaign}, {visitor.utmTerm}, {visitor.utmContent} | The visitor's stored UTM values |
{visitor.referrer}, {visitor.firstVisitPage} | First external referrer URL, first page path |
{visitor.customField[ID]} | A Custom fields by its numeric ID, for example {visitor.customField[42]} |
Any Visitor fields reference works by its ID, except location fields, which use geo. Visitor values update live: if the visitor submits a form or is identified while the content is on screen, it re-renders with the new value.
geo: the visitor's location
Variable | Value | Example |
|---|---|---|
{geo.country} | Two-letter ISO country code | DE |
{geo.countryName} | Country name in English | Germany |
{geo.region} | Region, state or province name | Bavaria |
{geo.city} | City name in English | Munich |
Location comes from the visitor's IP address and is available once Personizely has looked it up during the session. On the very first page of a session it may not be available yet, so content rendered right at page load can show the fallback there. Always add a fallback to geo values.
company: the visitor's company
Needs the Clearbit or Albacross integration. Values are available once the visitor's company has been identified from their IP address, which only happens for business networks.
Variable | Value |
|---|---|
{company.name} | Company name |
{company.domain} | Company website domain |
data: website data
{data.key} shows a Website data (ply.setData and plyData) value set with ply.setData, window.plyData or a parser. Keys are letters, digits and underscores. Data values update live when you call ply.setData with a new value.
query: URL parameters
{query.param} shows a URL parameter the visitor has arrived with, for example {query.ref}. The value is remembered: it's the latest value seen for that parameter on any page, not only the current URL. For {query.utm_source} and the other utm_* names, the visitor's stored UTM value is used. See Remembered traffic-source values.
variable: JavaScript variables
{variable.path} shows a global JavaScript variable by its path from window, for example {variable.Shopify.currency.active} or {variable.storeConfig.freeShippingThreshold}. It's read when the content is rendered.
datetime: the visitor's date and time
Values use the clock and time zone of the visitor's device, at the moment the content is rendered. They don't tick.
Variable | Value | Example |
|---|---|---|
{datetime.date} | Date and time, formatted for the visitor's browser language | 10/16/2026, 3:45:12 PM |
{datetime.hour} | Hour, 0–23 | 15 |
{datetime.minute} | Minute, 0–59, without a leading zero | 5 |
{datetime.day} | Day of the month, 1–31 | 16 |
{datetime.month} | Month number, 1–12 | 10 |
{datetime.year} | Four-digit year | 2026 |
{datetime.dayOfWeek} | Weekday name in English | Friday |
{datetime.timeOfDay} | morning (6:00–11:59), afternoon (12:00–16:59), evening (17:00–19:59) or night (20:00–5:59) | afternoon |
{datetime.season} | winter (Dec–Feb), spring (Mar–May), summer (Jun–Aug) or autumn (Sep–Nov), northern hemisphere | autumn |
Where dynamic text works
Where | Supported |
|---|---|
Widget text: headlines, text, buttons, form labels | Yes |
Widget links, image sources and button action URLs | Yes. Spaces and accented characters in values are encoded, but characters with a meaning in URLs, such as &, + and #, aren't |
Campaign changes made in the visual editor: text and HTML, inserted elements, image sources, links and other attributes | Yes |
Price, template, theme, shipping and split URL campaigns | No |
Email and SMS sent by your integrations | No: use your email platform's own merge tags |
Values are inserted as plain text. HTML or scripts in a value (for example, in a URL parameter) are shown as text, never run.
Behavior details and limitations
- Visitor and data values update live; others don't. geo, company, query, variable and datetime are read when the content is rendered.
- Keys are case-sensitive. {visitor.firstname} renders empty (or its fallback); the field is firstName.
- Falsy values use the fallback. A custom field or data value of 0 or false shows the fallback, not 0.
- Previews in the editor are approximate. The builder shows sample values. Check real values with a Preview and QA campaigns on your site.
- Unknown namespaces are left as typed. {customer.name} isn't a namespace, so it appears literally.
Examples
- Ad message match: a personalization for visitors with UTM campaign spring-sale whose headline reads "Your {query.utm_campaign or 'spring'} offer is still on".
- Local free-shipping bar: "Free shipping to {geo.city or 'your door'} on orders over $50".
- Time-aware popup: "Good ! Order in the next hour for same-day dispatch."
Troubleshooting
- The braces show on the page → a typo in the namespace, a space inside the braces, a missing closing brace, double quotes around the fallback, or a single quote inside it.
- Always shows the fallback → the visitor isn't identified (visitor), the value is empty or 0, the company couldn't be identified (company), or location wasn't available yet on the first page (geo).
- Wrong UTM value → {query.utm_*} and {visitor.utm*} show the visitor's stored value, which may come from an earlier visit.