> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tented.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Personalization Tokens

> Every token you can use to tailor emails to each recipient

## What are tokens?

Tokens are placeholders wrapped in double curly braces — like `{{contact.firstName}}` — that Tented swaps for real values when each email is sent. They work in the **subject**, **preheader**, and anywhere in the **body**, so every recipient gets a message that feels written for them.

This page is the full reference. For the how-to of inserting them, see [Creating Emails](/email/creating-emails#subject-lines-preheaders-and-personalization).

## Contact tokens

Reference any [standard or custom contact field](/people/contact-fields) by its API name:

```
{{contact.firstName}}
{{contact.company}}
{{contact.plan_tier}}   ← a custom field
```

**Fallbacks.** A token resolves to an empty string when a contact is missing that value. For anything a reader will see, add a default so you never ship "Hi ," :

```
Hi {{contact.firstName:default=there}},
```

The easiest way to get the syntax right is the **Personalize** button in the editor — pick the field, choose optional formatting, set an optional default, and it inserts the token for you.

## Formatting values

CRM data doesn't always arrive in the casing you want to send. Add a **case format** option to any contact or campaign dynamic token to fix it at send time:

| Option          | What it does                             | `"ada LOVELACE"` becomes |
| --------------- | ---------------------------------------- | ------------------------ |
| `:lowercase`    | everything lowercase                     | `ada lovelace`           |
| `:uppercase`    | everything uppercase                     | `ADA LOVELACE`           |
| `:sentencecase` | first letter capitalized, rest lowercase | `Ada lovelace`           |
| `:titlecase`    | each word capitalized                    | `Ada Lovelace`           |

```
Hi {{contact.firstName:titlecase}},
Your promo code: {{campaign.dynamic.couponCode:uppercase}}
```

A few rules worth knowing:

* **One format per token**, added anywhere after the field name. It combines with a fallback in either order — `{{contact.firstName:titlecase:default=friend}}` and `{{contact.firstName:default=friend:titlecase}}` are equivalent, and the format applies to the fallback too (a missing first name renders as "Friend").
* **Text values only.** Number, date, and true/false fields render unchanged — a format on those is simply ignored, never an error.
* **Use the keywords exactly as shown above** — `:lowercase`, `:uppercase`, `:sentencecase`, `:titlecase`. Anything else is flagged as an invalid token.
* `{{tented.*}}` sender-profile tokens don't take formats (or any other option).

## Sender-profile tokens

These `{{tented.*}}` tokens are filled by Tented into the email **body** (HTML and plain text — not the subject line) at send time. The first three pull from your [Sender Profile](/email/email-setup) and are mainly used in the unsubscribe footer; the last two become personal, per-recipient links:

| Token                                | Resolves to                                                                                                             |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
| `{{tented.company}}`                 | Your legal company name                                                                                                 |
| `{{tented.address}}`                 | Your mailing address                                                                                                    |
| `{{tented.privacyUrl}}`              | Your privacy policy URL                                                                                                 |
| `{{tented.unsubscribeOneClickLink}}` | Each recipient's one-click unsubscribe link (**required** in the footer)                                                |
| `{{tented.viewAsWebpageLink}}`       | Each recipient's [view-as-webpage link](#the-view-as-webpage-link) — a hosted web copy of the exact email they received |

## The view-as-webpage link

Add a "View this email in your browser" link — typically small text above the header or in the footer — by pointing any link at `{{tented.viewAsWebpageLink}}`:

```html theme={null}
<a href="{{tented.viewAsWebpageLink}}">View this email in your browser</a>
```

When a [blast](/email/email-blasts) or [triggered flow](/email/triggered-flows) email containing the token is sent, every recipient's copy carries their own private link to a web version of that exact email. A few things worth knowing:

* **It's a frozen copy.** The web version shows the email exactly as that recipient received it — their personalization values, their working unsubscribe link, everything captured at the moment of sending. Editing the email, changing the contact's fields, or even deleting the email afterwards doesn't change what the link shows.
* **Links stay live for 12 months.** After that, the page politely explains that the email is no longer available. The recipient's inbox copy is unaffected.
* **Treat the link like the email itself.** Anyone who has it can view that recipient's copy — including its live unsubscribe link — so a forwarded link is equivalent to a forwarded email.
* **It's never rewritten by click tracking.** Like the unsubscribe link, it bypasses click-tracking redirects so it keeps working on its own; clicks on it don't appear in campaign metrics.
* **[Sample sends](/email/sample-emails) get real links too.** A sample's view-as-webpage link opens a hosted copy of that exact sample — a handy way to share a test render — with the same 12-month lifetime.

<Tip>
  You can also just ask the editor's AI — "add a view-in-browser link above the header" — and it inserts the token for you.
</Tip>

## Campaign dynamic tokens (flows only)

Inside a [triggered flow](/email/triggered-flows), `{{campaign.dynamic.*}}` tokens carry values that belong to a contact's *run* of the flow rather than to the contact record. Values arrive from three places:

**Form Submitted triggers.** When a flow starts from a form submission, every answer becomes a token named after the form field, with spaces and punctuation turned into underscores (capitalization kept): a "first name" field is available to every email and webhook in that run as

```
{{campaign.dynamic.first_name}}
```

Multi-choice answers arrive comma-separated.

**API triggers.** A flow with a **Tented API** trigger is started by an external system [calling the public API](/api-reference/managing-triggered-flows#trigger-a-flow-api-trigger), which can pass token values along — `{"tokens": {"coupon_code": "SAVE20"}}` makes `{{campaign.dynamic.coupon_code}}` available to the run. The same goes for the `dynamic_context` payload when [adding a contact to a flow by API](/api-reference/managing-triggered-flows#add-a-contact).

**Flow steps.** Earlier steps can hand values to later emails. The headline example is the **Create Tent** step: with **Auto-approve** on, it publishes a personalized page and exposes its URL as `{{campaign.dynamic.tentURL}}`. Link a later **Send Email** step's button to that token and every contact's email points to *their own* generated page — a second Create Tent step would expose `{{campaign.dynamic.tentURL2}}`, and so on. Full walkthrough in [The Create Tent step](/email/triggered-flows#the-create-tent-step). The **Create Email** step takes the same tokens the other way: its prompt and subject can reference `{{campaign.dynamic.tentURL}}` (or any other run value) so the email it writes for each contact links to their own page, and a later Send Email step sends that per-contact email. See [The Create Email step](/email/triggered-flows#the-create-email-step). **Send Webhook** steps can likewise capture fields from the webhook's response into tokens for later steps.

Campaign dynamic tokens accept the same [case formats](#formatting-values) as contact tokens — `{{campaign.dynamic.couponCode:uppercase}}` — but not `:default=`; a missing value renders blank.

## Before you send

* **Preview with real data** — click **Preview as** in the editor and pick a contact to see tokens resolved.
* **Flows validate tokens** — when you activate a flow, Tented flags emails that reference invalid or inactive fields, so a typo can't ship. Fix the flagged token and re-activate.
* **Missing values are silent** — without a `:default=`, an absent value simply disappears, which can leave odd spacing or punctuation. Default anything visible.

<Card title="Back to: Creating Emails" icon="arrow-left" href="/email/creating-emails">
  The full email editor workflow.
</Card>
