The equity-compensation platform category — Carta, Shareworks, EquityZen, Pulley, and the next-generation entrants — handles a multi-year tracking problem. A grant is issued in 2022. It vests over 4 years with a 1-year cliff. The employee exercises some options in 2025, sells some shares in 2026, and the company IPOs in 2027. Each event has its own tax treatment, basis adjustment, and document trail. Get the math wrong on any one event and the year's tax filing is wrong by tens or hundreds of thousands of dollars.
This article is the working note for engineering teams building equity-compensation platforms. The data model the platform needs, the test scenarios that exercise the full code path, and the synthetic-data shape that surfaces the bugs before they ship to real holders.
What the platform has to model
A working equity-comp platform tracks five award types with different tax mechanics:
| Award type | Tax at grant | Tax at vest | Tax at exercise | Tax at sale | |
|---|---|---|---|---|---|
| RSU | None | Ordinary income on vested-share FMV | N/A (auto-issues at vest) | Capital gain/loss on excess over vest-FMV | |
| Restricted Stock with §83(b) | Ordinary income on grant FMV (if elected) | None (already taxed) | N/A | Capital gain on excess over grant FMV | |
| ISO (qualified disposition) | None | None | AMT on spread (federal); no regular tax | LTCG on full appreciation | |
| ISO (disqualifying disposition) | None | None | AMT on spread | Spread becomes ordinary income; appreciation past spread is capital | |
| NSO (non-qualified) | None | None | Ordinary income on spread | Capital gain on appreciation past exercise FMV | |
| ESPP §423 (qualifying) | None | N/A (purchased) | Ordinary income on lesser of discount or actual gain; capital on rest | (see exercise) | |
| ESPP §423 (disqualifying) | None | N/A | Ordinary income on full discount | (see exercise) |
Each row is a code path. A platform that handles all of them correctly is shipping engineering work that takes months to get right and years to keep right as IRS guidance evolves. Related: Section 199A QBI deduction modeling.
The data model
The minimum-viable data shape:
grant = {
grant_id, grantee_id, grant_date, grant_type,
shares_total, vesting_schedule: [{date, shares}],
strike_price (options only),
expiration_date,
fmv_at_grant, qsbs_eligible, section_83b_filed
}
lot = {
lot_id, grant_id, acquisition_method, acquisition_date,
shares, basis_per_share, holding_period_basis,
ordinary_income_at_acquisition,
amt_basis_per_share (ISO),
exercise_method (cash / cashless / net-exercise),
parent_lot_ids
}- fmv_at_grant
- = Per-share fair market value on the grant date — basis input for §83(b) elections and ISO AMT calculations
- qsbs_eligible
- = Whether the grant qualifies for Section 1202 small-business-stock exclusion (5-year hold + qualifying corp + acquisition method)
- amt_basis_per_share
- = ISO-specific — basis for AMT purposes is the FMV at exercise; basis for regular tax is the strike price. The bifurcation matters at sale.
- exercise_method
- = Cash exercise (full strike + tax), cashless (net of withholding), net-exercise (shares-for-shares). Each has different basis implications.
The events the platform has to handle
Beyond the basic grant → vest → exercise → sale flow, the platform has to model:
Event inventory
- Section 83(b) election filing — must be filed within 30 days of restricted-stock receipt; the platform has to surface the deadline and track the filing.
- Cliff vesting — most 4-year grants have a 1-year cliff; the platform has to compute zero vesting on day 1 of year 1 and full year-1 vesting on the cliff date.
- Acceleration provisions — single-trigger and double-trigger acceleration on change of control. The platform has to know which provisions the grant carries.
- Exercise post-termination — typical 90-day window for employee terminations; some companies extend to 1+ years. The platform has to flag pending expirations.
- Net exercise — strike paid in shares rather than cash; reduces the holder's share count and creates a single combined lot from the exercise transaction.
- Cashless exercise / sell-to-cover — sell enough at exercise to cover strike + withholding. Platform has to compute the right share count and the right cost basis.
- Forfeiture on termination — unvested shares are forfeited; the platform has to remove them and re-balance the cap table.
- ISO / NSO conversion — disqualifying dispositions reclassify the entire tax treatment; the platform has to back-out the qualified-treatment numbers and substitute disqualified ones.
- ESPP enrollment cycles — semi-annual lookback periods, contribution caps, automatic-purchase logic at end of cycle.
- Buybacks and tender offers — secondary liquidity events where the holder sells shares back to the company or to a tender pool.
- QSBS holding-period tracking — 5-year clock from acquisition to qualified status; platform should surface the qualification date prominently.
- Stock splits and reverse splits — proportional adjustment of share counts and basis-per-share across all lots.
- Mergers and acquisitions — share-for-share exchanges, cash-out events, escrow tranches. Each has different basis carry-over rules.
A platform missing any of these events has gaps where holders can lose track of basis or miss tax-relevant deadlines. Each event is a category of bug that real holders will eventually find — usually at tax-filing time, when the platform's output disagrees with the holder's accountant.
The tax-form generation
The platform's most-customer-visible output is the year-end tax-form package:
- Form 3921 for ISO exercises (issued by the company, but the platform has to supply the data)
- Form 3922 for §423 ESPP qualifying purchases
- Form W-2 Box 12 codes for NSO exercise income and 83(b) elections
- Form 1099-B equivalent for sales (broker-issued, but platform has to reconcile)
- Schedule D / Form 8949 transaction-by-transaction reporting
The platform has to produce data that the customer's tax software can ingest cleanly. The most common bug is mismatch between the platform's basis numbers and the broker's 1099-B basis numbers — the IRS requires reconciliation, and the customer is the one stuck doing it.
What synthetic test data needs to look like
A synthetic test corpus for an equity-comp platform should include:
- Spread 1Award type coverageAll 5 award types (RSU, restricted stock with 83(b), ISO, NSO, ESPP) at meaningful frequencies. Companies offering only RSU shouldn't have an ISO-only corpus.
- Spread 2Lifecycle stagePre-IPO startup (low FMV, paper-millionaire scenarios), late-stage pre-IPO (high FMV, AMT exposure), public-company (RSU-dominant), post-acquisition (cash-out, escrow). Each stage has different bug surfaces.
- Spread 3Edge casesQSBS-eligible founder grants. ISO disqualifying dispositions mid-year. ESPP qualifying vs disqualifying disposition decisions. Net exercises. Section 83(b) elections — both filed and not filed. Acceleration on change of control.
- Spread 4Tax-year boundariesExercises close to year-end (AMT impact in current year; sale in subsequent year). Vest dates close to year-end. Quarterly tax estimate timing.
- Spread 5State taxMulti-state employees (grant in CA, vest in TX). State tax conformity to federal §83(b) and ISO treatment varies.
- Spread 6Aggregation across grantsHolders with multiple grants over multiple years, with different vesting schedules. The platform has to aggregate into a single cohesive picture.
A test corpus missing any spread is a corpus where the platform has untested code paths. An equity-comp platform shipping production from an incomplete corpus is shipping bugs that will eventually surface when a holder's tax preparer disagrees with the year-end forms.
Key takeaways
- An equity-comp platform tracks five award types with different tax mechanics across the grant → vest → exercise → sale flow. Each award type is a code path.
- The minimum data model has 13+ fields per lot, including the AMT-basis bifurcation that ISO holders need.
- 13+ events the platform has to handle, including 83(b) elections, net exercise, cashless exercise, cliff vesting, forfeiture, and disqualifying dispositions.
- Year-end tax-form generation is the customer-visible output. Form 3921 (ISO), Form 3922 (ESPP), W-2 Box 12, and Schedule D all have to reconcile with broker 1099-B reporting.
- Test corpus needs award-type spread, lifecycle-stage spread, edge cases, tax-year boundary scenarios, and multi-state employees. Missing any spread leaves untested code paths.