Confirmation Pages
The confirmation page is the page a subscriber lands on after they click the link in a double opt-in confirmation email. By default, Broadcast shows a short message in the channel’s language. You can write your own heading and body for every page state in each of your channel’s languages, give the page its own colours or your Brand Kit, redirect subscribers to your own thank-you page, and choose how long the link stays valid.
Note
Requires Broadcast 2.36.0 or later for the full-screen page editor, languages other than English, and page colours. Earlier versions edit the page text in the template sidebar, in English only.
The Six Page States
A subscriber may land on the confirmation page in any of these states:
| State | When it renders |
|---|---|
| Confirmed | The subscriber clicked a valid, unexpired link for the first time. |
| Already Confirmed | The subscriber clicks the same link a second time after already confirming. |
| Link Expired | The subscriber clicked the link after it expired (24 hours after it was sent, unless you changed the link expiry). |
| Link Not Found | The token in the URL is invalid or has already been deleted. |
| Confirmation Failed | A server error prevented the confirmation from being recorded. |
| Generic Error | A fallback for any other unexpected condition. |
Each state has its own heading and body text. You can override either or both for any state.
How Subscribers Reach the Page
Confirmation links can reach a subscriber’s inbox through four different flows. Each flow stores the SubscriberConfirmation record differently, but they all funnel through the same confirmation page.
- Opt-in form with double opt-in enabled: A visitor submits one of your Opt-In Forms. Broadcast sends a confirmation email and the link points at the confirmation page.
- Subscribers API with
double_opt_in: true: Your code creates a subscriber programmatically and Broadcast handles the confirmation email. - Transactionals API with
double_opt_in: true: You send your own custom transactional that includes{{ confirmation_url }}in the body. - Manual transactional with
{{ confirmation_url }}: You hand-author any transactional email and include the{{ confirmation_url }}Liquid variable; Broadcast injects the URL of the most recent pending confirmation for that subscriber.
The first three create a SubscriberConfirmation record. The fourth reuses whichever pending confirmation already exists.
Where to Configure the Page Text
The page text lives on a confirmation template: the same template that defines the confirmation email. To edit it:
- Go to Templates → Confirmation and open the template that’s used for your flow.
- Click Edit. Under the email editor, the Confirmation page card previews what the link in this email lands on.
- Click Edit Page on that card (or in the flow strip at the top). The page editor opens in a new tab, so the unsaved email content behind it is never at risk.
- Pick a language tab. Each tab shows how many fields you have customised in that language.
- Open an outcome (Confirmed, Already confirmed, Link expired, and so on) and fill in Heading and/or Body. Blank fields use Broadcast’s built-in text in that language, shown in the field.
- Click Save in the top bar. It saves every language at once.
You can use {{ channel_name }}, {{ email }} and {{ first_name }} in the heading and body.

The strip across the top of a confirmation template’s edit screen shows the whole double opt-in flow: what sends this template, the email itself, how long the link lasts, and the page it lands on.

Which template you should edit depends on which flow your subscribers go through:
| Your flow | Which template drives the page |
|---|---|
| Opt-in form (double opt-in) with a confirmation email template selected on the form | The template selected on that form |
| Opt-in form (double opt-in) with no template selected on the form | The channel’s default confirmation template (or Broadcast’s built-in text if no default exists) |
Subscribers API with confirmation_template_id |
The supplied template |
Subscribers API without confirmation_template_id |
The channel’s default confirmation template (the API returns a 422 error if no default exists) |
Transactionals API with confirmation_template_id |
The supplied template |
Transactionals API without confirmation_template_id |
The channel’s default confirmation template (or Broadcast’s built-in text if no default exists) |
Manual transactional with {{ confirmation_url }} |
The template attached to whichever pending confirmation the recipient already has, typically inherited from one of the flows above |
To mark a template as the channel default, open it on the Templates → Confirmation index page and toggle the Default switch. See Email Templates for details.
How Page Text Resolves
Broadcast first decides the page’s language (see Page Language), then resolves each piece of text in this order:
- The template’s text for that language and state (the Heading and Body fields in the page editor).
- Legacy
Confirmation Textfield on the template: applies only to the body of the Confirmed state, and only when the page is shown in the channel’s default language. Text set in older versions of Broadcast continues to render here for backward compatibility. - Broadcast’s built-in text in that language.
Headings come from the template or the built-in text: there is no legacy heading field. If you set a Confirmed body and a legacy Confirmation Text on the same template, the Confirmed body wins.
Text you customise in one language is never shown on a page in another language. A French subscriber sees your French text, or Broadcast’s French text if you have not written any.
Redirect After Confirmation
Instead of showing Broadcast’s confirmation page, you can redirect subscribers to your own URL, useful if you have a branded thank-you page on your site.
- Go to Opt-in Forms and edit a form.
- Click the Settings (gear) button.
- Enable Double opt-in if it isn’t already.
- Fill in the After Confirmation URL field with an
http://orhttps://URL. - Save.

