Strasmore Research
Deep Dives Matt ConnorBy Matt Connor · data as of September 18, 2026 · refreshed weekly

Upcoming IPO Lockup Expirations: Next 90 Days

A refreshed calendar of upcoming IPO lockup expirations for US listings in the next 90 days: listing date, 180-day date, and each close versus offer price.

Upcoming IPO lockup expirations are the dates on which a newly listed company's insiders and pre-IPO investors become free to sell shares for the first time. A lockup is the contractual ban on selling that the underwriters place on those holders at the IPO, most often for 180 days. The calendar below lists every priced US IPO whose conventional 180-day lockup lands inside the next 90 days, computed from the listing date, with each stock's latest close set against its offer price. It was computed on September 18, 2026, holds 57 names, and regenerates on the weekly refresh: a date that passes drops off and the next one moves up. The full mechanics, including whom the ban binds, are in what an IPO lockup expiration is.

Upcoming IPO lockup expirations in the next 90 days

The soonest conventional date in view belongs to KPETU (KPET Ultra Paceline Corp), listed on Mar 31, whose 180th day is Sun, Sep 27, 9 days out. The farthest is WLCOU on Tue, Dec 15, 88 days out. Read the table top to bottom as a countdown: the days_away column measures each date from the day the table was computed, and unlock_180d is the listing date plus 180 calendar days.

QueryIPO lockup calendar: priced US listings whose 180-day date falls in the next 90 days
57 rows (showing 20)
tickercompanylisted_onlisted_labelunlock_180dunlock_labeldays_awaycomputed_on
KPETUKPET Ultra Paceline Corp2026-03-31Mar 312026-09-27Sun, Sep 279September 18, 2026
HMHHMH Holding Inc.2026-04-01Apr 12026-09-28Mon, Sep 2810September 18, 2026
NHIVUNewHold Investment Corp IV2026-04-14Apr 142026-10-11Sun, Oct 1123September 18, 2026
ARXSArxis Inc.2026-04-16Apr 162026-10-13Tue, Oct 1325September 18, 2026
MAIRMadison Air Solutions Corp.2026-04-16Apr 162026-10-13Tue, Oct 1325September 18, 2026
ALMRAlamar Biosciences Inc.2026-04-17Apr 172026-10-14Wed, Oct 1426September 18, 2026
AVEXAEVEX Corp.2026-04-17Apr 172026-10-14Wed, Oct 1426September 18, 2026
KLRAKailera Therapeutics Inc.2026-04-17Apr 172026-10-14Wed, Oct 1426September 18, 2026
EMIEncore Medical Inc.2026-04-22Apr 222026-10-19Mon, Oct 1931September 18, 2026
NHPNational Healthcare Properties Inc.2026-04-22Apr 222026-10-19Mon, Oct 1931September 18, 2026
YSWYYesway Inc2026-04-22Apr 222026-10-19Mon, Oct 1931September 18, 2026
ELMTElmet Group Co. The2026-04-23Apr 232026-10-20Tue, Oct 2032September 18, 2026
XEX-Energy Inc.2026-04-24Apr 242026-10-21Wed, Oct 2133September 18, 2026
CXIIUChurchill Capital Corp XII2026-04-28Apr 282026-10-25Sun, Oct 2537September 18, 2026
PSUSPershing Square USA Ltd.2026-04-29Apr 292026-10-26Mon, Oct 2638September 18, 2026
AVLNAvalyn Pharma Inc.2026-04-30Apr 302026-10-27Tue, Oct 2739September 18, 2026
GCGRUGeneral Catalyst Global Resilience Merger Corp.2026-04-30Apr 302026-10-27Tue, Oct 2739September 18, 2026
SBMTSilver Bow Mining Corp.2026-04-30Apr 302026-10-27Tue, Oct 2739September 18, 2026
WENCUWest Enclave Merger Corp.2026-04-30Apr 302026-10-27Tue, Oct 2739September 18, 2026
COAGHemab Therapeutics Holdings Inc.2026-05-01May 12026-10-28Wed, Oct 2840September 18, 2026
The exact SQL behind every number
SELECT
    ticker,
    company,
    toString(listed_d)                                          AS listed_on,
    concat(formatDateTime(listed_d, '%b'), ' ',
           toString(toDayOfMonth(listed_d)))                    AS listed_label,
    toString(unlock_d)                                          AS unlock_180d,
    concat(formatDateTime(unlock_d, '%a, %b'), ' ',
           toString(toDayOfMonth(unlock_d)))                    AS unlock_label,
    dateDiff('day', today(), unlock_d)                          AS days_away,
    concat(monthName(today()), ' ',
           toString(toDayOfMonth(today())), ', ',
           toString(toYear(today())))                           AS computed_on
