Skip to content

Vesting Schedules Guide

How to create vesting schedules, materialize vesting events, vest or forfeit shares, and handle termination and acceleration scenarios.


Vesting is a mechanism that distributes equity ownership over time. Instead of receiving all shares immediately, a recipient earns them incrementally according to a schedule. Unvested shares can be forfeited if the recipient leaves the company, aligning long-term incentives between the company and its equity holders.


Attach a vesting schedule to an existing equity grant.

Terminal window
corp cap-table create-vesting \
--grant-id $GRANT_ID \
--total-shares 1000000 \
--start-date 2026-04-01 \
--template "4yr/1yr cliff" \
--cliff-months 12 \
--total-months 48
Terminal window
curl -X POST http://localhost:8000/v1/entities/$ENTITY_ID/vesting-schedules \
-H "Authorization: Bearer $CORP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"grant_id": "'$GRANT_ID'",
"total_shares": 1000000,
"vesting_start_date": "2026-04-01",
"template": "standard_4y_1y_cliff",
"cliff_months": 12,
"total_months": 48
}'

Save the returned vesting_schedule_id.

ParameterDescription
grant_idThe equity grant this schedule applies to
total_sharesTotal number of shares that will vest over the schedule
vesting_start_dateDate vesting begins (typically the hire date or grant date)
templatePredefined vesting pattern (see below)
cliff_monthsMonths before the first vesting event occurs
total_monthsTotal duration of the vesting schedule

2. Standard 4-year / 1-year cliff template

Section titled “2. Standard 4-year / 1-year cliff template”

The standard_4y_1y_cliff template is the industry default for startup equity:

  • Cliff: 12 months. No shares vest during this period. If the recipient departs before the cliff, they receive nothing.
  • Cliff vest: 25% of total shares vest on the 1-year anniversary.
  • Monthly vesting: The remaining 75% vests in equal monthly installments over the next 36 months (approximately 2.08% per month).

Example with 1,000,000 shares starting 2026-04-01:

DateEventSharesCumulative
2027-04-01Cliff vest250,000250,000
2027-05-01Monthly vest20,833270,833
2027-06-01Monthly vest20,833291,666
2030-04-01Final vest20,8391,000,000

After creating a schedule, materialize it to generate individual vesting events:

Terminal window
corp cap-table materialize-vesting \
--schedule-id $VESTING_SCHEDULE_ID
Terminal window
curl -X POST http://localhost:8000/v1/entities/$ENTITY_ID/vesting-schedules/$VESTING_SCHEDULE_ID/materialize \
-H "Authorization: Bearer $CORP_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'

This creates individual vesting event records, each with a date and share count. All events start in the Scheduled state.

List materialized events:

Terminal window
corp cap-table vesting $ENTITY_ID

As each vesting date passes, transition events from Scheduled to Vested:

Terminal window
corp cap-table vest-event $EVENT_ID
Terminal window
curl -X POST http://localhost:8000/v1/entities/$ENTITY_ID/vesting-events/$EVENT_ID/vest \
-H "Authorization: Bearer $CORP_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'

Vested shares become part of the holder’s exercisable or owned position on the cap table.


When a recipient departs the company, all remaining Scheduled events are forfeited:

Forfeit is currently API-only — no CLI subcommand exists yet.

Terminal window
curl -X POST http://localhost:8000/v1/entities/$ENTITY_ID/vesting-events/$EVENT_ID/forfeit \
-H "Authorization: Bearer $CORP_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'

Forfeited events transition from Scheduled to Forfeited. Already-vested events are not affected.


To terminate the entire schedule on departure, which forfeits all remaining scheduled events in bulk:

Terminate is currently API-only — no CLI subcommand exists yet.

Terminal window
curl -X POST http://localhost:8000/v1/entities/$ENTITY_ID/vesting-schedules/$VESTING_SCHEDULE_ID/terminate \
-H "Authorization: Bearer $CORP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"termination_date": "2027-09-15"
}'

This vests all events with dates on or before the termination date and forfeits all events after it.


Acceleration allows some or all unvested shares to vest immediately upon a triggering event.

Acceleration provisions are configured when creating the vesting schedule via the acceleration_single_trigger and acceleration_double_trigger boolean fields. When an acceleration event occurs, the company vests all remaining scheduled events manually or via the API.

All unvested shares vest upon a single event, typically an acquisition (change of control). Enable by setting acceleration_single_trigger: true when creating the schedule.

Unvested shares vest only when both conditions are met: (1) a change of control occurs, and (2) the holder is terminated without cause within a defined window (typically 12 months after closing). Enable by setting acceleration_double_trigger: true when creating the schedule.

TypeTriggerCommon use
single_triggerChange of control aloneFounders, key executives
double_triggerChange of control + involuntary terminationEmployees with equity grants

Some grants allow recipients to exercise unvested shares before they vest. Early-exercised shares are still subject to the vesting schedule but are already purchased.

Early exercise uses the same exercise-option command. The grant’s vesting schedule must have early_exercise_allowed: true set when created.

Terminal window
corp cap-table exercise-option \
--grant-id $GRANT_ID \
--holder-id $HOLDER_ID \
--shares 250000
Terminal window
curl -X POST http://localhost:8000/v1/entities/$ENTITY_ID/grants/$GRANT_ID/exercise \
-H "Authorization: Bearer $CORP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"holder_id": "'$HOLDER_ID'",
"shares_to_exercise": 250000
}'

Early-exercised but unvested shares are automatically subject to a company repurchase right. If the holder departs before vesting, the company can buy back the unvested portion at the original strike price.


Scheduled → Vested (normal vesting or acceleration)
Scheduled → Forfeited (termination or departure)

Events can only transition forward. A Vested event cannot be forfeited, and a Forfeited event cannot be vested.


ActionCLIAPI
Create schedulecorp cap-table create-vestingPOST /v1/entities/{id}/vesting-schedules
Materialize eventscorp cap-table materialize-vestingPOST /v1/entities/{id}/vesting-schedules/{id}/materialize
Vest eventcorp cap-table vest-eventPOST /v1/entities/{id}/vesting-events/{id}/vest
Forfeit eventAPI onlyPOST /v1/entities/{id}/vesting-events/{id}/forfeit
Terminate scheduleAPI onlyPOST /v1/entities/{id}/vesting-schedules/{id}/terminate
Exercise optionscorp cap-table exercise-optionPOST /v1/entities/{id}/grants/{id}/exercise