wRog (wrog) wrote,
wRog
wrog

  • Mood:

How to do taxes on ESPP sales ([ex]msft folks)

Figure if I don't post this, a third person will come along and ask about it.

So here's how I do these. It's different from the official explanation, but I've convinced myself it's completely equivalent and (IMHO) a lot easier. (YMMV / I'm not a CPA / I don't play one on TV / etc ...)

First, a big wall 'o numbers. Copy and paste into a .csv file if you want to play with them in Excel or whatever.
Date,      Start_Price, End_Price, Actual_Cost, Max_Income,  Max_Basis
31-Dec-1997,  31.234375, 32.31250,   26.550,     4.684375,   31.234375 
30-Jun-1998,  32.78125,  54.18750,   27.865,     4.91625,    32.78125 
31-Dec-1998,  54.6875,   69.34375,   46.485,     8.2025,     54.6875 
30-Jun-1999,  70.5000,   90.18750,   59.930,    10.5700,     70.5000 
31-Dec-1999,  91.1875,  116.750,     77.510,    13.6775,     91.1875 
30-Jun-2000, 116.5625,   80.000,     68.00,     17.4825,     85.4825 
31-Dec-2000,  80.0000,   43.375,     36.87,     12.0000,     48.8700 
30-Jun-2001,  43.3750,   73.000,     36.87,      6.5050,     43.3750 
31-Dec-2001,  70.6000,   66.250,     56.31,     10.5900,     66.9000 
30-Jun-2002,  67.0400,   54.700,     46.50,     10.0600,     56.5600

Start_Price = closing price on the first trading day of the period 
End_Price   = closing price on the last  trading day of the period

Max_Income = 0.15 * Start_Price  (***)
Max_Basis  = Actual_Cost + Max_Income 
These are all per-share and adjusted for splits. I had to get the last 4 rows off of bigcharts.com, so you might want to check my start + end prices against the official list that they gave you (and that's on a Microsoft internal webpage somewhere; not the Schwab mailing). And whenever MSFT does its upcoming split, you'll need to divide these all by two or whatever --- or you could just multiply by the number of shares you actually have right now, jot those numbers down somewhere and just forget about splits from now on.

Each share has a cost basis for the purpose of Schedule D. In the World of ESPP, the basis for a given share will always be >= what you actually paid for it. The difference, if nonzero, is ordinary income.


  • If it's a disqualifying disposition (meaning the holding period was less than 18 months and you're still alive), ignore the last two columns.
    Your basis is End_Price.
    The ordinary income portion has already been included on your W-2 so there won't be anything for you to do other than check that they got the amount correct --- according to my own scorecard based on experience going back to 1994, there's only about a 70% chance that the Schwab folks will get this right the first time; be vigilant.

  • If it's a qualifying disposition (meaning you held it more than 18 months or you're dead), only the last 3 columns matter. The basis depends on the sale price (fair market value) that you get when you sell/die.

    If you sold for <= Actual_Cost,
    your basis is Actual_Cost (ordinary income is zero).

    If you sold for >= Max_Basis,
    your basis is Max_Basis (ordinary income is Max_Income).

    Otherwise,
    your basis is what you sold for
    (i.e., your capital gain/loss will be essentially zero (**)).
    The ordinary income portion goes on Line 21 of your 1040; put something like "ESPP ORDINARY INCOME" on the dotted line next to it.

    In this case, nothing from the Schwab ESPP-tracking folks goes to the IRS (the 1099B does, but that's sent out by different people at Schwab), so if their information is subtly (or completely) wrong, don't sweat it.

Once you have the basis per share, you multiply by the number of shares, enter in column (e) (*).
Ordinary income is always basis minus Actual_Cost.
And that's basically it.


Re TurboTax: I've never used TurboTax myself, but it should be possible to just pretend that you bought the shares on the end-period date for the basis price and enter the ordinary income portion separately as if that were money coming magically out of nowhere that has nothing to do with the sale of the shares.


And now some examples:

Suppose we sold 100 shares from the Dec-2000 lot. Grabbing the appropriate row from above, we see that
  End_Price   = $43.375
  Actual Cost = $36.87
  Max_Income  = $12.00
  Max_Basis   = $48.87
per share.

If we had sold on 11-July-2002 (qualifying disposition) for $60/share, $45/share, or $35/share (yeah, I know it hasn't gotten that low... yet...), we'd have, respectively,
(a) desc(b) acquired(c) sold(d) proceeds(e) basis(f) gainLine 21 of 1040
100 sh. MSFT31-Dec-200011-July-20025974.234887.001087.231200.00
100 sh. MSFT31-Dec-200011-July-20024474.234500.00(25.77)813.00
100 sh. MSFT31-Dec-200011-July-20023474.233687.00(212.77)0.00

(where the 25.77 amount for commission+SEC_fees on the sale was pulled directly out of my ass; I have no idea what Schwab's rates are like these days).

If we had sold on 11-May-2002 (disqualifying disposition) instead...
(a) desc(b) acquired(c) sold(d) proceeds(e) basis(f) gainIncluded on W-2
100 sh. MSFT31-Dec-200011-May-20025974.234337.501636.73650.50
100 sh. MSFT31-Dec-200011-May-20024474.234337.50136.73650.50
100 sh. MSFT31-Dec-200011-May-20023474.234337.50(863.27)650.50



(*) Note that for most brokers these days, the number they put on the 1099B is after subtracting off commissions and fees. If it so happens that Schwab turns out to be weird and doesn't subtract commissions and fees (there's a checkbox on the form that will tell you this), then you need to add these into whatever basis you enter in column (e). This won't affect the ordinary income portion. Repeating the first set of examples above for this world:
(a) desc(b) acquired(c) sold(d) proceeds(e) basis(f) gainLine 21 of 1040
100 sh. MSFT31-Dec-200011-July-20026000.004912.771087.231200.00
100 sh. MSFT31-Dec-200011-July-20024500.004525.77(25.77)813.00
100 sh. MSFT31-Dec-200011-July-20023500.003712.77(212.77)0.00

Whichever way they do it, the 1099B number is what goes in column (d).

Also, there's a place on the Schedule D where you sum all of the column (d)s and you want to make sure that number matches the sum of all of the Box 2's on the 1099B forms. That's one of the audit flags. Unless you've been doing short sales or wonky option things, this shouldn't be a problem.

(**) One might suppose that it's always zero, but there's a detail that I'm not entirely sure about, namely what happens with commissions+fees. The actual law (26 USC sec 423) says "fair market value", which I assume means not including commissions+fees, which suggests that commissions+fees always show up as a slight capital loss in this case.

(***) There is some funky rounding going on here. Basically, if you're anal-retentive and want the calculations to come out exactly the same (I'm sure the IRS won't care) as the way the HR folks are doing it, what you really want here is not 0.15 * StartPrice but rather StartPrice minus what ActualCost would have been if EndPrice had been higher, the latter being rounded in exactly the way they would have done it. So for example, for the 30-Jun-2000 period, 15% of StartPrice is actually 17.484375, but if that actually had determined the price for the period, they would actually have taken 85% of 116.5625 and rounded it to two places to get 99.08, which is why the MaxIncome number is actually 17.4825. As I said, I'm pretty sure the IRS won't care (unless you've got hundreds of thousands of shares, and maybe not even then).
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments