---
title: "Personalize a guide step's button link and image per viewer"
slug: "/help/demos/edit/guides/personalize-cta-and-images"
topic: "demos"
last_updated: "2026-11-11T13:13:36.435Z"
description: "Bind a guide step's button to a Link variable and an inline image to an Image variable, so each viewer gets their own URL and picture, with a default as fallback."
---

## Overview

A guide step's call-to-action button can open a different link for each viewer, and a step's inline image can change per viewer — both driven by variables. Instead of hard-coding one URL on a button or one picture on a step, you bind the button to a **Link variable** and the image to an **Image variable**, and Walnut swaps in the per-viewer value when the demo plays.

### Snapshot 📸

- **Feature status:** Generally available
- **Role access:** Anyone who can edit the template
- **Location:**
  - Button: Template editor → a guide step → click a button → **link icon** → **External URL** panel → **Variable** toggle
  - Image: Template editor → a guide step → click an image inside the step → **Personalize** button that appears next to the image

---

## Personalize a step button's link per viewer

Bind the button's CTA to a **Link variable** so the URL it opens is picked per viewer — from a preset, a CRM, a URL parameter, or a lead form, the same way any other variable gets its value.

1. Open the template in the editor and go to the guide step.
2. Click the button, then click the **link icon** (**Create Link**) in the button's toolbar.
3. In the **Link Button** panel, click the external URL area to open the **External URL** editor.
4. At the top of the editor, switch the toggle from **URL** to **Variable**.
5. Choose an existing **Link variable** from the dropdown, or click **New Link variable** to create one inline.
6. Click **Done**.

The button now opens the Link variable's value. The variable's **default value** is used for any viewer who does not have a personalized value supplied — set it to a sensible fallback URL so the button always goes somewhere.

### About Link variables

- A Link variable's default must start with `http://` or `https://`. If the field is blank or not a valid link, the picker shows **"Needs a default link"** and the variable cannot be chosen until you fix it.
- The dropdown placeholder reads **"Choose a Link variable"**, and if none exist yet you see **"No Link variables yet"** — use **New Link variable** in the same panel to create one.
- To go back to a fixed URL, switch the toggle from **Variable** back to **URL** and type the address.

---

## Personalize a step image per viewer

An image inside a guide step (a logo, a screenshot, an illustration) can be bound to an **Image variable**, so each viewer sees a different image on the same step.

1. Open the template in the editor and go to the guide step.
2. Click the image inside the step. A **Personalize** button with a lightning icon appears next to it.
3. Click **Personalize** and choose one of:
   - An existing **Image variable** from this template.
   - An image variable from the **Library** — Walnut forks it into this template automatically so the step can use it.
   - **New Image Variable** — creates an image variable from the picture you clicked. The current image becomes the variable's default value.
4. The button's label changes from **Personalize** to the name of the bound variable, and the image now tracks that variable.

### Unlink an image

Click the image, open the **Personalize** menu, and choose **Remove personalization**. The step keeps showing the current image as a fixed picture again.

### Good to know

- A ticked item in the menu is the variable the image is currently bound to.
- If a library image variable cannot be forked into the demo, Walnut shows **"Can't personalize this image"** and nothing changes — try again.
- You can bind several step images to the same Image variable, so they all swap together per viewer.

---

## Where per-viewer values come from

Both Link and Image variables take their per-viewer value from the same sources as other variables:

- A **preset** picked when a demo is created.
- A **CRM field** (for example Salesforce).
- A **URL parameter** on the shared demo link.
- A **lead form** filled in during the demo.

See [Personalization variables overview](/help/demos/personalize/variables/overview) for how to map a variable to each of these, and [Create demo variables](/help/demos/personalize/variables/create-variables) for the variable kinds and how to create them.

---

## Related resources

- [Create demo variables](/help/demos/personalize/variables/create-variables)
- [Personalization variables overview](/help/demos/personalize/variables/overview)
- [Make a guide button Primary or Secondary](/help/demos/edit/guides/button-styles)
- [Add rich media to guide steps](/help/demos/edit/guides/rich-media-in-guides)