FROM
(
    SELECT
        ticker,
        argMax(issuer_name, _ingest_time)                       AS company,
        argMax(toDate(listing_date), _ingest_time)              AS listed_d,
        addDays(listed_d, 180)                                  AS unlock_d
    FROM global_markets.stocks_ipos
    WHERE ticker != ''
      AND ticker NOT IN ('SPCX')
      AND toDate(listing_date) BETWEEN today() - 180 AND today() - 90
      AND ipo_status NOT IN ('pending', 'postponed', 'withdrawn', 'rumor', 'direct_listing_process')
      AND positionCaseInsensitive(issuer_name, 'acquisition') = 0
      AND final_issue_price > 0
    GROUP BY ticker
)
ORDER BY unlock_d, ticker
Run this yourself

One rule for reading the date column: it is the convention, not the contract. A 180-day term is what most US IPO underwriting agreements specify, and it is the only term a listing date can produce on its own. A prospectus can set a different length (90 days and a full year both occur) or a staggered schedule that frees a slice of the shares early, and none of that lives in the listing record. The methodology section below shows how to check a row against the prospectus; for the document itself, see how to find a lockup expiration date. When the 180th day lands on a weekend or a market holiday, the freed shares first trade on the next business day. The label carries the weekday for that reason.

How do these IPOs trade versus their offer price?

Where a stock sits relative to its offer price, the price at which the IPO shares were sold, is the first thing most readers check on a lockup calendar: it sets the paper gain each class of holder is sitting on, and a pre-IPO investor who paid a fraction of the offer holds a gain at almost any post-IPO level. The panel matches every calendar name to its latest daily close and expresses the gap as a percentage of the offer price, with the sign carrying the direction.

QueryLatest close versus IPO offer price for every name in the calendar
51 rows (showing 20)
tickeroffer_pricelast_closevs_offer_pctpriced_as_of
COAG1841.06128.1September 18, 2026
PBLS2040.54102.7September 18, 2026
ALMR1732.0588.5September 18, 2026
AVLN1833.385September 18, 2026
ARXS2850.0878.9September 18, 2026
ELMT1422.0157.2September 18, 2026
NHP1216.1434.5September 18, 2026
CNXU45.2631.6September 18, 2026
ODTX1823.2229September 18, 2026
EROK18.523.8128.7September 18, 2026
LCLN2025.3326.6September 18, 2026
SPTX1822.1623.1September 17, 2026
SSMR13.516.4221.7September 18, 2026
CXIIU1011.1411.4September 14, 2026
RACC1011.111September 17, 2026
YSWY2021.768.8September 18, 2026
KARD1617.116.9September 18, 2026
WHK2627.325.1September 17, 2026
CBRS185193.924.8September 18, 2026
FRBT1818.844.7September 18, 2026
The exact SQL behind every number
SELECT
    i.ticker                                                AS ticker,
    round(i.offer_px, 2)                                    AS offer_price,
    round(p.last_px, 2)                                     AS last_close,
    round((p.last_px / i.offer_px - 1) * 100, 1)            AS vs_offer_pct,
    concat(monthName(p.last_d), ' ',
           toString(toDayOfMonth(p.last_d)), ', ',
           toString(toYear(p.last_d)))                      AS priced_as_of
