Case Study 04 · EdTech Funnel Engineering

Trial Test Challenge

A full lead generation funnel built around a free half-length practice exam, with a custom test platform, live cohort rankings, AI SMS agent, automated results emails, CRM auto-upsert, and a ranked live webinar that converts completions into booked consultations.

Industry

EdTech / Test Preparation

Build Time

4 to 5 days, iterative

Platform Cost

$0 per month (Cloudflare free tier)

Stack

Cloudflare Worker + D1 · Activepieces · GHL · Airtable · Facebook Ads

1,000 Target completions
159 Questions across 3 year levels
4-5 days Full build time
$0 Monthly infrastructure cost

A warm list with weak engagement and no scalable lead event.

The business had a list of several thousand parent contacts and cold ad traffic, but email open and click rates were below average, meaning email alone could not hit the lead targets for the term. There was no existing event or mechanism to convert cold traffic into diagnostic data, webinar attendance, and booked consultations simultaneously.

The target was 1,000 completed tests in a 9 to 12 day window. A realistic email ceiling sat around 250 to 400 completions from multiple sends. Reaching the target required a multi-channel approach where every partial action (a form fill, a started test) became a contactable lead, and every channel ran automatically without manual effort.

Before

  • No scalable lead event for the term
  • Below-average email engagement, unable to carry the target alone
  • No diagnostic data on prospective students
  • Paid ad leads captured but not immediately nurtured
  • Manual follow-up required for every incomplete
  • Sales team had no pre-call brief or data on each family

After

  • Free practice test as a live-ranking event with built-in urgency
  • Every paid lead captured and nurtured by AI SMS agent instantly
  • Per-subject diagnostic data on every completing student
  • Automated results email, webinar flow, and consultation CTA
  • CRM auto-upsert with caller rotation, no manual imports
  • PDF call brief generated per student, ready before the sales call

A free test is a lead magnet. A free test with a live ranking is an event.

The design principle that shaped everything: show enough to hook, withhold enough to sell. Students see their score, subject breakdown, and live rank immediately on submission. The deeper analysis (which question types cost the most marks, pacing diagnostics, cohort context) is reserved for the internal call brief and the consultation call.

Correct answers are never shown at submission. Worked solutions are released only after entries close, protecting both the rankings and the reason to attend the webinar. Withholding final rankings and worked solutions until the live webinar is what converts a free test into webinar attendance, and webinar attendance into consultation bookings.

The ranking creates the deadline. The deadline creates the webinar. The webinar creates the consultation. Every step in between is automated.

From ad click to booked consultation, fully automated.

📣

Traffic

Email, SMS, FB group (warm) + Facebook Lead Form (paid)

📋

Capture

Lead form or direct registration. Every entry lands in CRM before the child sits anything

⏱️

Test

65 to 87 min exam, real pace, server-side scoring, live rank on submission

📊

Nurture

Instant results email, webinar registration CTA, AI SMS agent for paid leads

📅

Convert

Live rankings webinar, worked solutions, free results consultation booking

Custom built in 4 to 5 days. Zero off-the-shelf tools could do this.

No existing quiz platform offers live cohort rankings, per-section exam timers, CRM writes, and gated internal reporting in a single tool. The platform was built from scratch on Cloudflare: a Worker for all backend logic, a D1 (SQLite) database for attempts and registrations, and a single-file frontend served via Cloudflare Pages, embedded on the main website in an auto-resizing iframe.

01

Question serving and server-side scoring

Correct answers are never sent to the browser. The Worker serves questions with answers stripped and scores server-side on submission, storing per-section times and computing live rank. Viewing page source reveals nothing. 159 questions across three year levels, each with a topic label powering the call brief analysis.

02

Live leaderboard

A public rankings endpoint serves first name plus last initial, score as X out of total, per year level. Updates live as completions come in. Students and parents can see where they sit against every other participant in their year group immediately after submitting.

03

Exam UX built for genuine test conditions

One question at a time, tappable answer cards, a jump grid that fills as questions are answered, a sticky countdown turning red in the final minutes, inline diagrams, and full reading passages attached to every comprehension question. Each section closes automatically when time expires with no revisiting. A break screen between sections. Auto-scroll to top on every question change.

04

Internal toolchain: call briefs and rankings dashboard

Every completion generates a key-protected PDF call brief, rendered fresh from the database each time it is opened. It contains contact details, wrong-versus-blank split per subject, per-section timing, an analysis narrative, call talking points that adapt to the data, and a question-type table per subject. A separate internal dashboard shows live year-level tabs with every participant, subject scores, times, contact details, and one-click brief links.

05

Iframe embedding with postMessage

The app runs inside the existing website via an auto-resizing iframe. The app posts its height to the parent page, eliminating the double scrollbar, and posts scroll-to-top requests so section changes bring the page back to the timer. The same postMessage channel carries analytics events used for ad optimisation.

Every action writes to the CRM automatically.

