Skip to content

Landing pages built to test and convert, campaign after campaign

A modular landing page system built around a single conversion goal per campaign, sized for fast A/B testing across paid channels.

Campaign pages

Every page for the Corehaven account · March 2026 · load is p75 on a mid-range phone over 4G

All channelsNew pagePN
Sign-ups this month4,351Across the four paid channels
Conversion+42%Each page vs same channel's previous campaign
Brief to published< 2 hoursPages marketing built unaided
Mobile paid bounce−31%Load ≤ 0.8 s, was 4.0 s

Nine pages

Sorted by status, then sign-ups
PageChannelStatusVisitorsSign-upsRateLoadBuilt by
Free trial week/try/free-weekPaid socialLive41,2081,6283.95%0.8 sPriya Nair1h 34m brief to page
Refer a friend/referPaid socialLive9,8704344.40%0.6 sPriya Nair1h 12m brief to page
Corporate membership/work/teamsPaid searchLive6,3403495.50%0.7 sMarcus Bell1h 48m brief to page
Class pass 10/pass/tenPaid searchLive18,4205713.10%0.7 sMarcus Bell1h 26m brief to page
Bring a friend Saturdays/saturdaysShort videoLive15,3105053.30%0.8 sPriya Nair1h 41m brief to page
Student rate/studentsShort videoLive22,6406342.80%0.7 sJo Park1h 55m brief to page
Open day, Riverside/open-day/riversideDisplayPaused12,1052301.90%1.4 sLegacy, by hand11 days brief to page
New year reset/resetDisplayEnded30,9508052.60%0.8 sJo Park1h 38m brief to page
Early classes, 6 am/earlyPaid socialDraft———0.7 sJo Park0h 52m brief to page
Within the 0.8 s load budget Over budget: paused, cannot republishcmp-041 · Variant B promoted Wed 03/11/2026

The brief, in specifics

Industry
E-commerce & Retail
Duration
6 weeks
Cooperation model
Fixed price
Services
Landing page systemConversion designComponent kit
Integrations
ShopifyKlaviyoShipStationSendGrid
Technologies
Next.jsTypeScriptTailwind CSSVercel AnalyticsFigmaStripe API
Team
1 Project lead2 Frontend engineers1 Backend engineer

Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.

The screens

Every surface, in order

9:41LCP 0.8 s
Corehaven
Train free for 7 days. No card, no contract.
Alex(415) 555-0142
Start my free week
Further down
1,628 started a free week this monthMon · RiversideStrength 456:15 amRide12:30 pmCircuit6:30 pmQuestions? Your pass works at all three sites, and nothing renews unless you choose a membership.
Start my free week

The same page as paid social delivers it: the top and bottom of one narrow column, the form still above the timetable, painted in 0.8 seconds.

Results

Today, Tue 03/24/2026 · all live pages · updated as sign-ups land

LivePN

Sign-ups by hour

524 today · 237 on the promoted variant
Free trial week · Variant B (promoted) Every other page Now
12a36912p369

Cost per sign-up

March, by channel
Paid social$9.77
$20,150.00 spend · 2,062 sign-ups
Paid search$13.92
$12,810.00 spend · 920 sign-ups
Short video$11.35
$12,930.00 spend · 1,139 sign-ups
Display$21.39
$4,920.00 spend · 230 sign-ups

Live sign-up feed

Newest first
TimePageChannelDeviceSite
9:41 pmFree trial weekPaid socialAndroidRiverside
9:40 pmStudent rateShort videoiPhoneCanal Street
9:38 pmFree trial weekPaid socialAndroidNorthgate
9:36 pmClass pass 10Paid searchAndroidRiverside
9:35 pmRefer a friendPaid socialiPhoneNorthgate
9:33 pmFree trial weekPaid socialAndroidCanal Street
9:31 pmBring a friend SaturdaysShort videoAndroidRiverside
9:30 pmCorporate membershipPaid searchDesktopAll sites
9:27 pmFree trial weekPaid socialiPhoneRiverside

Promoted variant

