Teado · Growth analytics

Teado teacher funnel: from teado.ai to a paying, retained teacher

One page that shows every stage a teacher passes through, from the landing page to the first paid month, with the drop at each step and a warning where the drop is abnormal. It also records what is instrumented today on each surface, proposes the activation ("aha") moment and the retention levers, and lists the tracking work needed to make the numbers complete.

Surfaces
teado.ai · teacher.teado.ai
Data
Read replica · GA4 · Clarity
Refresh
Not loaded yet
Date
13/09/2026
Proposal for discussion, not a decision
Xuất xứ / Prompt / Giới hạn
This page answers a request made on 13/09/2026, verbatim: “suggest for me a funnel visual for teado to check teacher flow - each stage user has gone through like landing page/drop, signup, create account, onboarding/drop - each function... and drop. https://teado.ai/ -> https://teacher.teado.ai/ - Track data and give warning which stage is not good abour UI/UX and which stage has highest drop - Suggest to build aha moment, and retention optimization - Connect to Google Analytics to track users location, age as well if you need or build platform to track (check if any analytics code already setup in teacher.teado.ai code base (same code with teacher.flyer.us)) - Suggest me ideas to optimize users usge based on current product”. It was drafted by an AI assistant in one working session from the partner-web source (branch feat/es-locale, 29/08/2026), the teado-landing-page source, a headless-browser check of the live sites, the backend schema in flyer-backends, and, once the extraction script has been run, the production read replica. Nobody on the product team has reviewed it. Treat the stage definitions, thresholds and recommendations as a proposal to correct, not as an agreed specification.

1Summary

The teacher journey has eleven measurable stages. Eight of them can be counted today from the production database because the product already writes what it needs: the account row stores the landing UTMs and the source domain, the teacher profile stores every onboarding answer and every "viewed this feature" flag, and classes, assignments, AI-grading usage and subscriptions each have their own table. What cannot be counted today is the front of the funnel: teado.ai has no analytics at all, and teacher.teado.ai sends only page views to Google Analytics, so the landing-page drop and the signup-form drop are invisible.

Three findings shape the recommendations:

  1. The Teado host defaults new teachers to the "lite" version and skips the guided create-class step. After the onboarding form, a flyer.us teacher is sent to the exam library with a welcome modal that leads to "create your first class, add students". A Teado teacher is sent to the same library with no modal. The one screen that turns a visitor into a teacher with a class is skipped on the product that needs it most.
  2. Every new teacher receives ten sample assignments, ten sample students and a personal school. Useful for demos, but it hides the real activation rate unless every query filters them out. This page filters them.
  3. Microsoft Clarity is already recording sessions on teacher.teado.ai (injected by Google Tag Manager), so rage clicks, dead clicks and quick-backs per screen exist today. They are the UI/UX warning signal for Section 4; nobody needs to build a recorder.

The proposed activation moment is "a real student's work comes back graded, inside the first session", reached in three steps after onboarding (one class, one student link, one assignment). The proposed retention lever is a weekly "what your students did" report that only exists when there is student activity, which pulls the teacher back to assign again. The tracking plan adds nine GA4 events and five user properties, links the landing and app domains, and turns on Google Signals for age and location.

2What is tracked today

Verified on 13/09/2026 by loading both sites in a headless browser and listing the third-party requests, then confirmed in source. The picture differs sharply between the two surfaces.

