# Fan Passport — User Stories and Acceptance Criteria ## 1. Delivery format Stories are grouped by epic and written for MVP/P1 execution. Each story includes acceptance criteria using Given/When/Then statements where useful. Priority legend: - **P0:** Required for MVP - **P1:** Strongly recommended for first public version - **P2:** Post-MVP enhancement ## 2. Epic: Onboarding and identity ### Story 1 — Create account **Priority:** P0 **As a** fan **I want** to create an account **So that** my passport progress is saved across sessions and devices. **Acceptance criteria:** - Given I am unauthenticated, when I choose to sign up, then I can create an account using supported authentication methods. - Given my account creation succeeds, when onboarding continues, then my user profile is initialized. - Given account creation fails, when an error occurs, then I see a clear recoverable error message. - Given I already have an account, when I sign in, then I return to my existing passport progress. - The system must not create duplicate public leaderboard identities for the same authenticated account. ### Story 2 — Choose display name **Priority:** P0 **As a** fan **I want** to set a display name **So that** I can appear on leaderboards and share cards. **Acceptance criteria:** - Given I enter a display name, when I save, then the system validates length, uniqueness requirements if any, and blocked terms. - Given the display name is invalid, when I try to save, then I see the reason and can edit it. - Given the display name is valid, when saved, then it appears on my profile and eligible leaderboards. - Public surfaces must not show my email address in place of display name. ### Story 3 — Choose favorite team **Priority:** P0 **As a** fan **I want** to choose my favorite team **So that** my passport is personalized around the team I support. **Acceptance criteria:** - Given the team list is available, when I search or browse, then I can select one favorite team. - Given I select a team, when onboarding completes, then my passport home highlights that team’s fixtures and progress. - Given I select a team for the first time, then I unlock the “Backed a Nation” or equivalent badge. - Given I am undecided, when supported, then I can continue without a favorite team and choose later. - Given I later change favorite team, then historical earned badges remain accurate and new team-specific progress follows product rules. ### Story 4 — Set notification preferences **Priority:** P1 **As a** fan **I want** to choose which reminders I receive **So that** the app helps me return without annoying me. **Acceptance criteria:** - I can opt in or out of daily trivia reminders. - I can opt in or out of prediction deadline reminders. - I can opt in or out of favorite team match reminders. - I can change preferences later from settings. - The system respects platform-level notification permission states. - Notifications must not be sent for disabled categories. ## 3. Epic: Passport home and progress ### Story 5 — View passport overview **Priority:** P0 **As a** fan **I want** to see my passport overview **So that** I understand my tournament progress. **Acceptance criteria:** - Given I have passport activity, when I open Passport, then I see completion percentage, level/XP, favorite team, recent stamps, and recent badges. - Given I have no activity yet, when I open Passport, then I see clear starter actions. - Completion percentage must be calculated consistently from defined categories. - The screen must recommend at least one relevant next action when available. ### Story 6 — Earn XP from actions **Priority:** P0 **As a** fan **I want** to earn XP when I participate **So that** I feel progress after each session. **Acceptance criteria:** - Given I complete an XP-eligible action, when the action is confirmed, then XP is added once. - Given I repeat a one-time action, when it is already rewarded, then XP is not duplicated. - Given XP causes a level increase, then I see a level-up indication. - XP changes must be persisted and visible on Passport. - XP must not alter prediction leaderboard scores. ### Story 7 — View badge cabinet **Priority:** P0 **As a** fan **I want** to view earned and in-progress badges **So that** I know what I have achieved and what to pursue. **Acceptance criteria:** - Badge cabinet shows earned badges with unlock dates. - In-progress badges show progress where measurable. - Locked badges show “how to earn” unless intentionally hidden. - Badges can be filtered by category and rarity. - Earned badges can be opened to show details and sharing option. ### Story 8 — Unlock badge automatically **Priority:** P0 **As a** fan **I want** badges to unlock when I meet criteria **So that** rewards feel immediate. **Acceptance criteria:** - Given I complete badge criteria, when the relevant event is processed, then the badge unlocks without requiring manual support. - Given the badge is already unlocked, then the system does not unlock or reward it twice. - Given a badge has a time window, then it only unlocks if criteria are met during that window. - Major badges trigger a celebration moment; minor badges may use a lighter notification. - Badge unlock must be stored with timestamp and source event. ## 4. Epic: Today and daily return ### Story 9 — View today’s actions **Priority:** P0 **As a** fan **I want** to see today’s most important actions **So that** I know how to participate quickly. **Acceptance criteria:** - Today screen shows daily trivia status. - Today screen shows fixtures for the current day or next relevant matchday. - Today screen shows prediction status for visible fixtures. - Today screen shows streak or deadline warnings when relevant. - The screen prioritizes no more than three primary actions at a time. ### Story 10 — Answer daily trivia **Priority:** P0 **As a** fan **I want** to answer a daily World Cup trivia question **So that** I can return every day and test my knowledge. **Acceptance criteria:** - Given a daily question is available, when I open trivia, then I see one prompt with answer choices. - Given I submit an answer, then the answer is locked and cannot be changed. - After submission, I see whether I was correct and an explanation. - I receive configured XP and quiz points according to result. - My daily trivia streak updates if answered within the valid daily window. - If a question is later voided, affected users receive fair participation credit. ### Story 11 — Maintain trivia streak **Priority:** P0 **As a** fan **I want** to build a trivia streak **So that** I have a reason to return daily. **Acceptance criteria:** - Answering daily trivia within the daily window increments or starts the streak. - Missing a daily window breaks the streak unless a grace rule applies. - The app clearly shows current streak and next milestone. - Streak milestone badges unlock at configured thresholds. - Time-zone handling is consistent and visible enough to avoid confusion. ### Story 12 — Collect daily sticker pack **Priority:** P1 **As a** fan **I want** to claim a daily sticker pack **So that** I can grow my collection by returning. **Acceptance criteria:** - A user can claim at most one daily pack per configured daily window. - Opening a pack reveals all stickers received. - Stickers are added to the album or converted to duplicate currency according to rules. - Pack availability and next claim time are clearly displayed. - Pack contents follow configured rarity and duplicate-protection rules. ## 5. Epic: Fixtures and match interaction ### Story 13 — View fixture schedule **Priority:** P0 **As a** fan **I want** to view World Cup fixtures **So that** I know what matches are happening and when. **Acceptance criteria:** - Fixtures can be viewed by date. - Fixtures show teams, stage/group, kickoff time, and stadium. - Fixture times are displayed in the user’s local time where possible. - Match status is visible: upcoming, locked, live, final, postponed/corrected if applicable. - Users can navigate from fixture to match detail. ### Story 14 — View match detail **Priority:** P0 **As a** fan **I want** to view a match page **So that** I can predict, collect, and remember that match. **Acceptance criteria:** - Match detail shows both teams, kickoff, venue, group/stage, and current status. - If predictions are open, the screen allows prediction entry. - If predictions are locked, the screen shows locked prediction or missed-deadline state. - After final result, the screen shows result and scoring breakdown if user predicted. - The screen shows match stamp collection status. ### Story 15 — Check in to a match **Priority:** P1 **As a** fan **I want** to check in to matches I watch or follow **So that** my passport records my tournament journey. **Acceptance criteria:** - Check-in is available during a configured window around the match. - A user can check in once per match. - Checking in grants the match stamp if not already collected. - Checking in can contribute to team, stadium, and challenge progress. - If check-in is unavailable, the UI explains when it opens or why it closed. ## 6. Epic: Predictions ### Story 16 — Submit match prediction **Priority:** P0 **As a** fan **I want** to predict match results **So that** I can compete and prove my football knowledge. **Acceptance criteria:** - Given a match prediction is open, when I choose result/winner and scoreline, then I can save my prediction. - Saved prediction is visible immediately. - I can edit prediction until lock time. - At lock time, prediction becomes read-only. - The server enforces lock time; client clock cannot bypass it. - Submitting a prediction can award participation XP and match stamp according to rules. ### Story 17 — Apply confidence token **Priority:** P0/P1 depending scoring complexity **As a** prediction competitor **I want** to apply a limited confidence token **So that** I can strategically boost a prediction. **Acceptance criteria:** - The UI shows available confidence tokens and their multiplier. - I can apply only available tokens to eligible unlocked matches. - A token cannot be applied after prediction lock. - A token cannot be reused beyond its configured limit. - Scoring breakdown shows multiplier effect. - Confidence does not multiply XP or badge rewards. ### Story 18 — Predict giant killing **Priority:** P0 **As a** fan **I want** to predict an upset **So that** I can earn a special achievement when a lower-ranked team wins. **Acceptance criteria:** - Eligible giant-killing matches are clearly marked before lock. - Eligibility criteria are available in rules or explainer copy. - If I predict the underdog and they win, I receive configured bonus points and badge progress. - If I predict incorrectly, no giant-killing bonus is awarded. - Result must be final before badge/bonus is finalized. - The app avoids gambling language. ### Story 19 — Score prediction after match **Priority:** P0 **As a** fan **I want** my predictions scored transparently **So that** I trust the competition. **Acceptance criteria:** - Given final result is confirmed, predictions for the match are scored according to published rules. - Each scored prediction shows base points, bonuses, multiplier, and total. - Leaderboards update after scoring. - If result data changes, affected predictions are recalculated. - Users can view previous predictions and points in history. ### Story 20 — View prediction history **Priority:** P0 **As a** fan **I want** to review past predictions **So that** I can see where I gained or lost points. **Acceptance criteria:** - Prediction history lists submitted predictions, actual results, and points. - History can be filtered by stage, team, or result status. - Exact scorelines and special bonuses are highlighted. - Missed predictions are distinguishable from incorrect predictions. - Users can open match detail from history. ### Story 21 — Make group advancement predictions **Priority:** P1 **As a** fan **I want** to predict which teams advance from each group **So that** I can engage with the broader tournament. **Acceptance criteria:** - Group advancement predictions lock before the group’s first match. - User can select the required number of advancing teams according to tournament rules. - Saved picks are visible before and after lock. - Points are awarded after group standings are official. - The system handles best third-place qualification if included in rules. ### Story 22 — Make tournament winner prediction **Priority:** P1 **As a** fan **I want** to predict the champion **So that** I can chase a prestigious long-term badge. **Acceptance criteria:** - Tournament winner prediction has a clear lock rule. - User can select one eligible team. - Selection is visible on profile/passport if user chooses to share it. - Correct champion prediction unlocks “Champion Caller” or equivalent badge. - The system records whether prediction was made before the required deadline. ## 7. Epic: Collections ### Story 23 — Collect team cards **Priority:** P0 **As a** collector **I want** to collect team cards **So that** I can complete all teams in the tournament. **Acceptance criteria:** - Team collection shows all tournament teams. - Collected and missing teams are visually distinct. - Team cards can be collected through defined actions such as favorite selection, prediction, check-in, quiz, or sticker acquisition. - User can inspect how each collected team was acquired. - Missing team cards explain how to collect them. ### Story 24 — Complete group collection **Priority:** P0 **As a** tournament completist **I want** to complete groups **So that** I can follow the full group stage. **Acceptance criteria:** - Group collection shows teams, match stamps, and progress. - Group completion criteria are visible. - Progress updates after qualifying actions. - Completing a group unlocks a badge and XP. - Completing all groups unlocks the configured epic achievement. ### Story 25 — Collect stadium stamps **Priority:** P0 **As a** fan **I want** to collect stadium stamps **So that** I can experience the host cities as part of my passport. **Acceptance criteria:** - Stadium collection shows all configured host stadiums. - Stadium stamps can be collected through eligible match stamps or venue trivia. - Stadium detail shows hosted matches and city/country. - Collecting all stadiums unlocks an achievement. - Venue names and metadata are configurable for official corrections. ### Story 26 — Collect match stamps **Priority:** P0 **As a** fan **I want** to collect match stamps **So that** my passport records the matches I followed. **Acceptance criteria:** - Each fixture has an associated match stamp. - A match stamp can be collected by prediction, check-in, or post-match action according to rules. - Match stamp collection shows collected/missing status. - Stamps link back to match detail. - Match stamps contribute to passport completion percentage. ### Story 27 — Use sticker album **Priority:** P1 **As a** collector **I want** to fill a virtual sticker album **So that** the product feels like a classic football collecting experience. **Acceptance criteria:** - Sticker album shows sections and slots. - Opening packs adds stickers to the album. - Duplicate handling follows configured rules. - Album progress percentage is visible. - Completion thresholds unlock rewards. - Sticker acquisition must not be required for prediction leaderboard competitiveness. ## 8. Epic: Challenges and achievements ### Story 28 — View challenge hub **Priority:** P1 **As a** fan **I want** to see available challenges **So that** I have clear goals beyond individual actions. **Acceptance criteria:** - Challenge hub lists daily, team, collection, prediction, and social challenges. - Each challenge shows criteria, reward, progress, and expiry if applicable. - Tapping a challenge routes to the relevant action. - Completed challenges show reward state. - Expired challenges remain visible only where useful and do not mislead users. ### Story 29 — Complete “Watch all favorite team matches” **Priority:** P1 **As a** national team loyalist **I want** to complete a challenge for following all my team’s matches **So that** I can prove loyalty. **Acceptance criteria:** - Challenge is created for the user’s favorite team. - Each eligible team match contributes when user checks in or collects match stamp according to rules. - If the team plays additional knockout matches, challenge target updates or uses stage-specific structure clearly. - Completing all eligible matches unlocks a loyalty badge. - If the user changes favorite team mid-tournament, rules are applied consistently and explained. ### Story 30 — Complete “Every group” **Priority:** P0/P1 **As a** completist **I want** to complete every group **So that** I can earn a prestigious collection achievement. **Acceptance criteria:** - Each group has measurable completion. - Overall every-group challenge aggregates all group completions. - Completing all 12 groups unlocks an epic badge. - The user can see which groups remain incomplete. - The challenge remains possible according to configured collection rules. ## 9. Epic: Leaderboards and competition ### Story 31 — View global prediction leaderboard **Priority:** P0 **As a** prediction competitor **I want** to view the global leaderboard **So that** I can compare my performance. **Acceptance criteria:** - Leaderboard shows rank, display name, and prediction score. - My row is visible or pinned even if I am not near the top. - Board shows time window and last updated time. - Ties are handled according to published tie-breakers. - Ineligible or moderated users do not appear publicly. ### Story 32 — View daily and stage leaderboards **Priority:** P0 **As a** fan who joined late or fell behind **I want** daily and stage leaderboards **So that** I still have competitions I can win. **Acceptance criteria:** - User can switch between overall, daily, and stage boards. - Daily board includes only eligible points from that day’s matches. - Stage board includes only eligible points from selected stage. - Board reset/window is clear. - Rankings do not overwrite tournament-long scores. ### Story 33 — Create private league **Priority:** P1 **As a** social fan **I want** to create a private league **So that** I can compete with friends. **Acceptance criteria:** - Authenticated user can create a league with a valid name. - League receives invite link or code. - Creator becomes league owner/admin. - League standings show members and scores. - League can be joined by invited users. - League name is moderated or reportable. ### Story 34 — Join private league **Priority:** P1 **As a** fan **I want** to join a friend’s league **So that** I can compete in a known group. **Acceptance criteria:** - Opening a valid invite link routes me to the league join flow. - If unauthenticated, I can sign up/sign in and continue joining. - Joined league appears in my league list. - My existing scores apply according to league rules, which are visible. - Invalid or expired invites show a clear error. ## 10. Epic: Sharing and growth ### Story 35 — Share badge unlock **Priority:** P0 **As a** fan **I want** to share a badge I earned **So that** I can show my World Cup journey. **Acceptance criteria:** - Earned badge detail includes share action. - Share preview shows a public-safe card. - Card includes badge name, user display name, and tournament context. - Card excludes private data. - Shared link opens a public landing page or deep link destination. - User can cancel before sharing. ### Story 36 — Share correct prediction **Priority:** P0 **As a** prediction competitor **I want** to share a great prediction **So that** I can celebrate being right. **Acceptance criteria:** - Exact scoreline and giant-killing predictions produce share prompts. - Share card shows prediction and actual result. - Share is available only after match result is final. - The system does not reveal other users’ locked predictions before scoring. - Shared card links to signup or match context. ### Story 37 — Generate final recap **Priority:** P1 **As a** fan **I want** a final recap of my World Cup journey **So that** I can remember and share the tournament. **Acceptance criteria:** - After tournament final is confirmed, the system generates a recap for active users. - Recap includes completion, favorite team journey, best prediction, badges, collections, and quiz streak. - User can view recap from Passport archive. - User can share recap as a card/link. - Recap remains available after live tournament mode ends. ## 11. Epic: Memories ### Story 38 — Save match memory **Priority:** P1 **As a** fan **I want** to save a memory for a match **So that** my passport captures personal moments, not just stats. **Acceptance criteria:** - User can add a short note or reaction to an eligible match. - Memory is associated with the match and user. - User can edit or delete their own memory. - Memory visibility defaults to private unless changed. - Memory content is subject to moderation/reporting if shared publicly. ### Story 39 — View memory archive **Priority:** P1 **As a** fan **I want** to view saved memories **So that** I can revisit my tournament journey. **Acceptance criteria:** - Memories appear in Passport archive. - Memories can be filtered by match, stage, team, or type. - Deleted memories no longer appear. - Shared memories use public-safe display. - Memory archive persists after tournament end. ## 12. Epic: Administration and content operations ### Story 40 — Manage fixture data **Priority:** P0 **As an** operator **I want** to configure fixtures, results, and match statuses **So that** predictions and collections work accurately. **Acceptance criteria:** - Operators can import or configure teams, groups, stadiums, fixtures, kickoff times, and statuses. - Operators can mark results provisional and final. - Result changes trigger prediction rescoring. - Data changes are audited. - User-facing screens show updated fixture data consistently. ### Story 41 — Manage quiz content **Priority:** P0 **As a** content editor **I want** to schedule daily trivia questions **So that** users receive fresh content. **Acceptance criteria:** - Editor can create prompt, choices, correct answer, explanation, category, difficulty, and publish window. - The system prevents publishing a question without a correct answer and explanation. - Only one primary daily trivia question is active per configured window unless bonus mode is enabled. - Editor can void a question and grant fair credit. - Published questions appear on Today during the correct window. ### Story 42 — Manage badge and challenge definitions **Priority:** P0 **As a** game designer **I want** to configure badges and challenges **So that** the game can be balanced without code changes where feasible. **Acceptance criteria:** - Badge definitions include name, category, rarity, criteria, XP reward, and visibility. - Challenge definitions include criteria, reward, progress target, and availability window. - Definitions can be enabled/disabled. - Changes do not corrupt already-earned user achievements. - Criteria map to trackable product events. ### Story 43 — Correct scoring issue **Priority:** P0 **As an** operator **I want** to correct scoring when official data changes or an error occurs **So that** leaderboards remain trustworthy. **Acceptance criteria:** - Admin correction requires reason and audit metadata. - Affected predictions are recalculated. - Affected leaderboards are refreshed. - Users can see correction note where relevant. - The system prevents arbitrary unaudited manipulation of locked predictions. ## 13. Epic: Privacy, safety, and trust ### Story 44 — Control public profile visibility **Priority:** P0 **As a** fan **I want** to control public visibility **So that** I can participate safely. **Acceptance criteria:** - User can view and update privacy settings. - Public profile/share cards use only allowed fields. - Private league visibility is explained. - Email and authentication identifiers are never public. - Account deletion or data request path is available according to policy. ### Story 45 — Report inappropriate content **Priority:** P1 **As a** fan **I want** to report inappropriate usernames, league names, or shared memory content **So that** the community remains safe. **Acceptance criteria:** - Report actions are available on relevant public/social surfaces. - Report captures content type, reported entity, reporter, reason, and timestamp. - Reported content can be reviewed by operators. - Operators can hide or moderate violating content. - Reporting does not expose reporter identity publicly. ### Story 46 — Understand rules **Priority:** P0 **As a** fan **I want** clear rules for predictions, collections, quizzes, and leaderboards **So that** I trust the experience. **Acceptance criteria:** - Help/rules page explains prediction scoring. - Help/rules page explains lock deadlines. - Help/rules page explains badge/collection mechanics. - Help/rules page explains leaderboard tie-breakers. - Rules are linked from relevant screens. ## 14. MVP acceptance summary A competent MVP should be accepted when: 1. A new user can create an account, choose a favorite team, and see a personalized passport. 2. The user can answer daily trivia and receive visible streak/XP progress. 3. The user can view fixtures and submit predictions before lock. 4. Predictions lock correctly and score transparently after final results. 5. The user can collect team, match, group, and stadium progress. 6. Badges unlock from real tracked actions. 7. Global/daily/stage leaderboards display correct scores and tie handling. 8. The user can share at least badges, great predictions, and passport progress. 9. Operators can maintain fixture, result, quiz, badge, and challenge content. 10. The product can generate or preserve an end-of-tournament passport archive.