exp-118
Free trial week · headlineTrain free for 7 days. No card, no contract.
Variant B4.40%
Control3.10%
Lift, called at 95%+42%
PromotedWed 03/11/2026Since promotion563 of 12,802Page this month1,628 of 41,208

The results console: sign-ups by hour with the promoted free trial variant picked out, cost per sign-up for each of the four channels, a live sign-up feed and the promoted headline's figures.

Corehaven
Start my free week
Free for 7 days · all 3 sitesTrain free for 7 days. No card, no contract.Every class, every site, from tomorrow morning.
First nameAlexMobile(415) 555-0142Start my free week
No card. We text you a pass for the first class you pick.
0:24 · a first class at Riverside
1,628people started their free week this month.
Mon · RiversideStrength 456:15 am · 4 leftRide12:30 pm · 9 leftCircuit6:30 pm · 2 left
Tue · RiversideRow & lift6:00 am · 6 leftMobility12:30 pm · 11 leftBoxfit7:00 pm · 3 left
Wed · RiversideStrength 456:15 am · 5 leftRide12:30 pm · 8 leftCircuit6:30 pm · 1 left
7 days free · every class · no cardStart my free week

The page behind the console's top line: 41,208 visitors, 1,628 of them signed up, and that 1,628 shown back on the page as the only proof it offers, under the winning headline and a two-field form.

Corehaven
Buy a 10-visit pass
Class pass 10Ten visits for $70.00. Use them whenever.$7.00 a visit, any class, any site, valid for six months. If you come more than five times a month, read the table first.
10 visits$70.00$7.00 a visit · 6 months to useBuy a 10-visit pass
How often you comeClass passMembershipCheaper for you
Once a week · 4 visits a month$28.00$39.00Class pass
Six a month · 6 visits a month$42.00$39.00Membership, by $3.00
Twice a week · 8 visits a month$56.00$39.00Membership, by $17.00
Three a week · 12 visits a month$84.00$39.00Membership, by $45.00
At twice a week the pass costs $56.00 a month against a $39.00 membership. We would rather you knew.
Coming now and then? The pass is yours.Buy a 10-visit pass

A price-led page that argues against itself: at twice a week the class pass costs $56.00 against a $39.00 membership, and the table says so.

Corehaven
Get a team quote
Corehaven for teams$27.00 a head instead of $39.00. One invoice.Every class at all three sites for everyone on the list, billed once a month to the company.
Your team, worked out
People on the plan−40+
40 × $39.00 on their own$1,560.00
40 × $27.00 on the team plan$1,080.00
Saved every month$480.00
One invoice of $1,080.00 a month. Add or remove people any time.
“Forty of us signed up in a week. Finance stopped asking about receipts, which was honestly the selling point.Operations lead, 60-person studio
CompanyHalden StudioWork emailops@halden.studioPeople40Get a team quoteA quote within one working day

The 5.5% page: forty people at $27.00 instead of $39.00, one invoice of $1,080.00 and $480.00 a month saved, worked out on the page.

Corehaven
Share my link
Your referrals · NorthgateDana, five friends joined through you.Every friend who comes four times gives you a month free. Here's where each of them is.
FriendJoinedVisits toward your monthStatus
SSam02/034 of 4Month given
LLeah02/113 of 4Month given
TTomás02/242 of 4On the way
WWren03/020 of 4Not in yet
AAde03/050 of 4Not in yet
2months already given to you9 visits between your five friends
Your linkcorehaven/r/dana-ok Share my link
Months are added to your membership automatically. Friends need to visit four times within their first 60 days.

Five referrals, nine visits between them, two months already given: the member's own progress standing in for a testimonial.

Corehaven
ClassesTimetableLocationsCoachesJournal 5 ways out
Paused · 1.90% · LCP 1.4 s · hero 1,640 KB full size
Riverside · Saturday 10 am – 4 pmOpen day at our biggest site yet Taster classes every hour, coaches on the floor, a juice bar
3 different asks
Register for open dayName, email, phone, site, date of birth, goals, how you heardRegister
Get the newsletterMonthly news from all three sites, straight to your inboxSubscribe
Book a tour insteadPick any weekday slot with a membership advisorBook a tour

