Backlog · Teado.ai / teacher.flyer.us

Best Content Contest — teacher submission and ranking

A competition where teachers build lessons in the builder, publish them to Explore, and get ranked. The submission pipeline already exists in production; this document specifies the front door, the entry marker and the scoring layer that turn it into a contest.

Sprint
Backlog
Status
Draft — for approval
Priority
2 — Medium
Updated
06/09/2026
Turn the community shelf on Explore into content teachers compete to fill
Draft for approvalSections 3 and 4 are grounded in a direct read of the partner-web and admin-web codebases, so the “what already exists” claims are verifiable. Everything from section 5 onward is a design proposal. Unresolved items are listed in Open questions rather than assumed.

1Context and problem

FLYER wants to run a “best content” competition so that teachers publish their own material to the Explore shelf on Teado.ai. Three requirements were given: a landing page teachers can read, functions for teachers to submit content to Explore, and a ranking report that produces ten prize winners.

The starting point is better than it looks. A teacher can already build a lesson in the builder, publish it to the community, have it reviewed by an admin, and see it appear on Explore with their name printed on the card. That path is live in production today and is used rarely, because nothing points at it.

So the problem is not “teachers cannot publish”. The problem is that publishing is invisible, unrewarded and unmeasured. A contest is a good instrument against all three, provided it is built on the existing pipeline instead of beside it.

Design positionDo not build a parallel contest system. Add a front door, an entry marker and a scoring layer on top of the publish-and-review pipeline that already runs. A contest entry should travel exactly the same approval path as any other community item, so that everything built for the contest keeps working after the contest ends.

2Goals and success metrics

Goals

  • Grow the community shelf on Explore with material that other teachers genuinely use.
  • Activate the builder among teachers who have never created content on the platform.
  • Establish a repeatable mechanic — leaderboard, author statistics, review SLA — that keeps working outside contest season.
  • Direct new content toward the levels where the shared library is thinnest.

Success metrics

MetricDefinitionType
Approved entriesCommunity items approved inside the contest windowPrimary
Participating teachersDistinct teachers with at least one approved entryPrimary
Adoption depthShare of entries used by at least 5 teachers outside the author's schoolPrimary — measures quality, not volume
Builder activationEntrants who had never created content before the contestSecondary
Review turnaroundp50 and p90 hours from submit to decisionGuardrail
Rejection rateShare of entries rejected at first reviewGuardrail — a high rate means the brief or the checklist failed
Retention after the contestTeachers who publish again in the 30 days after the awardsThe real test of whether this was worth running
Baseline not yet measuredThe current number of community items and community authors has not been pulled from the analytics replica. Targets should be set against that baseline before the brief is published.

3What already ships today

Read from the current source, not assumed. Every row below is live in production.

CapabilityWhere it livesState
Content builder — 12 question types (multiple choice, gap fill, matching, drag and drop, word ordering, reorder, flashcard, passage, open ended, dropdown, audio response, interactive video), an AI question generator and themes/creator/[id], components/creatorLive
Publish to community — a modal with three visibility choices, of which one is “Public to the community — anyone can find and take this test”/exams, my-exams/components/publish-modal, mutation partnerPracticeCheckPointsPublish(community: true)Live
Content policy consent — a one-time gate a teacher must accept before publishing publiclyproviders/flyer/content-policyLive
Moderation queue — Pending / Approved / Rejected with a bilingual rejection reasontable check_point_review_requests; admin screen admin-web /users/check-point-requestLive
Community shelf on Explore — a “Community” source filter, with author credit printed on the card/explore, views/exam-libraryLive
Reuse signals — attempt counter per item, clone-to-my-library, assignment to classes, playlistscheckPoint.testCount, partnerPracticeCheckPointClone, assign_tests, featured playlistsLive
Consequence for requirement B“Functions so teachers can submit content to Explore” is a discoverability and copy problem, not a build. A teacher can already do it in four clicks — but only if they know that the publish action hides inside a bulk-selection toolbar in the test-library table. The work is to pull that path forward, not to invent it.

