Vesting System#
Overview#
Vesting Terms objects support a structured representation of security vesting. This is accomplished by expressing security vesting as a graph of "Vesting Conditions", and then recording vesting transactions for each security.
The current philosophy is that these graphs will be directed and acyclic. Each condition (node) in the graph specifies the trigger (edge) for entering that condition, and vesting some portion or quantity of the linked security. The conditions also then list all possible subsequent conditions.
Let's look at some examples.
Example 1: Event-based vesting#
We'll start with a minimal example of event-based vesting. In this scenario, let's say a Plan Security has been issued but it will not vest at all unless the company is sold for $100,000,000 or more. We can express this as a graph:
flowchart TB
id(( ))
sold[[qualifying-sale: 100%]]
id-->|Company acquisition > $100MM|sold
And this graph is expressed in JSON as:
{
"id": "all-or-nothing",
"object_type": "VESTING_TERMS",
"name": "Documentation: Example 1",
"description": "100% of the options vest on a security-specific date",
"allocation_type": "CUMULATIVE_ROUND_DOWN",
"vesting_conditions": [
{
"id": "qualifying-sale",
"description": "Company is acquired for > $100MM",
"portion": {
"numerator": "1",
"denominator": "1"
},
"trigger": {
"type": "VESTING_EVENT"
},
"next_condition_ids": []
}
]
}
Let's break down the single Vesting Condition here.
- It has
trigger.type
ofVESTING_EVENT
. This means that this condition is not met, and thus this portion of vesting does not occur, until an event is triggered and recorded in the transaction log. - It has a Vesting Condition Portion
portion
of 1/1; in other words, 100%. - It has an empty array of
next_condition_ids
. This means this is a terminating node on the graph and is the end of vesting.
When the security is first issued, we associate it with the Vesting Terms by ID:
{
"object_type": "TX_PLAN_SECURITY_ISSUANCE",
"id": "b1746426",
"security_id": "vesting-ex-1",
"date": "2021-01-01",
"vesting_terms_id": "all-or-nothing",
"quantity": "500",
"..."
}
If the issuance is the only transaction object on record, then this issuance is 0% vested. Let's say, however, that a qualifying sale were to occur. To represent this, we add a Vesting Event Transaction to the record:
{
"object_type": "TX_VESTING_EVENT",
"id": "d0a02b7a",
"security_id": "vesting-ex-1",
"date": "2022-07-14",
"vesting_condition_id": "qualifying-sale"
}
This event is linked to the issuance by the security_id
field, and is linked
to the vesting condition via the vesting_condition_id
. This means that on 14
July 2022, a vesting event occurred for the referenced security. The amount
vested is derived from:
- The
quantity
on the security's issuance event. - The
portion
on the vesting conditionqualifying-sale
, which is a condition on the security's vesting termsall-or-nothing
.
This is a simple example, but it also probably isn't a very realistic one. In our next example, we'll show how to add time-based deadlines to an event.
Example 2: Event-based vesting with deadlines#
Let's say that our hypothetical company has realized that the terms described in Example 1 are not motivating enough, and so they want to add a deadline:
The security will only vest if the qualifying sale happens within three years of issuance, or prior to Jan 1, 2025, whichever happens first.
Our graph is now a little more complicated:
flowchart TB
id(( ))
start[[vesting-start]]
sold[[qualifying-sale: 100%]]
rel([relative-expiration: 0%])
abs(absolute-expiration: 0%)
id-->|Issuance|start
start-->|+3 years|rel
start-->|Jan 1, 2025|abs
start-->|Company acquisition > $100MM|sold
This graph is expressed in JSON as:
{
"id": "all-or-nothing-with-expiration",
"object_type": "VESTING_TERMS",
"name": "Documentation: Example 2",
"description": "100% of the options vest on a security-specific date, within time boundaries",
"allocation_type": "CUMULATIVE_ROUND_DOWN",
"vesting_conditions": [
{
"id": "vesting-start",
"description": "The date on which the vesting period begins",
"trigger": {
"type": "VESTING_START_DATE"
},
"quantity": "0",
"next_condition_ids": [
"relative-expiration",
"absolute-expiration",
"qualifying-sale"
]
},
{
"id": "relative-expiration",
"description": "0% vesting three years after vesting start",
"portion": {
"numerator": "0",
"denominator": "1"
},
"trigger": {
"type": "VESTING_SCHEDULE_RELATIVE",
"period": {
"length": 36,
"type": "MONTHS",
"occurrences": 1,
"day_of_month": "VESTING_START_DAY_OR_LAST_DAY_OF_MONTH"
},
"relative_to_condition_id": "vesting-start"
},
"next_condition_ids": []
},
{
"id": "absolute-expiration",
"description": "0% vesting after 1 Jan, 2025",
"quantity": "0",
"trigger": {
"type": "VESTING_SCHEDULE_ABSOLUTE",
"date": "2025-01-01"
},
"next_condition_ids": []
},
{
"id": "qualifying-sale",
"description": "Company is acquired for > $100MM",
"portion": {
"numerator": "1",
"denominator": "1"
},
"trigger": {
"type": "VESTING_EVENT"
},
"next_condition_ids": []
}
]
}
We're introducing a few new concepts here, so let's tackle them one at a time.
Vesting Start#
The first condition in our array of vesting conditions has a Vesting Start Trigger. This trigger is essentially a special case of a Vesting Event, like from our first example. Since it is the first item in our array of conditions, it is the first node in our graph. Its occurrence is recorded in the transaction log in the same way as a vesting event, but as a Vesting Start Transaction:
{
"object_type": "TX_VESTING_START",
"id": "08f8b870",
"security_id": "vesting-ex-1",
"date": "2021-01-01",
"vesting_condition_id": "vesting-start"
}
Since our terms said the relative expiration is within three years of issuance, in this case, the date of our Vesting Start Transaction is the same as our issuance date. This won't always be the case, as you'll see in other examples.
next_condition_ids
#
Unlike in Example 1, we now have a next_condition_ids
that is not empty.
These strings are references to the id
of other vesting conditions, and
indicate the paths we might follow as we navigate our vesting graph. As
time passes, or as events occur, we evaluate the triggers for each possible
"next" condition in the next_condition_ids
array order.
In this case, after vesting-start
has been triggered, we have three possible
next conditions:
relative-expiration
absolute-expiration
qualifying-sale
Since the two expirations are date based, one way to think about this is a daily evaluation:
- If
relative-expiration
's trigger condition is met, gotorelative-expiration
and vest nothing, else: - If
absolute-expiration
's trigger condition is met, gotoabsolute-expiration
and vest nothing, else: - If
qualifying-sale
's trigger condition is met, gotoqualifying-sale
and vest 100%, else: - Nothing happens
Only one path is ever taken, and graphs should be acylic.
We've already discussed how qualifying-sale
is triggered in Example 1, but
let's break down the new triggers.
Vesting Schedule Relative#
Our relative-expiration
condition has a
Vesting Schedule Relative Trigger. These triggers are
relative to any prior condition that has already been met, as described by
relative_to_condition_id
.
In this case, the period
specifies that this condition
triggers 1 time (occurrences
) after 36 MONTHS (length
+ type
). Since
relative_to_condition_id
is vesting-start
, this means the condition is
triggered 36 months after the Vesting Start transaction. Since the Vesting
Start transaction is dated 1 Jan, 2021, this will trigger 1 Jan, 2024.
Unlike the Vesting Start and Vesting Event triggers, Vesting Schedule Relative triggers do not have corresponding transactions in the transaction record. Their triggering is implicit based on the passage of time.
Vesting Schedule Absolute#
Our absolute-expiration
condition has a
[Vesting Schedule Absolute Trigger][absolute-trigger]. These triggers are
met at a specific date, regardless of any other vesting event dates in the
transaction log.
In this case, the date
specifies that this condition would trigger on
1 Jan, 2025. Since that is after the trigger for relative-expiration
for this security, it will never happen. If we issued another security
with a later vesting start, however, this trigger could come into play. For
example, with this issuance:
{
"object_type": "TX_PLAN_SECURITY_ISSUANCE",
"id": "6174642b",
"security_id": "vesting-ex-2",
"date": "2023-07-01",
"vesting_terms_id": "all-or-nothing-with-expiration",
"quantity": "500",
"..."
}
and this Vesting Start transaction:
{
"object_type": "TX_VESTING_START",
"id": "80f8b807",
"security_id": "vesting-ex-2",
"date": "2023-07-01",
"vesting_condition_id": "vesting-start"
}
the relative-expiration
would not trigger until 1 July, 2026 -- so the
absolute-expiration
will trigger instead.
Similar to the Vesting Schedule Relative trigger, Vesting Schedule Absolute triggers do not have corresponding transactions in the transaction record. Their triggering is implicit based on the passage of time.
Quantity vs Portion#
You may have also noticed along the way that some of the conditions in this
example have a quantity
key instead of a portion
key. All Vesting
Conditions support either a relative portion
or a fixed quantity
of shares.
Example 3: Schedule-based vesting#
A fairly common vesting structure is one that is fully scheduled, with some kind of delay or "cliff" before any vesting begins. For this example, we'll construct a set of terms that correspond to four years, vested monthly, with 25% vested at a one year cliff.
flowchart TB
id(( ))
start[[vesting-start]]
cliff([cliff: 12/48])
monthly([monthly-thereafter: 1/48])
id-->start
start-->|+1 year|cliff
cliff-->|+1 month|monthly
subgraph periodic
monthly-.->|+1 month, 35x|monthly
end
And this graph is expressed in JSON as:
{
"id": "4yr-1yr-cliff-schedule",
"object_type": "VESTING_TERMS",
"name": "Four Year / One Year Cliff",
"description": "25% of the total number of shares shall vest on the one-year anniversary of this Agreement, and an additional 1/48th of the total number of Shares shall then vest on the corresponding day of each month thereafter, until all of the Shares have been released on the fourth anniversary of this Agreement.",
"allocation_type": "CUMULATIVE_ROUNDING",
"vesting_conditions": [
{
"id": "vesting-start",
"quantity": "0",
"trigger": {
"type": "VESTING_START_DATE"
},
"next_condition_ids": ["cliff"]
},
{
"id": "cliff",
"description": "25% payout at 1 year",
"portion": { "numerator": "12", "denominator": "48" },
"trigger": {
"type": "VESTING_SCHEDULE_RELATIVE",
"period": {
"length": 12,
"type": "MONTHS",
"occurrences": 1,
"day_of_month": "VESTING_START_DAY_OR_LAST_DAY_OF_MONTH"
},
"relative_to_condition_id": "vesting-start"
},
"next_condition_ids": ["monthly-thereafter"]
},
{
"id": "monthly-thereafter",
"description": "1/48th payout each month thereafter",
"portion": { "numerator": "1", "denominator": "48" },
"trigger": {
"type": "VESTING_SCHEDULE_RELATIVE",
"period": {
"length": 1,
"type": "MONTHS",
"occurrences": 36,
"day_of_month": "VESTING_START_DAY_OR_LAST_DAY_OF_MONTH"
},
"relative_to_condition_id": "cliff"
},
"next_condition_ids": []
}
]
},
A lot of the concepts used here were introduced in Example 2. A security associated with this set of Vesting Terms ...
{
"object_type": "TX_PLAN_SECURITY_ISSUANCE",
"id": "607e59ab",
"security_id": "vesting-ex-3",
"date": "2021-01-01",
"vesting_terms_id": "4yr-1yr-cliff-schedule",
"quantity": "480",
"..."
}
... begins vesting when a Vesting Start transaction is logged:
{
"object_type": "TX_VESTING_START",
"id": "a32bd9ca",
"security_id": "vesting-ex-3",
"date": "2021-01-30",
"vesting_condition_id": "vesting-start"
}
Note this will normally be the only vesting transaction in the transaction log for this security, as all other vesting is scheduled and thus the events are implicit based on the passage of time.
The vesting-start
condition lists a single next_condition_id
named "cliff",
which is configured to trigger 12 months after vesting start on 2022-01-31, and
vest 12/48 of the security -- 120 shares. (This portion could just as easily be
25/100, or 1/4; the example only uses the denominator of 48 for consistency.)
Once this condition has triggered, the schedule dictates we wait for the next
condition, "monthly-thereafter", to trigger. This combination of events
introduces us to two new concepts.
Vesting Schedule Relative occurrences
#
You may have noticed that the visualized graph for this set of vesting terms
appears to have a cycle in it, even though in the introduction we stated that
graphs were acyclic. After the initial trigger of monthly-thereafter
as we
navigate from the cliff condition, this node appears to trigger itself 35 more
times. The sub-graph and the dashed line in the graph is meant to imply that
this is an internal state of the condition, not a "next" condition. This
repeated triggering is controlled by the occurrences
attribute.
In this case, occurrences is set to 36, and the portion is set to 1/48. This means that once this trigger condition is met, it will continue to re-trigger until it has triggered 36 times total. Each time, 1/48 of the security's quantity will vest.
Vesting Day of Month#
Both the cliff
and monthly-thereafter
conditions in this example specify
a day_of_month
attribute with the value
VESTING_START_DAY_OR_LAST_DAY_OF_MONTH
. This attribute is required for
schedule-relative triggers that are specified in months. Possible values are
enumerated here.
In this case, our value states to use the day of the vesting start transaction or the last day of the month. This explicit requirement is important to handle edge cases such as this one, in which the vesting start transaction occurred on 30 January, 2021.
For our cliff
condition, the relative time is 12 months. As specified in the
schema, months are calendar months, so this condition triggers on 30 January, 2022.
The monthly-thereafter
condition, however, uses a relative time of 1 month.
Since there is no day 30 in February, the "or last day of month" logic applies
and the first trigger occurs on 28 February, 2022. This would trigger on 29
February in a leap year as, again, relative months are calendar months.
Each subsequent occurrence of the periodic monthly trigger would apply the same logic. Since every other month has a day 30, the rest of the occurrences would occur on the 30th of the month.
If legal documents specify vesting using 365-day years, relative triggers should be expressed in days instead of months.