SurfaceToolStatusWhat it capturesGap
teado.ai
Next.js 16, Vercel project "teado"
Google Analytics / GTMAbsentNothing. No script, no dataLayer.Landing visits, CTA clicks and the drop to signup are unknown. Every link to the app already carries utm_source=ldpteado with medium and campaign, so attribution exists on the app side only.
Facebook Pixel, ClarityAbsentNothing.Ads cannot optimise on landing events.
teacher.teado.ai
partner-web, shared with teacher.flyer.us
Google Tag Manager GTM-WNL6H6VMLiveLoads the tags below. dataLayer holds only gtm.js / gtm.dom / gtm.load; no product events are pushed.All downstream tools see page views only.
GA4 G-XWHVP4YV0E (in code) and G-P0HW70FSDY (from GTM)LivePage views on both properties; enhanced-measurement auto events if enabled in the property.No signup, onboarding, class, assignment or purchase events. Two properties receive the same hits; which one the team reads is not documented. Cross-domain with teado.ai is not configured because teado.ai has no tag.
Microsoft Clarity n8orfkthqtLiveSession recordings, heatmaps, rage and dead clicks, quick-backs, JS errors per URL.Not used for the funnel yet. Identify API not called, so a recording cannot be joined to a teacher.
Google Ads conversion tag 976672787LiveView-through conversion on page load.No purchase or signup conversion is sent, so bidding optimises on visits.
Facebook Pixel 1005592880615993PageView onlyPageView.No CompleteRegistration, no Purchase; no Conversions API.
Datadog RUM + LogsLiveRoute changes as actions, automatic click tracking, 20% session replay, errors.Engineering tool; the product team does not read it.
Backend (api.flyer.us)MixpanelDisabledInitialisation is commented out in _app.tsx; three track() calls remain and do nothing.Remove or revive; today it is dead code.
Product databaseCompleteusers keeps source domain, auth provider, country and UTMs; teacher_profiles.onboarding_info keeps every onboarding answer and every viewed_* milestone; classes, assignments, teacher_usage_ledger (AI quota used) and subscriptions are separate tables.This is the source of Section 3. It cannot see visitors who never signed up.
Consequence The funnel below has two halves. The right half (from account creation onward) is exact and available now. The left half (landing visit, CTA click, signup form started) needs the events in Section 7 before it shows a number.

3The funnel

One row per stage, counted on teachers who signed up in the last 90 days. Each bar is the share of the first stage; the label shows the count and the conversion from the previous stage. A stage is flagged when its step conversion falls under the threshold in Section 4, and the largest single drop is marked. Hover a bar for the definition.

The sequential spine

Teado-origin signups
Numbers not loaded yet The extraction script has not been run, or funnel.json is missing. The rows below show the stage definitions; Section 9 explains the one command that fills them.

teacher.flyer.us against Teado

Same window and the same stage definitions for both sources.

Load funnel.json to fill this.
Twice the signups, less than half the assignment rate teacher.flyer.us brought in 1,359 accounts over 90 days, twice Teado's 690, and clears the first two steps slightly better: 89.6% submit the onboarding form against 89.0%. From the feature screen onwards it is behind. Only 4.9% ever set a real assignment, against 9.1% for Teado. At the step that matters most, a student handing work back, the gap is widest: 0.8% against 2.3%. In absolute terms the two sources land in the same place — 66 teachers assigning against 63 — but teacher.flyer.us needs twice the signups to get there.
How to read this The two sources are not the same kind of person. teacher.flyer.us takes both teachers invited by a centre and teachers who find the product themselves; Teado is mostly self-serve signups off the landing page. The rate gap is therefore not evidence that one interface is better. What is certain is that both stall in the same place: the gap between finishing the form and setting the first assignment. Paid is zero in both columns because the whole subscriptions table holds one row, which means purchases are not flowing into it — not that nobody has paid.
Read the late stages as parallel, not sequential Steps 4 to 8 are a genuine sequence: each one requires the one before it. Steps 9 to 14 are things a teacher may do in any order, so the "of prev" percentage on those rows compares two independent populations and should be ignored. Opening AI grading, claiming the trial and assigning work are separate acts, and a teacher can do any of them without the others.

Stage definitions

