TeamFit — Team Performance Review & 1:1 Insights
A demo snapshot of an HR-ops SaaS automating 1:1 review cycles and annual performance aggregation for small teams.
Demo Snapshot
This is a curated demo snapshot. Real project data is reviewed before publishing.
PRD
Section Layout ↔ Industry-Standard PRD Template
| Industry-Standard PRD Section | This Fixture's Section | Depth Notes |
|---|---|---|
| Target Personas | Target Personas | 5-30 person team HR lead + managers |
| Success Metrics | Success Metrics | Response rate 60% to 85%; cycle 23 to 14 days |
| Key Feature Specs | Key Feature Specs | 1:1 review template CRUD + auto-reminder scheduler |
| (Domain-specific) | Role Permission Matrix | admin/manager/member (3 roles) x read/write/delete/export (4 verbs) |
Project Overview
TeamFit is an HR-ops SaaS for 5-30 person startups and small teams that consolidates 1:1 review cycles, reminders, and annual performance aggregation in one automated flow. The system removes the repetitive overhead — scheduling, chasing responses, tallying results — so managers can invest their attention in feedback quality itself. Three-tier role separation (admin / manager / member) is built in from day one so the boundaries of who can view and edit what are locked at product design time, not bolted on later. Vooster was used to structure the requirements and auto-distribute sprint tasks so the MVP shipped with a single engineer, designer, and manager triad in three months. Compared with the Google Forms + spreadsheet status quo, the quantitative goal is to cut cycle operations overhead by four hours per manager per week. The north-star metrics are shortening a single cycle from 23 days to under 14 days and lifting response rate from the 60% band to 85%. TeamFit is the minimum product that stitches three elements — an automated cycle engine, a permission matrix, and an aggregation report — into one workflow.
Problem Statement
Managers at 5-30 person growth teams know review cycles should happen frequently, yet manual overhead means they run them no more than once a half. The incumbent alternatives share three shortcomings. First, Google Forms makes editing questions simple but offers no reminder automation, response-rate tracking, or annual aggregation. Second, Notion templates look clean but lack permission separation, anonymity guarantees, and expiration management — not a home for HR data. Third, off-the-shelf HR-ops SaaS like Lattice or 15Five assume enterprise pricing and feature breadth, becoming overkill for 5-30 person teams with high onboarding friction. Fourth, spreadsheet-based processes depend on one manager's rhythm; when they are away, the cycle stalls and the data trail scatters. The net effect: managers treat reviews as a reluctantly deferred chore, and members leave responses untouched until chased. TeamFit tackles this with an "auto-open → auto-remind → auto-aggregate" pipeline that cuts manager intervention to under 30 minutes per cycle. The design principle is to encode operational policies and data flow into the product so the same cycle quality repeats regardless of who is in the lead seat. "A cycle that runs without the manager's constant steering" is the MVP's success condition. This lets small teams adopt review discipline normally associated with much larger organizations.
Target Personas
Persona A — Startup People Lead / HR Lead (alias: Haeun Lee)
Role: First people lead at a 25-40 person B2B SaaS startup; owns reviews, onboarding, and 1:1 culture Context: Runs a company-wide review cycle each quarter and summarizes the data into executive-facing reports Daily Pain:
- Half the cycle is chasing responses because Google Forms + spreadsheets offer no automated nudging
- Aggregating the annual report by hand every quarter surfaces data-format inconsistencies
- Lack of manager/reviewer/subject permission separation risks accidental self-review exposure
- Forwarding each review summary to the relevant team lead via DM becomes a repetitive chore
- Vacations or absences stall the cycle, and the restart point becomes opaque Usage Context:
- Open the cycle at quarter start, watch the response-rate dashboard, then receive the aggregate report after close
- Export the annual report as CSV for executive 1-on-1 prep
- Archive cycle metadata (name, window, template version) each round Current alternatives: Google Forms, Notion databases, Google Sheets Adoption trigger: Response rate dips below 60% for three consecutive cycles, raising executive concern Core needs: automated reminders, permission matrix, annual aggregation report
Persona B — New Engineering Manager (alias: Doyun Park)
Role: Six months into leading a 6-8 engineer team after promotion from senior IC Context: Runs 1:1 cadence, feedback sessions, and the formal review cycle during performance season Daily Pain:
- Assembles 1:1 agendas from scratch each time, losing focus between meetings
- Cannot see an aggregate of each report's response cadence, which makes retros slow
- Cross-team template sharing fails because formats differ, preventing reuse
- Must juggle their own review and direct reports' reviews across fragmented tools
- The feedback loop from review data to coaching habits is broken Usage Context:
- Pick a template from the library and personalize per direct report
- Review per-team response rate and comment themes on the dashboard at cycle close
- Use the aggregate report during quarterly personal coaching retros Current alternatives: Notion personal templates, 1:1 note apps (Grove, Fellow) Adoption trigger: Adopting the tool alongside the people team's rollout decision Core needs: template library, team-view dashboard, consolidated comment archive
Persona C — Individual Contributor / Review Subject (alias: Seoyoon Choi)
Role: Senior frontend engineer, participates in self reviews and two-to-three peer reviews each quarter Context: Writes one self review and two-to-three peer reviews per quarter Daily Pain:
- Review links arrive across email, Slack, and Notion, forcing the recipient to hunt them down
- Ambiguity between completed and pending reviews creates anxiety about getting chased
- Finding a previously written peer review later is hard because the links are scattered Usage Context:
- Checks a personal dashboard once the review request lands, sees every open item in one place
- Reviews outstanding assignments 48 hours before the deadline thanks to reminders
- Searches their own review history on the "history" page to reference past writeups Current alternatives: Email, Slack notifications, Notion personal pages Adoption trigger: Natural onboarding once the team adopts the tool Core needs: personal TODO dashboard, searchable review history, unambiguous reminders
User Stories
-
US-001: As a people lead, I want to open a review cycle from a saved template, so that I do not need to rebuild the question structure every time. Acceptance Criteria:
- Search, clone, and customize a template then launch the cycle within five minutes
- Template versioning enables direct comparisons with past cycles
- Template edit permissions are restricted to admin and manager roles
- Cycle launch auto-selects participants via team/department filters
- Pre-launch dry-run previews the exact email and Slack messages that will go out
- Cycle name, window, and template version are pinned in the audit log as an immutable record
-
US-002: As a reviewer, I want to receive email and Slack reminders before the deadline, so that I never miss an assigned review without explicit manager chasing. Acceptance Criteria:
- Reminders auto-fire 48 and 24 hours before the deadline
- Channel routing follows the user's preference (email, Slack, or both)
- A reminder-history table prevents duplicate sends
- Reminders cancel immediately on review completion
- Delivery failures (bounce, Slack inactive) trigger an admin fallback alert
-
US-003: As an admin, I want to view the response rate dashboard for an active cycle, so that I can intervene when participation lags. Acceptance Criteria:
- Live cycle detail page shows response rate and the non-responder list
- A "resend reminder" button is available for non-responders, rate-limited to once per day
- Response rate under 50% within 24 hours of the deadline alerts the admin
- Response-rate metrics are included in the weekly aggregate report
- Tooltips explicitly document the computation basis (submitted vs. draft vs. unresponded)
-
US-004: As a member, I want to see all my assigned reviews on a personal dashboard, so that I can keep track of what I need to complete without searching emails. Acceptance Criteria:
- Personal dashboard lists assigned reviews sorted by state and deadline
- Completed vs. outstanding items are color-coded for clarity
- Clicking an item jumps directly to the review authoring screen
- Items within 48 hours of the deadline pin to the top
- Completed reviews are searchable and revisitable on the history tab
-
US-005: As an admin, I want to export the annual performance aggregation as CSV, so that I can share it with the executive team for compensation review. Acceptance Criteria:
- The annual report page exposes a CSV export button
- Export requests record author and timestamp in the audit log
- Large exports run asynchronously and notify via Slack DM on completion
- Exported CSV contains anonymized statistics only (no individual comments)
- Individual-comment exports are gated to admin role plus an explicit executive grant
-
US-006: As a manager, I want to configure different review cycles per team with different question sets, so that engineering and sales teams can use formats suited to their needs. Acceptance Criteria:
- Different templates, cadences, and reminder settings per team
- Template library tags templates as org-shared vs. team-only
- Team-only templates are editable only by the team's manager
- Creating a new team offers to auto-duplicate the baseline template
- A template diff view compares templates across teams
-
US-007: As a people lead, I want the system to prevent members from viewing colleagues' reviews, so that privacy expectations are never accidentally violated. Acceptance Criteria:
- Members can only see reviews they authored plus reviews about them (anonymized)
- Direct URL access to out-of-scope data returns HTTP 404
- Permission-violation attempts are recorded in the audit log with warn severity
- Managers' scope is limited to their direct reports; admins can see the whole org
- Permission changes invalidate existing sessions immediately
-
US-008: As a member, I want to save a draft of my review before submitting, so that I can come back to it later without losing my progress. Acceptance Criteria:
- Drafts auto-save every 30 seconds while writing
- An explicit "save and resume later" button is provided
- Draft state does not count as "responded" in the response-rate metric
- Drafts are never auto-submitted after the deadline; a warning is shown instead
- Draft restoration displays the last edit timestamp
-
US-009: As an admin, I want to pause an ongoing review cycle temporarily, so that I can handle emergencies (sudden org change) without losing the collected responses. Acceptance Criteria:
- Pausing a cycle halts reminders and automatic closure
- Already-collected responses stay intact and available on resume
- Requires an explicit reason memo before pausing
- Pause history is written to the audit log
- On resume, an option to recalculate the remaining window is offered
-
US-010: As a manager, I want to compare a team member's review scores quarter over quarter, so that I can give feedback grounded in a concrete trajectory rather than vague impressions. Acceptance Criteria:
- The direct-report detail page renders a line chart of average score by quarter
- Key category sub-scores (execution, collaboration, growth) are charted separately
- Quarterly comment theme keywords surface theme drift
- Quarters with insufficient data are labeled explicitly as missing
- Data exports are recorded in the audit log to preserve the sharing trail
-
US-011: As a people lead, I want the system to detect "stalled" cycles with no activity for 7 days and alert me, so that I can intervene before deadlines slip. Acceptance Criteria:
- Cycles with no response activity for seven consecutive days are marked as "stalled"
- The admin receives both a Slack DM and an email notification
- From the stalled state the admin can resend reminders, pause, or extend
- Stall detection runs once daily via a scheduled batch
- Exiting the stalled state automatically resolves the notification
Core Feature Specs
F1. Review template builder & library
Purpose: Let managers drag, reorder, and save reusable review templates Behavior:
- Drag-and-drop editing across question types (short text, long text, 1-5 scale, checkbox)
- Tagging for org-shared vs. team-only visibility
- Template versioning supports comparison and rollback
- Library search, cloning, and inline preview
- Save triggers a dry-run of the resulting email and Slack messages Priority: MUST Success signal: median template creation under 5 minutes; reuse rate above 60%
F2. Review cycle auto-scheduler
Purpose: Automatically open, manage, and close quarterly or semi-annual cycles according to policy Behavior:
- Cycle creation specifies open date, deadline, participants, and template
- Reaches the open timestamp and auto-sends review links to participants
- State machine (draft → sent → responded → closed) is fully automated
- Non-responders at deadline are auto-closed with explicit "missed response" flag
- Holiday and weekend avoidance is configurable on dispatch windows Priority: MUST Success signal: per-manager cycle operations drop from 4 hours/week to under 30 minutes
F3. Auto-reminder engine
Purpose: Dispatch reminders to non-responders on a predefined cadence over email and Slack Behavior:
- Reminders auto-fire 48 and 24 hours before deadline
- Channel routing respects user preference (email, Slack, or both)
- Completion of the review immediately cancels pending reminders
- A reminder-history table blocks duplicate dispatch
- Bounce or failure triggers an admin fallback alert Priority: MUST Success signal: response rate climbs from 60% to 85%
F4. Annual performance aggregation report
Purpose: Aggregate review results into quarterly, semi-annual, and annual reports for executive review Behavior:
- Scores, comment themes, and response rates aggregate per window
- Separate views by admin, manager, and individual perspective
- CSV and PDF downloads; large exports are queued asynchronously
- Anonymization rules redact raw comments and expose numeric indicators only
- Report generation runs and viewers are recorded in the audit log Priority: SHOULD Success signal: 100% exec engagement with the quarterly report
F5. Personal review dashboard
Purpose: Give reviewers and review subjects a single place to manage their tasks and history Behavior:
- Lists assigned reviews sorted by state and deadline
- Completed vs. outstanding color coding, with imminent items pinned
- Searchable history of reviews the user authored
- Draft auto-save every 30 seconds
- Reviews about the user are shown only in anonymized summary form Priority: SHOULD Success signal: weekly active member rate above 70%
Success Metrics
Each metric is aggregated in real time on the product dashboard and exported into the operational retro packet at the end of every cycle.
- Cycle response rate: share of submitted (non-draft) reviews. Target above 85%, baseline 60%.
- Reminder → response conversion: share of recipients who respond within 24 hours of a reminder. Target above 60%.
- Average response lead time: from cycle open to response submission. Target under 10 days, baseline 18 days.
- Admin time to generate annual report: manager clicks plus minutes required to produce the export. Target under 5 minutes.
- Manager cycle operations overhead: weekly hours on opening, chasing, and aggregating. Target under 30 minutes, baseline 4 hours.
- Cycle completion rate: scheduled cycles that close as planned. Target above 95%.
- Permission violation blocking rate: admin-alert precision for out-of-scope access attempts, held at 100%.
Non-Functional Requirements
- Performance: personal dashboard load p95 under 2 seconds; report exports up to 30k records complete within 30 seconds
- Authorization: three-tier roles (admin / manager / member); every write and read path enforces role checks
- Data retention: review comments retained between 2 and 5 years per org policy, then auto-purged
- Audit: permission changes, template edits, and export requests persisted as diffs in the audit log
- Anonymity: peer review results support optional anonymization; managers may see masked authors per policy
- Localization: ko/en UI ship together; notification language follows the recipient profile
- Security: permission changes re-auth sessions immediately; sensitive fields (scores, comments) encrypted at the column level
- Accessibility: WCAG 2.1 AA compliance with full keyboard navigation
Role Permission Matrix
TeamFit's permissions are defined as a matrix of three roles (admin / manager / member) × four verbs (read / write / delete / export). Every request must clear both a tRPC middleware check and a DB row-level security check.
| Action | admin | manager | member |
|---|---|---|---|
| Read org-wide reviews | ✅ allowed | ❌ blocked | ❌ blocked |
| Read own-team reviews | ✅ allowed | ✅ allowed | own only |
| Write templates | ✅ allowed | ✅ allowed | ❌ blocked |
| Write review comments | ✅ allowed (per own role) | own reviews | own reviews |
| Delete cycle | ✅ allowed | ❌ blocked (read-only) | ❌ blocked |
| Export annual report | ✅ allowed | own-team scope | ❌ blocked |
| Grant / change permissions | ✅ allowed | ❌ blocked | ❌ blocked |
| View audit log | ✅ allowed | ❌ blocked | ❌ blocked |
Supporting matrix rules:
- Export privileges are constrained to the org owner; managers only get partial export within their team scope.
- Reviewer ↔ subject rule: the subject sees only anonymized comments among reviews about them.
- Permission changes take effect after an admin 2FA re-auth and invalidate all existing sessions.
- Matrix changes are persisted as diffs in the audit log with actor, timestamp, and before/after payload.
Scope Boundaries
V1 excludes the following.
- External OKR integrations (Lattice, 15Five, CultureAmp) — avoids diluting the core proposition
- Anonymous 360 reviews — start with a transparent matrix, add anonymity once trust is earned
- Compensation workflow — outside HR-ops scope; leave it to dedicated comp tools
- Storing salary and bonus data — the privacy cost outweighs the benefit
- External SSO / SAML — MVP uses Clerk's default auth; enterprise SSO is post-PMF
- Mobile native apps — responsive web is enough; native waits for demand
- Real-time coach bots and AI-generated feedback — focus on human-authored review quality first
Tech Stack & Architecture
- Frontend: Next.js + React, Tailwind CSS, shadcn/ui components. Dashboards mix ISR with SWR.
- API: tRPC provides end-to-end types across permissions, templates, cycles, and report APIs.
- DB: PostgreSQL (Prisma ORM) with row-level security on; review comments are column-encrypted.
- External: Resend (email), Slack API (messages and buttons), Google Calendar (optional cycle scheduling), Clerk (auth).
- Deployment: Vercel app plus Supabase DB; Vercel Cron drives reminder scheduling.
- Observability: OpenTelemetry traces exported to Grafana Cloud; core business metrics live on the internal dashboard.
The foundational constraint is "minimum PII retention." Sensitive fields use column-level encryption and backups apply masking policies. Given the 5-30 person team context, the product favors cycle-automation quality over feature breadth, and enterprise features (large-scale SSO, dedicated data regions) are explicitly out of scope.
태스크 트리
Sprint 1 — Auth & Review CRUD
Admin/member role separation and 1:1 review template base CRUD
-
[TASK-001] Admin/member role separation middleware
DONE(complexity: 4, urgency: 5, importance: MUST)Implement route-level access control middleware separating admin and member roles. Admins can view all team review data; members access only their assigned reviews. Apply role checks at the tRPC procedure level using session-extracted role information.
- ST-001-1: Role-based middleware
DONE - ST-001-2: Role-scoped data queries
DONE
- ST-001-1: Role-based middleware
-
[TASK-002] 1:1 review template CRUD
IN_PROGRESS(complexity: 3, urgency: 4, importance: MUST)Build create/read/update/delete API for review templates that managers configure. Templates store a reusable question list as a JSON array and are referenced when creating review cycles.
- ST-002-1: Template schema and API routes
DONE - ST-002-2: Template editor UI component
IN_PROGRESS
- ST-002-1: Template schema and API routes
Sprint 2 — Automation & Reports
Auto-reminder scheduler and annual performance aggregation report
-
[TASK-003] Review cycle auto-reminder scheduler
BACKLOG(complexity: 5, urgency: 4, importance: MUST)Build a scheduler that auto-sends email and Slack reminders 48h and 24h before review deadlines for non-responders. Choose cron-based scheduling (Vercel Cron or BullMQ) over DB polling — polling causes high-frequency query load and risks missed sends. Log reminder dispatch history in a separate table to prevent duplicate sends.
-
[TASK-004] Annual performance aggregation report
BACKLOG(complexity: 4, urgency: 2, importance: SHOULD)Generate yearly summary reports aggregating scores and comments from completed review cycles, exportable as CSV or PDF by admins. Pre-compute aggregation results into a cache table to avoid performance degradation when cycle counts grow large.