FROM
(
    SELECT
        ticker,
        argMax(toFloat64(final_issue_price), _ingest_time)  AS offer_px
    FROM global_markets.stocks_ipos
    WHERE ticker != ''
      AND ticker NOT IN ('SPCX')
      AND toDate(listing_date) BETWEEN today() - 180 AND today() - 90
      AND ipo_status NOT IN ('pending', 'postponed', 'withdrawn', 'rumor', 'direct_listing_process')
      AND positionCaseInsensitive(issuer_name, 'acquisition') = 0
      AND final_issue_price > 0
    GROUP BY ticker
) AS i
INNER JOIN
(
    SELECT
        ticker,
        toFloat64(argMax(close, date))                      AS last_px,
        max(date)                                           AS last_d
    FROM global_markets.stocks_daily_aggs
    WHERE date >= today() - 10
      AND close > 0
    GROUP BY ticker
) AS p ON p.ticker = i.ticker
ORDER BY vs_offer_pct DESC, ticker
Run this yourself

As of September 18, 2026, the top row trades 128.1% against its offer price and the bottom row -83.8%, across 51 names that printed a close within the last ten sessions. A name that appears in the calendar but not here has no close on record in that window. The offer price is the final issue price from the IPO record, unadjusted for any later corporate action.

How many lockups are in the pipeline?

Each month's listings become the lockup calendar roughly six months later. The panel counts priced US listings by listing month over the trailing year, with SPACs and direct listings excluded under the same filter the calendar uses. The three months that sit about six months back are the ones filling the table above; the most recent months show what the calendar will hold half a year from now.

QueryPriced US IPO listings by month, trailing year (the lockup pipeline)
monthmonth_labelipo_count
2025-09Sep 20257
2025-10Oct 202530
2025-11Nov 202513
2025-12Dec 202517
2026-01Jan 202613
2026-02Feb 202618
2026-03Mar 20267
2026-04Apr 202618
2026-05May 202621
2026-06Jun 202623
2026-07Jul 202615
2026-08Aug 202611
2026-09Sep 20261
The exact SQL behind every number
SELECT
    formatDateTime(listing_month, '%Y-%m')                  AS month,
    formatDateTime(listing_month, '%b %Y')                  AS month_label,
    count()                                                 AS ipo_count
FROM
(
    SELECT
        ticker,
        toStartOfMonth(argMax(toDate(listing_date), _ingest_time)) AS listing_month
    FROM global_markets.stocks_ipos
    WHERE ticker != ''
      AND ticker NOT IN ('SPCX')
      AND toDate(listing_date) BETWEEN today() - 365 AND today()
      AND ipo_status NOT IN ('pending', 'postponed', 'withdrawn', 'rumor', 'direct_listing_process')
      AND positionCaseInsensitive(issuer_name, 'acquisition') = 0
      AND final_issue_price > 0
    GROUP BY ticker
)
GROUP BY listing_month
ORDER BY listing_month
Run this yourself

The series runs from Sep 2025 (7 listings) to Sep 2026 (1 so far), with the end months clipped by the trailing-year window. Lockups cluster the way listings do: a heavy listing month becomes a heavy expiration month two quarters later, and the calendar's row count swings with it from one refresh to the next. The first-half 2026 IPO market review covers the listing side in detail, drawing on the same IPO record.

Can a lockup end early?

Yes, and a listing date alone cannot show it. There are two paths. The prospectus may carry an early-release provision, commonly a release after the first post-IPO earnings report if the stock has closed above a stated multiple of the offer price for a set number of days. Separately, the underwriters can waive the lockup for some or all holders at any time, and often do alongside a follow-on offering in which the sellers are the very holders the lockup binds. Either path surfaces in the issuer's own filings, usually an 8-K, the current report a company files with the SEC when something material happens. The panel below scans 8-K filings from issuers that listed in the last two years for a lock-up mention.

