{
  "slug": "espp-discount-return",
  "title": "ESPP Discount Annualized Return Calculator",
  "heading": "ESPP Annualized Return Calculator",
  "category": "financial",
  "url": "https://www.revenuelab.fyi/toolbox/espp-discount-return",
  "summary": "Turn your employee stock purchase plan discount into an annualized return.",
  "description": "A typical ESPP lets you buy company stock at a 10–15% discount to market price, often using the lower of the price at the start or end of an offering period (a lookback provision). Held only for the few months of the offering period, that discount alone can translate into an eye-popping annualized return, because you're compounding a double-digit gain over a fraction of a year. This calculator takes your discount rate, the offering period length, and any lookback benefit to compute both the flat return per period and the annualized equivalent, then separately shows the tax hit if you sell immediately (a 'quick sale' taxed partly as ordinary income) versus holding for qualifying disposition treatment. Most financial planners recommend selling ESPP shares immediately unless you already have room for concentrated single-stock risk, because the discount is the real reward — the stock price itself is a coin flip.",
  "formula": "Purchase price = min(start price, end price) × (1 − discount). Period return = (market price − purchase price) ÷ purchase price. Annualized return = (1 + period return)^(365 ÷ offering days) − 1.",
  "dateModified": "2026-09-30",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=espp-discount-return",
  "inputs": [
    {
      "id": "startPrice",
      "label": "Stock price at start of offering period",
      "kind": "number",
      "hint": null,
      "default": 50,
      "unit": "$",
      "min": 0.01,
      "max": null
    },
    {
      "id": "endPrice",
      "label": "Stock price at purchase date",
      "kind": "number",
      "hint": null,
      "default": 58,
      "unit": "$",
      "min": 0.01,
      "max": null
    },
    {
      "id": "discount",
      "label": "ESPP discount",
      "kind": "number",
      "hint": null,
      "default": 15,
      "unit": "%",
      "min": 0,
      "max": 30
    },
    {
      "id": "lookback",
      "label": "Lookback provision?",
      "kind": "select",
      "hint": null,
      "default": "yes",
      "options": [
        {
          "value": "yes",
          "label": "Yes — lower of start/end price"
        },
        {
          "value": "no",
          "label": "No — end price only"
        }
      ]
    },
    {
      "id": "offeringDays",
      "label": "Offering period length",
      "kind": "number",
      "hint": null,
      "default": 180,
      "unit": "days",
      "min": 30,
      "max": 730
    },
    {
      "id": "sharesValue",
      "label": "Dollar amount contributed this period",
      "kind": "number",
      "hint": null,
      "default": 5000,
      "unit": "$",
      "min": 0,
      "max": null
    }
  ],
  "outputs": [
    {
      "id": "annualizedPct",
      "label": "Annualized return",
      "format": "percent",
      "hint": null,
      "primary": true
    },
    {
      "id": "periodReturnPct",
      "label": "Return for this offering period",
      "format": "percent",
      "hint": null,
      "primary": false
    },
    {
      "id": "purchasePrice",
      "label": "Your actual purchase price",
      "format": "currency",
      "hint": null,
      "primary": false
    },
    {
      "id": "dollarGain",
      "label": "Dollar gain on this contribution",
      "format": "currency",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "Stock price at start of offering period: 50 $",
      "Stock price at purchase date: 58 $",
      "ESPP discount: 15 %",
      "Lookback provision?: Yes — lower of start/end price",
      "Offering period length: 180 days",
      "Dollar amount contributed this period: 5000 $"
    ],
    "outputs": [
      "Annualized return: 87.9%",
      "Return for this offering period: 36.5%",
      "Your actual purchase price: $42.50",
      "Dollar gain on this contribution: $1,824"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter stock price at start of offering period ($).",
      "Enter stock price at purchase date ($).",
      "Enter espp discount (%).",
      "Enter lookback provision?.",
      "Enter offering period length (days).",
      "Enter dollar amount contributed this period ($).",
      "Read your annualized return on the right — it updates as you type.",
      "Hit Share to keep the scenario or send it to someone."
    ]
  },
  "scenarios": [
    {
      "name": "Conservative",
      "description": "Lower-end numbers — what if things land soft?",
      "values": {
        "startPrice": 30,
        "endPrice": 34.8,
        "discount": 9,
        "lookback": "yes",
        "offeringDays": 110,
        "sharesValue": 3000
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "startPrice": 50,
        "endPrice": 58,
        "discount": 15,
        "lookback": "yes",
        "offeringDays": 180,
        "sharesValue": 5000
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "startPrice": 80,
        "endPrice": 92.80000000000001,
        "discount": 24,
        "lookback": "yes",
        "offeringDays": 290,
        "sharesValue": 8000
      }
    }
  ],
  "limitations": [
    "Results are estimates before tax, fees, and inflation unless an input explicitly covers them.",
    "Rates are treated as fixed for the whole period — variable-rate products will drift from this projection.",
    "This is educational maths, not financial advice. Check anything contractual with the lender or your accountant."
  ],
  "faq": [
    {
      "q": "Why is the annualized return so much higher than the discount itself?",
      "a": "Because the discount, plus any lookback gain, is earned over just a few months, not a full year. Compounding a 15–40% period gain across two or four offering periods a year produces annualized numbers well north of 30%, which is why ESPPs are often the highest-certainty return available to an employee, assuming the stock doesn't crash before you sell."
    },
    {
      "q": "Should I sell immediately or hold the shares?",
      "a": "Selling immediately (a 'quick sale' or disqualifying disposition) locks in the discount as a known gain and removes single-stock risk, though part of the gain is taxed as ordinary income. Holding for a qualifying disposition (generally 2 years from grant and 1 year from purchase) shifts more of the gain to long-term capital gains rates but exposes you to full stock price risk for that whole time."
    },
    {
      "q": "What's the lookback provision doing in this calculation?",
      "a": "It lets your purchase price be based on whichever is lower: the stock price at the start of the offering period or at the purchase date. If the stock rose during the period, you still buy at the (discounted) starting price, effectively locking in a bigger gain than the discount alone would produce."
    },
    {
      "q": "Is there a cap on how much I can put into an ESPP?",
      "a": "IRS rules cap qualified §423 ESPP purchases at $25,000 of stock value (measured at the offering start price) per calendar year, and most plans also cap the percentage of salary you can contribute, commonly 10–15%."
    }
  ],
  "related": [
    "https://www.revenuelab.fyi/toolbox/rsu-vest-withholding-gap",
    "https://www.revenuelab.fyi/toolbox/amt-iso-exercise",
    "https://www.revenuelab.fyi/toolbox/asset-location-tax-efficiency"
  ],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — ESPP Discount Annualized Return Calculator (https://www.revenuelab.fyi/toolbox/espp-discount-return)"
}