Skip to main content

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:
Backend module: ESOP entities and endpoints are handled within the captable module on the server side — there is no standalone 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 the esop 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 both startDate 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 cliffValue property overrides the value of the first post-cliff event, altering the vesting curve steepness
  • cliffValue can 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 - 1
  • day — Either an integer or lastDayOfMonth. 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

8. Risks and Edge Cases

9. Dependencies