Stages 1 to 3 are invisible until the Section 7 events exist. Stages 4 to 14 are computed from the replica with the fixture filters applied.

  1. 1
    Landing visit
    A session on teado.ai. Needs GA4 on the landing page. Not counted today.
  2. 2
    CTA click to the app
    Click on any "Try free / Sign up" link; every link already carries utm_source=ldpteado&utm_medium=button&utm_campaign=header|hero. Needs a cta_click event. Not counted today.
  3. 3
    Signup form started
    Arrived on /signup and chose Google or phone. Needs sign_up_start. Not counted today.
  4. 4
    Account created
    users row, Teado-origin when source_domain or utm_source contains "teado". Auth provider is stored (Google or phone OTP).
  5. 5
    Account verified / active
    users.state active, or a teacher profile exists. Phone signups pass an OTP screen (/verify-account) first.
  6. 6
    Onboarding form submitted
    The role + profile form on /onboarding calls viewerCreateTeacherProfile, which creates the teacher_profiles row. This is the first "create account" step in the request.
  7. 7
    Onboarding questions answered
    onboarding_info contains number_of_students, school_name, is_freelance_teacher or what_curriculum_teaching. Distinguishes teachers who filled the form from those who skipped it.
  8. 8
    Reached a feature screen
    Any viewed_* flag (exam library, classes, students, program, AI grading). The app writes these itself.
  9. 9
    First real assignment
    assign_tests with is_sample=false. The ten sample assignments every teacher receives are excluded. Measured 02/10/2026: 62 of 617 Teado teachers, and 51 of those 62 had never created a class of their own.
  10. 10
    Created own class
    classes with is_sample=false created at least 10 minutes after the profile. Only 14 Teado teachers did this in 90 days, because the auto-created sample classes already give them somewhere to assign. This step sits after the assignment on purpose: it is the rarer act, not the earlier one.
  11. 11
    Opened AI grading
    A viewed_ai_grading_speaking or viewed_ai_grading_writing marker in onboarding_info. The original definition used teacher_usage_ledger.used > 0, which is unusable: that table holds exactly one row for the entire product. This stage therefore measures reaching the screen, not completing a grading run.
  12. 12
    A student handed work back
    A user_attempts row pointing at one of the teacher's non-sample assignments. This is the proposed aha moment (Section 5). The original definition used profile_completed_ids, which is populated on only 89 of 60,676 non-sample assignments and repeats the same learner id dozens of times, so it understated this stage to nearly zero.
  13. 13
    Trial claimed
    teacher_profiles.trial_expires_at is set. The current offer is a 7-day trial.
  14. 14
    Paid
    A teacher_subscriptions row pointing at a teacher_packages entry priced above zero . The two live packages are TEADO_TOOL at 2,490,000 VND and TEADO_TOOL_PLUS at 4,800,000 VND, both for 365 days. Zero-price packages count as trial, not revenue. No purchase is observable yet: the whole subscriptions table holds one row, and one activation code has ever been used.

Weekly cohorts

Signups by week with the count reaching each key stage, so a change in the funnel can be dated. Recent weeks are not mature: a cohort needs about four weeks before its assignment and paid counts settle.

Week ofSignupsProfileClassAssignmentAI useStudent submitPaid
Load funnel.json to fill this table.

Who signs up on Teado

Onboarding answers appear here after the script runs: role, freelance or school, number of students, curriculum, how they heard of Teado.

Where they come from

UTM source / medium / campaignSignupsProfileAssignPaid
Filled from users.utm_*.
Sign-in methodSignupsProfileAssign
Country (users.country_code)SignupsAssign

4Where the drops are, and the UI/UX warnings

A drop is only a problem relative to what the step should convert. The thresholds below are starting values taken from typical self-serve B2B SaaS onboarding; the team should replace them with Teado's own trailing 90-day median once three months of data exist. The page applies them automatically.

StepWatch underCritical underUsual cause when it is low
Landing visit to CTA click8%4%Message does not match the ad; CTA below the fold on mobile; language switch mid-page.
CTA click to account created50%30%Phone OTP delivery; Google button fails on in-app browsers (Zalo, Facebook); form asks too much.
Account created to onboarding form submitted85%70%Role choice unclear; school picker slow; required "Họ" field; page reload loses state.
Onboarding submitted to first real class45%30%The guided step is skipped on Teado (lite default); the library is shown instead of the class wizard.
First class to first real assignment60%40%Empty class (no students); library filters; the ten sample assignments make the list look already full.
First assignment to first student submission50%30%Students never received the class code; assignment scheduled too far ahead; parents, not students, hold the device.
Student submission to trial claimed40%25%Trial is offered before value is felt; quota exhausted without explanation.
Trial to paid15%8%Price shown per day (13,000 VND/day) versus per package; payment only by transfer or VNPay; no reminder before expiry.
Retention week 2 / week 440% / 25%25% / 15%No reason to return: nothing new from students; no weekly summary; assignments are one-off.