Every registration and completion writes into the existing Airtable Sales Sheet the sales team already works from, so trial test leads appear directly in the calling pipeline with no imports or copying.

Moment What the system writes
Paid ad lead via Facebook Lead Form Lead lands in Airtable and GoHighLevel simultaneously before the child has sat anything. AI SMS agent starts the conversation within minutes.
Test completion (existing contact) Appends trial test tag and full results block to existing record: test name, date, total score, all three subject scores, rank at completion, assigned caller, and the call brief PDF link.
Test completion (new contact) Creates a new row with parent details, email, phone (normalised format), child name, and year level. Matching by email or phone, so duplicate records are not created regardless of formatting differences.
Caller rotation Two callers alternate automatically via the S2 Caller field. Every trial test lead arrives pre-assigned in the calling pipeline with no manual allocation.

Data hygiene rule: the system only fills in existing records when those fields are empty, never overwriting manually maintained CRM data. Year level rolls over automatically each January without any code changes.

Paid leads nurtured by AI within minutes of the form fill.

Conversations run inside GoHighLevel under one agent name, with a deliberately constrained division of labour: the automated workflow sends every outbound message, and the AI agent is strictly reply-only, answering only what the parent actually asked and steering back to two goals: sit the test and register for the webinar.

Reply-only, never initiates

The workflow owns cadence, the agent owns conversation. No double-texting, one voice per thread.

Never helps with test content

Any request for a hint or an answer is warmly declined. The ranking only means something if it reflects the child's own work.

Never quotes prices or promises outcomes

Pricing and placement conversations are routed to the human team via a booking link.

Texts like a person

One or two sentences, no emojis, no exclamation marks, at most one question per message. Deadlines stated as facts, not threats.

Separate capture from completion.

The cold-traffic problem with a long test is drop-off: most parents will not sit their child down for an 87-minute exam at the moment they see an ad. The solution was to separate capture from completion. Paid traffic converts on a Facebook Lead Form, a ten-second native action, and the automation then walks the captured lead to the test in their own time via SMS and email simultaneously.

The worst case for a paid click is a captured, contactable lead rather than a lost visitor. The AI SMS agent and the confirmation email both carry the test link, and the Saturday deadline provides the built-in urgency to complete.

After entries close, creative flips to webinar-only registration for the Sunday reveal, so the final 24 hours of spend still convert.

Built entirely on free-tier infrastructure.

Component Technology Purpose Cost
Test backend Cloudflare Worker All logic: question serving, server-side scoring, ranking, CRM writes, PDF generation Free
Database Cloudflare D1 (SQLite) Attempts, registrations, per-section times, all participant data Free
Frontend Cloudflare Pages Single-file app embedded via iframe in existing website Free
Results email Activepieces Webhook from Worker triggers branded HTML results email within minutes of completion Existing
CRM Airtable Auto-upsert on every registration and completion, caller rotation, call brief links Existing
Paid lead intake GoHighLevel + Facebook Lead Form Lead form data flows to GHL and Airtable simultaneously, triggering AI SMS agent Existing
AI SMS agent GoHighLevel AI workflow Reply-only agent nurturing paid leads toward test completion and webinar registration Existing
Webinar Calendly + email Registration, confirmation with re-engagement question, reminder with agenda Existing

Integrity built into every layer.

Real cohorts only

No fabricated leaderboard entries. Existing students sit the test first so public traffic ranks inside a genuine cohort from day one.

One attempt per student

Enforced at registration and submission, stated up front, and defended by the AI agent when parents ask for a second go.

No answer leakage

Answers never reach the browser. Solutions release only after entries close. The agent declines all content help.

Honest claims throughout

Half-length is stated as half-length and framed as the point: same pace, same formats, half the sitting time. No placement promises, no invented statistics.

Analysis only asserts what it knows

The call brief refuses to invent: if per-section timing was not recorded, it says so rather than fabricating a pacing story. Small cohorts suppress rank-based talking points.

Expectation setting from first click

The page states plainly that it is the test itself, not a booking form, with a confirm dialog before any timer starts. Surprised parents are lost parents.

A reusable funnel infrastructure, not a one-off campaign.

The build is deliberately reusable. Adding a year level is a question-bank entry and one dropdown option; every downstream system (section timers, Airtable grades, call briefs) adapts automatically. The same platform, calendar shape, and automation stack can rerun each term with a fresh paper.

Each repeat iteration inherits a warm audience of prior participants, a proven toolchain, and progressively better data on what converts. The infrastructure built for this event is the template for every future lead event.

The entire platform, 159 questions across 3 year levels, live cohort rankings, instant automated results emails, AI SMS nurture for paid leads, CRM auto-upsert with caller rotation, PDF call briefs per student, and an internal rankings dashboard, was built by someone with a marketing background and no traditional programming experience. Every line of code was generated through Claude, directed by a clear understanding of the business problem and the data architecture needed to solve it.