SPEC 004: ESOP
Status: DRAFT Priority: P0 Created: 2026-02-21 Approved: pending Repo(s): equa-web, equa-server
1. Feature Purpose
The ESOP module manages employee stock option plans, equity incentive pools, and vesting schedules. It allows organizations to create board-approved equity incentive plans, allocate option pools tied to specific security types, grant options to individual team members with customizable vesting, and track exercise events. This is critical for startups and growth-stage companies that use equity compensation to attract and retain talent.2. Current State (Verified)
Frontend module:esop server module. Plan, pool, option, and vesting schedule entities live alongside other cap-table entities in the persistence layer.
3. Data Model
Entities
Key Fields — Plans
Key Fields — Pools
Key Fields — Options
Key Fields — ContinuousVestingSchedules
Key Fields — DiscreteVestingSchedules
Key Fields — VestingEvents
Key Fields — TasksExerciseOption
Relationships
4. API Endpoints
Served by the captable module endpoints.5. Frontend Components
Routes
State Management
ESOP state is managed within theesop module store, holding loaded plans, pools, options, and vesting schedules. Data is fetched via captable API endpoints and cached locally.
6. Business Rules and Validation
6a. Vesting Calculation Logic (from Confluence KnowledgeBase)
Source: Confluence KnowledgeBase — Calculating Vesting (by Christopher Johnson)Vesting Schedules are functions that output a list of Vesting Events. A Vesting Event has two properties:
date (the vesting date) and value (the amount vested). Schedules can have relative dates (requiring a startDate parameter) and relative values (requiring a totalValue parameter).
Continuous Vesting Schedules
Continuous schedules are equations that procedurally generate Vesting Events. They are fully relative, requiring bothstartDate and totalValue.
When a continuous schedule has no
cliffValue, the first vesting event equals the increment of each subsequent event.
Worked example: 1,000 options, 4-year vest, monthly frequency, 1-year cliff:
totalValue= 1,000,frequency= 1 (monthly),eventQuantity= 48- Cliff duration = 12 months → first 12 events suppressed
- At cliff (month 12): 250 options vest (12/48 * 1,000)
- After cliff: ~20.83 options vest per month (1,000 - 250) / 36
Cliffs
- A cliff is a duration of months before vesting begins
- Prevents events that would vest before the cliff ends
- Reduces the quantity of Vesting Events but does NOT alter the total schedule duration
- Does NOT alter the cadence of events after the cliff
- A cliff of 1 month negates the first event
- Optional
cliffValueproperty overrides the value of the first post-cliff event, altering the vesting curve steepness cliffValuecan be relative (percentage) or absolute (fixed number)
Discrete Vesting Schedules
Discrete schedules contain a user-defined list of Vesting Events. Events can have relative or absolute dates and values. The frontend UI only supports fully relative or fully absolute schedules (no mixing). Relative Discrete Vesting Event properties:month— 1-based offset from startDate.month. Resolved month:startDate.month + event.month - 1day— Either an integer orlastDayOfMonth. Unlike month, day is absolute (not offset from startDate.day)value— The amount vested at this event
7. Acceptance Criteria
- AC-1: Admin can create an equity incentive plan with board approval date, term, and approved equities
- AC-2: Admin can attach security types and vesting schedules to a plan
- AC-3: Admin can create an option pool under a plan with shares, price per share, and default vesting
- AC-4: Admin can grant options to a team member specifying shares, start date, and vesting schedule
- AC-5: System prevents granting more options than remaining pool capacity
- AC-6: Continuous vesting schedule correctly computes cliff and periodic vesting amounts
- AC-7: Discrete vesting schedule correctly applies per-event vesting on specified dates
- AC-8: Team member can exercise vested options via TasksExerciseOption workflow
- AC-9: Vesting timeline visualization accurately reflects grant schedule and cliff
- AC-10: All ESOP data uses content-addressed hashing for immutable audit trail