Student Flow
Linear competition entry · 4 steps · prereqs gate each stepSitemap
Student Portal · Admin Portal · System- Forgot Password Prominent · prevents re-registration
- Continue Where You Left Off Primary CTA · jumps to the next incomplete step
- Submission Status After Step 4 · received, shortlisted, selected, or not advanced (with timestamps)
- Contest Timeline Submission deadline, results, award show
- Latest News Announcements and program updates
- Request Account Deletion Triggers manual review · CASL / privacy compliant
- Category required + optional topic tag for sponsor reporting
- Edit / Delete / Replace Anytime before deadline
- Confirmation Email With edit link · proves the submission landed
- FAQ Common signup, quiz, and submission questions
- Contact the Team Sends to
info@energycreates.comwith student context attached
- Student Profile Single-student view: progress, contact, history
- Submission Page Full submission · download files · approve / reject / restore
- Reject Reasons Logged Reversible · no Thinkific-style lock-in
- Inbound Email Emails to
info@energycreates.comreferencing a submission ID auto-attach to that record · manual attach also supported
- Shortlist Phase 1 · approve or reject the long list
- Scoring Phase 2 · 8-criteria, 100-point rubric
- Results Aggregated scores · winner selection
/api/progressRead/write student step progress/api/quizSubmit answers, return pass/fail/api/submissionUpload + edit submission/api/admin/*Admin-only queries · login-protected
Per-Page Intent & Primary CTA
One commit per page · next step always visible| Page | Visible state | Primary CTA |
|---|---|---|
/account | Logged out | Log In / Sign Up |
/account/dashboard | Contest progress 1–4 | Continue [current step] |
/account/watch | YouTube / Vimeo embed, resume button | Mark complete / Continue to Step 2 |
/account/study-guide | PDF preview + download | Continue to Step 3 |
/account/quiz | Question 1 of 25 · randomized from question pool | Submit answer / Continue |
/account/submit | Upload area, category picker, prior submission preview if any · editable / deletable until deadline | Save draft / Submit / Replace |
/account/settings | Profile fields + "Request account deletion" button | Save changes |
Challenges & Fixes
Documented Year 1 / Year 2 pain points · Year 3 platform fixes them by design| Past Challenge | Year 3 Fix |
|---|---|
| Rejected submissions in Thinkific could not be un-rejected. Manual workaround required adding them to the judging portal in a separate system; the student's account showed the wrong state. | Admin can approve · reject · restore any submission. Status changes audit-logged. One system, no parallel records. |
| Submission form treats primary video + supporting explainer video as one file. | Separate structured fields: primary video, supporting video, external links, uploaded files, artist statement. |
| Many projects live on YouTube or Google Drive; links are buried in long written explanations and reviewers miss them. | Dedicated External Links field. Surfaces prominently on the submission detail / judging view. |
| Duplicates — students re-upload updated versions; earlier ones get marked rejected. | Edit / delete / replace your own submission anytime before deadline. Versioning instead of duplicate rejection. |
| Duplicate accounts — same student appears twice, inflating counts. | Email-uniqueness check at signup with "Did you mean to log in?" prompt. Prominent forgot-password link. |
| Artist Statements sometimes submitted via email rather than the platform. Silent data loss (e.g., Sebastian Arellano-Rubach's statement). | Email integration with info@energycreates.com — emails referencing a submission ID get attached to that record. Manual attach also supported. |
| Some students submit playable artifacts (e.g., "Spark" RPG by Faith Breis). No way to evaluate — submission excluded. | Per-medium constraints documented at submission time. Either accept with reviewer instructions, or block up front. |
| Archiving the contest in Thinkific doesn't actually stop submissions. New submissions arrived after contest close. | Hard submission window — server-side cutoff, not just UI-hidden. Manual override for late-permitted submissions. |
| Drop-off at the final submit click. GA showed ~1,250 BC students reached the 2-of-2 page; how many actually clicked submit is unknown. | Server-side success record. Upload errors surface visibly with retry. submission_upload_failed event identifies stuck students. |
| Thinkific has no real export. Last year required copy/paste from each submission page into the spreadsheet to rank ~1,400 entries. | Native CSV / JSON exports — submissions + profile data joined in one file. No copy/paste, no silent dropped fields. |
| Province not captured at signup. BC participation reverse-engineered from GA IP (4,700–5,300 range from a 5,000-account manual sample). | Province (and school) required at signup. Stored on the student record. Filterable in admin. |
| No topic / category field. CEP keyword pulls (LNG, oil, EVs, Clean Fuel) had to be free-text keyword matching. | Category required at submit (film · visual art · writing · music · installation · game · other). Topic tag for sponsor reporting. |
Late event instrumentation — project_submitted not wired until late 2025. Year 1 and most of Year 2 submission counts badly under-counted. | Every event wired on day 1. Server-side counts are truth; GA is for funnel analysis only. |
| Multi-editor spreadsheet caused Artist Statements to disappear. Had to lock editing to Inna and Brian; helpers got a single checkbox column. | Native role-based admin. Shortlist + scoring are first-class platform actions, not spreadsheet columns. No cell-level conflicts. Arlene-friendly UX. |
| Two fragmented systems — Thinkific for the contest, separate portal for judging. Data sync was manual. | Shared database. Judging still runs as its own app (judgingportal.vercel.app) but reads from the submission database directly — no CSV exports, no manual sync. |
Guiding Principles
Foundational rules for the buildLinear 1-2-3-4 Flow
Watch → Study Guide → Quiz → Submit. Every page makes the next step obvious. Students should never wonder "what now?"
Progressive Disclosure
Locked steps are visible but disabled with a "complete previous step to unlock" tooltip. No dead ends, no confusion.
Mobile-First
The 15–25 demographic is mobile-dominant. Every page must work at 375px, including the quiz and submission upload.
Resume Anywhere
Close the tab mid-quiz, come back tomorrow, pick up at the same question. Same for video position and submission draft.
Full French Parity
Not a translation toggle on top of English — a proper /fr/account/* mirror with French CTAs, error states, and emails.
Self-Serve Edits
Students fix their own typos and re-uploads. Edit, delete, or replace any submission anytime before the deadline. No support tickets for routine corrections.
Reversible Admin Actions
Every admin action (reject, restore, ban) is undoable and audit-logged. Year 2's "rejected in Thinkific, can't un-reject" lock-in does not repeat.
Capture What We Report On
Ask each thing at the right moment: province at signup, category and topic at submission. Sponsor reports shouldn't require reverse-engineering analytics.
Technical
Login · progress · submissions · analyticsenergycreates.com/account — no separate subdomain like the old competition.energycreates.com Thinkific instance.
Login Requirements
- Email + password (no SSO for Year 3).
- Duplicate prevention — uniqueness check on email at signup; "Did you mean to log in?" prompt if a match is found.
- Email verification on signup (single-tap link).
- Forgot-password flow with rate-limited reset emails. Prominent placement on login screen.
- Session persistence across tabs / devices.
- CASL-compliant marketing opt-in checkbox during signup.
- Required signup fields — name, email, password, province, school, age band.
What Gets Tracked Per Student
- Watch progress: last playback position (seconds), completed (bool).
- Study guide: downloaded (bool) or scrolled-to-end (bool).
- Quiz: answers per attempt, score, passed (bool), attempt count.
- Submission: file URLs, description, terms-agreed (bool), submitted-at, last-edited-at.
Persistence
State lives server-side keyed by user ID. Local browser cache is a write-through cache only — never the source of truth. This avoids the "I switched devices and lost my progress" failure mode of localStorage-only LMSs.
Student-Side Requirements
- Large file upload — video, audio, image, document. Chunked upload with resumability for ~50–500MB files.
- Required category field — film, visual art, writing, music, installation, other. Optional secondary topic/theme field for sponsor reporting.
- Edit / delete / replace until deadline — students fix their own typos and re-uploads. No support tickets needed.
- Error recovery — failed uploads don't lose state. Clear error messages, retry button. Server records every attempt.
- Confirmation — visible "submitted" badge in the dashboard + email receipt with edit link.
- Per-medium constraints documented up front — file types and max sizes shown before upload, not after rejection.
Admin-Side Requirements
- Reversible reject / restore — every submission has an editable status (submitted · rejected · restored). Reject reasons logged. Same record, no parallel system.
- Audit log — who changed status, when, why. Visible on the submission detail page.
- Filter / search — by category, province, status, student name, date. The list view should match the way the judging team thinks about the entries.
- Bulk export — CSV / JSON of submissions (with file URLs) for the judging portal handoff.
project_submitted wasn't instrumented until late 2025. Year 3 wires every event on day 1 so we don't repeat the mistake.
Events fired by the LMS
account_created— server-side, includes province + age band.step_started/step_completed— for each of watch · study-guide · quiz · submit.quiz_attempted— fires per attempt with score + pass/fail.submission_started— when the upload form opens.submission_upload_failed— surfaces stuck students explicitly.submission_completed— server-side, irrevocable proof of submit.submission_edited/submission_deleted— for edit-flow analytics.submission_shortlisted— Phase 1 approve (judging).submission_scored— Phase 2 score saved · judge, total, criterion breakdown.
Truth source
Server-side database is the source of truth for counts (signups, submissions, completions). GA is for funnel/drop-off analysis only. Cross-check the two at every reporting cycle; investigate any divergence — that's how Year 2's instrumentation gap should have been caught earlier.