The legacy page the console paused at 1.9% and 1.4 seconds, flagged: a full-size photograph, five ways out in the top strip, and three different things asked at the bottom.

Introduction

The brief

An ecommerce brand needed landing pages that launched fast and converted paid ad traffic. We built a modular landing page system tuned for speed and testing.

A direct-to-consumer brand running paid acquisition across four channels, where every campaign needed its own landing page and every page was built from scratch by whoever was free. Pages took two weeks, which meant campaigns were planned around engineering availability. The engagement was six weeks, scoped to remove that dependency entirely, not to make one better page.

Design & Web

What people were running into

Building landing pages from scratch for every campaign was slow, inconsistent, and hard to test against paid traffic cohorts.

The pages were also slow. Built ad hoc, each shipped its own fonts, its own hero image at full size, and a client-side test script that blocked render. On the mid-range Android phones that most of the paid traffic actually arrived on, the ad's landing page took four seconds to become readable, and the bounce data showed most of that traffic leaving before it did.

We created a modular landing page framework with high-converting sections, fast edge rendering, and built-in variant testing.

The solution

Design decisions

Designed a library of high-converting section templates

The section library was drawn from what had converted in the brand's own previous pages, not from a general set of patterns.

Built sub-second Next.js SSG templates hosted on Vercel Edge

Pages are statically generated and served from the edge, with subset self-hosted fonts and the hero preloaded at its rendered size.

Structured pages around one clear conversion action

Each page carries one conversion action, so the section library has no arrangement that produces two competing asks on one page.

Instrumented variant tracking for rapid A/B testing

Variants resolve at the edge before the page is served, with the primary metric and minimum sample declared before a test starts.

Process

Phase by phase

  1. Phase 1: Traffic & Funnel Audit

    Paid Ad Conversion Analysis

    Audited landing page bounce rates and ad click-through conversion friction across paid marketing campaigns.

    • Funnel Bounce Audit
    • Ad Alignment Spec
    • Conversion Benchmark
  2. Phase 2: Modular Component System

    High-Converting Page UI Kit

    Designed high-converting landing page layouts with sticky CTAs, hero video blocks, and social proof elements.

    • Modular Component Library
    • Figma Design System
    • Conversion Tokens
  3. Phase 3: Fast Sub-Second Edge Build

    Next.js SSG & Vercel Edge Setup

    Engineered Next.js SSG pages hosted on Vercel Edge with sub-800ms initial load times globally.

    • SSG Edge Pipeline
    • Speed Benchmark Report
    • Analytics Integration
  4. Phase 4: A/B Testing & Optimization

    Variant Testing & Campaign Launch

    Ran multi-variant A/B headline tests, achieving a +42% lift in lead conversions across paid channels.

    • A/B Test Dashboard
    • Campaign Conversion Report
    • Production Launch
Early classes, 6 am Draft

Built by Jo Park, Marketing · started 10:08 am · no engineering ticket

PublishPN

Section library

25 placeable
Search blocks
Hero · headline + video poster+1.1 ptsSticky ask bar+0.9 ptsShort form · 2 fields+0.8 ptsSign-up counter+0.6 ptsPrice vs membership table+0.6 ptsSavings calculator+0.5 ptsReferral progress+0.5 ptsHero · headline + still+0.4 ptsTimetable preview+0.4 ptsCoach cards+0.3 ptsFAQ · 5 questions+0.3 ptsMember quote+0.2 ptsLocation + hours+0.2 pts

Page

/early · mobile width preview
Hero · headline + still
6 am · RiversideDone before your inbox opens.45-minute classes from 6:00 am.
Timetable preview
Mon · Strength 456:15 amTue · Row & lift6:00 amWed · Strength 456:15 am
Short form · 2 fields
Book a 6 am class
Drop Sticky ask bar
Member quote“The 6:15 is the only hour nobody can book over.” · Riverside
FAQ · 5 questions
+ Do I need to book?+ What if I'm late?+ Is there parking at 6 am?
Single-action footer
Book a 6 am class

One goal

Book a 6 am classEvery ask block on this page uses this label. A second goal can’t be added.

Before it can publish