Query8-K filings from recent IPO issuers that mention a lock-up, last 180 days
25 rows (showing 20)
tickerfiled_onfiled_labelform_typelockup_mentionsfiling_url
GRDN2026-09-10Sep 108-K7https://www.sec.gov/Archives/edgar/data/1802255/0001193125-26-387858.txt
NTHI2026-09-10Sep 108-K3https://www.sec.gov/Archives/edgar/data/1979414/0001829126-26-009977.txt
SWMR2026-09-10Sep 108-K7https://www.sec.gov/Archives/edgar/data/2092574/0001104659-26-106499.txt
MAIR2026-08-25Aug 258-K6https://www.sec.gov/Archives/edgar/data/2098430/0001628280-26-058764.txt
ROC2026-08-19Aug 198-K14https://www.sec.gov/Archives/edgar/data/2077709/0001213900-26-091418.txt
HAWK2026-08-13Aug 138-K10https://www.sec.gov/Archives/edgar/data/1750704/0001750704-26-000018.txt
ATHR2026-08-11Aug 118-K9https://www.sec.gov/Archives/edgar/data/2026353/0001493152-26-037023.txt
RACC2026-07-27Jul 278-K8https://www.sec.gov/Archives/edgar/data/2118032/0001193125-26-316954.txt
ATHR2026-07-21Jul 218-K9https://www.sec.gov/Archives/edgar/data/2026353/0001493152-26-034007.txt
JUNS2026-07-21Jul 218-K1https://www.sec.gov/Archives/edgar/data/1679628/0001493152-26-034077.txt
CSQR2026-07-17Jul 178-K1https://www.sec.gov/Archives/edgar/data/2105398/0001104659-26-084616.txt
CRCL2026-07-02Jul 28-K1https://www.sec.gov/Archives/edgar/data/1876042/0001876042-26-000205.txt
XE2026-06-04Jun 48-K5https://www.sec.gov/Archives/edgar/data/2088896/0001193125-26-256369.txt
ARXS2026-06-02Jun 28-K6https://www.sec.gov/Archives/edgar/data/2093536/0001193125-26-252459.txt
WGRX2026-05-29May 298-K10https://www.sec.gov/Archives/edgar/data/2030763/0001493152-26-026452.txt
FJET2026-05-22May 228-K4https://www.sec.gov/Archives/edgar/data/1947016/0001062993-26-002837.txt
JUNS2026-05-20May 208-K1https://www.sec.gov/Archives/edgar/data/1679628/0001493152-26-024547.txt
EROK2026-05-19May 198-K5https://www.sec.gov/Archives/edgar/data/2104882/0001193125-26-231118.txt
CAEP2026-05-11May 118-K2https://www.sec.gov/Archives/edgar/data/2034268/0001213900-26-054575.txt
CRCL2026-05-11May 118-K1https://www.sec.gov/Archives/edgar/data/1876042/0001876042-26-000148.txt
The exact SQL behind every number
SELECT
    k.ticker                                                   AS ticker,
    toString(toDate(k.filing_date))                            AS filed_on,
    concat(formatDateTime(toDate(k.filing_date), '%b'), ' ',
           toString(toDayOfMonth(toDate(k.filing_date))))      AS filed_label,
    any(k.form_type)                                           AS form_type,
    max(countSubstringsCaseInsensitive(k.items_text, 'lock-up')
        + countSubstringsCaseInsensitive(k.items_text, 'lockup')) AS lockup_mentions,
    any(k.filing_url)                                          AS filing_url
FROM global_markets.stocks_8k_text AS k
WHERE k.ticker IN
(
    SELECT ticker
    FROM global_markets.stocks_ipos
    WHERE ticker != ''
      AND ticker NOT IN ('SPCX')
      AND toDate(listing_date) BETWEEN today() - 730 AND today() - 30
      AND ipo_status NOT IN ('pending', 'postponed', 'withdrawn', 'rumor', 'direct_listing_process')
      AND positionCaseInsensitive(issuer_name, 'acquisition') = 0
      AND final_issue_price > 0
)
  AND toDate(k.filing_date) >= today() - 180
  AND (positionCaseInsensitive(k.items_text, 'lock-up') > 0
       OR positionCaseInsensitive(k.items_text, 'lockup') > 0)
GROUP BY k.ticker, k.accession_number, k.filing_date
ORDER BY k.filing_date DESC, k.ticker
LIMIT 25
Run this yourself

