Direct Stock Purchase Plans: How They Fill
How a direct stock purchase plan actually fills: a transfer agent pools orders, buys on its own schedule, and tells you the average price afterward.
A direct stock purchase plan, or DSPP, lets you buy shares in one company through that company's own plan rather than through a brokerage account. The issuer is not the seller. A transfer agent administers the plan: it pools participants' cash and buys in the open market on a schedule the plan sets. You learn your price after the fact, as an average across the whole batch.
Who actually sells you the shares
A short list of transfer agents administers most US plans:
- Computershare, named as the plan agent by issuers including Hershey and IBM
- Equiniti Trust Company, the successor entity to American Stock Transfer
- Broadridge Corporate Issuer Solutions
The agent keeps the issuer's share register, and plan shares are recorded in your own name on the company's books rather than pooled under a broker's name. That single difference changes how proxy material reaches you and who holds your cost-basis record. Our guide to street name vs holder of record walks through both sides of that register.
What price do you get in a direct stock purchase plan?
Plan documents are blunt about this. Computershare's DirectStock terms let the agent combine participant purchase requests into a single batch order, and every participant in that batch receives the batch's weighted average price. Plans commonly state that the transaction will occur within five business days after funds are received, assuming the market is open. There is no limit price on a plan purchase, no intraday fill, and no way to attach a price condition to it.
The closest thing in equities to that arrangement is a mutual fund's forward pricing rule, where your order is filled at a value computed after you place it. One difference matters: a fund strikes one net asset value per day, while a plan's price is a volume-weighted blend of whatever the agent's broker paid while working the batch.
To see what the agent is averaging over, here is a single ordinary session in Coca-Cola, cut into 30 minute buckets of New York time.
| et_time | ko_price | gap_from_vwap_pct |
|---|---|---|
| 04:00 | 88.52 | 0.36 |
| 04:30 | 88.42 | 0.25 |
| 05:00 | 88.6 | 0.46 |
| 05:30 | 88.56 | 0.41 |
| 06:00 | 88.58 | 0.43 |
| 06:30 | 88.53 | 0.38 |
| 07:00 | 88.47 | 0.31 |
| 07:30 | 88.49 | 0.33 |
| 08:00 | 88.39 | 0.22 |
| 08:30 | 88.32 | 0.14 |
| 09:00 | 88.15 | -0.05 |
| 09:30 | 88.33 | 0.15 |
| 10:00 | 88.25 | 0.06 |
| 10:30 | 88.34 | 0.16 |
| 11:00 | 88.5 | 0.35 |
| 11:30 | 88.45 | 0.29 |
| 12:00 | 88.4 | 0.23 |
| 12:30 | 88.42 | 0.26 |
| 13:00 | 88.46 | 0.29 |
| 13:30 | 88.43 | 0.26 |
The exact SQL behind every number
WITH
(
SELECT sum(toFloat64(close) * volume) / sum(volume)
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND window_start >= toDateTime('2026-09-16 00:00:00')
AND window_start < toDateTime('2026-09-18 00:00:00')
AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2026-09-16')
) AS day_vwap
SELECT
formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(argMax(toFloat64(close), window_start), 2) AS ko_price,
round(100 * (argMax(toFloat64(close), window_start) / day_vwap - 1), 2) AS gap_from_vwap_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND window_start >= toDateTime('2026-09-16 00:00:00')
AND window_start < toDateTime('2026-09-18 00:00:00')
AND toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2026-09-16')
GROUP BY et_time
ORDER BY et_timeAcross that day the buckets ran from 88.52 in the first one to 87.93 in the last, and the first bucket sat 0.36% away from the day's volume-weighted average price. A plan participant picks none of those points. The batch lands where it lands, and the statement reports one number.
Widen the lens to months and the band gets harder to ignore.
| month | month_label | avg_close | low_price | high_price | band_pct |
|---|---|---|---|---|---|
| 2025-09-01 | Sep 2025 | 67.04 | 65.35 | 69.46 | 6.13 |
| 2025-10-01 | Oct 2025 | 68.08 | 65.84 | 71.61 | 8.48 |
| 2025-11-01 | Nov 2025 | 71 | 67.66 | 73.23 | 7.85 |
| 2025-12-01 | Dec 2025 | 70.3 | 68.79 | 72.9 | 5.85 |
| 2026-01-01 | Jan 2026 | 71.12 | 67.27 | 74.9 | 10.72 |
| 2026-02-01 | Feb 2026 | 78.94 | 74.4 | 82 | 9.63 |
| 2026-03-01 | Mar 2026 | 76.79 | 74.07 | 81.4 | 9.55 |
| 2026-04-01 | Apr 2026 | 76.5 | 74.55 | 80.32 | 7.54 |
| 2026-05-01 | May 2026 | 80.02 | 77.73 | 82.66 | 6.17 |
| 2026-06-01 | Jun 2026 | 80.46 | 76.81 | 84.04 | 8.99 |
| 2026-07-01 | Jul 2026 | 83.88 | 80.83 | 90.92 | 12.03 |
| 2026-08-01 | Aug 2026 | 88.49 | 85.16 | 92.49 | 8.28 |
| 2026-09-01 | Sep 2026 | 87.96 | 86.07 | 90.36 | 4.88 |
The exact SQL behind every number
SELECT
toString(toStartOfMonth(date)) AS month,
formatDateTime(toStartOfMonth(date), '%b %Y') AS month_label,
round(avg(toFloat64(close)), 2) AS avg_close,
round(min(toFloat64(low)), 2) AS low_price,
round(max(toFloat64(high)), 2) AS high_price,
round(100 * (max(toFloat64(high)) - min(toFloat64(low))) / avg(toFloat64(close)), 2) AS band_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'KO'
AND date >= toStartOfMonth(today() - 400)
AND date < toStartOfMonth(today())
GROUP BY toStartOfMonth(date)
ORDER BY toStartOfMonth(date)Over the most recent full month in the panel, Sep 2026, the low to high band spanned 4.88% of the month's average close of 87.96, between 86.07 and 90.36. Two participants who send the same amount of cash into the same plan in the same month, on either side of its purchase date, end up owning measurably different numbers of shares.
That band is not specific to one name. Here are eight widely held dividend payers over September 2026, ordered by how far their closing prices travelled.
| ticker | month_close_range_pct | avg_day_range_pct |
|---|---|---|
| IBM | 12.51 | 2.54 |
| HSY | 11.66 | 1.95 |
| PEP | 10.32 | 1.59 |
| XOM | 6.77 | 1.99 |
| JNJ | 5.08 | 1.82 |
| MMM | 4.97 | 1.99 |
| PG | 4.37 | 1.47 |
| KO | 3.72 | 1.29 |
The exact SQL behind every number
SELECT
ticker,
round(100 * (max(toFloat64(close)) - min(toFloat64(close))) / avg(toFloat64(close)), 2) AS month_close_range_pct,
round(avg(100 * (toFloat64(high) - toFloat64(low)) / toFloat64(close)), 2) AS avg_day_range_pct
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('KO', 'PEP', 'JNJ', 'PG', 'XOM', 'MMM', 'HSY', 'IBM')
AND date >= toDate('2026-09-01')
AND date < toDate('2026-10-01')
GROUP BY ticker
ORDER BY month_close_range_pct DESCIBM carried the widest month of the eight, its closing prices spread across 12.51% of the average close, against 3.72% for KO at the narrow end. The same name averaged 2.54% between high and low within a single session. Those are the windows a pooled purchase date is drawn from.
What does a DSPP cost?
Fees are set per plan, not per agent, and they almost always pair a flat charge with a per-share charge in cents. Two live examples, as of October 2026:
- Hershey's plan, administered by Computershare, charges nothing on the initial investment, then $5.00 plus $0.05 per share for a one-time cash purchase by direct debit, $2.50 plus $0.05 per share on a recurring monthly debit, and 5% of the amount reinvested (capped at $5.00) plus $0.05 per share on dividend reinvestment. Sales run $15 plus $0.12 per share as a batch sale, or $25 plus $0.12 per share as a market order. The minimum initial investment is $250. See the Hershey stock purchase page.
- IBM's Computershare Investment Plan charges $5 per voluntary investment by check, or $1 for an automatic investment, with a $500 minimum for new investors. See the IBM plan page.
The flat component decides whether a plan is cheap. A hypothetical $100 purchase carrying a $5.00 flat charge gives up 5% of the money before any shares are bought, while the same $5.00 on a $5,000 purchase is 0.1%. Plans also revise their fee schedules without filing a new prospectus, so the brochure on the agent's site is the live document, not an old filing.
Notice the sell side of Hershey's schedule. The batched sale is the cheap option, and a market or limit order costs more. Purchases get pooled with no exceptions. Sales are where a plan hands back a little control, at a price. If order types are new to you, start with market orders versus limit orders.
How is a DSPP different from a DRIP?
A dividend reinvestment plan recycles dividends on shares you already own. A DSPP accepts new cash from someone who may own nothing yet. Most issuer plans today are one combined document doing both jobs. The reinvestment leg fires only when a dividend is paid, which for a typical US large cap means four dates a year.
| ex_date | ex_date_label | cash_per_share |
|---|---|---|
| 2023-11-30 | Nov 30, 2023 | 0.46 |
| 2024-03-14 | Mar 14, 2024 | 0.48 |
| 2024-06-14 | Jun 14, 2024 | 0.48 |
| 2024-09-13 | Sep 13, 2024 | 0.48 |
| 2024-11-29 | Nov 29, 2024 | 0.48 |
| 2025-03-14 | Mar 14, 2025 | 0.51 |
| 2025-06-13 | Jun 13, 2025 | 0.51 |
| 2025-09-15 | Sep 15, 2025 | 0.51 |
| 2025-12-01 | Dec 1, 2025 | 0.51 |
| 2026-03-13 | Mar 13, 2026 | 0.53 |
| 2026-06-15 | Jun 15, 2026 | 0.53 |
| 2026-09-15 | Sep 15, 2026 | 0.53 |
The exact SQL behind every number
SELECT
toString(ex_dividend_date) AS ex_date,
formatDateTime(ex_dividend_date, '%b %e, %Y') AS ex_date_label,
round(toFloat64(any(cash_amount)), 2) AS cash_per_share
FROM global_markets.stocks_dividends
WHERE ticker = 'KO'
AND ex_dividend_date >= today() - 1100
AND ex_dividend_date <= today()
GROUP BY ex_dividend_date
ORDER BY ex_dividend_dateThe most recent ex-dividend date in the panel, Sep 15, 2026, carried 0.53 per share, and the panel holds 12 such dates. A payment of that size on a modest position buys a fraction of a share at a price near 87.96, and holding that fraction is the mechanical reason plans track balances to several decimal places. Those decimals survive corporate actions too: stock splits and fractional shares covers what a split does to them.
How do you find out whether a company has a plan?
- Check the investor relations site under shareholder services or direct stock purchase. Issuers that run a plan link it from there.
- Check the transfer agent's investor portal. Computershare's investor site carries a plan directory and the brochure for each issuer it administers.
- Read the plan prospectus. Plans are registered offerings, and the S-3 or 424(b) filing spells out the pricing language and the fee table in full.
Many large issuers have closed their plans over the past decade. Where a plan still exists and offers no purchase discount, a zero-commission brokerage account buys the same stock with a limit price and an immediate fill, and most brokers now hold fractional shares as well. The plan wins on two narrow grounds: a genuine discount to market on reinvested dividends, where one is offered, and registered ownership for a reader who wants their own name on the issuer's register.
FAQ
Can you buy stock directly from a company without a broker?
You can enroll in that company's direct stock purchase plan where one exists. A transfer agent such as Computershare runs it, and your shares are registered in your own name on the issuer's books. A broker still executes the actual market purchase on the plan's behalf.
What price do you pay in a direct stock purchase plan?
The weighted average price of the batch the agent bought on that investment date. You do not choose it, and you learn it after the purchase has settled into your plan account.
Are direct stock purchase plans cheaper than a broker?
Rarely at small sizes. A flat charge of a few dollars plus cents per share works out to a large percentage of a $100 purchase, while a zero-commission broker charges nothing per trade. Plans offering a discount on reinvested dividends are the exception.
How quickly can you sell shares held in a DSPP?
Slower than a brokerage sale. Sale requests are grouped into batches on the agent's schedule, and the batched option is the cheapest one. Some plans offer a market or limit order instead, at a higher fee.
Does a DSPP give you fractional shares?
Yes. Plan accounting carries fractional balances, which is how a dividend of a few dollars gets fully reinvested instead of sitting as cash.
Every panel above ships with the exact SQL beneath it. To measure the band around any purchase window yourself, ask the same question in plain English on the Strasmore terminal.