How to Find a Lockup Expiration Date
A lockup expiration date lives in the IPO prospectus, not on a calendar page. Where to find it, and why counting 180 days from the first trade gets it wrong.
A lockup expiration date is written into the IPO prospectus, and the quickest way to find it is to open the issuer's final prospectus on EDGAR and read two places: the section headed "Shares Eligible for Future Sale" and the "Lock-Up Agreements" discussion inside "Underwriting". Between them they give the number of shares that become sellable and the day the restriction lifts. The counting rule below is where most published dates go wrong, and the release conditions after it are why a printed date is sometimes not the operative one.
If you want the concept first, what an IPO lockup is covers what the agreement does and who signs it. This page is the lookup.
Where the lockup expiration date is written
Every US IPO leaves the same paper trail. Open EDGAR full text search, find the company, and pull its filing list.
- The S-1 is the registration statement. It carries lockup language from the first public draft onward, and amendments arrive as S-1/A, with terms that can change between them.
- The 424B4 is the final prospectus, filed within two business days of pricing. It matches the deal that actually happened. Read this one.
Inside the document, search for both spellings, "lock-up" and "lockup", since filings are inconsistent about the hyphen. Three sections carry the answer.
- Shares Eligible for Future Sale is the supply schedule: how many shares are restricted and the date each block becomes eligible for sale. The sentence you want reads something like "beginning 181 days after the date of this prospectus".
- Underwriting, sometimes headed "No Sales of Similar Securities", is the contract: who signed, what they may not do, the carve-outs, and which underwriters hold the power to release shares early.
- Risk Factors almost always restates the schedule in plainer English, inside the risk factor about substantial future sales.
The filings a company makes covers the rest of the form alphabet.
Count from the pricing date, not the first trading day
The clock starts at "the date of this prospectus". That is the pricing date, the evening the underwriters set the price. The stock opens the next session. Anyone counting 180 days from the first bar on a chart lands a day late.
The count is also in calendar days, not sessions, and the day it lands on may be a Saturday. Nine well known listings, with day 180 taken from each deal's pricing date:
The exact SQL behind every number
WITH ipos AS (
SELECT tupleElement(pair, 1) AS ticker,
toDate(tupleElement(pair, 2)) AS pricing_date
FROM (
SELECT arrayJoin([('LYFT', '2019-03-28'), ('UBER', '2019-05-09'),
('DASH', '2020-12-08'), ('ABNB', '2020-12-09'),
('HOOD', '2021-07-28'), ('RIVN', '2021-11-09'),
('CAVA', '2023-06-14'), ('BIRK', '2023-10-10'),
('RDDT', '2024-03-20')]) AS pair
)
),
sessions AS (
SELECT DISTINCT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2019-03-01 00:00:00')
AND window_start < toDateTime('2026-08-01 00:00:00')
)
SELECT i.ticker AS ticker,
formatDateTimeInJodaSyntax(i.pricing_date, 'MMM d, yyyy') AS pricing_date_label,
formatDateTimeInJodaSyntax(addDays(i.pricing_date, 180), 'MMM d, yyyy') AS day_180_label,
formatDateTime(addDays(i.pricing_date, 180), '%W') AS day_180_weekday,
countIf(s.session_date > i.pricing_date
AND s.session_date <= addDays(i.pricing_date, 180)) AS market_opens,
formatDateTimeInJodaSyntax(
minIf(s.session_date, s.session_date >= addDays(i.pricing_date, 180)),
'MMM d, yyyy') AS next_open_session_label
FROM ipos AS i
CROSS JOIN sessions AS s
GROUP BY i.ticker, i.pricing_date
ORDER BY (minIf(s.session_date, s.session_date >= addDays(i.pricing_date, 180))
> addDays(i.pricing_date, 180)) DESC,
i.pricing_date ASCOne hundred and eighty calendar days came to 122 market opens for DASH and 123 for RDDT. Counting 180 trading days instead puts you roughly two months past the real date, the other common way to get this wrong.
The panel is sorted to put any count landing on a closed market first. DASH priced on Dec 8, 2020, its day 180 fell on a Sunday, and the first session on or after it was Jun 7, 2021. Shares become sellable on the contract date. They can only change hands at the next open.
180 days is a convention, not a rule
The 180-day term is the market standard, and it is a habit rather than a requirement. Variants you will meet in filings:
- 90 days, more common in smaller deals.
- 365 days, occasionally applied to founders or control holders in the same deal that gives everyone else 180.
- Staged releases, where a fraction frees at one date and the balance at another. The prospectus states each tranche as a share count and a date.
- Split terms by group. Officers and directors, pre-IPO funds, and employees can each sign different agreements in one deal, in which case there is no single lockup expiration date at all.
The share count matters as much as the date. Compare the restricted block against the stock's float to see how much tradeable supply the schedule adds on paper.
What moves the date after it is printed
- A waiver. The named underwriters can release holders early in writing, and they often do this alongside a marketed secondary offering. Nothing in the original filing changes.
- Early release conditions. Many recent agreements free a tranche once the stock trades at or above a stated premium to the IPO price for a stated number of days inside a window, and only after the first or second quarterly earnings release.
- Earnings window openings. Agreements commonly open the release window a set number of trading days after an earnings report, which pins the effective date to the earnings calendar rather than to the anniversary count.
- A new registration. A resale registration statement, or a takedown off a shelf, can put a block into the market on its own schedule.
Each of these lives in a filing or a company announcement. A date on a calendar site that no filing supports is a guess.
What the tape does around day 180
Volume is the observable part. Here is one listing traced week by week through its first year, Reddit, which priced on March 20, 2024:
The exact SQL behind every number
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toFloat64(sum(volume)) AS shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'RDDT'
AND window_start >= toDateTime('2024-03-21 00:00:00')
AND window_start < toDateTime('2025-03-21 00:00:00')
GROUP BY session_date
)
SELECT toMonday(session_date) AS week,
round(avg(shares) / 1e6, 2) AS avg_daily_volume_m
FROM daily
GROUP BY week
ORDER BY weekThe chart covers 53 weeks. The first averaged 32.21 million shares a session. The last averaged 12.16 million. Grouping the same sessions by their distance from the pricing date puts numbers on the windows a lockup reader cares about:
The exact SQL behind every number
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toFloat64(sum(volume)) AS shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'RDDT'
AND window_start >= toDateTime('2024-03-21 00:00:00')
AND window_start < toDateTime('2025-03-21 00:00:00')
GROUP BY session_date
)
SELECT multiIf(dateDiff('day', toDate('2024-03-20'), session_date) <= 30, 'Days 1-30',
dateDiff('day', toDate('2024-03-20'), session_date) <= 90, 'Days 31-90',
dateDiff('day', toDate('2024-03-20'), session_date) <= 170, 'Days 91-170',
dateDiff('day', toDate('2024-03-20'), session_date) <= 200, 'Days 171-200',
'Days 201-365') AS window_label,
round(avg(shares) / 1e6, 2) AS avg_daily_volume_m,
round(max(shares) / 1e6, 2) AS busiest_session_m
FROM daily
GROUP BY window_label
ORDER BY min(dateDiff('day', toDate('2024-03-20'), session_date))Days 1 to 30 averaged 10.17 million shares a session. Days 91 to 170, the stretch running into the 180-day mark, averaged 3.39 million. Days 171 to 200, the four weeks bracketing it, averaged 3.92 million, with a busiest session of 7.2 million shares.
Read that as one company's record rather than a rule. Now take the 180-day convention as an assumption and apply it to all nine listings:
The exact SQL behind every number
WITH ipos AS (
SELECT tupleElement(pair, 1) AS ticker,
toDate(tupleElement(pair, 2)) AS pricing_date
FROM (
SELECT arrayJoin([('LYFT', '2019-03-28'), ('UBER', '2019-05-09'),
('DASH', '2020-12-08'), ('ABNB', '2020-12-09'),
('HOOD', '2021-07-28'), ('RIVN', '2021-11-09'),
('CAVA', '2023-06-14'), ('BIRK', '2023-10-10'),
('RDDT', '2024-03-20')]) AS pair
)
),
daily AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
toFloat64(sum(volume)) AS shares
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('LYFT', 'UBER', 'DASH', 'ABNB', 'HOOD', 'RIVN', 'CAVA', 'BIRK', 'RDDT')
AND window_start >= toDateTime('2019-07-01 00:00:00')
AND window_start < toDateTime('2024-11-01 00:00:00')
GROUP BY ticker, session_date
)
SELECT d.ticker AS ticker,
round(avgIf(d.shares, dateDiff('day', i.pricing_date, d.session_date) BETWEEN 120 AND 170) / 1e6, 2) AS baseline_volume_m,
round(avgIf(d.shares, dateDiff('day', i.pricing_date, d.session_date) BETWEEN 171 AND 200) / 1e6, 2) AS window_volume_m,
round(avgIf(d.shares, dateDiff('day', i.pricing_date, d.session_date) BETWEEN 171 AND 200)
/ avgIf(d.shares, dateDiff('day', i.pricing_date, d.session_date) BETWEEN 120 AND 170), 2) AS volume_ratio
FROM daily AS d
INNER JOIN ipos AS i ON d.ticker = i.ticker
GROUP BY d.ticker
HAVING countIf(dateDiff('day', i.pricing_date, d.session_date) BETWEEN 120 AND 170) >= 20
AND countIf(dateDiff('day', i.pricing_date, d.session_date) BETWEEN 171 AND 200) >= 10
ORDER BY volume_ratio DESCThe ratio divides average daily volume in days 171 to 200 by the same figure for days 120 to 170. A reading near 1 means the weeks around day 180 looked like the weeks before them. UBER came in highest at 4.53x, on a baseline of 8.47 million shares a session. LYFT came in lowest at 0.93x. Across 9 deals the same assumption produces a wide range of outcomes, which is the argument for reading the filing rather than the convention.
Announcements of registered offerings land after the close, and the first print anyone sees is the next morning's open. Overnight gaps covers that mechanic.
Secondary offerings and Form 144 around the date
Two filing types show up next to a release.
- A registered offering. A prospectus supplement filed under Rule 424(b)(5), or a fresh S-1 registering the resale of existing shares, means holders are selling through underwriters instead of one at a time on the exchange. The document names the selling holders and their share counts.
- Form 144. An affiliate proposing to sell restricted or control stock files a notice once the sale passes 5,000 shares or $50,000 in any three month period. Since 2023 these notices are filed electronically on EDGAR, which makes them searchable next to everything else. Rule 144 also caps an affiliate's quarterly volume at the greater of 1% of shares outstanding or the average weekly reported volume over the four weeks before the notice.
Form 4 filings record what insiders actually sold. Read together, the Form 144 is the intent and the Form 4 is the receipt.
The 2026 class runs the same paperwork
Pull the 424B4 for the name you care about, read the two sections, count from the prospectus date, then check whether the agreement carries an early release condition. The 2026 IPO market covers the first half's deal flow, and the SpaceX listing's first month traces what the tape did in the weeks after that debut.
One caution about published tables of upcoming dates. Most are generated by adding 180 days to a listing date, which repeats both errors above: the one day offset, and the assumption that the convention holds for every holder. A date is worth having only when a filing supports it, which is why there is no forecast table on this page.
Lockup expiration date FAQ
Where is the lockup expiration date in an S-1?
In two sections. "Shares Eligible for Future Sale" carries the schedule of how many shares free up and when. The "Lock-Up Agreements" text inside "Underwriting" carries the contract terms and names the underwriters who can waive them. The final 424B4 prospectus repeats both with the priced deal's numbers.
Does a lockup start on the IPO date or the pricing date?
The pricing date. Filings phrase it as a number of days after "the date of this prospectus", which is the day the deal prices, one session before trading opens. Counted that way, day 180 covered 122 market opens for DASH, whose day 180 landed on Jun 6, 2021.
Is every IPO lockup 180 days?
No. The 180-day term is a convention. Terms of 90 and 365 days both appear, staged releases free part of a holding earlier, and separate holder groups in one deal can sign different agreements.
Can a lockup end before the date in the prospectus?
Yes. The underwriters can waive it in writing, and many agreements include early release conditions measured against the share price over a window of trading days, often gated to the period after an earnings release. Confirm any early release in a filing or a company announcement.
How do you tell whether insiders sold after a lockup expired?
Form 144 notices record an affiliate's intent to sell, and Form 4 filings record completed insider transactions. A registered secondary appears as a 424(b)(5) supplement or a resale S-1, and it names the selling holders.
Every figure above comes from a stored query over session data, with the SQL under each panel. Change the tickers, move the day windows, and run the same count on the Strasmore terminal.