Emails

Personalization

Contact merge tags, event data, repeat blocks, and fallbacks.

Audryo substitutes merge tags at send time (and in Preview when a sample contact is selected). Tags are the same in the canvas, campaigns, Journeys, and transactional sends.

Contact fields

Use a confirmed contact property:

text
{{ contact.first_name }}
{{ contact.first_name | "there" }}

The part after | is the fallback when the field is empty or missing. Always add a fallback on greeting lines so you never send “Hi ,”.

The key is the schema key from Data → Fields, not the label. If the field is still proposed, it can still merge — confirming the definition only marks it as reviewed.

Event / send data

Transactional sends and event-triggered Journey enrollments can pass a JSON object that emails read as data:

text
{{ data.order_id }}
{{ data.total }}
Order {{ data.order_id }} is {{ data.status }}

Shorthand {{ order_id }} also works for transactional dataVariables when the name does not clash with a contact field. Prefer data. in Journey emails so authors can tell the two namespaces apart.

Rules that surprise people:

  • Journey event payloads are snapshotted at enrollment. A later

order_placed does not rewrite an email already queued for this run.

  • Reentry starts a new enrollment with a new snapshot (subject to

the trigger’s reentry policy).

  • Audience or attribute triggers have no data payload.

{{ data.* }} renders empty there — use {{ contact.* }}.

  • Unlike contact fields, event keys are not gated on a confirmed

definition. An unknown key renders as empty text, not an error. Send a test before you activate.

Tags

Some conditions and merge paths use tag.<name> (for example tag.vip) when a Journey has applied a tag. Tags are labels on the contact, not contact properties. Manage them under Data → Tags.

Repeat blocks

For line items, pass an array of objects in data and drop a Repeat / line items block in the editor. Inside the repeating row, reference the current item’s keys the same way you would a data field.

Example payload:

JSON
{
  "dataVariables": {
    "order_id": "ord_1842",
    "items": [
      { "name": "Pro plan", "amount": "$29" },
      { "name": "Usage overage", "amount": "$4" }
    ]
  }
}

If the array is missing or empty, the repeat block renders nothing — put a fallback sentence outside the repeat if the email must still make sense.

Button URLs and image links can include merge tags (https://app.example.com/orders/{{ data.order_id }}). They must still be real https destinations after substitution. Placeholder URLs (https://example.com, #) fail lint on confirm.

What is not a merge tag

Do not store marketing consent as {{ contact.subscribed }} and hope delivery will honor it. Consent lives on the consent ledger. Eligibility checks that ledger, not a property you named similarly.

Preview with a real contact

In the editor Preview, pick a contact (when the project has people synced) to see substitutions. Test send still goes to the address you type, using that contact’s data when you choose one.