Prevent mistakes, save time, and gain insights by keeping track of your option vesting administration using proper tools. The recipe in this repository turns your vesting schedule into a Clojournal collection. That enables analysis through plain text accounting tools like ledger. The only thing you have to do is to transform your schedule, which you can get using tools like Carta, into a data structure like in the example below.
Consider the example vesting schedule in the code below (also available in the examples/
directory of this repository).
(ns simple-example (:require [nl.epij.clojournal-recipe.option-vesting :refer [vesting-schedule->journal]] [nl.epij.clojournal-recipe.option-vesting.grant :as grant] [nl.epij.clojournal-recipe.option-vesting.period :as period] [com.clojournal.alpha.api :as c.api])) (def vesting-schedule "Transform your vesting schedule (for example, from Carta) into a data structure like this one" [{::period/grant {::grant/id "PL-1337" ::grant/price "R$ 3.42" ::grant/cliff "P1Y" ;; 1 year ::grant/issued-by "Example Inc." ::grant/underlying-asset "EXPL"} ::period/number "1" ::period/status ::period/exercised ::period/id "PL-1337/1" ::period/date "2017-12-15" ::period/options-vested 5000} {::period/grant {::grant/id "PL-1337" ::grant/price "R$ 3.42" ::grant/cliff "P1Y" ::grant/issued-by "Example Inc." ::grant/underlying-asset "EXPL"} ::period/number "2" ::period/status ::period/exercised ::period/id "PL-1337/2" ::period/date "2017-12-17" ::period/options-vested 25}]) (-> vesting-schedule vesting-schedule->journal c.api/journal println)
We pipe this code into babashka and get a plain text accounting journal.
bb --classpath "$(clojure -Spath)" --file /dev/stdin <<EOF
$example_code
EOF
2016-12-15 * (PL-1337) Example Inc. (Off-Balance:Unvested Options:PL-1337) EXPL 5025 (Off-Balance:Unexercised Options:PL-1337) EXPL 5025 2017-12-15 * (PL-1337/1) Example Inc. (Off-Balance:Unvested Options:PL-1337) EXPL -5000 Assets:Options 5000 "PL-1337" {R$ 3.42} Income -5000 "PL-1337" {R$ 3.42} [Unrealized:Equity:Capital Requirement] 5000 "PL-1337" @ R$ 3.42 [Unrealized:Liabilities:Exercise Provision] -5000 "PL-1337" @ R$ 3.42 [Unrealized:Assets:PL-1337] EXPL 5000 [Equity:Capital Gains Provision:PL-1337] EXPL -5000 2017-12-17 * (PL-1337/2) Example Inc. (Off-Balance:Unvested Options:PL-1337) EXPL -25 Assets:Options 25 "PL-1337" {R$ 3.42} Income -25 "PL-1337" {R$ 3.42} [Unrealized:Equity:Capital Requirement] 25 "PL-1337" @ R$ 3.42 [Unrealized:Liabilities:Exercise Provision] -25 "PL-1337" @ R$ 3.42 [Unrealized:Assets:PL-1337] EXPL 25 [Equity:Capital Gains Provision:PL-1337] EXPL -25
With the journal at hand we can do arbitrary queries using ledger. Below, we first add a stock valuation to the journal of $ 100. Then, we query the balance sheet and express the total value of the underlying stock in U.S. Dollar.
ledger --file - balance --exchange $ <<EOF
$example_ledger
commodity $
format $ 1,000.00
P 2020-09-07 EXPL $ 100
EOF
5025 PL-1337 Assets:Options $ -502,500.00 Equity:Capital Gains Provision:PL-1337 -5025 PL-1337 Income $ 502,500.00 Off-Balance:Unexercised Options:PL-1337 $ 502,500.00 Unrealized $ 502,500.00 Assets:PL-1337 5025 PL-1337 Equity:Capital Requirement -5025 PL-1337 Liabilities:Exercise Provision -------------------- $ 502,500.00
Now, try a register query, check lot prices, include this journal into other journals, add valuations through price DBs, and exchange the unrealized gains to fiat currencies.
I’m not an accountant so take the book account decisions with a grain of salt! That said, I’d love to see PRs where you challenge these decisions.