Case Study 04 · EdTech Funnel Engineering
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.
The Problem
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
After
The Core Idea
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.
The Funnel
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
The Platform
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.
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.
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.
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.
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.
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.
CRM and Automation
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.
The AI SMS Agent
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.
Paid Traffic Strategy
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.
Technical Stack
| 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 |
Design Principles
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.
Result
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.