Data 2022 – 2026 H1 (through Jun 2026) · gross fees (SGD) · internal
Marketing efficiency — cost per lead / trial / enrolment
Stream
Audience
Metric
Revenue & enrolment by year
Year
Revenue
Semester
Holiday
Adult
Camp
Revenue = gross course fees paid (SGD), attributed by registration (Created) date; four streams (Semester / Holiday / Adult / Camp), with the 10-day holiday intensive (10INT) counted as Holiday. Recomputed from source enrolment records. 2026 is part-year (through Jun, plus advance July signups).
Enrolment & funnel
Audience
Overall funnelYear (when contact first entered)
By branch
How students found us (self-reported)
From the “How did you learn of TGA?” field — all CRM contacts, regardless of whether they enrolled (87% of 5,697 filled, n=4,999). Chinese social = WeChat + Xiaohongshu + 狮城辣妈 forum; Friends/Referral = word-of-mouth.
Source mix by CRM sign-up year, semester-enrolled students only; bracketed on the axis = students with a source that year. 2022→2026: Instagram rose 1%→9%; Facebook Ads rose 11%→16%; Friends/Referral fell 32%→26%; Chinese social fell 14%→4%; Online Search ~30% throughout. 2022 inflated by migration backfill; 2026 part-year.
Three stages per channel: Contacts (CRM records with a source) → Did a trial (camp/holiday) → Enrolled in a semester class.
Labels show the two step rates: →trial = trial ÷ contacts, then →sem = enrolled ÷ trial. Hover a bar for both, plus the overall enrolled ÷ contacts.
Source: all three stages come from each student’s own Student Database record (channel, trial flag, semester enrolment) — one standardized source per student. Only the channel attribution (“how did you hear of us”) is self-reported.
→sem can exceed 100% (e.g. Other 2023): “enrolled” also counts students who went straight to a semester class with no trial, so on small channels enrollees can outnumber trial-doers. The Sankeys above separate the trial vs direct paths cleanly.
Adult retention is measured in quarters (8-lesson terms, ~Jan/Apr/Jul/Oct); each step is +1 quarter. ⚠ Note the semi-annual return pattern (+2q, not +1q) — flagged for ops review.
How this is counted: rebuilt straight from the semester sign-up records. A student "counts" for any semester they signed up for a semester class — trials, holiday camps (10INT) and waitlist-only entries are excluded; dropped-out students count only for the semesters they actually attended. Each student is placed in the semester (kids) or quarterly term (adults) they first started, then tracked forward. Every cell traces to real rows — nothing carried over from earlier hardcoded figures.
3-Day Go Camp → class conversion
Counts as a conversion
March camp — Q1 catch-up intake (cohort → converted, rate)
⚠ Punggol 2026 (76) includes 38 off-cycle January camp registrations — Punggol’s opening-period 3-Day Go Camp (13–18 Jan 2026), folded into this Q1 window. 0 of the 38 convert within 150 days (only 1 has enrolled in any semester product at all), but this batch is not really measurable: a January camp’s next natural intake is the July semester (~175 days out, just past the 150-day window), and July-2026 enrolment is still being entered. Treat as WIP.
June camp — main intake (cohort → converted, rate)
September camp — catch-up intake (cohort → converted, rate)
December camp — main intake (cohort → converted, rate)
Trial ROI: a kid camp trial is worth ~$446 in downstream course revenue (gross) — roughly 6× an adult intro-workshop (~$69). Kids convert ~26% of trials into semesters; adults ~10% into courses.
Lifetime value by starting age
Lifetime semester revenue and tenure by age at first enrolment (kids only; maturity-adjusted to those who started 2022–2024). Age 5–6: ~$2,100 over ~5.2 semesters; age 9–11: ~$1,500 over ~4.4 semesters. Bars = avg lifetime $ (left axis); line = avg semesters stayed (right).
New (first-ever) kid students per year, per centre. Each bar stacks the year’s two intakes: solid = January (H1), paler = July (H2). 2022 shows July only (its January was pre-Airtable migration, excluded); 2026 shows January only (July semester not in yet). Online excluded.
New (first-ever) adult students per year, per centre. Each bar stacks the year’s two intakes: solid = January (H1), paler = July (H2). Real course enrolments only — the Introductory Go Workshop (adult trial) is excluded, same as kid camps are. 2022 = Jul only, 2026 = Jan only. Online excluded.
Demand by region
Catchment map — each dot is an enrolled student's home (geocoded, colour = centre they attend), clustered into counts as you zoom out. Dashed rings mark 2 km (inner) and 5 km (outer) around each centre. Toggle centres top-right; ⍌ top-left for full screen; scroll to zoom while hovering the map. Homes are jittered ~50 m for privacy; PC ring is ~±1 km (new-mall postal). Needs internet to load the base map.
How far enrolled students travel to each centre — home postal → centre, straight-line km (all-time semester students). Medians: MC 4.0, KC 4.3, PC 3.8 km. Geocoded from OneMap building coordinates; 94% of enrolled students matched (Online/LingoAce students — who have no physical catchment — and ~6% with an unmatched/malformed postal are excluded). 20 recently-built addresses missing from the geocode set were added at neighbourhood-level (approximate). PC ~±1 km — Punggol Coast Mall's postal is too new for the geocode dataset, so PC is anchored on the nearest mapped Punggol Coast point.
Enrolled students by postal district & centre
District
MC
KC
PC
Total
Home postal district (Singapore postal sector → district) of enrolled semester students, by centre attended; sorted by total demand. A student attending two centres is counted under each (so columns match the travel chart). Based on postal sector, so it covers a few more students than the exact-geocoded map above.