Upgrade prompt test
Compares four places to show the upgrade prompt to free users, with timing layered in through audience targeting.
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 upgrade prompt test
Coming soonBlu builds a step
About this recipe
When to use it
An upgrade prompt's placement and timing both independently affect whether it converts, and testing them separately misses the interaction between the two. This runs a combined test - client variants for placement, server-side payload for timing.
What it delivers
Runs a combined experiment testing upgrade prompt placement (client-side variants) and timing (server-side payload) for free SaaS users.
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
“Compares four places to show the upgrade prompt to free users, with timing layered in through audience targeting.”
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 upgrade prompt testCreate a CLIENT EXPERIMENT on /experiences titled "Upgrade Prompt Optimization". This recipe merges what was historically two separate experiments (placement + timing) into one. The PLACEMENT dimension is tested via client variants (different on-page locations); the TIMING dimension is layered via the experience's audience targeting (segment-based: account age + activity). ═══ PATH 1: Top-level configuration ═══ Experience type: client_experiment Variants (placement axis): - Control (25%): existing upgrade banner at top of dashboard - Variant B (25%): inline upgrade prompt at the feature-limit gate (shown when user clicks a paywalled feature) - Variant C (25%): persistent upgrade card in sidebar navigation - Variant D (25%): floating upgrade pill in the bottom-right corner Targeting (timing dimension applied as audience filter): - Pages: any in-app page where the dashboard chrome renders - Audience: free plan users only: segment definition: subscription is null OR Plan = "free", AND account_age >= 3 days - Run this experiment in three sequential cohorts to test timing: - Cohort 1: account_age 3-7 days - Cohort 2: account_age 8-14 days - Cohort 3: account_age >14 days - Each cohort gets the same 4 placement variants; comparing across cohorts answers the timing question. - Devices: any - Display frequency: once_per_session (avoid prompt fatigue within a session) Primary metric: goal_completed_in_experience where experience_id = <this> (goal fires on Subscription started within 14 days of exposure) Secondary metrics: - Click on where target_id = "upgrade-prompt-cta" (per-placement click rate) - Click on where target_id = "upgrade-prompt-dismiss" (dismissal rate: friction signal) - Subscription started within 14 days Guardrail: NPS feedback (Feedback submitted with score property) must not drop more than 5 points in trailing-30d trend Schedule: 21 days ═══ PATH 2: Variant HTML content (Visual Editor) ═══ Variant: Control (top banner) HTML target selector: .dashboard-header (insert before) Variant DOM (existing): <div class="upgrade-banner" data-variant="control" data-placement="top-banner"> <p>Upgrade to Pro for unlimited features</p> <button class="upgrade-cta" id="upgrade-prompt-cta" data-placement="top">Upgrade now</button> <button class="dismiss" id="upgrade-prompt-dismiss" aria-label="Dismiss">×</button> </div> Variant: B (inline at feature-limit gate) HTML target selector: .feature-gate-overlay (the modal/overlay that appears when a free user hits a feature limit) Variant DOM: <div class="upgrade-inline-prompt" data-variant="b" data-placement="inline-gate"> <h3>You've hit your free plan limit</h3> <p>Upgrade to Pro to continue with unlimited access.</p> <button class="upgrade-cta" id="upgrade-prompt-cta" data-placement="inline">Upgrade now</button> <button class="dismiss" id="upgrade-prompt-dismiss">Maybe later</button> </div> Variant: C (sidebar card) HTML target selector: .sidebar-nav (append at bottom) Variant DOM: <div class="upgrade-sidebar-card" data-variant="c" data-placement="sidebar"> <span class="upgrade-icon">⚡</span> <p>Unlock Pro features</p> <button class="upgrade-cta" id="upgrade-prompt-cta" data-placement="sidebar">See plans</button> </div> Variant: D (floating pill) HTML target selector: body (append fixed-position element) Variant DOM: <div class="upgrade-floating-pill" data-variant="d" data-placement="floating-pill" style="position:fixed;bottom:24px;right:24px;"> <button class="upgrade-cta" id="upgrade-prompt-cta" data-placement="floating">Upgrade ↗</button> <button class="dismiss" id="upgrade-prompt-dismiss" aria-label="Dismiss">×</button> </div> The Visual Editor lets the user adjust copy, colors, animation, and exact positioning per variant. Ensure target_id values "upgrade-prompt-cta" and "upgrade-prompt-dismiss" are preserved across all variants so Click on aggregation is consistent. Taxonomy notes: - The 4-variant design tests placement; the 3-cohort schedule tests timing. Total observations: 4 placements × 3 timings = 12 cells. Plan sample sizes accordingly: you'll want at least 500 exposures per cell, so ~6,000 free users in the experiment. - Click on.target_id = "upgrade-prompt-cta" is shared across placements, with target_id and the data-placement attribute on the button enabling per-placement segmentation in analysis.
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 /upgrade-prompt-optimization 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.
