XOM Dividend Increase History: Every Raise
Every XOM dividend increase on record: old and new quarterly rate, the percentage raise, the quarter Exxon declares in, and 5, 10 and 20 year growth.
XOM dividend increase history, in full: every raise Exxon Mobil has declared over the past twenty years, with the old and new quarterly rate, the size of each step, the declaration date, and the ex-dividend date the higher rate first applied to. The record here holds 19 increases, carrying the quarterly rate from $0.29 a share to $1.03. Exxon has also moved the season it announces in, which is the part to know if you are working out when the next one lands.
Every figure on this page comes from one source: the declared dividend records in stocks_dividends, which carry one row per XOM cash dividend with its ex-dividend date, declaration date, and cash amount per share. For the current rate, the yield and the payment calendar, see the XOM dividend page.
Every XOM dividend increase, raise by raise
A dividend increase is not a separate event in the data. It is a quarterly payment larger than the one before it, so the way to find every raise is to walk the payments in ex-dividend date order and keep the ones that step up. Each row below is one of those steps, paired with the rate it replaced.
| ex_dividend_date | ex_month_label | declared_label | old_quarterly_usd | new_quarterly_usd | pct_increase |
|---|---|---|---|---|---|
| 2006-02-08 | Feb 2006 | not recorded | 0.29 | 0.32 | 10.34 |
| 2007-05-10 | May 2007 | not recorded | 0.32 | 0.35 | 9.38 |
| 2008-05-09 | May 2008 | not recorded | 0.35 | 0.4 | 14.29 |
| 2009-05-11 | May 2009 | not recorded | 0.4 | 0.42 | 5 |
| 2010-05-11 | May 2010 | not recorded | 0.42 | 0.44 | 4.76 |
| 2011-05-11 | May 2011 | not recorded | 0.44 | 0.47 | 6.82 |
| 2012-05-10 | May 2012 | not recorded | 0.47 | 0.57 | 21.28 |
| 2013-05-09 | May 2013 | Apr 24, 2013 | 0.57 | 0.63 | 10.53 |
| 2014-05-09 | May 2014 | Apr 30, 2014 | 0.63 | 0.69 | 9.52 |
| 2015-05-11 | May 2015 | Apr 29, 2015 | 0.69 | 0.73 | 5.8 |
| 2016-05-11 | May 2016 | Apr 27, 2016 | 0.73 | 0.75 | 2.74 |
| 2017-05-10 | May 2017 | Apr 26, 2017 | 0.75 | 0.77 | 2.67 |
| 2018-05-11 | May 2018 | Apr 25, 2018 | 0.77 | 0.82 | 6.49 |
| 2019-05-10 | May 2019 | Apr 24, 2019 | 0.82 | 0.87 | 6.1 |
| 2021-11-10 | Nov 2021 | Oct 27, 2021 | 0.87 | 0.88 | 1.15 |
| 2022-11-14 | Nov 2022 | Oct 27, 2022 | 0.88 | 0.91 | 3.41 |
| 2023-11-14 | Nov 2023 | Oct 27, 2023 | 0.91 | 0.95 | 4.4 |
| 2024-11-14 | Nov 2024 | Nov 1, 2024 | 0.95 | 0.99 | 4.21 |
| 2025-11-14 | Nov 2025 | Oct 31, 2025 | 0.99 | 1.03 | 4.04 |
The exact SQL behind every number
WITH quarterly AS
(
SELECT
ex_dividend_date AS ex_date,
toFloat64(max(cash_amount)) AS rate,
max(declaration_date) AS declared
FROM global_markets.stocks_dividends
WHERE ticker = 'XOM'
AND frequency = 4
AND ex_dividend_date >= '2005-01-01'
AND ex_dividend_date <= today()
GROUP BY ex_dividend_date
),
stepped AS
(
SELECT
ex_date,
declared,
rate,
lagInFrame(rate) OVER (ORDER BY ex_date ASC
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_rate
FROM quarterly
)
SELECT
toString(ex_date) AS ex_dividend_date,
formatDateTime(ex_date, '%b %Y') AS ex_month_label,
if(toYear(declared) > 1990,
formatDateTime(declared, '%b %e, %Y'), 'not recorded') AS declared_label,
round(prev_rate, 4) AS old_quarterly_usd,
round(rate, 4) AS new_quarterly_usd,
round((rate / prev_rate - 1) * 100, 2) AS pct_increase
FROM stepped
WHERE ex_date >= '2006-01-01'
AND prev_rate > 0
AND rate > prev_rate
ORDER BY ex_date ASCThe first step inside the window lifted the quarterly rate 10.34%, from $0.29 to $0.32, first applying to holders on the record for the Feb 2006 payment. The most recent step was 4.04%, from $0.99 to $1.03, declared Oct 31, 2025. The pct_increase column shows the size of each step, and that size has not been constant across the span.
When does Exxon declare its dividend increase?
The declaration date on each record is the day the board's decision on that payment became official, and it always falls before the ex-dividend date for the same payment. Grouping the increases by the calendar quarter of their declaration date answers the question readers actually type, which is when to watch.
| declaration_quarter | raises_declared | first_year | latest_year |
|---|---|---|---|
| Q2 (Apr to Jun) | 7 | 2013 | 2019 |
| Q4 (Oct to Dec) | 5 | 2021 | 2025 |
The exact SQL behind every number
WITH quarterly AS
(
SELECT
ex_dividend_date AS ex_date,
toFloat64(max(cash_amount)) AS rate,
max(declaration_date) AS declared
FROM global_markets.stocks_dividends
WHERE ticker = 'XOM'
AND frequency = 4
AND ex_dividend_date >= '2005-01-01'
AND ex_dividend_date <= today()
GROUP BY ex_dividend_date
),
stepped AS
(
SELECT
ex_date,
declared,
rate,
lagInFrame(rate) OVER (ORDER BY ex_date ASC
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_rate
FROM quarterly
),
raises AS
(
SELECT declared
FROM stepped
WHERE ex_date >= '2006-01-01'
AND prev_rate > 0
AND rate > prev_rate
AND toYear(declared) > 1990
)
SELECT
multiIf(toQuarter(declared) = 1, 'Q1 (Jan to Mar)',
toQuarter(declared) = 2, 'Q2 (Apr to Jun)',
toQuarter(declared) = 3, 'Q3 (Jul to Sep)',
'Q4 (Oct to Dec)') AS declaration_quarter,
count() AS raises_declared,
toString(min(toYear(declared))) AS first_year,
toString(max(toYear(declared))) AS latest_year
FROM raises
GROUP BY declaration_quarter
ORDER BY raises_declared DESC, latest_year DESCThe fullest bucket is Q2 (Apr to Jun), holding 7 of the increases, with declarations running from 2013 to 2019. The next bucket is Q4 (Oct to Dec), holding 5, from 2021 to 2025. Compare the two latest_year values and the current habit is visible: the bucket with the more recent latest year is where announcements have been landing, and the other is the older pattern. That is as far as the record goes. A board can change its meeting calendar, and nothing in a dividend record commits a company to a future raise.
The gap between the declaration and the payment is where the ex-dividend date sits, and that date settles who receives which rate. The ex-dividend date explained walks through the timing. For the announcement calendar across dividend payers in general, when companies announce dividend raises covers the seasonal habits.
Has Exxon ever gone a year without a raise?
Yes, and the two honest ways to count a streak disagree about it. Grouping the payments by the calendar year of their ex-dividend date gives one line per year: what was paid per share, how many payments landed, and how many increases were declared inside it.
| year | paid_per_share_usd | payments | raises_declared |
|---|---|---|---|
| 2006 | 1.28 | 4 | 1 |
| 2007 | 1.37 | 4 | 1 |
| 2008 | 1.55 | 4 | 1 |
| 2009 | 1.66 | 4 | 1 |
| 2010 | 1.74 | 4 | 1 |
| 2011 | 1.85 | 4 | 1 |
| 2012 | 2.18 | 4 | 1 |
| 2013 | 2.46 | 4 | 1 |
| 2014 | 2.7 | 4 | 1 |
| 2015 | 2.88 | 4 | 1 |
| 2016 | 2.98 | 4 | 1 |
| 2017 | 3.06 | 4 | 1 |
| 2018 | 3.23 | 4 | 1 |
| 2019 | 3.43 | 4 | 1 |
| 2020 | 3.48 | 4 | 0 |
| 2021 | 3.49 | 4 | 1 |
| 2022 | 3.55 | 4 | 1 |
| 2023 | 3.68 | 4 | 1 |
| 2024 | 3.84 | 4 | 1 |
| 2025 | 4 | 4 | 1 |
The exact SQL behind every number
WITH quarterly AS
(
SELECT
ex_dividend_date AS ex_date,
toFloat64(max(cash_amount)) AS rate
FROM global_markets.stocks_dividends
WHERE ticker = 'XOM'
AND frequency = 4
AND ex_dividend_date >= '2005-01-01'
AND ex_dividend_date <= today()
GROUP BY ex_dividend_date
),
stepped AS
(
SELECT
ex_date,
rate,
lagInFrame(rate) OVER (ORDER BY ex_date ASC
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_rate
FROM quarterly
)
SELECT
toYear(ex_date) AS year,
round(sum(rate), 4) AS paid_per_share_usd,
count() AS payments,
countIf(prev_rate > 0 AND rate > prev_rate) AS raises_declared
FROM stepped
WHERE toYear(ex_date) >= 2006
AND toYear(ex_date) < toYear(today())
GROUP BY year
ORDER BY year ASCThe window opens in 2006, when the payments totalled $1.28 per share, and closes at $4 across 4 payments in the last complete year. Watch the raises_declared column rather than the totals. A year can carry a higher total than the year before it while containing no announcement at all: a raise declared mid-year is paid at the old rate for the quarters already gone and at the new rate afterwards, so the following calendar year collects four payments at the higher rate even when the board announces nothing in it.
That is why the streak below is counted twice from the same table.
| basis | years_counted | starting_year |
|---|---|---|
| Annual total per share above the prior year | 19 | run from 2007 |
| Calendar years with an increase declared | 5 | run from 2021 |
| Calendar years with no increase declared | 1 | latest 2020 |
The exact SQL behind every number
WITH quarterly AS
(
SELECT
ex_dividend_date AS ex_date,
toFloat64(max(cash_amount)) AS rate
FROM global_markets.stocks_dividends
WHERE ticker = 'XOM'
AND frequency = 4
AND ex_dividend_date >= '2005-01-01'
AND ex_dividend_date <= today()
GROUP BY ex_dividend_date
),
stepped AS
(
SELECT
ex_date,
rate,
lagInFrame(rate) OVER (ORDER BY ex_date ASC
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_rate
FROM quarterly
),
yearly AS
(
SELECT
toYear(ex_date) AS y,
sum(rate) AS total,
countIf(prev_rate > 0 AND rate > prev_rate) AS raises
FROM stepped
WHERE toYear(ex_date) >= 2006
AND toYear(ex_date) < toYear(today())
GROUP BY y
),
framed AS
(
SELECT
y,
total,
raises,
lagInFrame(total) OVER (ORDER BY y ASC
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_total
FROM yearly
),
marks AS
(
SELECT
max(y) AS last_year,
greatest(maxIf(y, prev_total > 0 AND total <= prev_total), min(y)) AS last_total_break,
greatest(maxIf(y, raises = 0), min(y)) AS last_rate_break,
countIf(raises = 0) AS flat_years,
maxIf(y, raises = 0) AS latest_flat_year
FROM framed
)
SELECT
tupleElement(t, 1) AS basis,
toUInt32(tupleElement(t, 2)) AS years_counted,
tupleElement(t, 3) AS starting_year
FROM marks
ARRAY JOIN
[
(toString('Annual total per share above the prior year'),
toInt32(last_year - last_total_break),
concat('run from ', toString(last_total_break + 1))),
(toString('Calendar years with an increase declared'),
toInt32(last_year - last_rate_break),
concat('run from ', toString(last_rate_break + 1))),
(toString('Calendar years with no increase declared'),
toInt32(flat_years),
if(flat_years = 0, 'none in window', concat('latest ', toString(latest_flat_year))))
] AS tCounted on annual totals, the run is 19 years (run from 2007). Counted on declared rate increases, it is 5 years (run from 2021). Neither figure is wrong. They measure different things, and a page quoting only the longer one leaves out the calendar years that held no announcement. This window carries 1 of those (latest 2020). Both runs are floored at the start of the window shown here, so they describe this span rather than Exxon's whole history as a payer.
XOM dividend growth rate over 5, 10 and 20 years
Compound annual growth rate, or CAGR, is the single steady yearly rate that would carry an old quarterly payment to the current one over the same number of years. It flattens the lumpiness of individual raises into one comparable number, which is what makes it the usual way to line up two dividend payers.
| horizon | start_ex_label | start_quarterly_usd | latest_quarterly_usd | cagr_pct | growth_multiple |
|---|---|---|---|---|---|
| 5-year span | Nov 2021 | 0.88 | 1.03 | 3.2 | 1.17 |
| 10-year span | Nov 2016 | 0.75 | 1.03 | 3.22 | 1.37 |
| 20-year span | Nov 2006 | 0.32 | 1.03 | 6.02 | 3.22 |
The exact SQL behind every number
WITH quarterly AS
(
SELECT
ex_dividend_date AS ex_date,
toFloat64(max(cash_amount)) AS rate
FROM global_markets.stocks_dividends
WHERE ticker = 'XOM'
AND frequency = 4
AND ex_dividend_date >= '2000-01-01'
AND ex_dividend_date <= today()
GROUP BY ex_dividend_date
),
series AS
(
SELECT
groupArray(ex_date) AS ds,
groupArray(rate) AS rs
FROM
(
SELECT ex_date, rate
FROM quarterly
ORDER BY ex_date ASC
)
),
spans AS
(
SELECT
ds,
rs,
yrs,
rs[length(rs)] AS end_rate,
greatest(arrayFirstIndex(d -> d >= addYears(ds[length(ds)], -1 * toInt32(yrs)), ds), 1) AS idx
FROM series
ARRAY JOIN [5, 10, 20] AS yrs
)
SELECT
concat(toString(yrs), '-year span') AS horizon,
formatDateTime(ds[idx], '%b %Y') AS start_ex_label,
round(rs[idx], 4) AS start_quarterly_usd,
round(end_rate, 4) AS latest_quarterly_usd,
round((pow(end_rate / rs[idx], 1.0 / yrs) - 1) * 100, 2) AS cagr_pct,
round(end_rate / rs[idx], 2) AS growth_multiple
FROM spans
ORDER BY yrs ASCOver the five-year span the quarterly rate compounded at 3.2% a year, from $0.88 in Nov 2021 to $1.03. The ten-year span compounds at 3.22% a year. The twenty-year span compounds at 6.02%, starting from a quarterly rate of $0.32 in Nov 2006 and ending 3.22 times higher. Comparing the three rows shows how much the pace of raises has varied across the span, which a single headline growth number hides.
One company's growth rate reads better next to others. Verizon's dividend increase history applies the same counting to a different payer, and dividend growth champions lines up the longest records.
FAQ
How often does Exxon raise its dividend?
Across the 20 complete calendar years counted here, Exxon declared 19 quarterly rate increases, close to one a year. The spacing is not exactly twelve months, and the count of years holding no increase at all is shown in the streak panel above.
When was Exxon's last dividend increase?
The most recent increase in this record was declared Oct 31, 2025 and took the quarterly rate to $1.03 per share from $0.99. It first applied to the payment with the Nov 2025 ex-dividend date.
Does Exxon have a dividend increase streak?
Two counts apply to the same data. On annual totals paid per share, the run inside this window is 19 years. On calendar years that contained a declared rate increase, it is 5 years. Published "consecutive years" claims generally use the annual-total basis.
What is Exxon's dividend growth rate?
Measured on the declared quarterly rate, the five-year compound annual growth rate is 3.2% a year and the twenty-year figure is 6.02%. Those are growth rates of the dividend itself, and they are not a shareholder return.
Do I get the higher rate if I buy after an increase is announced?
The rate you receive is set by the ex-dividend date of each payment, not by the announcement date. Owning the shares before that cutoff puts you on the record for that payment at the rate declared for it, and the ex-dividend date explained covers how the cutoff works.
Data notes and how to reproduce these numbers
- Source:
stocks_dividends, filtered to ticker XOM and quarterly frequency. Rows are grouped by ex-dividend date and reduced with max() on the cash amount, which collapses any duplicate row for the same payment. - Amounts are the cash rate per share as declared. They are not split adjusted, so a split inside the window would need the split-adjusted column instead of the one used here.
- Increases are detected by comparing each payment to the previous one in ex-dividend date order, which means the earliest payment in the loaded range can never register as a raise. That is why each query loads a year of runway before the window it reports.
- The declaration date is the announcement date recorded on the dividend row. A row without a usable declaration date prints as not recorded and drops out of the quarter grouping, so the quarter counts can total less than the full list of increases.
- Calendar-year panels exclude the current, incomplete year. The front edge of the record can lag live filings by a day or two.
- The compound growth panel anchors on the most recent payment and walks back a whole number of years, taking the first payment on or after that date as the starting rate.
Every panel above ships with the SQL that produced it, so the window can be widened or the ticker swapped and the whole count rerun. Ask the same question in plain English on the Strasmore terminal to run it yourself.