4What is missing

#GapWhy it blocks a contest
1No campaign conceptNothing marks an item as an entry. There is no window, no category, and no way to answer “how many entries do we have” without a hand-written query.
2No landing pageTeachers have nowhere to read the rules, see the prizes or find the button, and marketing has nothing to link to from Zalo or email.
3Submission is buriedThe builder has no publish exit. A teacher who has just finished a lesson must leave the builder, open the test library, tick a checkbox and find a toolbar. Drop-off will be heavy at exactly the moment of highest motivation.
4Review is a black boxStatus is one table column and the rejection reason is a tooltip. Against a deadline, a teacher rejected on day 12 needs to see why and resubmit.
5Authors get no feedbackNothing tells a teacher that 40 other teachers used their lesson. That number is the real prize and it is currently shown nowhere.
6No ranking of any kindReview is binary approve or reject. There is no rubric score, no leaderboard and no report that could defend a choice of ten winners.

5The flow end to end

One pipeline, three actors. Steps 3 and 6 already exist; the rest is the work.

Step 1
Discover
Zalo and email campaign, plus an in-app banner on Explore and the test library.
New · Marketing + FE
Step 2
Understand
The /contest landing page: rules, categories, prizes, rubric, live counters.
New · FE
Step 3
Create
The builder, unchanged. The call to action drops the teacher into question-type selection.
Exists
Step 4
Submit
One modal: choose a category, pass the eligibility checklist, accept the rules.
New shell over the existing mutation
Step 5
Review
The existing moderation queue, plus a rubric score and a contest filter.
Extend admin-web
Step 6
Go live
The approved item appears on Explore under the Community source with author credit.
Exists
Step 7
Earn
Other teachers assign or clone it and learners complete it. Metrics accrue to the author.
Instrument
Step 8
Rank and award
A daily leaderboard for teachers and a locked ranking report for the awards decision.
New · FE + BE

Timeline design — decide this first

Usage-based scoring punishes late entries: a lesson published on the last day has no time to be used. The fix belongs in the calendar, not in the formula.

PhaseLengthWhat happens
Announce1 week beforeLanding page live in countdown state, notify-me capture, Zalo push.
Submission window4 weeksTeachers submit. Review runs continuously against a 48-hour service level.
Usage window2 weeks after submissions closeNothing new is accepted, so every approved entry gets at least 14 days live before metrics freeze. This is what makes the ranking fair.
Judging1 weekThe jury scores the shortlist. The leaderboard freezes and is labelled provisional.
Awards1 dayWinners published on the same landing page, which then becomes the evergreen proof for the next round.

6Requirement A — the landing page

Route /contest inside partner-web, localised vi and en like the rest of the app, and readable when logged out so that it can be shared outside the product.

teacher.flyer.us/contest
Best Content Contest 2026Build a lesson. Publish it to Explore. Let thousands of teachers use it.
Join the contest   See the entries
128entries approved
54teachers competing
11 daysleft to submit
10prizes
How it works1 · Build in the builder → 2 · Submit to the contest → 3 · Reviewed within 48 hours → 4 · Live on Explore, earning points
CategoriesWhich level bands and content types are open
How you are scoredThe full rubric, published openly
PrizesTen winning teachers, plus what every entrant keeps
Leaderboard — top 10, updated dailyRank · Teacher · School · Entries · Teachers using · Learners reached · Score, with a highlighted “your position: #23” row for a signed-in participant
FAQCan an older lesson be entered? Can an entry be edited after submitting?
Rules and content policyLinks to the policy the publish gate already enforces

The counters and the leaderboard read live data. A static poster goes stale on day two and stops being worth revisiting, which removes the main reason a teacher would return to the page mid-contest.

Four states, one page

