# Creating a Confirmation Campaign

<Callout type="info" title="What this is">
A confirmation campaign sends an email with a pre-filled link that lets a subscriber confirm, in a single click, that their address is still active. The link opens a public form that is already filled in and submits it automatically, so the subscriber has nothing to complete.
</Callout>

## Why this matters

Confirmation campaigns are one of the best ways to keep a healthy, engaged list. By asking inactive or unconfirmed contacts to re-confirm, you clean out addresses that no longer respond, protect your sender reputation, and keep your engagement metrics honest, all without adding friction for the subscriber.

## How it works

Two custom fields track the confirmation on each contact in your list:

| Field | Type | Role |
| --- | --- | --- |
| `confirmation` | Number | A 0/1 flag showing whether the person confirmed. Set to `1` directly through the email link. |
| `confirmation_date` | Date | The exact date of the confirmation. Pre-filled automatically by the email link and submitted with the current date. |

The link in the email carries merge tags that fill `confirmation_date` with today's date and set `confirmation` to `1` the moment the link is clicked. Everything happens in the URL, **no separate automation is required.**

## Before you start

Keep these two field names **exactly** as written, lowercase, with the underscore, everywhere you reuse them (`confirmation` and `confirmation_date`). The names in the URL must match the names on your list and your form, or the values won't be recorded.

## Step-by-step instructions

### Create the two custom fields

In the contact list you'll use for the campaign:

<Stepper>

1. Open the contact list you want to use.

2. Click the **gear icon (⚙)** next to the **+** button, at the top right of the table.

3. Go to the **Attributes** section.

4. Add an attribute named `confirmation`. Type: **Number**. Set it to **not displayed**. Save.

5. Add an attribute named `confirmation_date`. Type: **Date**. Set it to **not displayed**. Save.

</Stepper>

### Create the confirmation form

<Stepper>

1. In the **Forms** section, create a new form.

2. Name it clearly so you can find it later, such as *Subscription confirmation*.

3. Assign it to the correct list if you have more than one.

4. The **Email** field and the **Submit** button are generated by default. Click **Edit form** on the right.

5. Add the `confirmation` field (type **Number**) with the small **+**.

6. Add the `confirmation_date` field (type **Date**) with the small **+**. You can rename each field's label to something friendlier, such as *Confirmation* and *Confirmation date*.

7. Give the form a clear title. You can also turn on **Smart form** mode to apply your branding, you'll need to add your logo separately, it isn't included by default.

8. Scroll the right-hand menu down to **Manage a field** to reorder the fields as you want them. You can also replace the **Submit** button with **Auto-submit**, since that's what this flow relies on.

9. Save.

</Stepper>

<Callout type="caution" title="Turn off the form's confirmation email">
In the right-hand menu, **disable the confirmation email** for this form. If it stays on, the automated flow can't work.
</Callout>

Once the form is ready, **Publish** it, then copy the **self-hosted link** from the left-hand menu and keep it somewhere handy, you'll need it in the next step.

<Callout type="note" title="Most subscribers never see the form">
Because the submission is automated, most recipients won't see this form at all. Still, give it a clean design and allow a few seconds for display, in case a slow connection means a subscriber does see it briefly.
</Callout>

### Build the campaign email

The full link you put on the button is assembled like this:

| Segment | Role |
| --- | --- |
| `<public-link>` | The self-hosted link from your form. The token is unique to this form. |
| `?` | Starts the parameters. |
| `email=[email]` | Merge tag replaced with the recipient's real address at send time. |
| `confirmation=1` | Sets the list's `confirmation` field to `1` when the email is confirmed, so you can search the list easily. |
| `confirmation_date=[DATE\|0\|Y-m-d]` | Pre-fills the date field with today's date (offset `0`, year-month-day format). |
| `auto_submit=true` | Submits the form automatically on open, with no extra click. |

Final assembled link:

```text
<public-link>?email=[email]&confirmation=1&confirmation_date=[DATE|0|Y-m-d]&auto_submit=true
```

Then build the email itself:

<Stepper>

1. Write a warm email asking your subscribers to re-confirm their subscription.

2. In the email designer, select the call-to-action button.

3. In its link, replace `<public-link>` with the real URL you copied from your form.

4. **Recommended:** add the same link in plain text below the button, for people who can't click it (notably on Outlook).

5. Assign your campaign to the correct list.

</Stepper>

### Choose your recipients

Decide which part of the list should receive the request:

- Target everyone who hasn't opened or clicked an email in a while, for example, over the past year, using [segmenting by engagement](/en/docs/audience/segmenting-by-engagement).
- Target a part of your list that has never been confirmed and that you only have a business relationship with.
- We recommend sending a **second** confirmation email about a week later, re-selecting only the people who didn't respond to the first one.

### Test with a real send

<Callout type="caution" title="Don't use “Test send” for this">
A test send doesn't process merge tags like `[email]` or `[DATE|0|Y-m-d]` the same way a real send does, so the link won't fill in correctly. You have to send the real campaign to a real recipient to validate the whole flow.
</Callout>

<Stepper>

1. In your chosen list, create a segment containing a single address (yours and/or a colleague's).

2. In the campaign, select that segment as the recipient and send the **real** campaign (not test mode).

3. Open the email you receive and click the button (or the fallback link).

4. Check that the form page submitted automatically and that you see the form's submission confirmation page.

5. Go back to the contact list and check the tested contact's record: `confirmation_date` should show today's date, and `confirmation` should be `1`.

</Stepper>

If either field didn't update, re-check: the exact field names in the URL, that `confirmation` and `confirmation_date` were added to the form, and that the full link (including `confirmation=1`) was actually pasted into the email.

## Troubleshooting

**The fields don't update after a click**

- Confirm the field names in the URL match your list and form exactly: `confirmation` and `confirmation_date` (lowercase, with the underscore).
- Make sure both fields were added to the form, not just to the list.
- Verify the full link, including `confirmation=1` and `auto_submit=true`, was pasted into the button.

**The subscriber sees the form instead of an instant confirmation**

- This is expected on slow connections. As long as `auto_submit=true` is in the link, the form submits on its own after loading.

**The confirmation email keeps going out from the form**

- Disable the form's confirmation email in the form's right-hand settings menu.

**The link doesn't fill in when I test it**

- You're likely using a test send. Merge tags only resolve on a real send, send the campaign to a one-address segment instead.

## Related articles

- [Adding attributes to your list](/en/docs/audience/adding-attributes-to-your-list) - Create the custom fields
- [Creating a form](/en/docs/audience-building/working-with-forms) - Build and publish the confirmation form
- [Segmenting by engagement](/en/docs/audience/segmenting-by-engagement) - Target inactive contacts
- [Creating dynamic segments](/en/docs/audience/creating-dynamic-segments) - Build the one-address test segment
- [Adding merge tags to a campaign](/en/docs/personalization/adding-merge-tags-to-a-campaign) - How merge tags resolve