Matches over the last 180 days: 25, capped at 25, the newest from GRDN on Sep 10. A match is only a lead. A follow-on offering 8-K mentions lock-up agreements for the new deal; an earnings 8-K may simply restate the schedule. Open the filing from the link in the table and read the paragraph. Early lockup releases and waivers walks through the forms these take and who has the authority to grant them.

What happens in the two weeks after a lockup expires?

The question behind every lockup calendar is whether the stock drops once the shares are free. That measurement lives in do stocks fall after lockup expiration, which tracks the price path around past expiration dates from the same listing record and refreshes on its own schedule, so the figures are cited there rather than copied here. What this page adds is a checklist for the two weeks after any date in the table above:

  • Volume against the stock's own average over the sessions before the date. A freed float (the shares available to trade) that is actually being sold shows up as a step in shares traded, whatever the price does.
  • Form 4 filings. Section 16 insiders (officers and directors, plus any holder above 10%) report open-market sales within two business days, which puts the first insider sales on EDGAR inside the same week.
  • The daily short volume ratio, the share of each day's volume marked as short sales. Traders who borrowed stock ahead of the date have fresh supply to cover against once it passes.
  • A secondary offering filed at or just before the date. That is a common shape for an early release, and the 8-K panel above catches many of them.

How is each row computed?

Every row can be reproduced from the SQL under its panel. The steps:

  1. Source. The IPO listing record supplies ticker, issuer name, listing date and final issue price; the latest close comes from daily bars; filings come from the SEC EDGAR index and the 8-K text feed.
  2. Filters. Priced IPOs only. SPACs (any issuer with "acquisition" in its name) and direct listings are excluded: neither follows the 180-day convention. One reused symbol that tags two companies in vendor feeds is excluded in the SQL.
  3. Window. A listing date between 180 and 90 days ago, exactly the set whose 180th day falls between today and 90 days out.
  4. Expiration. Listing date plus 180 calendar days, applied uniformly, never read from a prospectus.
  5. Price versus offer. The latest daily close within the last ten sessions, divided by the final issue price, minus one, in percent.
  6. Refresh. Weekly. The computed_on column dates the table.

To verify a row, open the final prospectus (SEC form 424B4, or 424B1 for some deals) from the receipts panel below and search for "lock-up". The Underwriting section states the length and any early-release condition; the Shares Eligible for Future Sale section gives the share counts. Where the prospectus sets a staggered schedule, note each tranche date separately. The calendar shows one date per name and cannot split it.

Prospectus receipts for every calendar name

The panel matches each calendar name to its final prospectus in the EDGAR index, filed within two weeks of the listing date. It found 50 filings for the 57 names in the calendar. A name missing here priced under a form type outside the two searched, or its ticker has not yet been attached to its EDGAR record.