One conversion action Hero: headline, sub, still Timetable: site and 3 days Member quote: name and site FAQ: 5 of 5 answered Hero still ≤ 120 KB No render-blocking script LCP estimate 0.70 s · budget 0.8 s

Build clock

Brief to published
0h 52m0h< 2 hoursPages used to take two weeks and an engineer. This one is on its last block.
On screen

Assembling a page: a marketer drops library sections into the single-goal early classes page, 52 minutes on the build clock against the two-hour mark, with every publish check already green and the sticky ask bar on its way in.

Sub-Second Edge Rendering

Engineered with Next.js SSG for instant global page loads under paid ad traffic.

Pages are statically generated and served from the edge, so paid traffic hits a cached document instead of waiting on a render. Fonts are self-hosted and subset, the hero image is preloaded at the exact rendered size and everything else is deferred. That's what holds Largest Contentful Paint under a second on a mid-range phone over 4G, the condition most of the ad spend actually lands in.

What shipped
  • Statically generated, served from the edge
  • Self-hosted subset fonts; hero preloaded at rendered size
  • Tuned against a mid-range phone on 4G, not desktop fiber
Speed budget

Core Web Vitals per template · field data, last 28 days · a page over budget can't publish

Edit budgetPN
LCP, p75≤ 0.80 sMid-range Android, 4G
INP≤ 200 msTap on the ask
CLS≤ 0.05No shift from a variant
Hero image≤ 120 KBPreloaded at rendered size
Render-blocking0 KBBlocks a publish

Templates

Five templates in use · bars run to 1.6 s, the line is the budget
Template · pageLCPINPCLSWeightRender-blockingGate
OfferFree trial week0.76 s88 ms0.01212 KB0 KBPassing
Price tableClass pass 100.69 s82 ms0.00176 KB0 KBPassing
CalculatorCorporate membership0.69 s104 ms0.01184 KB0 KBPassing
ProgressRefer a friend0.63 s76 ms0.00121 KB0 KBPassing
EventOpen day, Riverside1.40 s238 ms0.121,860 KB212 KBBlocked

Why Free trial week paints at 0.76 s

Previous pages: ~4.0 s, test script blocking render
Document, edge cache
Subset fonts, self-hosted
Hero poster, preloaded
Below-fold blocks, deferred
0 s0.4 s0.8 budget1.2 s

Publish blocked

Open day, Riverside
Render-blocking212 KB · tour booking widgetlimit 0 KB
LCP, p751.40 slimit 0.80 s
Hero image1,640 KB · full sizelimit 120 KB
INP238 mslimit 200 ms
CLS0.12limit 0.05
Paused at 1.9% · rebuild from the libraryPublish
On screen

The speed budget: Core Web Vitals for each of the five templates, why the free trial page paints at 0.76 s (edge document, subset fonts, preloaded hero, everything else deferred), and the open day page's publish blocked on 212 KB of render-blocking script.

Section library

26 blocks · ranked by measured lift in sign-up rate across 140 campaigns

Find a blockPN

Ranked by lift

Lift: pts of sign-up rate vs pages without the block
#BlockKindLiftUsed inWeight
1Hero · headline + video posterHero1.164 / 140118 KB
2Sticky ask barAsk0.9121 / 1404 KB
3Short form · 2 fieldsAsk0.8118 / 1406 KB
4Sign-up counterProof0.657 / 1402 KB
5Price vs membership tableOffer0.622 / 1405 KB
6Savings calculatorOffer0.514 / 1409 KB
7Referral progressProof0.511 / 1404 KB
8Hero · headline + stillHero0.471 / 14096 KB
9Timetable previewInfo0.448 / 1407 KB
10Coach cardsProof0.339 / 14042 KB
11FAQ · 5 questionsInfo0.396 / 1403 KB
12Member quoteProof0.283 / 14018 KB
13Location + hoursInfo0.261 / 14011 KB
14First-visit stepsInfo0.244 / 1405 KB
15Class type gridInfo0.152 / 14036 KB
16Team logos stripProof0.117 / 14024 KB
17Single-action footerAsk0.1140 / 1402 KB
18Opening countdownOffer0.09 / 1403 KB
19Studio gallery · 4 stillsInfo0.033 / 140164 KB
20App previewInfo-0.121 / 14058 KB
21Benefit trioInfo-0.176 / 1406 KB
22Video testimonialProof-0.212 / 140210 KB
23Hero · headline onlyHero-0.226 / 1403 KB
24Map embedInfo-0.318 / 140188 KB
25Comparison vs other gymsOffer-0.415 / 1407 KB
26Long form · 7 fieldsAsk-0.940 / 14014 KB