UI/UX warnings per screen (from Clarity)

Clarity already records every teacher.teado.ai session. The signals below, read per URL in the Clarity dashboard, tell whether a low step is a design problem or a demand problem. Until the Identify call in Section 7 is added, recordings cannot be joined to a teacher, but the per-URL rates already work.

ScreenSignalWarn whenReads as
/signup, /verify-accountQuick-back rate, JS errorsquick-back > 20%; any error spikeOTP or Google login failing; a design fix, not a marketing fix.
/onboardingDead clicks on the role cards; rage clicks on "Tiếp tục"; scroll depthdead clicks > 5% of sessions; rage clicks > 2%The form blocks on a validation the user cannot see (required last name, school not selected).
/explore (first landing after onboarding)Exit rate on first visit; time to first clickexit > 40% within 30 sThe library is not a next step; the teacher does not know what to do. Supports Section 5.
/onboarding/create-class, /classesAbandon between "create class" and "add student"> 50% leave after class creationAdding students is the friction; the class code sharing flow needs a Zalo-ready message.
/flyer-ai (AI grading)Rage clicks on upload; JS errorsanyUpload or quota errors; the quota message must say what is left and how to get more.
/package, /billingExit rate; dead clicks on price cardsexit > 70%Price or payment method, not interest. Compare with trial-to-paid.
Rule for the warning badge The page marks a stage "Largest drop" for the biggest absolute loss between adjacent stages, "Critical" or "Watch" from the thresholds above, and prints the Clarity signal to check next to it. A stage is a UI/UX problem when Clarity shows friction on that screen; it is a demand or expectation problem when the screen is calm and people simply leave.

5The aha moment

The product sells time saved on grading and reporting. A teacher believes that only when a student's work comes back marked without the teacher doing it. So the proposed activation event is: a real student submits an assignment and the teacher opens the graded result, within the first session or the first 48 hours. In the database this is stage 12 (first non-sample assignment with a completed profile) plus the teacher viewing it, which the tracking plan adds as result_viewed.

Why this and not "created a class" or "used AI grading once": a class without students is an empty room, and one AI grading on the teacher's own upload proves the model works but not that the workflow fits a classroom. The submission is the first moment the product did work the teacher did not do.

The shortest path to it, on the current product

  1. Bring back the guided create-class step on Teado. Today router.replace(EXPLORE + (isLite ? '' : '?showWelcomeV3Modal=1')) drops the welcome modal for lite users. Showing it on Teado is a one-line change and puts every new teacher in front of "create your class" instead of a library of 6,000 tests.
  2. Make the first assignment a demo the teacher can finish in five minutes. Pre-select one short test matching the curriculum answered in onboarding (the answer is already stored in what_curriculum_teaching), pre-fill one student as "me", and let the teacher submit as that student to see the graded result at once. This produces stage 12 inside the session, then invites real students.
  3. Give the teacher a ready-to-paste Zalo message with the class code. The student-add step already has a copy button; the message should contain the link, the code and one sentence for parents. Most Vietnamese classes are organised in a Zalo group, so this is the real invitation channel.
  4. Show the "first result" state explicitly. When the first real submission arrives, the home screen should open on that graded result with the time saved ("Graded in 40 seconds"), not on the class list.

Target to validate: the median profile to first submission time falls under 48 hours, and the share of Teado signups reaching stage 12 within 7 days doubles from its baseline. Both numbers are on this page once the script has run (Section 3, time-to-stage tiles).

6Retention