QueryFinal prospectus (424B4 / 424B1) on file for each calendar name
50 rows (showing 20)
tickerform_typefiled_onprospectus_url
AADX424B42026-06-04https://www.sec.gov/Archives/edgar/data/2118195/0001193125-26-256356.txt
AIAI424B42026-05-14https://www.sec.gov/Archives/edgar/data/2096362/0001493152-26-022855.txt
ALMR424B42026-04-17https://www.sec.gov/Archives/edgar/data/2104204/0001193125-26-161647.txt
APURU424B42026-05-21https://www.sec.gov/Archives/edgar/data/2093524/0001213900-26-060082.txt
ARXS424B42026-04-16https://www.sec.gov/Archives/edgar/data/2093536/0001193125-26-159369.txt
AVEX424B42026-04-20https://www.sec.gov/Archives/edgar/data/2096300/0001193125-26-162601.txt
BXDC424B42026-05-15https://www.sec.gov/Archives/edgar/data/2100161/0001193125-26-225090.txt
CAES424B42026-06-17https://www.sec.gov/Archives/edgar/data/2087965/0001213900-26-069612.txt
CBRS424B42026-05-14https://www.sec.gov/Archives/edgar/data/2021728/0001628280-26-035214.txt
CNXU424B42026-05-11https://www.sec.gov/Archives/edgar/data/2066836/0001062993-26-002473.txt
COAG424B42026-05-01https://www.sec.gov/Archives/edgar/data/2114044/0001193125-26-201458.txt
CXIIU424B42026-04-28https://www.sec.gov/Archives/edgar/data/2114227/0001213900-26-048413.txt
ELMT424B42026-04-23https://www.sec.gov/Archives/edgar/data/2101698/0001213900-26-047144.txt
EROC424B42026-06-10https://www.sec.gov/Archives/edgar/data/2110029/0001193125-26-265898.txt
EROK424B42026-05-14https://www.sec.gov/Archives/edgar/data/2104882/0001193125-26-224302.txt
FCBM424B42026-06-18https://www.sec.gov/Archives/edgar/data/1531193/0001140361-26-025790.txt
FRBT424B42026-06-11https://www.sec.gov/Archives/edgar/data/1925062/0001628280-26-042580.txt
FRVO424B42026-05-14https://www.sec.gov/Archives/edgar/data/1853868/0001628280-26-034849.txt
GMRS424B42026-05-14https://www.sec.gov/Archives/edgar/data/1898718/0001104659-26-060835.txt
HAWK424B42026-05-07https://www.sec.gov/Archives/edgar/data/1750704/0001628280-26-032207.txt
The exact SQL behind every number
SELECT
    e.ticker                                   AS ticker,
    any(e.form_type)                           AS form_type,
    toString(toDate(e.filing_date))            AS filed_on,
    any(e.filing_url)                          AS prospectus_url
FROM global_markets.stocks_sec_edgar_index AS e
INNER JOIN
(
    SELECT
        ticker,
        argMax(toDate(listing_date), _ingest_time) AS listed_d
    FROM global_markets.stocks_ipos
    WHERE ticker != ''
      AND ticker NOT IN ('SPCX')
      AND toDate(listing_date) BETWEEN today() - 180 AND today() - 90
      AND ipo_status NOT IN ('pending', 'postponed', 'withdrawn', 'rumor', 'direct_listing_process')
      AND positionCaseInsensitive(issuer_name, 'acquisition') = 0
      AND final_issue_price > 0
    GROUP BY ticker
) AS i ON i.ticker = e.ticker
WHERE e.form_type IN ('424B4', '424B1')
  AND toDate(e.filing_date) >= today() - 200
  AND toDate(e.filing_date) BETWEEN addDays(i.listed_d, -14) AND addDays(i.listed_d, 14)
GROUP BY e.ticker, e.accession_number, e.filing_date
ORDER BY e.ticker, e.filing_date
Run this yourself

FAQ

How long is an IPO lockup period?

Most US IPO lockups run 180 days from the date of the final prospectus, a term set by the underwriting agreement rather than by any rule. Shorter and longer terms both occur, and some agreements release a portion of the shares early on a staggered schedule or after the company's first earnings report.

How do I find the exact lockup expiration date for a stock?

Open the final prospectus (SEC form 424B4) on EDGAR and search for "lock-up". The Underwriting section states the length and any early-release condition. Count from the prospectus date, which can differ from the first trading day by a day or two.

Can insiders sell before the lockup expires?

Not on the open market, unless the underwriters release them early. Lock-up agreements carry narrow exceptions (gifts, transfers to family trusts, shares withheld to cover taxes on vesting equity, transfers in a tender offer or merger) that do not put stock on the exchange.

Do stocks always fall when a lockup expires?

No. The expiration removes a restriction on supply; whether holders sell into it, and how much, varies by name. The companion post on whether stocks fall after lockup expiration measures the price path around past dates.

What if a lockup expiration falls on a weekend?

The agreement still ends on that calendar date, and the first session on which the freed shares can trade is the next business day. The calendar labels the weekday of each date for that reason.


Every panel here ships with the exact SQL beneath it. To check one name, or to pull the calendar for a different window, ask the question in plain English on the Strasmore terminal.

#ipo lockup#lockup expiration#lockup calendar#upcoming lockups#insider selling