Retired

Can't be placed
Long form · 7 fields−0.9 pts across 40 campaigns: the lowest of all 26. Existing pages keep it until rebuilt; new pages use the short form.Replaced by Short form · 2 fields+0.8 pts

What a block declares

Hero
Hero · headline + video posterheadlinetext · 8–60 charssubtext · ≤ 90 charsposterimage · 640 × 360 · ≤ 120 KBclipvideo · ≤ 30 s · loads on tapgoal labelfrom the page, not the blockRequired. A block with any left empty can't publish.

Locked to Corehaven tokens

Display800 · 40 / 1.04Askbrand · pill · 14 / 700Radius12 · 16 · 24

Modular Campaign UI Kit

On screen

The section library: all twenty-six blocks ranked by measured lift across 140 campaigns, the seven-field long form retired at the bottom, the fields a hero block must declare before it can publish, and the Corehaven tokens every block is locked to.

Reusable conversion blocks for quick campaign assembly and consistent brand styling.

A campaign is assembled from a fixed set of typed section blocks, so a new landing page is a content decision and not an engineering ticket. The blocks are locked to the brand tokens, which is what keeps twenty campaigns looking like one company. Each block declares the copy and media it needs, so a half-filled section can't ship.

What shipped
  • Pages assembled from typed section blocks, not from scratch
  • Blocks locked to brand tokens across every campaign
  • Required copy and media declared per block; no half-filled sections

Automated A/B Testing Engine

Built-in variant testing for headlines, hero media, and call-to-action buttons.

Variants are resolved at the edge before the page is served, so there's no flash of the control and no layout shift while a client-side script decides. Assignment is sticky per visitor and stable across sessions. Results are read against a pre-declared primary metric with a minimum sample set before the test starts, so a campaign can't be called the moment it happens to look good.

What shipped
  • Variant resolved at the edge: no flash of control, no shift
  • Sticky assignment across sessions
  • Primary metric and minimum sample declared before the test runs
Headline test exp-118

Free trial week · started Tue 03/03/2026 · variant resolved at the edge, sticky per visitor

Called · Variant B promotedPN
Primary metric, declaredTrial sign-up (form submitted)
Minimum sample, declared14,000 visitors per arm
CalledWed 03/11/2026 · day 9
Threshold95% confidence, both arms past minimum

Control

Retired
Free for 7 days · all 3 sitesYour first week at Corehaven is freeClasses, open gym and a coach intro.
Visitors14,220
Sign-ups441
Rate3.10%
Sample vs declared minimum14,220 / 14,000 ✓

Variant B

Winner · promoted
Free for 7 days · all 3 sitesTrain free for 7 days. No card, no contract.Every class, every site, from tomorrow morning.
Visitors14,186
Sign-ups624
Rate4.40%
Sample vs declared minimum14,186 / 14,000 ✓

Cumulative sign-up rate by day

Yellow: below declared minimum, not callable
Variant B Control

Result

Read against the declared metric
+42%sign-up rate, B over control3.10% → 4.40% at 95% confidence
No flash of control: resolved at the edge Assignment sticky across sessions Couldn't be called before day 9
On screen

A headline test, called: control and Variant B side by side with visitors, sign-ups and rate, both past the 14,000-per-arm minimum declared before the start, and the +42% lift called on day nine, not on day one when B first looked good.

What moved after the redesign

+42%

Landing page conversion

< 2 hours

Time to launch page

−31%

Ad bounce rate

Conversion is measured per campaign against the same channel's previous campaign, not across the account, so creative differences are held as close to constant as this allows. Bounce rate is mobile paid traffic specifically. Time to launch is measured from brief to published page for the pages the marketing team built unaided.

Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.