Teacher churn on FLYER is already measured: individual teachers churn at 84.8% year on year while B2B centres churn at 17.4% (data.flyer.vn/teacher-metrics). Teado sells to the individual teacher, so the retention design has to create the habit a centre imposes by contract: assign every week, look at results every week.

LeverWhat it doesWhy it fits the current productMeasure
Weekly student reportEvery Monday a summary of submissions, scores and the students who did nothing, with one button "assign this week's test".The data already exists (assignments, attempts, monthly report screen). The report is empty for teachers with no students, which itself nudges stage 9–10.Week-2 and week-4 active rate (Section 3 tiles).
Assignment scheduleLet the teacher set a weekly slot once; the app proposes the next test each week.assign-schedule and viewed_assign_schedule already exist; the feature needs a default, not a build.Share of teachers with two or more assignments in 30 days.
Trial that starts at value, not at signupStart the 7-day trial when the first real submission arrives, and say what the trial unlocks in the teacher's own numbers ("120 speaking recordings left").trial_expires_at and can_claim_trial are per profile; the ledger knows the quota.Trial-to-paid conversion.
Expiry and quota messages with a next actionThree days before expiry and when a quota reaches 80%, an in-app message with the package that matches their usage.The lite version redirects blocked routes to / silently today; a teacher who hits a limit should see why.Paid conversions within 7 days of the message.
Student-side pullStudents and parents get the result notification with the teacher's name, so the teacher is asked "when is the next test".Notifications exist on the learner side (7.5M rows); this is a template, not a feature.Repeat assignment rate.
Win-back at day 21If no action for three weeks, one message that shows what changed in the library for their curriculum.Curriculum answer stored in onboarding; library has level and curriculum tags.Reactivation rate.

7Tracking plan (GA4, Clarity, replica)

The principle: the database stays the source of truth for anything that happens after signup, and Google Analytics is added for the part the database cannot see (visitors, clicks, form starts) and for audience data (location, age, device). Nothing is built from scratch; the tags exist, they need events.

A. Landing page (teado.ai): add the tags that are missing

B. App (teacher.teado.ai): push product events to the dataLayer

One helper, track(event, params), that pushes to window.dataLayer and lets GTM forward to GA4, Facebook and Google Ads. Nine events cover the funnel:

EventWhere it firesParametersMarks as conversion
sign_up_start/signup when Google or phone is chosenmethodno
sign_upafter viewerSignUp succeedsmethod, host (teado | flyer)GA4, Facebook CompleteRegistration, Google Ads
onboarding_submitafter viewerCreateTeacherProfilerole, is_freelance, number_of_students, curriculumno
class_createdCreateClassStep successis_firstno
student_addedAddStudentStep successcount, methodno
assignment_createdassign success (non-sample)is_first, test_levelGA4 key event
ai_grading_usedspeaking or writing grading returnsfeature_code, is_firstno
result_viewedteacher opens a graded submissionis_firstGA4 key event (activation)
purchasesubscription code applied / payment confirmedpackage_code, value, currency, transaction_idGA4, Facebook Purchase (Pixel + Conversions API), Google Ads

Five user properties set once after login, so every report can be split by them: role, is_freelance, school_size, curriculum, teado_version (lite | full). They come from the same profile object the app already loads.

C. Audience data: location and age

D. Clarity: join recordings to the funnel

E. Keep the database as the source of truth

The extraction script in Section 9 produces this page. When the events above exist, the same script can pull the top-of-funnel counts from the GA4 Data API (or from the BigQuery export prepared earlier at admin.teado.ai) and prepend them to the same JSON, so one page keeps showing the whole path.

Housekeeping Decide which of the two GA4 properties (G-XWHVP4YV0E in code, G-P0HW70FSDY from GTM) is the one the team reads and remove the other from the container; delete the dead Mixpanel code; and set the Google Ads tag to fire on purchase and sign_up instead of page load.

8Ideas to raise usage on the current product