StateHeroPrimary action
CountdownDates and “opens in N days”Notify me — captures teachers before day one
RunningDays left and live countersJoin / Submit an entry
Judging“Submissions closed — results on 20/10”Browse the entries, which drives Explore traffic while judging runs
EndedWinners, with their lessons embeddedBrowse winning content · Register interest for the next round

Copy notes

  • Lead with the audience, not the prize. “Let thousands of teachers use your lesson” motivates more durably than a cash figure, and it stays true after the contest ends.
  • Publish the rubric on the page. A contest judged by hidden criteria produces one round of entries and no second round.
  • Logged-out visitors see everything except the submit button, which becomes “Sign in to join”. The page then doubles as an acquisition asset for Teado.ai.

7Requirement B — submission

The mutation exists. The design work is putting it where the teacher already is, and making the aftermath legible.

Three entry points, one modal

Entry pointPlacementWhy there
Builder exitAfter Save in the editor header: a success sheet whose primary action is “Submit to the contest”The highest-intent moment. The builder has no publish exit at all today, which makes this the single highest-leverage change in the proposal.
Test library rowA row action and a bulk-toolbar action in /exams, beside the existing publish actionCovers the teacher who wants to enter a lesson built last month.
Contest page“Submit an entry” opens a picker of eligible items from the teacher's libraryCovers the teacher who arrives from the campaign rather than from inside the product.
Submit to the contest — modal
Unit 5 — Present Perfect, A218 questions · 12 min · 4 question types
CategoryA2 grammar practice ▾
VisibilityPublic to the community — required to enter
Eligibility — checked automatically✓ At least 10 questions   ✓ Level set   ✓ Every question has an answer key   ✓ Cover image   ✗ Description is empty — add one
☐ This is my own work and follows the content policy  ·  ☐ I accept the contest rules
Submit entry Cancel Reviewed within 48 hours. An entry that comes back can be edited and resubmitted.

The eligibility checklist is the quality lever. It rejects thin entries before a reviewer spends time on them, and it teaches the standard while the teacher is still in a position to fix it.

After submitting — “My entries”

A tab on the contest page, mirrored as a filter in /exams. One card per entry.

Unit 5 — Present Perfect LiveApproved 12/09 · 34 teachers using · 812 learners · rank #23
Listening — At the airport In reviewSubmitted 2 hours ago · usually reviewed within 48 hours
Vocabulary — Weather Needs a fix“Questions 4 and 7 have two correct answers.”   Edit and resubmit

Three deliberate choices. The rejection reason is shown in full rather than as a tooltip. “Rejected” is renamed “Needs a fix” and carries a resubmit button, because inside a contest a rejection should read as a rally rather than a verdict. And a live entry shows the two numbers that make an author feel paid: teachers using it and learners reached.

Notifications

  • Approved / needs a fix — in-app, plus the channel the teacher already receives reminders on. Both deep-link to the entry, not to a generic list.
  • Weekly during the usage window — “Your lessons were used by 12 new teachers this week. You moved to #18.” This is the mechanic that brings entrants back, and it is worth keeping for every community author after the contest ends.

8Requirement C — ranking

Two surfaces, deliberately different. Teachers need motivation and a sense of fairness; the awards committee needs an auditable table.

Public leaderboard, on the landing page

  • Top 20 teachers, refreshed daily at a fixed hour so the number is stable enough to discuss.
  • A pinned “your position” row for the signed-in participant, even at rank 87. The gap to the next rank is what drives another submission.
  • Component columns visible — entries, teachers using, learners, jury score — not only a total. A single opaque number invites accusations; visible components invite effort.
  • Ranked by teacher, not by item, because the prize goes to ten people. A separate “best entries” shelf highlights individual lessons and doubles as merchandising for Explore.

Internal ranking report, in admin

