How Stock Splits Get Announced: 8-K to Ex-Date
How stock splits are announced: the board vote, the press release and 8-K filing, then the exchange notice. Plus the typical gap to the effective date.
Stock splits are announced by the company itself, and the exchange publishes the operational dates afterwards. The board passes a resolution that fixes the ratio and the key dates, the company puts out a press release and files a Form 8-K with the SEC, and the exchange notice plus the clearing-system relay then set the day the new shares actually land. The announcement date and the effective date are never the same day, and the distance between them is measurable. The panels below put a number on it.
How stock splits are announced, step by step
A stock split is a corporate action: a company-initiated change to its own share count. The order of events rarely varies, whatever the ratio.
- The board resolves the split. Directors approve a ratio (four new shares for every old share, say) and set the dates that govern it: a record date, a distribution or payable date, and the ex-date on which the quoted price adjusts.
- The company discloses it. A press release goes out and the company files a Form 8-K with the SEC. When the split calls for amending the charter, raising the count of authorized shares or cutting par value, that filing carries Item 5.03, the item covering amendments to articles of incorporation or bylaws. Whether holders also vote is a separate question, handled in do stock splits need shareholder approval.
- The exchange and FINRA receive notice. SEC Rule 10b-17 obliges an issuer to give notice of a split at least 10 calendar days ahead of the record date. The listing exchange then publishes its own corporate action notice carrying the confirmed dates.
- The clearing system relays it. DTC passes the action to member brokers, who update customer positions on the distribution date.
- The effective date arrives. The quoted price divides by the ratio and the share count multiplies by it. Our guide to when a stock split takes effect walks the ex-date mechanics in detail.
Two of those steps carry built-in waiting. A charter amendment can sit until the next annual meeting, and the notice period runs backwards from the record date. The published effective date is the end of a queue rather than the start of one.
How long does it take from announcement to effective date?
Putting a number on the wait needs a dated announcement for every split. The stand-in used here is the first dated news story that names a split for that company inside the 400 days before its effective date, matched against every forward split that took effect in the past two years. It measures when the split became public rather than a legal filing timestamp, and it tracks the press release closely: a split release is wire news on the day it is issued.
| percentile | gap_days |
|---|---|
| p10 quickest | 9 |
| p25 | 14 |
| p50 median | 40 |
| p75 | 170 |
| p90 slowest | 295 |
The exact SQL behind every number
WITH
split_events AS (
SELECT
ticker,
execution_date,
max(toFloat64(split_to)) AS to_shares,
max(toFloat64(split_from)) AS from_shares
FROM global_markets.stocks_splits
WHERE execution_date >= today() - 730
AND execution_date < today()
AND toFloat64(split_to) > toFloat64(split_from)
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
),
split_stories AS (
SELECT
arrayJoin(tickers) AS story_ticker,
toDate(published_utc) AS story_date
FROM global_markets.stocks_news
WHERE published_utc >= today() - 1140
AND positionCaseInsensitive(title, 'split') > 0
),
gaps AS (
SELECT
e.ticker AS ticker,
e.execution_date AS execution_date,
dateDiff('day', min(s.story_date), e.execution_date) AS gap_days
FROM split_events AS e
INNER JOIN split_stories AS s ON s.story_ticker = e.ticker
WHERE s.story_date < e.execution_date
AND s.story_date >= e.execution_date - 400
GROUP BY e.ticker, e.execution_date
)
SELECT
p.1 AS percentile,
p.2 AS gap_days
FROM
(
SELECT arrayJoin([
('p10 quickest', toUInt32(round(quantileDeterministic(0.10)(toFloat64(gap_days), cityHash64(ticker, execution_date))))),
('p25', toUInt32(round(quantileDeterministic(0.25)(toFloat64(gap_days), cityHash64(ticker, execution_date))))),
('p50 median', toUInt32(round(quantileDeterministic(0.50)(toFloat64(gap_days), cityHash64(ticker, execution_date))))),
('p75', toUInt32(round(quantileDeterministic(0.75)(toFloat64(gap_days), cityHash64(ticker, execution_date))))),
('p90 slowest', toUInt32(round(quantileDeterministic(0.90)(toFloat64(gap_days), cityHash64(ticker, execution_date)))))
]) AS p
FROM gaps
)Read the curve from left to right. The quickest tenth of forward splits (p10 quickest) went from first public story to effective date in 9 calendar days. The middle of the distribution (p50 median) sits at 40 days. The slow tenth (p90 slowest) stretches to 295 days. A reader who sees a split headline and expects new shares in the account that week is reading the wrong end of the process.
Has the lead time changed over the past two years?
Grouping the same splits by the month their new shares took effect shows whether that lead time holds steady.
| month | month_label | split_count | median_gap_days | shortest_gap_days | longest_gap_days |
|---|---|---|---|---|---|
| 2024-10-01 | Oct 2024 | 3 | 146 | 10 | 194 |
| 2024-12-01 | Dec 2024 | 4 | 86 | 2 | 392 |
| 2025-01-01 | Jan 2025 | 3 | 86 | 18 | 89 |
| 2025-02-01 | Feb 2025 | 3 | 14 | 2 | 205 |
| 2025-05-01 | May 2025 | 1 | 22 | 22 | 22 |
| 2025-06-01 | Jun 2025 | 2 | 52 | 43 | 61 |
| 2025-07-01 | Jul 2025 | 1 | 13 | 13 | 13 |
| 2025-09-01 | Sep 2025 | 2 | 42 | 20 | 63 |
| 2025-10-01 | Oct 2025 | 2 | 182 | 98 | 266 |
| 2025-11-01 | Nov 2025 | 2 | 260 | 160 | 361 |
| 2025-12-01 | Dec 2025 | 4 | 140 | 4 | 399 |
| 2026-01-01 | Jan 2026 | 1 | 198 | 198 | 198 |
| 2026-02-01 | Feb 2026 | 3 | 369 | 31 | 369 |
| 2026-03-01 | Mar 2026 | 1 | 8 | 8 | 8 |
| 2026-04-01 | Apr 2026 | 6 | 15 | 13 | 216 |
| 2026-05-01 | May 2026 | 1 | 1 | 1 | 1 |
| 2026-06-01 | Jun 2026 | 7 | 14 | 14 | 91 |
| 2026-07-01 | Jul 2026 | 1 | 205 | 205 | 205 |
| 2026-08-01 | Aug 2026 | 1 | 29 | 29 | 29 |
The exact SQL behind every number
WITH
split_events AS (
SELECT
ticker,
execution_date,
max(toFloat64(split_to)) AS to_shares,
max(toFloat64(split_from)) AS from_shares
FROM global_markets.stocks_splits
WHERE execution_date >= today() - 730
AND execution_date < today()
AND toFloat64(split_to) > toFloat64(split_from)
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
),
split_stories AS (
SELECT
arrayJoin(tickers) AS story_ticker,
toDate(published_utc) AS story_date
FROM global_markets.stocks_news
WHERE published_utc >= today() - 1140
AND positionCaseInsensitive(title, 'split') > 0
),
gaps AS (
SELECT
e.ticker AS ticker,
e.execution_date AS execution_date,
dateDiff('day', min(s.story_date), e.execution_date) AS gap_days
FROM split_events AS e
INNER JOIN split_stories AS s ON s.story_ticker = e.ticker
WHERE s.story_date < e.execution_date
AND s.story_date >= e.execution_date - 400
GROUP BY e.ticker, e.execution_date
)
SELECT
toStartOfMonth(execution_date) AS month,
formatDateTime(toStartOfMonth(execution_date), '%b %Y') AS month_label,
toUInt32(count()) AS split_count,
toUInt32(round(quantileDeterministic(0.50)(toFloat64(gap_days), cityHash64(ticker, execution_date)))) AS median_gap_days,
toUInt32(min(gap_days)) AS shortest_gap_days,
toUInt32(max(gap_days)) AS longest_gap_days
FROM gaps
GROUP BY month, month_label
ORDER BY month19 months in the window carry at least one forward split with a dated story ahead of it. In Aug 2026, 1 forward splits took effect, with a median wait of 29 days and individual gaps running from 29 to 29 days. Monthly medians swing around on counts this small, which is why the pooled percentiles above make the better summary. The useful thing in this panel is the distance between the shortest_gap_days and longest_gap_days lines inside a single month: two companies that announce in the same week can land their splits weeks apart.
Which splits moved fastest, and which took longest?
Names make the range concrete. The panel below pins the five quickest and the five slowest announcement windows in the sample, with the dates attached.
| ticker | ratio | announced_on | effective_on | gap_days |
|---|---|---|---|---|
| CVNA | 5:1 | May 7, 2026 | May 8, 2026 | 1 |
| CRVL | 3:1 | Dec 24, 2024 | Dec 26, 2024 | 2 |
| FTLF | 2:1 | Feb 5, 2025 | Feb 7, 2025 | 2 |
| TTSH | 3000:1 | Dec 12, 2025 | Dec 16, 2025 | 4 |
| JFB | 2:1 | Mar 17, 2026 | Mar 25, 2026 | 8 |
| NFLX | 10:1 | Nov 21, 2024 | Nov 17, 2025 | 361 |
| BULZ | 10:1 | Feb 20, 2025 | Feb 24, 2026 | 369 |
| SHNY | 10:1 | Feb 20, 2025 | Feb 24, 2026 | 369 |
| PANW | 2:1 | Nov 20, 2023 | Dec 16, 2024 | 392 |
| NOW | 5:1 | Nov 14, 2024 | Dec 18, 2025 | 399 |
The exact SQL behind every number
WITH
split_events AS (
SELECT
ticker,
execution_date,
max(toFloat64(split_to)) AS to_shares,
max(toFloat64(split_from)) AS from_shares
FROM global_markets.stocks_splits
WHERE execution_date >= today() - 730
AND execution_date < today()
AND toFloat64(split_to) > toFloat64(split_from)
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
),
split_stories AS (
SELECT
arrayJoin(tickers) AS story_ticker,
toDate(published_utc) AS story_date
FROM global_markets.stocks_news
WHERE published_utc >= today() - 1140
AND positionCaseInsensitive(title, 'split') > 0
),
gaps AS (
SELECT
e.ticker AS ticker,
e.execution_date AS execution_date,
e.to_shares AS to_shares,
e.from_shares AS from_shares,
min(s.story_date) AS first_story_date,
dateDiff('day', min(s.story_date), e.execution_date) AS gap_days
FROM split_events AS e
INNER JOIN split_stories AS s ON s.story_ticker = e.ticker
WHERE s.story_date < e.execution_date
AND s.story_date >= e.execution_date - 400
GROUP BY e.ticker, e.execution_date, e.to_shares, e.from_shares
)
SELECT
ticker,
concat(toString(to_shares), ':', toString(from_shares)) AS ratio,
formatDateTime(first_story_date, '%b %e, %Y') AS announced_on,
formatDateTime(execution_date, '%b %e, %Y') AS effective_on,
toUInt32(gap_days) AS gap_days
FROM
(
SELECT
*,
row_number() OVER (ORDER BY gap_days ASC, ticker ASC) AS quickest_rank,
row_number() OVER (ORDER BY gap_days DESC, ticker ASC) AS longest_rank
FROM gaps
)
WHERE quickest_rank <= 5 OR longest_rank <= 5
ORDER BY gap_days ASC, ticker ASCCVNA sits at the quick end of the table: a 5:1 split that first hit the news on May 7, 2026 and took effect on May 8, 2026, a gap of 1 days. At the far end, NOW ran 399 days from first story to effective date. Long windows have two ordinary readings. A company can announce early and schedule the distribution after its annual meeting, and a company can also turn up in split coverage well before it commits to one, which pulls the first-story date forward. Short windows cluster among companies that resolve, file, and distribute inside a single notice cycle.
What is already on the split calendar?
The same records that date past splits also carry the ones still ahead, which is what the upcoming stock splits calendar publishes.
| ticker | ratio | direction | effective_on | days_away |
|---|---|---|---|---|
| CMND | 1:8 | reverse | Oct 5, 2026 | 2 |
| GUTS | 1:12 | reverse | Oct 5, 2026 | 2 |
| PSKY | 2:1 | forward | Oct 5, 2026 | 2 |
| SCNX | 1:25 | reverse | Oct 5, 2026 | 2 |
| TGOSY | 5:1 | forward | Oct 5, 2026 | 2 |
| VIVK | 1:15 | reverse | Oct 5, 2026 | 2 |
| VTAK | 1:10 | reverse | Oct 5, 2026 | 2 |
| ETHA | 1:3 | reverse | Oct 6, 2026 | 3 |
| GPMT | 1:10 | reverse | Oct 6, 2026 | 3 |
| ITOC | 1:16 | reverse | Oct 6, 2026 | 3 |
| RUBI | 1.5:1 | forward | Oct 6, 2026 | 3 |
| GCDT | 1:6 | reverse | Oct 7, 2026 | 4 |
| SUGP | 1:6 | reverse | Oct 7, 2026 | 4 |
| TELWY | 5:1 | forward | Oct 7, 2026 | 4 |
| TKOMY | 15:1 | forward | Oct 7, 2026 | 4 |
| TOPPY | 2:1 | forward | Oct 7, 2026 | 4 |
| MGF | 1:5 | reverse | Oct 8, 2026 | 5 |
| MIN | 1:6 | reverse | Oct 8, 2026 | 5 |
| DWAHY | 2:1 | forward | Oct 9, 2026 | 6 |
| DXJ | 3:1 | forward | Oct 9, 2026 | 6 |
The exact SQL behind every number
SELECT
ticker,
concat(toString(toFloat64(split_to)), ':', toString(toFloat64(split_from))) AS ratio,
if(toFloat64(split_to) > toFloat64(split_from), 'forward', 'reverse') AS direction,
formatDateTime(execution_date, '%b %e, %Y') AS effective_on,
toUInt32(dateDiff('day', today(), execution_date)) AS days_away
FROM global_markets.stocks_splits
WHERE execution_date >= today()
AND execution_date <= today() + 180
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date, split_to, split_from
ORDER BY execution_date ASC, ticker ASC
LIMIT 4033 splits currently hold an effective date inside the next six months. The nearest is CMND at 1:8, 2 days out, and the furthest in view is 75 days away. Every row reached that calendar through the chain above: a press release and an 8-K sit behind each one. The direction column separates forward splits from reverse ones, which run the same announcement path in the opposite direction. For the splits that have already landed, with ratios and dates, see recent stock splits, and the same calendar is queryable through the free SQL stock splits calendar.
What happens inside the announcement window
The gap is not dead time. Four mechanical things sit inside it, and each one has its own page.
- Due bills. Where the distribution lands after the record date, trades in the interval settle with a due bill attached: the seller owes the buyer the additional shares the buyer is entitled to. Brokers handle the transfer, and the holder sees it as a position adjustment.
- Options adjustment. Listed contracts are adjusted on the ex-date, with strikes divided and deliverables multiplied by the ratio. How stock splits affect options works through the arithmetic for whole and uneven ratios.
- Fractional shares. A whole ratio such as 4-for-1 cannot create a fraction. An uneven one such as 3-for-2 can, and the broker either books the fraction or pays cash in lieu of it. Stock splits vs fractional shares covers the distinction.
- Cost basis. Per-share basis divides by the ratio on the effective date while total basis stays put, which matters at tax time rather than on the day itself. Cost basis after a stock split has the worked example.
None of that moves the value of a position on the day the split lands. What moves is the share count and the quoted price, in opposite directions and in the same proportion. The full mechanics of the action live on the what is a stock split page.
How the announcement-to-effective gap is measured
- Sample: every forward split with an effective date in the trailing two years, deduplicated by ticker and effective date.
- Announcement stand-in: the earliest dated news story naming a split for that ticker inside the 400 days before the effective date. It is a publicity floor, not a filing timestamp.
- Splits with no dated story in that window drop out, so the sample leans toward companies with news coverage.
- Reverse splits are excluded from the gap sample and appear only in the forward calendar panel. What is a reverse stock split covers that genre.
- All gaps are calendar days, not trading days. Percentiles use a deterministic estimator, so two renderings of the same statistic agree.
FAQ
How do companies announce a stock split?
The board approves the split, then the company announces it in a press release and a Form 8-K filed with the SEC. When the split calls for a charter amendment, that 8-K carries Item 5.03. The listing exchange follows with a corporate action notice holding the confirmed record and ex-dates.
Where can I find the official announcement of a stock split?
Two places carry the primary document: the company's investor relations press release, and its 8-K on the SEC's EDGAR system. The exchange corporate action notice is the operational version of the same facts, and it is what brokers and the clearing system act on.
How long after the announcement does a stock split take effect?
In the sample above, the median forward split took 40 calendar days from its first public story to its effective date, with the quickest tenth inside 9 days and the slow tenth out at 295 days. No fixed rule sets it. The floor comes from the notice period ahead of the record date.
Is the announcement date the same as the ex-date?
No. The announcement date is when the company makes the split public. The ex-date, often called the effective date, is the session on which the quoted price and the share count adjust. The exchange notice period and the company's own schedule separate the two.
Do I have to own the shares on the announcement date to receive the split?
No. Entitlement follows the record date that the board fixes in the announcement, not the announcement itself. When a stock split takes effect lays out which date governs what.
Every panel here carries the SQL that produced it, so you can open one and see exactly how a gap was counted. To check the dates behind a specific company's split, ask the question in plain English on the Strasmore terminal.