---
title: Dynamic text (personalization variables)
slug: dynamic-text
description: How Personizely dynamic text works: every {visitor}, {geo}, {company}, {data}, {query}, {variable} and {datetime} value, fallback syntax, and where it works.
docTags: 
createdAt: 2026-10-17T09:44:57.443Z
---

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](docId\:jRubqMsuzAHPTOBPLwFSW), which mark where an embedded widget appears.

**Available on:** all platforms. Company values need the Clearbit or Albacross integration.

## Syntax

```javascript
{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](docId\:Q2m71k4qe54obA5WmAvBT)                   |
| `{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](docId\:km7iOXZLplGl8qZlK582W) by its numeric ID, for example `{visitor.customField[42]}` |

Any [Visitor fields reference](docId\:imIYkGl2lTiSb6EhnikmB) 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)](docId\:F8Z6F1Bhw44oDyzHQoPE_) 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](docId\:pUBcmS1M98xB8Mg8L99D_#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](docId\:Sotf7nxCNqIQJUdVasvOz) 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.

## Related

- [Website data (ply.setData and plyData)](docId\:F8Z6F1Bhw44oDyzHQoPE_)
- [Visitor fields reference](docId\:imIYkGl2lTiSb6EhnikmB)
- [Custom fields](docId\:km7iOXZLplGl8qZlK582W)
- [Identifying visitors](docId\:Q2m71k4qe54obA5WmAvBT)
- [Text element and dynamic text](docId\:waQaq7P2ozN4vtAFLxG40)
- [Content A/B testing with the visual editor](docId\:sRIV2YbnueXGJTEWlxZl8)