Subscribers who confirm via this form will be redirected to that URL instead of seeing Broadcast’s confirmation page.
Important details:
- Only the opt-in-form flow supports redirects. Confirmations created via the Subscribers API, Transactionals API, or manual
{{ confirmation_url }}use the rendered page; there’s no per-record redirect setting on those flows. - The redirect runs only on the Confirmed and Already Confirmed states. If a subscriber clicks an expired or invalid link, they see Broadcast’s standard error page: they are not redirected.
- The confirmation runs first. Subscribers are marked confirmed (and any tags, sequences, and welcome emails fire) before the browser navigates to your URL.
- Validation rejects unsafe schemes.
javascript:,data:, and other non-HTTP schemes are blocked at save time.
Link Expiry
Confirmation links expire 24 hours after they are sent by default. You can change that per channel under Settings → General Channel Settings → Confirmation Page → Confirmation link expiry:
| Option | What it means |
|---|---|
| 24 hours | The default. |
| 48 hours | Useful when your list checks email every other day. |
| 7 days | A full week to click through. |
| 30 days | For lists that read in batches, or B2B audiences returning from leave. |
| Never | The link stays valid until it is used. |
The setting applies to confirmation links created after you save it; links already in flight keep the expiry they were given.
A subscriber who clicks an expired link sees the Link Expired state of the confirmation page. They are not stuck: submitting your opt-in form again (or re-running whichever flow created the confirmation) sends a fresh link.
Before you choose Never
A link that never expires can still be clicked long after the subscriber has forgotten signing up, and it keeps working if the email is forwarded. Prefer a window your audience can realistically meet unless you have a specific reason not to.
Page Language
The confirmation page speaks the same languages as the unsubscribe pages, and you set them in the same place:
- Default language: set in the top bar of Settings → Unsubscribe Page, or under Settings → General Channel Settings → Confirmation Page → Language. Both change the same setting.
- Other languages: add them with + Add language under Settings → Unsubscribe Page. Each language you add gets a tab in the confirmation page editor. The editor’s Add a language link takes you there.
- Browser matching: turn on Match the subscriber’s browser language under Settings → Unsubscribe Page to show each subscriber the page in their browser’s language, when it is one of the channel’s languages. Everyone else sees the default language.
Broadcast ships built-in text in English, Deutsch, Français, Español, Italiano, Português (Brasil), Nederlands, Polski, Svenska, Dansk, Norsk (bokmål), Suomi and 日本語, so every outcome reads correctly in each language even where you have not written your own text.
A link that belongs to no confirmation (the Link Not Found state) names no channel, so that page uses the browser’s language when Broadcast ships it, and English otherwise.
See Unsubscribe Settings for more on languages.
Appearance
The Appearance section at the bottom of the page editor sets how every confirmation page in the channel looks, whichever template sent the email. The text belongs to each template; the look belongs to the channel, so two templates cannot paint the same page two ways.
- Match the channel brand kit: gives the page your logo, colours, font, corner radius and social links from Settings → Brand Kit. It is the same switch as Subscription confirmation page on the Brand Kit page.
- Colours: page background, card background, text, secondary text, links and buttons (accent). Each colour you set overrides the Brand Kit. Leave a colour blank to use the Brand Kit, or Broadcast’s standard look when the Brand Kit is off; the field shows which colour that is.
- Show logo and Show social links: hide the Brand Kit’s logo or social links on this page. They only appear when the page matches the Brand Kit.
Previewing the Page
You can preview each state without sending a real confirmation email:
- In the page editor, the preview on the right updates as you type, before you save. Switch between the six outcomes with the tabs above it, and use Mobile to see the page at phone width. It follows the language tab you are editing.
- On the template’s edit screen, the Confirmation page card previews the Confirmed state.
- From the template show page, the Preview confirmation page link opens the Confirmed state in a new tab.
- You can manually pass
?state=<state>in the URL (e.g.,/c/<channel>/templates/confirmation/<id>/preview_page?state=expired) to preview any state.
A small banner on the previewed page reads “This is a preview: subscribers will see this page after clicking the confirmation link” so it’s clear you’re not viewing a real submission.
Frequently Asked Questions
My subscribers see “Thank you for confirming your email address.” How do I change that?
Open the confirmation template that drives your flow (see the configuration table above), click Edit, then Edit Page. Under Confirmed, set the Body field to your custom text in each language you offer, and click Save.
I want subscribers to land on my own site instead of Broadcast’s page.
If subscribers come from an opt-in form, set After Confirmation on that form (see Redirect After Confirmation). For other flows, you’ll need to render your own page based on the URL the subscriber arrives at: Broadcast doesn’t support per-record redirects on API-driven flows.
I customized only the success state. What happens when a subscriber clicks an expired link?
The Link Expired page shows Broadcast’s built-in text in the page’s language. To customize it too, open Link expired in the page editor and fill in the heading and body.
Where does the manual {{ confirmation_url }} flow get its page text from?
It inherits from whichever flow created the pending SubscriberConfirmation for that subscriber. If you used the Subscribers API to create the subscriber and then sent a follow-up transactional with {{ confirmation_url }}, the page uses the template that the API stored on the confirmation. If no template is attached, it falls back to the channel’s default confirmation template, and then to Broadcast’s built-in text in the page’s language.
API Reference
Everything you can configure for confirmation pages in the admin UI can also be managed through the API:
- Per-state page text: the Templates API accepts
confirmation_page_settings, keyed by language code and then by state (confirmed,already_confirmed,expired,not_found,confirmation_failed,fallback), each with aheadingandbody: for example{ "de": { "confirmed": { "heading": "Willkommen!" } } }. The same object is returned in template responses. The older shape keyed by state alone, with no language, is still accepted and reads as the channel’s default language. - Default confirmation template: set
default_confirmation: trueon a template via the Templates API to make it the channel default. - Template assignment on opt-in forms: the Opt-In Forms API accepts
confirmation_email_template_idto point a form at a specific confirmation template. - Redirect URL: settable via the Opt-In Forms API under
automation_settings.confirmation_redirect_url.
The page’s appearance, the channel’s languages and the link expiry are set in the app only.