IPO Lockup Expiration: Meaning & Release Date
A lockup expiry is the day IPO insiders can finally sell, customarily 180 days after listing. Where to find the exact end date, and how five unlocks traded.
An IPO lockup is a contractual ban on insiders selling their shares for a set period after a listing, customarily around 180 days for a traditional IPO. When it expires, the sellable share count can multiply overnight, and the date is public months in advance. This page measures what actually happened on five famous expiry days, price, volume, and the options tape, instead of arguing from one anecdote.
What is an IPO lockup period?
Lockups are contracts, not regulations: their length, coverage, and early-release triggers live in each deal's prospectus, in agreements the insiders, founders, employees, pre-IPO funds, sign with the underwriters. While the lockup holds, the tradable float is roughly the shares sold in the offering; the float guide measured H1 2026's IPOs floating a median of just under a third of their shares at listing, which means the locked majority often dwarfs everything trading. Expiry does not force anyone to sell; it makes selling possible, and markets spend the preceding weeks arguing about the difference.
Lengths vary by deal type, and "180 days" is a convention, not a rule. Traditional IPOs customarily use about 180 days. SPAC sponsors commonly accept around a year, often with early release if the shares hold above a stated price. Follow-on offerings frequently use 90-day lockups. And many modern deals stagger the release in tranches, employee shares on one date, early investors on another, precisely so no single date carries the whole overhang.
How to find the actual expiration date
The real date is in the deal's own filings, not in date arithmetic. The final prospectus, the 424(B)(4) filed on the SEC's EDGAR site at pricing, spells the terms out in two sections: Shares Eligible for Future Sale (how many shares unlock, and when) and Underwriting (who is bound, and what permits an early release). Company investor-relations pages often restate the date. Counting 180 days from the listing is a fallback guess, and the guess can miss: Lyft's 2019 unlock landed on August 19, weeks ahead of 180-day arithmetic from its March 29 listing, the deal's own terms set the earlier date. Underwriters can also waive a lockup early, and waivers are typically disclosed.
Before the date: Facebook's run-in
The most-watched lockup in market history is Facebook's November 14, 2012 release, when a large tranche of insider shares came free at once. The claim usually attached to that day is that known dates get priced in advance. The two weeks in front of the date are the test:
| session | close | shares_m | day_change_pct | vs_peak_close_pct |
|---|---|---|---|---|
| 2012-10-22 | 19.32 | 31.1 | 0 | -16.8 |
| 2012-10-23 | 19.5 | 51.4 | 0.9 | -16 |
| 2012-10-24 | 23.21 | 193.1 | 19 | 0 |
| 2012-10-25 | 22.53 | 74.3 | -2.9 | -2.9 |
| 2012-10-26 | 21.94 | 70.7 | -2.6 | -5.5 |
| 2012-10-31 | 21.12 | 94.4 | -3.7 | -9 |
| 2012-11-01 | 21.22 | 36.3 | 0.5 | -8.6 |
| 2012-11-02 | 21.18 | 37.7 | -0.2 | -8.8 |
| 2012-11-05 | 21.25 | 31.3 | 0.3 | -8.5 |
| 2012-11-06 | 21.19 | 27.2 | -0.3 | -8.7 |
| 2012-11-07 | 20.48 | 32.7 | -3.4 | -11.8 |
| 2012-11-08 | 20 | 33.7 | -2.4 | -13.8 |
| 2012-11-09 | 19.19 | 41 | -4.1 | -17.3 |
| 2012-11-12 | 20.09 | 63 | 4.7 | -13.5 |
| 2012-11-13 | 19.88 | 70.2 | -1.1 | -14.4 |
The exact SQL behind every number
SELECT session, close, shares_m,
round((close / lagInFrame(close, 1, close) OVER (ORDER BY session) - 1) * 100, 1) AS day_change_pct,
round((close / max(close) OVER () - 1) * 100, 1) AS vs_peak_close_pct
FROM (
SELECT toString(toDate(toTimeZone(window_start, 'America/New_York'))) AS session,
round(argMax(close, window_start), 2) AS close,
round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'FB'
AND window_start >= toDateTime('2012-10-22 00:00:00')
AND window_start < toDateTime('2012-11-14 00:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session
)
ORDER BY sessionOn 2012-10-24, the session after its third-quarter report, FB closed at $23.21, up 19% on 193.1 million shares, the window's peak close. It then gave the jump back into the date: on the eve of the unlock the stock closed at $19.88, -14.4% below that peak and within a few percent of the $19.5 it closed at before the report. (The gap in the table is real, U.S. equity markets were closed October 29–30, 2012 for Hurricane Sandy.) Anyone determined to sell in front of the unlock had weeks to do it at leisure; the date had been in the prospectus since May.
The day itself, and the two weeks after
Then the most feared date on the young stock's calendar arrived:
| session | close | shares_m | vs_eve_close_pct |
|---|---|---|---|
| 2012-11-13 | 19.88 | 70.2 | 0 |
| 2012-11-14 | 22.36 | 216 | 12.5 |
| 2012-11-15 | 22.18 | 77 | 11.6 |
| 2012-11-16 | 23.55 | 106 | 18.5 |
| 2012-11-19 | 22.9 | 81.8 | 15.2 |
| 2012-11-20 | 23.1 | 44.8 | 16.2 |
| 2012-11-21 | 24.33 | 87.4 | 22.4 |
| 2012-11-23 | 24 | 28.3 | 20.7 |
| 2012-11-26 | 25.92 | 117.1 | 30.4 |
| 2012-11-27 | 26.16 | 82 | 31.6 |
| 2012-11-28 | 26.34 | 48 | 32.5 |
| 2012-11-29 | 27.3 | 83.7 | 37.3 |
| 2012-11-30 | 27.98 | 85.7 | 40.7 |
The exact SQL behind every number
SELECT session, close, shares_m,
round((close / first_value(close) OVER (ORDER BY session) - 1) * 100, 1) AS vs_eve_close_pct
FROM (
SELECT toString(toDate(toTimeZone(window_start, 'America/New_York'))) AS session,
round(argMax(close, window_start), 2) AS close,
round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'FB'
AND window_start >= toDateTime('2012-11-13 00:00:00')
AND window_start < toDateTime('2012-12-01 00:00:00')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session
)
ORDER BY sessionOn 2012-11-14, the unlock day itself, FB closed at $22.36, 12.5% above the eve's close, on 216 million shares against 70.2 million the session before. The follow-through answers the question a skeptic should ask next: did the pop survive contact with actual insider selling? It did, and extended, by 2012-11-30 the stock stood 40.7% above the eve close, with volume running above the pre-expiry norm for most of the stretch. Unlocked supply prints as volume when it sells, and here the tape absorbed it with price rising. The standard reading, offered as interpretation: the expiry was the most telegraphed event in the stock's young life, the fear had been sold in advance, and the date's arrival removed an uncertainty rather than adding one.
Beyond Facebook: five expiries, measured
One rally is an anecdote. Here is the same measurement, expiry-day close versus the prior session, and the volume multiple, across five of the most-watched unlocks of the past fifteen years. Each date is the deal's most-reported unlock session; several of these companies released shares in multiple tranches, so a single row is one cliff, not the whole overhang.
| ticker | expiry_session | prior_close | expiry_close | expiry_day_change_pct | expiry_shares_m | volume_multiple |
|---|---|---|---|---|---|---|
| FB | 2012-11-14 | 19.88 | 22.36 | 12.5 | 216 | 3.1 |
| TWTR | 2014-05-06 | 38.72 | 31.86 | -17.7 | 123.8 | 12.3 |
| SNAP | 2017-07-31 | 13.82 | 13.68 | -1.1 | 46.8 | 2.9 |
| LYFT | 2019-08-19 | 52.51 | 51.67 | -1.6 | 22.9 | 3.9 |
| UBER | 2019-11-06 | 28.01 | 26.94 | -3.9 | 114.2 | 2.3 |
The exact SQL behind every number
WITH daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
argMax(close, window_start) AS close,
sum(toFloat64(volume)) AS vol
FROM global_markets.delayed_stocks_minute_aggs
WHERE ((ticker = 'FB' AND window_start >= toDateTime('2012-11-12 00:00:00') AND window_start < toDateTime('2012-11-15 00:00:00'))
OR (ticker = 'TWTR' AND window_start >= toDateTime('2014-05-04 00:00:00') AND window_start < toDateTime('2014-05-07 00:00:00'))
OR (ticker = 'SNAP' AND window_start >= toDateTime('2017-07-27 00:00:00') AND window_start < toDateTime('2017-08-01 00:00:00'))
OR (ticker = 'LYFT' AND window_start >= toDateTime('2019-08-15 00:00:00') AND window_start < toDateTime('2019-08-20 00:00:00'))
OR (ticker = 'UBER' AND window_start >= toDateTime('2019-11-04 00:00:00') AND window_start < toDateTime('2019-11-07 00:00:00')))
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker, d
),
packed AS (
SELECT ticker, arraySort(x -> x.1, groupArray((d, close, vol))) AS rows
FROM daily
GROUP BY ticker
)
SELECT ticker,
toString(rows[-1].1) AS expiry_session,
round(rows[-2].2, 2) AS prior_close,
round(rows[-1].2, 2) AS expiry_close,
round((rows[-1].2 / rows[-2].2 - 1) * 100, 1) AS expiry_day_change_pct,
round(rows[-1].3 / 1e6, 1) AS expiry_shares_m,
round(rows[-1].3 / rows[-2].3, 1) AS volume_multiple
FROM packed
ORDER BY expiry_sessionThe distribution, not the anecdote, is the lesson. Four of the five closed lower on the day, and FB's 12.5% rise is the outlier, not the rule. Most of the declines were shallow, SNAP -1.1%, LYFT -1.6%, UBER -3.9%, sessions that would draw no notice without the date attached. The exception is Twitter: -17.7% on 12.3x the prior day's volume, the heaviest multiple in the table, on 2014-05-06, with 123.8 million shares changing hands in the session. A circled date can still break a stock. What every row shares is the volume column: all five expiry sessions ran at least double the prior session's share count. Direction is deal-specific; the crowd showing up is not.
The options tape ahead of a known date
Shareholders are not the only ones positioning. A holder who cannot or will not sell ahead of a known date can buy puts instead, and that pre-positioning is visible in the derivatives tape before the unlock arrives. Uber's November 6, 2019 lockup expiration is the clean example inside our options-trades coverage:
| session | put_contracts_k | call_contracts_k | put_share_pct | prints_k |
|---|---|---|---|---|
| 2019-10-23 | 11.3 | 11.6 | 49.3 | 2.8 |
| 2019-10-24 | 21.4 | 11.6 | 64.8 | 2.5 |
| 2019-10-25 | 14.3 | 13.4 | 51.7 | 2.9 |
| 2019-10-28 | 9.6 | 14.9 | 39.1 | 3.1 |
| 2019-10-29 | 43.5 | 19.4 | 69.2 | 5.6 |
| 2019-10-30 | 40 | 25.4 | 61.2 | 6.7 |
| 2019-10-31 | 51.2 | 30.9 | 62.4 | 9 |
| 2019-11-01 | 65.5 | 31.4 | 67.6 | 10.4 |
| 2019-11-04 | 171.5 | 119.6 | 58.9 | 36.6 |
| 2019-11-05 | 226.2 | 132.2 | 63.1 | 46.6 |
| 2019-11-06 | 245.3 | 116.5 | 67.8 | 41.5 |
| 2019-11-07 | 69.1 | 65.8 | 51.2 | 14.5 |
| 2019-11-08 | 51.7 | 48.6 | 51.5 | 9.6 |
The exact SQL behind every number
SELECT toString(toDate(toTimeZone(sip_timestamp, 'America/New_York'))) AS session,
round(sumIf(size, substring(ticker, length(ticker) - 8, 1) = 'P') / 1e3, 1) AS put_contracts_k,
round(sumIf(size, substring(ticker, length(ticker) - 8, 1) = 'C') / 1e3, 1) AS call_contracts_k,
round(100.0 * sumIf(size, substring(ticker, length(ticker) - 8, 1) = 'P') / sum(size), 1) AS put_share_pct,
round(count() / 1e3, 1) AS prints_k
FROM global_markets.options_trades
WHERE ticker >= 'O:UBER19' AND ticker < 'O:UBER20'
AND sip_timestamp >= toDateTime('2019-10-23 00:00:00') AND sip_timestamp < toDateTime('2019-11-09 00:00:00')
GROUP BY session
ORDER BY sessionTwo weeks out, on 2019-10-23, UBER's options tape was close to balanced: puts were 49.3% of contract volume, on 11.3 thousand put contracts. Into the date the tape grew put-heavy and far larger, on 2019-11-06, the expiry day, 245.3 thousand put contracts traded, many times the window-opening count, and puts took 67.8% of the day's contracts. One honest caveat: the same week carried Uber's quarterly report, published November 4 after the close, so two circled dates sat two sessions apart on this tape. The session after the unlock, the put share snapped back to 51.2%, near even, and contract counts collapsed from the peak. Scheduled risk gets hedged; then the hedges go away.
Holding through an unlock: what practitioners check
Nothing here is advice, these are the mechanics worth checking. Get the real date from the filing, the 424(B)(4), not 180-day arithmetic, and note whether the release is staggered. Watch volume, not just price: an expiry that passes on ordinary volume means the unlock stayed theoretical, and insider supply is visible as tape when it prints. Hedging a known date costs premium: puts over an event everyone can see tend to be expensive, and what it costs to trade options covers the spread and premium arithmetic any hedge pays. Staggered releases blunt cliffs by design, spreading the overhang across several dates.
The next marquee expiry on this site's watchlist belongs to SpaceX's June 12, 2026 listing. Applying the customary 180-day convention puts the window's end near early December 2026, arithmetic on the receipted listing date, not a statement of the deal's actual terms, which live in its prospectus and may differ. The SK Hynix debut joins the same watchlist one month behind, and the H1 2026 IPO class stacks more of these dates into late 2026.
Lockup expiration FAQ
What is an IPO lockup period?
A contractual agreement barring company insiders, founders, employees, pre-IPO investors, from selling shares for a set period after the IPO. The exact terms live in each deal's prospectus, and underwriters can waive them early.
How long do IPO lockups last?
Customarily about 180 days for a traditional IPO, but that figure is a convention: SPAC sponsor lockups often run about a year with price-based early release, follow-on offerings commonly use 90 days, and many deals stagger releases across several dates.
Do stocks always drop when the lockup expires?
No. Of the five marquee expiries measured above, four closed lower and one, Facebook, November 2012, closed 12.5% higher on 3.1x volume. The worst of the five, Twitter's May 2014 unlock, printed -17.7% on the day. The reliable pattern was volume, every one of the five ran at least double the prior session, not direction.
How do I find a stock's lockup expiration date?
In the deal's final prospectus, form 424(B)(4) on the SEC's EDGAR site, under Shares Eligible for Future Sale and Underwriting. Those sections state the length, the share counts by tranche, and any early-release triggers: the authoritative version of a date that headlines often approximate.
When is the SpaceX lockup expiration?
The deal's actual terms live in its prospectus; the customary 180-day convention, applied to its June 12, 2026 listing date, points to early December 2026. Treat that as arithmetic, not a confirmed date.
Every panel above is a stored, versioned query over the as-traded tape, expand the SQL under any panel, or measure the next unlock's session yourself on the Strasmore terminal.