Column groupFields
IdentityTeacher, school, domain, date of first submission, number of entries
QualityJury score per criterion, reviewer names, divergence flag, shortlist yes or no
AdoptionDistinct outside teachers who assigned or cloned the entry, playlist adds
UsageDistinct outside learners with a completed attempt, completion rate, average score
IntegritySelf-traffic share, near-duplicate flag, bulk-submission flag, policy strikes
OutcomeComputed score, rank, manual override with a mandatory note, final lock

Two functions matter beyond display. CSV export, because the awards conversation will happen in a meeting and a spreadsheet. And lock the ranking, which freezes the metric snapshot with a timestamp so that the winners list cannot silently drift after it is announced.

9Scoring model

Three components. Human judgement dominates, because the goal is good content rather than viral content, but adoption and usage keep the jury honest and give teachers something they can influence daily.

Quality — jury rubric. Four criteria scored 1 to 5: pedagogical accuracy, fit to the stated CEFR level, engagement and creativity, completeness of media, instructions and answer keys. Two independent reviewers, a third if they diverge by more than 3 points.50%
Adoption by peers. Distinct other teachers who assigned, cloned or playlisted the entry. Log-scaled, so 40 against 20 matters and 400 against 380 does not.30%
Learner usage. Distinct learners outside the author's own school who completed the entry. Log-scaled the same way.20%

A teacher's total is the sum of their best three entries. One outstanding lesson can win; a teacher who uploads thirty thin lessons cannot buy a rank with volume.

Anti-gaming rules

RiskRule
The author assigns the entry to their own 200 studentsAttempts by learners in the author's own school or domain are excluded from the usage component entirely.
Colleagues at the same centre boost each otherAdoption counts distinct teachers outside the author's school and domain.
Bulk AI dumpsAn eligibility floor of at least 10 questions with complete answer keys and a description, near-duplicate detection on titles and question hashes, and only the best three entries counting.
Recycled or copied materialThe existing content policy consent plus a reviewer check. One policy strike disqualifies the entry, a second disqualifies the teacher.
Late entries disadvantagedSolved in the calendar: submissions close two weeks before metrics freeze.
Point the brief at a real gapThe shared content library is dense from Pre-A1 to B1 and thin above it. B2 holds a fraction of the material of every level below it, and C1 and C2 have full IELTS mock tests but almost no short practice items. Weighting the categories toward B2 and above — a category multiplier, or simply reserving prize slots — turns a marketing campaign into content the platform is genuinely short of. The figures should be confirmed with Academic before the brief is published.

10Data and technical design

Entries could be derived, and that is not enough

An entry set can be derived with no backend change at all: community-published, approved, inside the date window. That is enough to launch and not enough to run the awards, because it cannot hold a category, a jury score, a frozen metric snapshot or a manual override, and every ranking question becomes a hand-written query.

Recommendation: one campaign table and one entry table, added in the first sprint.

campaigns
  id, slug, name_vi, name_en, status,
  submit_open_at, submit_close_at, metrics_freeze_at, announce_at,
  categories[], rules_url, prize_config

campaign_entries
  id, campaign_id, check_point_id, teacher_profile_id, category,
  submitted_at, review_request_id,          -- reuses the existing queue
  jury_scores[], jury_avg,
  adoption_count, learner_count,            -- snapshotted at freeze
  computed_score, rank, is_disqualified, override_note

Two properties to preserve. campaign_entries points at the existing review request rather than duplicating moderation, so a contest entry travels the same approval path as any other community item. And the metric columns are snapshots taken at freeze time rather than live counts, so a published ranking stays reproducible.

Metric definitions

MetricSourceExclusions
AdoptionDistinct teacher profiles that created an assignment from the entry, cloned it, or added it to a playlistThe author; any teacher in the author's school or custom domain; sample or auto-generated assignments
Learner usageDistinct learner profiles with a completed attempt on the entryLearners belonging to the author's school or domain
QualityRubric scores captured on the review request
Known trap in the assignment dataEvery teacher receives auto-generated sample assignments on signup, and the assignment table's teacher column is unreliable — the teacher profile column is the one to join on. Any adoption query must exclude sample rows, or the numbers will be inflated for every teacher equally and the ranking will be noise.

