Hello,
With $WORK, I have access to ESPP. The trick is that I'm located in Canada, where the ESPP discount in considered taxable income. So each buy event could look like this:
2025-12-01 * "ESPP Buy"
; the discount is taxed as income, so the cost basis is the FMV on the trade date
Assets:Broker:WORK 10 WORK { 100 USD }
Assets:Jobs:WORK:EsppFund -(85 * 10) USD
Income:Jobs:EsppDiscount -(15 * 10) USD
The issue I have is related to my paycheck. This EsppDiscount is spread over the course of a few paychecks under "Employer Paid Benefits" as "ESPP Gain". For other Employer Paid Benefits, I usually have a Income leg and an expense leg:
2025-12-15 * "Paycheck"
Income:Jobs:LifeInsurance -50 CAD
Expenses:Jobs:LifeInsurance 50 CAD
; Here if I add an 'Income' leg, the income would be counted twice
Expenses:Jobs:EsppGain 100 CAD
What I ended up doing is:
2025-12-01 * "ESPP Buy"
Assets:Broker:WORK 10 WORK { 100 USD }
Assets:Jobs:WORK:EsppFund -(85 * 10) USD
Liabilities:Jobs:EsppUntaxedGain -((15 * 10) * 1.2) CAD @@ -(15 * 10) USD
2025-12-15 * "First paycheck with an ESPP Gain entry"
Income:Jobs:EsppDiscount -50 CAD
Liabilities:Jobs:EsppUntaxedGain 50 CAD
; after a few paychecks, I need the pad directive to account for conversion imprecision
; the exchange rate in the buy event is from Bank of Canada, it's not the one the broker/my employer uses
2026-02-28 pad Liabilities:Jobs:EsppUntaxedGain Equity:Conversion
2026-02-28 balance Liabilities:Jobs:EsppUntaxedGain 0 CAD
This lets me track the EsppDiscount in CAD, which is what I need at the end of the day for my tax report.
Is this an okay way to book these transactions?
Cheers,
--
Damien