Principles that held

  1. 01

    Sub-800ms global page load time reduced mobile ad bounce rate by 31%.

    The bounce was mostly the render-blocking test script the previous pages shipped: paid traffic won't wait, and the test itself had been the cost.

  2. 02

    Modular component library allowed launch of new campaign pages in under 2 hours.

    Two hours is a marketing-team figure, not an engineering one, and that's the actual result: the dependency was removed, not shortened.

  3. 03

    Multi-variant A/B headline testing boosted campaign conversion rate by +42%.

    Headline testing gave the largest single lift because the headline is the one element every visitor reads, and it had never been tested.

Ways of working

How design and engineering worked together

01
  1. 01

    A cross-functional team of 3 worked on a fixed price basis over 6 weeks, covering Landing page system, Conversion design, Component kit. We ran two-week increments, each one shippable, reviewed with them before it merged. Decisions were recorded as they were made, so the reasoning survived the people who made it.

    Six weeks fixed price against a defined deliverable: a section library, an edge-rendered template and a variant harness. The brand's marketing team built the last two campaign pages themselves during the engagement, with the team watching, because a system that only its authors can operate hasn't removed the dependency it was built to remove.

Assemble a page

Why a page from the library can publish and the open day page couldn't

Load one of Corehaven’s pages as it was built, then add or remove blocks. The publish gate re-checks the load estimate against the budget, counts the asks and the ways out, and refuses anything the library doesn't hold. Switch the variant test to a client-side script to see where the old pages’ four seconds went. Use the arrow keys once a tab is focused.

Blocks · lift label from the library

Paid social

Free trial week

The page behind the console's top line: 41,208 visitors, 1,628 sign-ups.

Goal: Start my free week

Load estimate0.76 s
0 sbudget 0.8 s4.2 s
Asks
1
Ways out
0
Blocking
0 KB
Ready to publishOne ask, nothing outside the library, and the hero paints inside the budget.

As built: 3.95% sign-up rate, 0.8 s measured.

Illustrative load model: 0.34 s for the cached document and fonts, the hero’s own paint cost, 0.01 s per deferred block, and 3.2 s for a client-side test script. Lift labels are per block, measured across 140 campaigns; they are not additive.

Architecture

From a paid click to a painted page, variant already chosen

The old pages lost their traffic before they became readable, mostly to a test script that blocked render. Here every decision a page needs is made before it's sent, so paid traffic lands on a cached document instead of waiting on a render.

  1. 01 · Trigger

    Campaign brief and paid click

    • One page per campaign, four paid channels
    • Each page carries one conversion action

    No arrangement produces two competing asks

  2. 02 · Assembly

    Typed section library

    • Blocks drawn from the brand's own converting pages
    • Locked to the brand tokens
    • Figma system mirrors the code

    A block missing its copy or media can't ship

  3. 03 · Build

    Next.js static generation

    • Fonts self-hosted and subset
    • Hero preloaded at its rendered size
    • Everything else deferred

    Paint held under a second on a mid-range phone over 4G

  4. 04 · State

    Variant harness

    • Primary metric declared before the test
    • Minimum sample declared before the test
    • Assignment sticky per visitor

    A test can't be called just because it looks good early

  5. 05 · Delivery

    Vercel Edge and analytics

    • Cached document served from the edge
    • Variant resolved before the page is sent
    • Variant tracking in Vercel Analytics

    No flash of the control, no layout shift

Fast, honest, finished

Wasted clicks, false winners & broken pages

The page never waits on the test

Variants resolve at the edge before the page is served, so no client-side script decides while the visitor waits: no flash of the control, no layout shift. Load is judged on a mid-range phone over 4G, where the paid traffic actually arrives.

No test is called on a good day

The primary metric and the minimum sample are declared before a test starts, and assignment is sticky per visitor across sessions. Conversion is read per campaign against the same channel's previous campaign.

No half-filled page, no second ask

Each block declares the copy and media it needs, so a half-filled section can't ship, and each page carries one conversion action, so the library has no arrangement with two competing asks.

Paying for clicks that leave before your page loads? Scope your build in 3 minutes.

Scope your build
Have a project?

Let's talk

Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.