API surface

  • GET /campaign/:slug — campaign config, live counters, leaderboard page. Public, cacheable for a few minutes.
  • POST /campaign/:slug/entries — submit; validates eligibility server-side, then calls the existing publish mutation. Client-side validation is a courtesy, not the gate.
  • GET /campaign/:slug/my-entries — status, reviewer note and live statistics for the signed-in teacher.
  • POST /admin/campaign/:slug/score — jury score on one entry.
  • POST /admin/campaign/:slug/freeze — snapshot metrics and lock the ranking.

11Review capacity

This is the operational risk that decides whether the contest feels good or embarrassing. A campaign that lands 500 entries against a 48-hour promise needs roughly 60 to 80 reviewer-hours across four weeks. The queue today is one admin screen with an approve button and a reject button.

  1. Automated gate — the eligibility checklist blocks incomplete entries at submission time, at no human cost.
  2. Reviewer pool — the contributors who already digitise content can clear the queue against a published checklist. They need one thing the current screen lacks: a preview of the actual lesson beside the decision, plus a rubric score field so that the pass doubles as first-round judging.
  3. Jury — only the top 40 or so by adoption and usage reach the real jury. Ten people judging 500 entries will not happen; ten people judging 40 will.
Do not publish an SLA operations has not agreed toA missed review promise during a contest is worse than no promise at all.

12Scope and phasing

PhaseShipsRough size
1 — Launch
before the announcement
Landing page with all four states · campaign and entry tables · submit modal with eligibility checks · builder exit call to action · entry list with status and reasons · contest filter and rubric field in the admin queue~2 sprints, 1 FE and 1 BE, design in parallel
2 — During
week 1 of the window
Daily leaderboard · author statistics on entry cards · weekly progress notification · integrity flags in the admin report~1 sprint
3 — Awards
before judging
Jury scoring screen · internal ranking report with CSV export and ranking lock · winners state on the landing page~1 sprint

If the deadline moves up

Cut in this order: the leaderboard becomes a weekly manual publish; the jury screen becomes a shared spreadsheet fed by the CSV export; the integrity flags become a manual check on the shortlist only. Do not cut the landing page, the submit modal or the entry status list — those three are what teachers actually touch.

Explicitly out of scope

  • Worksheets, playlists and Topic Talk as entry types in round one. Each is a different publish path with a different usage metric.
  • Any change to how community content is ranked or merchandised inside Explore itself.
  • Cash disbursement and tax handling for prizes, which is a finance process rather than a product one.

13Open questions

QuestionWhy it changes the designOwner
Which content types are eligible — builder tests only, or also worksheets, playlists and Topic Talk?Each extra type is a different publish path, a different eligibility rule and a different usage metric. The recommendation is builder tests only for round one.Product
Who sits on the jury, and how many hours can they give?Sets the shortlist size and therefore the whole scoring model.Academic
Prize structure — ten equal prizes or a tiered top three?Tiers require tie-breaking rules and a defensible margin between ranks; equal prizes do not.Marketing
Are contest entries permanently public?Affects the consent copy. A teacher who can withdraw a lesson after winning weakens the library; a teacher who cannot must be told clearly before submitting.Product + Legal
What is today's baseline of community items and community authors?Sets the target and the review-capacity plan. Requires a query against the analytics replica.Product
Which channel carries the campaign — Zalo, email, or in-app only?Determines the notification build in phase 2.Marketing
SourceSections 3 and 4 come from reading partner-web (views/exam-library, views/my-exams, components/creator, the generated GraphQL schema) and admin-web (pages/users/check-point-request). Everything from section 5 onward is a design proposal awaiting approval.