Performance Reviews
Reviews live in Google Docs, half of them are late, and nobody can find last year's.
Review cycles with self reviews, peer feedback the manager approves, manager reviews with ratings, calibration with a recorded reason, a release date, and strict rules for who sees each part.
Updated · 4 build phases · 17 acceptance checks
- No.
- 025
- Department
- People
- Build time
- 2 hrs
- Difficulty
- Intermediate
- Team size
- 10–200 people
- Replaces
- Lattice
- Status
- Full spec; build test pending
Can you build your own performance review tool instead of paying for Lattice?
Yes, for a team of 10 to 200 people that runs review cycles once or twice a year. This blueprint specifies review cycles with a question template and 1 to 5 ratings, self reviews, peer feedback proposed by the employee and approved by the manager, manager reviews with an overall rating, calibration with a recorded reason, release on a set date, acknowledgement, reminders and an overdue list, review history and a CSV export, with a table of who may see each part enforced on the server. It is specified in four build phases with 17 acceptance checks. It leaves out 1:1s, goals, engagement surveys, compensation and promotions.
The full blueprint
A complete spec with the data model, rules, worked examples, phased build prompts and acceptance checks. It has not been build-tested yet, and there is no interactive demo.
Build test pending. How we test.
Build it or buy Lattice?
Lattice prices each product per seat per month: Performance $10, Goals & OKRs $8 and Engagement $4, with Compensation ($6) and Grow ($4) as add-ons. Contracts are billed annually, and the minimum annual agreement is $4,000, so a team of up to 33 people pays the minimum for Performance alone. Source: lattice.com/pricing, checked October 2026.
What this blueprint keeps
Review cycles with a template of questions and 1 to 5 ratings; self reviews; peer feedback, proposed by the employee and approved by the manager; manager reviews with an overall rating; calibration with a recorded reason; release on a set date; acknowledgement by the employee; reminders and an overdue list; each person's review history; a CSV export; and visibility rules for every part of a review.
What it leaves out
1:1s, continuous feedback and praise, goals (see the OKR Tracker blueprint), engagement surveys, succession planning, promotions and PIPs, compensation planning, 360 reviews from direct reports, AI writing help, and HR system integrations.
Build it if
- You're under about 33 people, so Lattice's $4,000 minimum costs more than its per-seat price.
- You want review rules you can read: who sees self reviews, peer feedback and calibration notes, and when.
- You run one or two cycles a year and don't need the rest of a people platform.
- Your reviews live in shared documents and you want deadlines, reminders and history.
Buy Lattice if
- You want 1:1s, continuous feedback, goals and engagement surveys in the same product.
- You need compensation planning, promotions, succession planning or PIPs.
- You want HR system integrations and analytics across your workforce.
- You want AI help writing and summarising reviews.
The blueprint
Paste the whole spec into your AI builder, then send each prompt in the Build plan section one at a time. Check each phase before moving on.
How to use this file: paste this whole document into your AI builder (Claude, ChatGPT, Cursor, Lovable, Replit, Type) as context. Then send the build prompts in section 15 one at a time. Do not move to the next phase until the acceptance checks for the current phase pass.
1. The problem
"Reviews live in Google Docs, half of them are late, and nobody can find last year's."
Twice a year someone in people operations copies a review template into a document per person, shares each one with the right manager, and chases everyone for weeks. Self reviews and manager reviews sit in the same document, so who could see what depends on sharing settings. Peer feedback arrives by email. Ratings are adjusted in a spreadsheet nobody else sees, and last year's review is somewhere in a folder.
This blueprint runs a review cycle: self reviews, peer feedback the manager approves, manager reviews with ratings, calibration by people operations, a release date when employees see their review, and acknowledgement. Who can see each part, and when, is a rule the server enforces.
2. What the real product does
Research basis: Lattice's pricing page (lattice.com/pricing), October 2026.
What we verified:
- Products priced per seat per month. Performance is $10 (performance reviews, succession planning, promotions, PIPs, talent reviews and calibration, plus 1:1s, weekly updates, feedback and Q&A boards). Goals & OKRs is $8 and Engagement is $4. Add-ons: Compensation for $6 more and Grow for $4 more.
- Contract terms. The minimum annual agreement is $4,000. All contracts are billed annually, in US dollars. Performance and Goals & OKRs can be bought separately, and 1:1s, feedback and updates come with any base product.
- Every base product includes analytics, an AI agent and integrations.
For a team of 30, Performance alone at $10 per seat is $3,600 a year, so the $4,000 minimum applies; the minimum covers up to 33 seats.
What this blueprint keeps
Review cycles with a template of questions and 1 to 5 ratings; self reviews; peer feedback, proposed by the employee and approved by the manager; manager reviews with an overall rating; calibration with a recorded reason; release on a set date; acknowledgement by the employee; reminders and an overdue list; each person's review history; a CSV export; and visibility rules for every part of a review.
What this blueprint deliberately leaves out
1:1s, continuous feedback and praise, goals (see the OKR Tracker blueprint), engagement surveys, succession planning, promotions and PIPs, compensation planning, 360 reviews from direct reports, AI writing help, and HR system integrations.
3. Scope of v1
- One company and one review cycle open at a time, with one template per cycle.
- Reporting lines come from each person's manager. The manager on a review is fixed when the cycle launches.
- Ratings are whole numbers from 1 to 5 with labels (section 6).
- Email through an outbox. If no email provider is configured, emails are logged, not sent.
4. Roles
| Role | Who | Can do |
|---|---|---|
| Admin | People operations | Everything: people, reporting lines, templates, cycles, calibration, release, reopening sections, the overdue list, export. |
| Manager | Anyone with direct reports | Everything an employee can do, plus: approve peers for their reports, read their reports' submitted self reviews and peer feedback, write and submit their reports' manager reviews. |
| Employee | Everyone in a cycle | Write and submit their self review, propose peers, write peer feedback when asked, read their review once released, acknowledge it. |
The visibility rules in R2 are enforced on the server for every page and every request.
5. Data model
All IDs are strings. Timestamps in UTC.
Person: id, name, email (unique, lowercase), title, team, role: admin | member, manager_id (empty for the top of the company), start_date, active.
Template: id, name, questions: list of { id, text, kind: text | rating, audience: self | manager | both | peer, required }.
Cycle: id, name, template_id, status: draft | active | closed, start_date_cutoff, self_due, peer_due, manager_due, release_on, share_peer_feedback (boolean), peer_min_for_sharing (default 2), launched_at, closed_at.
Review: id, cycle_id, employee_id, manager_id (fixed at launch), self_status and manager_status: not_started | draft | submitted, self_submitted_at, manager_submitted_at, overall_rating (manager), calibrated_rating, calibration_reason, released_at, acknowledged_at, acknowledgement_comment.
Answer: id, review_id, author_id, section: self | manager | peer, question_id, text or rating, updated_at.
PeerRequest: id, review_id, peer_id, status: proposed | approved | declined | submitted | peer_declined, decided_by, reason, submitted_at.
Event (append-only) and Notification (outbox): id, at, actor, type, data; and id, kind, to_email, subject, body, status: queued | sent | failed | logged, error.
6. Ratings and visibility
Competency ratings: 1 Needs improvement, 2 Developing, 3 Solid, 4 Strong, 5 Exceptional. Overall rating (manager only): 1 Does not meet expectations, 2 Partially meets expectations, 3 Meets expectations, 4 Exceeds expectations, 5 Far exceeds expectations. The final rating is the calibrated rating if there is one, otherwise the overall rating.
| Part of a review | Employee | Their manager | A peer | Admin |
|---|---|---|---|---|
| Self review | Always (their own) | Once submitted | Never | Once submitted |
| Peer feedback | After release, only if the cycle shares it and at least 2 peers submitted: without names, in random order | Each answer once submitted, with the peer's name | Only their own | Once submitted |
| Manager review and overall rating | After release | Always (their own writing) | Never | Once submitted |
| Calibration reason and the rating before calibration | Never | Yes | Never | Yes |
| Final rating | After release | Yes | Never | Yes |
Anyone else, including other managers and the employee's skip-level manager, sees nothing of the review.
Worked examples (seed data in section 14; today is Thursday, October 15, 2026)
| Situation | Result |
|---|---|
| Marcus opens Leo's review | "Leo hasn't submitted his self review yet." Marcus can draft his own section but not see Leo's draft. |
| Kai opens Ivy's review | Refused: Kai is neither Ivy's manager nor an admin. |
| Marcus tries to submit Leo's manager review today | Refused: "Leo hasn't submitted his self review. You can submit after Oct 22." |
| Only Kai submits peer feedback for Ivy | Marcus sees Kai's answers with his name; at release Ivy sees no peer feedback, because fewer than 2 peers submitted. |
| Hannah calibrates Leo's overall rating from 4 to 3 | She must give a reason; Marcus is emailed; after release Leo sees "3, Meets expectations" and nothing about calibration. |
7. Lifecycle
| Action | Who | Rule |
|---|---|---|
| Launch cycle | Admin | Dates in order (self_due before peer_due, peer_due no later than manager_due, manager_due before release_on). Creates one review for every active person with a manager whose start_date is on or before start_date_cutoff, and emails each employee. |
| Save draft | Author | Any time after launch, until the section is submitted |
| Submit self review | Employee | All required self questions answered |
| Propose peers | Employee | 1 to 3 active people, not themselves and not their manager, before peer_due |
| Approve or decline a peer | Manager | A decline needs a reason; approval emails the peer |
| Submit peer feedback | Approved peer | Before the end of peer_due; a peer may decline with a reason |
| Submit manager review | Manager | All required manager questions and the overall rating answered, and the self review submitted or self_due passed (R4) |
| Calibrate | Admin | Before release, with a reason |
| Reopen a section | Admin | Before release, with a reason; the author is emailed |
| Release | Admin | On or after release_on, for reviews whose manager section is submitted; one by one or all at once |
| Acknowledge | Employee | After release, with an optional comment |
| Close cycle | Admin | After release_on; unreleased reviews stay visible to admins and managers |
8. Business rules
- R1. Launch creates reviews as section 7 describes and fixes each review's manager. People who start after the cutoff, or who have no manager, are not included.
- R2. Visibility is exactly the table in section 6, enforced on the server for pages, downloads and direct requests.
- R3. Submissions. Required answers must be filled in (text of 20 to 4,000 characters; ratings 1 to 5). A submitted section is read-only; only an admin can reopen it, before release, with a reason.
- R4. Order. A manager can submit a review only after the self review is submitted or self_due has passed.
- R5. Peers. Peer feedback is only from approved peers, only before the end of peer_due, and each peer answers only the peer questions.
- R6. Calibration sets calibrated_rating with a reason (10 to 500 characters) and emails the manager. The employee never sees the reason or the rating before calibration.
- R7. Release makes the review read-only and emails the employee.
- R8. Acknowledgement records the time and an optional comment (up to 1,000 characters), visible to the manager and admins. Nothing else in the review can change after it.
- R9. Reminders. Three days before each due date and on the day, everyone with a pending item for that step gets one email listing them; the job is safe to run twice. Admins see an overdue list from the day after each due date.
- R10. Events. Every change writes an event; events are never edited or deleted.
9. Screens
- My reviews: my own review for the open cycle (with each step's status and due date), peer requests waiting for me, and my reports' reviews if I'm a manager.
- Review page: the sections the viewer may see under R2, the forms the viewer may fill in, and the timeline of steps.
- Peers: propose peers (employee); approve or decline them (manager).
- Cycle dashboard (admin): every review with each step's status, the overdue list, calibration (overall ratings by team, with Calibrate on each), and Release.
- History: each person's reviews by cycle; employees see only their own released reviews.
- People, Templates, Cycles, Outbox (admin).
10. Notifications
| Trigger | Recipient | Subject |
|---|---|---|
| Cycle launched | Each employee | "H2 2026 review: your self review is due Thu Oct 22" |
| Peer approved | The peer | "Ivy Tan asked for your feedback (due Thu Oct 29)" |
| Peer declined by the manager | The employee | "Ella Ford won't be asked for feedback" (with the reason) |
| Reminder (R9) | People with pending items | "Your self review is due in 3 days" |
| Calibration | The manager | "Leo Grant's overall rating was calibrated to 3" (with the reason) |
| Section reopened | Its author | "Your self review was reopened" (with the reason) |
| Release | The employee | "Your H2 2026 review is ready" |
Write every email to the outbox first, then send it. With no provider configured, set status logged. A daily job at 09:00 in the company time zone (protected by a CRON_SECRET header) sends reminders. A failed email never blocks the action that caused it.
11. Time
All "now" reads go through one function that adds the development clock offset, so due dates, reminders and release can be tested by moving the clock. Due dates end at 23:59 in the company time zone (America/Chicago).
12. Export
Admins can export a cycle as CSV: employee, team, manager, self status and date, peers approved and submitted, manager status and date, overall rating, calibrated rating, final rating, released date, acknowledged date.
13. Edge cases
- A manager leaves during a cycle: an admin reassigns their open reviews to another manager, who sees everything the old manager could; the change is logged.
- An employee is deactivated during a cycle: their review stays visible to admins and is excluded from reminders.
- A peer is deactivated after approval: their request is cancelled and the employee is told.
- A review released by mistake: there is no un-release; an admin adds a note and starts the conversation outside the app.
- The same person is asked for feedback by three colleagues: each request is separate, with one reminder email listing all of them.
14. Seed data
Company Pinecrest Studio, time zone America/Chicago. Dates are relative to today; the examples assume today is Thursday, October 15, 2026.
People (emails firstname@pinecrest.example):
| Person | Title | Manager | Notes |
|---|---|---|---|
| Dan Price | CEO | none | |
| Hannah Cole | Head of People | Dan | Admin |
| Marcus Webb | Engineering lead | Dan | |
| Sofia Ruiz | Design lead | Dan | |
| Ivy Tan | Engineer | Marcus | |
| Leo Grant | Engineer | Marcus | |
| Kai Moore | Designer | Sofia | |
| Ella Ford | Designer | Sofia | |
| Nate Bell | Designer | Sofia | Started Oct 1 |
Template "Half-year review": "What went well this half?" (text, both), "What would you like to do better next half?" (text, both), ratings for Quality of work, Collaboration and Ownership (both), Overall rating (manager); peer questions "What should {name} keep doing?" and "What could {name} do differently?" (text, peer).
Cycles: H1 2026 (closed), in which Ivy Tan's review was released with a final rating of 4 and acknowledged. H2 2026 (active, launched three days ago): start_date_cutoff Sep 30, self due Thu Oct 22, peer due Thu Oct 29, manager due Thu Nov 5, release on Thu Nov 12, peer feedback shared, minimum 2 peers.
H2 2026 reviews (seven, for everyone except Dan and Nate): Ivy, Kai and Sofia have submitted self reviews; Leo has a self review draft; Ella, Marcus and Hannah haven't started. Ivy proposed Kai and Leo, and Marcus approved both; Kai proposed Ivy and Ella, waiting for Sofia. No manager reviews yet.
15. Build plan
Send these prompts one at a time after pasting this file. Each phase ends with checks you can run by clicking through the app. Start each phase's checks from a fresh load of the seed (the reset button); checks within a phase run in order on the same data.
Phase 1: Foundation and self reviews
Using the Performance Reviews blueprint above, build Phase 1 only.
1. Set up the data model from section 5 exactly, with a real database.
2. Add sign-in with the platform's built-in auth or Google sign-in limited to our company email domain. A signed-in email must match an active Person; anyone else sees "Ask people operations to add you."
3. Build People, Templates and Cycles with launch (R1), My reviews and the Review page with self reviews (section 9, screens 1, 2 and 6), with R2 and R3 enforced on the server.
4. Load the seed data from section 14, with dates relative to today.
5. Add a "sign in as" switcher, a "move the clock forward" control and a "reset to seed data" button, all visible only in development.
When you're done, list what you built and anything in the spec you had to interpret.
Acceptance checks
- Signed in as Hannah, H2 2026 has seven reviews; Nate Bell (started Oct 1) and Dan Price (no manager) have none.
- Signed in as Marcus, Ivy's submitted self review is visible, while Leo's review says "Leo hasn't submitted his self review yet." and shows none of his draft answers.
- Signed in as Kai, opening Ivy's review is refused, both on screen and by a direct request.
- Signed in as Leo, submitting his self review with an empty required answer is refused; once complete, it submits, becomes read-only, and Marcus can now read it.
Phase 2: Peer feedback
Using the Performance Reviews blueprint above, build Phase 2 only.
1. Build Peers (section 9, screen 3) and peer feedback with R5 and the peer rows of section 6.
2. Write the peer emails in section 10 to the outbox, and build the Outbox screen.
When you're done, list what you built and anything in the spec you had to interpret.
Acceptance checks
- Signed in as Sofia, Kai's proposed peers are Ivy and Ella; approving Ivy emails her a request, and declining Ella with a reason emails Kai.
- Signed in as Kai, his peer form on Ivy's review asks "What should Ivy keep doing?" and "What could Ivy do differently?"; after he submits, he can see only his own answers on her review.
- Signed in as Marcus, Ivy's review shows Kai's peer answers with Kai's name.
- After the clock moves past Oct 29, Leo's peer form for Ivy is closed and a direct submission is refused.
Phase 3: Manager reviews, calibration and release
Using the Performance Reviews blueprint above, build Phase 3 only.
1. Build manager reviews with R4, calibration (R6) and release (R7) on the Cycle dashboard (section 9, screen 4), and acknowledgement (R8).
2. Write the calibration, reopen and release emails to the outbox.
When you're done, list what you built and anything in the spec you had to interpret.
Acceptance checks
- Marcus can draft Leo's manager review, but submitting it today is refused with "Leo hasn't submitted his self review. You can submit after Oct 22."; after the clock moves past Oct 22, he submits it with an overall rating of 4.
- Hannah calibrates Leo's rating from 4 to 3 with a reason; Marcus is emailed and sees the reason on the review.
- Before release, Leo sees no part of Marcus's review, including by a direct request.
- With the clock at Nov 12, Hannah releases Leo's review: Leo is emailed, sees Marcus's answers and "3, Meets expectations", nothing about calibration, and no peer feedback section.
- Leo acknowledges with a comment; the review shows Acknowledged, and its answers and rating can no longer be changed, including by a direct request.
Phase 4: Reminders, history and export
Using the Performance Reviews blueprint above, build Phase 4 only.
1. Build the daily reminder job and the overdue list (R9).
2. Build History (section 9, screen 5) and the CSV export (section 12).
When you're done, list what you built and anything in the spec you had to interpret.
Acceptance checks
- Moving the clock to Monday Oct 19 at 09:00 and running the job sends one self-review reminder each to Leo, Ella, Marcus and Hannah, and running it again sends nothing more.
- On Oct 23, Hannah's overdue list shows four self reviews: Leo Grant, Ella Ford, Marcus Webb and Hannah Cole.
- Ivy's history shows H1 2026 (4, Exceeds expectations, acknowledged) and H2 2026 in progress; signed in as Ivy, she sees H1 2026's released review but nothing from H2 2026 beyond her own self review.
- The H2 2026 export has seven rows with each step's status and date, and the final rating column filled only for reviews with a submitted manager section.
16. Variations
- Upward feedback from direct reports to their manager.
- Short monthly check-ins between cycles.
- Goals from the OKR Tracker shown next to the review.
- A rating distribution chart per team for calibration meetings.
- Signed PDF copies of released reviews for the employee file.
Performance Reviews: questions people ask
How should a performance review cycle work?
In steps with due dates: the employee writes a self review, chosen peers give feedback, the manager writes a review with an overall rating, people operations checks ratings across teams (calibration), and every review is released to its employee on the same day, who then acknowledges it. In this blueprint a manager can submit only after the self review is in or its due date has passed, so the employee's view is heard first.
Who should be able to see each part of a performance review?
Write it down as a table and enforce it on the server. In this blueprint the manager sees the self review once submitted and peer feedback with names; the employee sees the manager review and final rating only after release, and peer feedback only without names and only if at least 2 peers responded; calibration notes are never shown to the employee; nobody else, including skip-level managers, sees the review.
What is calibration in performance reviews?
A step before release where people operations compares ratings across teams and adjusts any that are out of line, for example from 4 to 3. In this blueprint every change needs a written reason, the manager is told, and the employee sees only the final rating.
How do you keep peer feedback anonymous?
Show it to the employee without names, in random order, and only when enough peers responded that nobody can be singled out. This blueprint uses a minimum of 2 submitted peers; with fewer, the peer section is not shown to the employee at all, while the manager still sees each answer with its author.
What data model does a performance review tool need?
Person (with manager and start date), Template (questions, ratings, audience), Cycle (due dates, release date, peer sharing rules), Review (one per employee per cycle, with section statuses, overall and calibrated rating), Answer (author, section, question), PeerRequest, an Event log and a Notification outbox.
How much does Lattice cost?
Lattice charges per seat per month by product: Performance $10, Goals & OKRs $8 and Engagement $4, with add-ons for Compensation ($6) and Grow ($4). Contracts are billed annually with a $4,000 minimum annual agreement (checked October 2026).
Get new blueprints by email
One email when a new blueprint is published. Nothing else.
More blueprints
Time-Off Tracker
I can never tell who's out next week until they're already gone.
- No.
- 010
- Dept.
- People
- Status
- Demo
- Replaces
- Timetastic
Hiring Pipeline
We're hiring for three roles and tracking candidates in a spreadsheet.
- No.
- 011
- Dept.
- People
- Status
- Demo
- Replaces
- Greenhouse
Employee Onboarding
Every new hire's first week depends on who remembers what.
- No.
- 015
- Dept.
- People
- Status
- Spec
- Replaces
- BambooHR
All people and hr blueprintsEvery blueprintHow we test blueprints