CTA wording by account state
The main button reads differently for a first-time visitor, a returning one, someone mid-trial, a free-plan user and a paying customer, instead of one generic prompt.
Authored by Sid Chaudhary
Founder & CEO at Intempt
Agentic workflow
Coming soon1 step Blu runs end to end. It drafts a plan and nothing runs until you approve it.
- 1
Set up the five CTA variants
Coming soonBlu builds a step
About this recipe
When to use it
A generic CTA ignores where someone actually is in their journey, and it costs conversions. Personalizing CTA copy by audience segment, "Start your free trial" for first-timers, "Continue where you left off" for returners, "Upgrade to Pro" for existing customers, has been cited at a 202% lift.
What it delivers
Personalizes CTA copy per audience segment (first-time visitor, returning visitor, existing customer), matching the ask to where each visitor actually stands.
How you prompt this
Describe the outcome in your own words and Blu Agent maps it to this recipe, or run it by name. It drafts a plan first and nothing runs until you approve it.
Tell Blu Agent what you want
“The main button reads differently for a first-time visitor, a returning one, someone mid-trial, a free-plan user and a paying customer, instead of one generic prompt.”
recipe.md preview
Built from the published catalog. Blu Agent's full step prompts load in your workspace when you run it.
Inputs & outputs
What the recipe needs before it runs, and what it leaves in your workspace.
Inputs
- Nothing declared beyond an Intempt workspace. Blu asks for anything else it needs as it goes.
Outputs
How the recipe runs
Blu follows the steps in order and shows you each one before anything goes live.
- 01Set up the five CTA variantsCreate a CLIENT PERSONALIZATION on /experiences titled "Personalized CTA Copy". This personalization changes the primary CTA copy per audience segment. Each variant binds to a lifecycle audience. ═══ PATH 1: Top-level configuration ═══ Experience type: client_personalization Variants (each binds to a lifecycle/visitor-stage audience): - Control (audience = all (fallback): generic CTA) "Get started" - Variant B (audience = "First-time visitors / no account"): "Start your free trial" - Audience: Users.First seen within current session OR Users.First seen is null - AND Users has no Subscription started event - Variant C (audience = "Returning visitors / no account / no signup"): "Continue exploring [Brand]" - Audience: Users.First seen older than current session AND Users has no User created event - Variant D (audience = "Free trial users currently on trial"): "Continue your trial" - Audience: Users has User created event AND Users has no Subscription started event with billing_period set - Variant E (audience = "Active free plan users"): "Upgrade to Pro" - Audience: Users has Subscription started where Plan = "free" - Variant F (audience = "Paying customers"): "Open dashboard" - Audience: Users has Subscription started where Plan != "free" AND no Subscription canceled Targeting: - Pages: homepage "/", marketing pages, /pricing, /features - Devices: any - Display frequency: always Metrics (CRM/CDP): - Click on per CTA copy per audience (per-segment CTR is the headline metric) - Downstream conversion: signup, trial-to-paid, free-to-paid upgrade: measured per audience Schedule: continuous ═══ PATH 2: Variant HTML content (Visual Editor) ═══ Variant: Control (no DOM changes: fallback "Get started" remains) Variant: B (first-time visitors) HTML target selector: .primary-cta-button (the page's primary CTA) Replacement HTML: <button class="primary-cta" data-variant="b" data-audience="first-time" id="primary-cta"> Start your free trial </button> Variant: C (returning, no account) HTML target selector: .primary-cta-button Replacement HTML: <button class="primary-cta" data-variant="c" data-audience="returning" id="primary-cta"> Continue exploring [Brand] </button> Variant: D (trial users) HTML target selector: .primary-cta-button Replacement HTML: <button class="primary-cta" data-variant="d" data-audience="trial" id="primary-cta"> Continue your trial </button> Variant: E (free plan users) HTML target selector: .primary-cta-button Replacement HTML: <button class="primary-cta" data-variant="e" data-audience="free-plan" id="primary-cta"> Upgrade to Pro </button> Variant: F (paying customers) HTML target selector: .primary-cta-button Replacement HTML: <button class="primary-cta" data-variant="f" data-audience="paying" id="primary-cta"> Open dashboard </button> The Visual Editor allows the user to refine the exact copy ("Start MY free trial" first-person tested 202% lift). The CTA's link target also changes per audience: trial users go to /app, free-plan users go to /upgrade, paying customers go to /dashboard. Taxonomy notes: - Uses canonical events: Users.First seen, User created, Subscription started (with Plan and billing_period properties). - The CTA target_id remains "primary-cta" across variants for consistent Click on aggregation. - The 202% lift figure (cited multiple times in 2026 SaaS research) is for first-person CTA copy ("Start MY free trial") personalized by visitor intent. This recipe enables that pattern. - Don't over-segment: 5-6 lifecycle audiences is the sweet spot. Beyond that, content authoring overhead exceeds the gains. - Combine with source-based-personalization for compounding effect: a first-time visitor from LinkedIn enterprise ads sees both source-matched hero (Variant B from source-based) AND first-person CTA copy (Variant B from this recipe). Order precedence: source beats lifecycle when both apply.
Install Intempt and run it
- 1
Sign up
Create a free Intempt workspace.
- 2
Connect your data
Add the sources this recipe reads from.
- 3
Ask Blu
Type /personalized-cta-copy-personalization in Blu once this recipe is live there.
- 4
Review and approve
Blu builds each step and waits for your OK before anything goes live.