Each idea uses something that already exists in the code or the data. They are ordered by expected effect on the funnel over engineering cost.

  1. Show the welcome and create-class modal on Teado. One condition in the onboarding redirect. Directly addresses the largest structural drop (onboarding to first class).
  2. Start on "full" rather than "lite" for new Teado teachers, with the AI quota as the limit. The lite version hides the home dashboard and redirects blocked routes to / without a message. New teachers cannot know what they are missing. Keep the quota, drop the route limits, or at least replace the silent redirect with a screen that names the feature and the package.
  3. Use the onboarding answers. Curriculum, level and class size are stored on every profile and used for nothing after the form. Filter the library by default to the answered curriculum and propose one test per week from it.
  4. Turn the ten sample assignments into one guided example. Ten samples make the assignment list look full and hide the empty state that should push the teacher to assign. One sample, labelled as such, with a "try it as a student" button, does the demo job and keeps the metrics clean.
  5. Sell the trial after the first result, and say what it contains in numbers. The ledger knows the quota; the package page shows 13,000 VND per day. Teachers decide on "how many recordings for my 30 students per month", so show that.
  6. Freelance teachers are a distinct segment. The form asks it and stores it (is_freelance_teacher). Freelancers have no centre forcing a schedule, so they need the weekly report and schedule defaults most; the B2B path (school portal, invite teachers) should not be shown to them.
  7. Zalo-first sharing. Class code, assignment link and weekly report should each have a "copy for Zalo" message. Most of the student-side drop is the invitation never reaching the family.
  8. Fix the signup path inside in-app browsers once GA4 shows the browser split: open Google login in the system browser or lead with phone OTP when the user agent is Zalo or Facebook.
  9. Referral is already built (referral_code, ref_teacher_id, ref_completed_tasks) but not surfaced in the Teado flow. A "invite a colleague, both get a week" card after the first result costs a template.
  10. Empty states as instructions. A class with no students, a week with no submissions, a library with no filter: each should show the one action and the reward ("add students to receive the Monday report").

9How to refresh the numbers

The page reads /teado-funnel/funnel.json. The script that writes it lives outside the site so that database credentials are never deployed. Run it from a terminal on the analytics machine:

python3 ~/teado-funnel-build/funnel_query.py            # 90-day window, 12 weekly cohorts
DAYS=180 WEEKS=26 python3 ~/teado-funnel-build/funnel_query.py   # longer view
cd ~/Downloads/roadmap.flyer.us && npx wrangler pages deploy . --project-name=flyer-roadmap --commit-dirty=true

The script prints the distinct source_domain values it found, so the Teado filter (source_domain or utm_source containing "teado") can be checked against reality on the first run. It excludes sample classes and assignments, classes created within 10 minutes of the profile, and accounts that only have a learner profile. A cron entry can run it daily once the definitions are agreed; the other data pages on data.flyer.vn already use that pattern.

10Decisions to ratify

  1. Accept "first real student submission, viewed by the teacher" as the activation event for Teado.
  2. Show the welcome and create-class step on Teado (remove the lite exception in the onboarding redirect).
  3. Default new Teado accounts to the full version with a quota, or replace the silent lite redirect with an explanatory screen.
  4. Add GTM to teado.ai and configure cross-domain measurement; pick the single GA4 property of record.
  5. Implement the nine dataLayer events and five user properties in partner-web; add Clarity identify.
  6. Replace the threshold table in Section 4 with Teado's own trailing medians after three months of data.
  7. Reduce the sample fixtures from ten assignments to one guided example.
  8. Schedule the extraction script daily and link this page from the roadmap and from admin.teado.ai.

Sources: partner-web (src/pages/_app.tsx, _document.tsx, onboarding, providers/teado, constants.ts, hooks/useTeacherOnboardingInfo.ts), teado-landing-page (lib/i18n/dictionaries.ts), headless-browser request log of teado.ai and teacher.teado.ai on 13/09/2026, flyer-backends/flyer-go/db/schema/current.sql, memory notes on sample fixtures and teacher churn. Related: document index · teacher metrics · admin.teado.ai (BigQuery queries) · Roadmap