Excel · Finance

How to Build a 12-Month Rolling Forecast in Excel with ChatGPT

Provide ChatGPT with reconciled historical actuals, explicit forecast drivers, and your current forecast layout, then use it to draft a formula-driven 12-month rolling forecast. Each close should preserve the prior forecast for variance analysis, move the closed month to actuals, and add one new far-end forecast month.

Choose your situation — copy the prompt:
I need a rolling 12-month forecast model in Excel.

MODEL SETTINGS
- Currency / units: [e.g. GBP £000]
- Last closed actual month: [e.g. June 2025]
- First open forecast month: [e.g. July 2025]
- Active horizon required: exactly 12 future months
- Sign convention: [e.g. revenue positive, costs positive and subtracted]
- Forecast version/date: [e.g. July 2025 forecast]

HISTORICAL ACTUALS
Columns: Line Item | [one column per CLOSED month]
[Paste reconciled actuals here — include the most recent closed month]

FORECAST DRIVERS
For each material line item, tell me the driver rather than guessing:
- Revenue: [e.g. 2% MoM / units × price / other]
- COGS: [e.g. 40% of revenue]
- OpEx: [e.g. 0.5% MoM, or line-specific drivers]
- Headcount / payroll: [if applicable]
- Seasonality: [none / monthly index on Assumptions tab]
- One-offs: [month | line item | amount | add/subtract | recurring? no]
- Other material lines: [state driver or "hold flat"]

MODEL DEFINITION
1. Preserve historical actuals as values; do not overwrite prior closed months.
2. Keep an ACTIVE FORECAST HORIZON containing exactly 12 future months,
   beginning with the first open forecast month.
3. Keep a separate "Prior Forecast" snapshot or version before replacing a forecast
   month with actuals, so forecast-vs-actual variance can still be measured.
4. When a month closes:
   - record the final reconciled actual,
   - remove that month from the active forecast horizon,
   - append one new month at the far end,
   - retain exactly 12 future forecast months.

FORECAST RULES
- Put recurring assumptions in an Assumptions area/tab and link forecast formulas to them.
- Do not hard-code recurring forecast outputs.
- Define the Revenue base explicitly and apply growth only once.
- If seasonality is used, explain whether it is applied to an annual base, a deseasonalised
  monthly base, or another base. Do not multiply by a seasonality factor twice.
- One-offs must be separate explicit additions/overrides and must not automatically roll forward.
- Include Gross Profit and Operating Income.
- Include Net Income only if I provide every required below-operating-income driver.
- Add Forecast 12M Total using only the 12 active forecast months.
- Add validation rows/checks:
  a) active forecast month count = 12
  b) first forecast month = month after last closed actual
  c) no overlap between Actuals and Active Forecast
  d) one-offs occur only in specified periods
  e) Forecast 12M Total range contains exactly 12 month columns
- Do not invent assumptions or infer missing business drivers from a few historical rows.
- If a required driver is missing, list it before creating that forecast line.

OUTPUT
1. Proposed Assumptions layout
2. Actuals + Active Forecast layout
3. Explicit Excel formulas for the first 2 forecast months and formula pattern thereafter
4. Forecast 12M Total formulas
5. Monthly roll-forward procedure
6. Validation checks
Use tab-separated tables suitable for Excel.

Paste your real actuals and assumptions. Works in ChatGPT.

I need to add seasonality to my rolling revenue forecast without changing the annual base unintentionally.

BASE-YEAR ANNUAL REVENUE: [e.g. £600,000]

Historical monthly revenue shares:
Jan: [%] Feb: [%] Mar: [%] Apr: [%] May: [%] Jun: [%]
Jul: [%] Aug: [%] Sep: [%] Oct: [%] Nov: [%] Dec: [%]

How these shares were calculated:
[one representative year / average of several years / other]

Growth treatment in my current forecast:
[growth NOT yet applied / growth already embedded / not sure]

Requirements:
1. Check that all 12 shares are present and calculate their actual sum.
2. Do not merely assume the shares total exactly 100%.
3. Normalize them so the 12 seasonality indices average exactly 1.0:
   NormalizedShare = MonthlyShare / SUM(All12MonthlyShares)
   SeasonIndex = NormalizedShare × 12
4. Verify SUM(12 normalized shares) = 100% and AVERAGE(12 indices) = 1.0
   within a stated rounding tolerance.
5. Define BaseMonthlyRevenue = BaseYearAnnualRevenue / 12 only if this annual base
   is the intended forecast base.
6. If growth is not embedded elsewhere, state exactly how growth interacts with seasonality.
   Do not apply both a growing monthly base and a second growth factor to the same forecast.
7. If growth is already embedded in a deseasonalised base forecast, apply only the
   normalized seasonality factor.
8. Put the raw shares, normalized shares and seasonality indices on Assumptions.
9. Give exact Excel formulas and an annual-control check showing that seasonality alone
   redistributes revenue across months rather than creating/destroying annual revenue.
10. Do not invent missing monthly shares or a growth method.

Use this after building the base model — add it as a separate tab so your assumptions stay organised.

I need to roll my 12-month forecast forward after month-end close.

Month just closed: [e.g. June 2025]
Final reconciled actual figures:
[Paste the closed-month line items]

Current ACTIVE FORECAST HORIZON:
[e.g. June 2025 through May 2026]

Current forecast values for the month that just closed:
[Paste them, so I can retain forecast-vs-actual variance]

New far-end forecast month:
[e.g. June 2026]

Current far-end assumptions / formulas:
[Paste the prior far-end month formulas and relevant assumption rows]

Instructions:
1. First confirm that the closed month is the first month of the current active horizon.
   If it is not, stop and flag the timeline inconsistency.
2. Preserve the closed month's PRIOR FORECAST as a snapshot/version for variance analysis.
3. Record the final reconciled actual in the Actuals section without changing earlier actuals.
4. Remove the closed month from ACTIVE FORECAST only after the prior forecast is preserved.
5. Append the new far-end month. Copy formula logic only where the driver is genuinely recurring.
   Do NOT carry forward expired one-offs, temporary overrides, promotions or dated assumptions.
6. Re-evaluate seasonality using the new calendar month.
7. Confirm the new ACTIVE FORECAST contains exactly 12 future months with no gaps/duplicates.
8. Update Forecast 12M Total to those 12 columns only.
9. Show:
   - prior forecast vs actual variance for the closed month,
   - changed cells/formulas,
   - the new first and last forecast months,
   - validation checks.
10. Do not overwrite history, silently change assumptions, or invent a new far-end driver.

Run this after month-end close: the closed month moves to Actuals, one new far-end month is appended, and the active forecast stays at 12 future months.

Before — static budget repeats assumptions and has no rolling horizon
ExcelHomeFormulasData
C2
fx
480000
ABCDEF
1Line ItemJan BudgetFeb BudgetMar BudgetFY TotalDriver
2Revenue£480k£480k£480k£5,760kHardcoded
3COGS£192k£192k£192k£2,304kHardcoded 40%
4OpEx£220k£220k£220k£2,640kNo escalation
5Operating Income£68k£68k£68k£816k
Annual BudgetActualsAssumptions
The sheet is a static annual budget: no first-open-month marker, no 12-month forward horizon, no prior-forecast snapshot, and recurring forecast drivers are embedded as numbers.
After — historical actuals sit beside a formula-driven 12-month forecast horizon
ExcelHomeFormulasTrace Precedents
E2
fx
=D2*(1+Assumptions!$B$2)
ABCDEFGH
1Line ItemApr AMay AJun AJul FAug FSep F… Jun F+1Forecast 12M
2Revenue£520.0k£535.0k£510.0k£520.2k£530.6k£541.2klinked=SUM(E2:P2)
3COGS @ 40%£208.0k£214.0k£204.0k£208.1k£212.2k£216.5klinked=SUM(E3:P3)
4OpEx£221.0k£223.0k£225.0k£226.1k£227.3k£278.4k*linked=SUM(E4:P4)
5Operating Income£91.0k£98.0k£81.0k£86.0k£91.1k£46.3klinked12M sum
ActualsRolling ForecastAssumptions
Driver logic
Assumptions:
Revenue growth = 2.0% MoM
COGS = 40% of Revenue
OpEx escalation = 0.5% MoM
Sep one-off relocation = £50k

Jul Revenue = £510.0k × 1.02 = £520.2k
Aug Revenue = £520.2k × 1.02 = £530.604k
Jul COGS = £520.2k × 40% = £208.08k
Jul OpEx = £225.0k × 1.005 = £226.125k

Sep OpEx includes the explicit £50k one-off.
Forecast 12M totals sum only the 12 active forecast months.

Control checks:
• Last actual = Jun
• First forecast = Jul
• Active forecast count = 12
• No Actual/Forecast overlap ✓

The shown values are illustrative and follow the stated drivers.
Before — monthly revenue shares exist, but no normalized index is used
ExcelHomeDataFormulas
G3
fx
12.5%
ABCDEFGH
1MetricJulAugSepOctNovDecCheck
2Flat base£50k£50k£50k£50k£50k£50kIgnores seasonality
3Historical share7.0%6.5%7.5%9.0%10.5%12.5%Full year must = 100%
A monthly share is not itself the seasonality index. Use all 12 months and normalize against their actual total first; simply multiplying by 12 is exact only when the 12 raw shares sum to exactly 100%.
After — monthly shares become a normalized 1.0-average seasonality index
ExcelHomeFormulasAssumptions
G3
fx
=G2/SUM($B$2:$M$2)*12
ABCDEFGH
1MetricJulAugSepOctNovDecLogic
2Historical share7.0%6.5%7.5%9.0%10.5%12.5%Input
3Season Index0.840.780.901.081.261.50Share × 12
4Base monthly revenue£600,000 annual / 12 = £50,000Annual / 12
5Seasonal revenue£42,000£39,000£45,000£54,000£63,000£75,000Base × Index
Seasonality math
Average monthly share = 1/12 = 8.333%

If the complete 12-month raw shares sum to exactly 100%:
Jul index = 7.0% / 100% × 12 = 0.84
Dec index = 12.5% / 100% × 12 = 1.50

General formula:
=MonthlyShare / SUM(All12Shares) * 12

With £600k base-year annual revenue:
Base month = £600k / 12 = £50k
Jul = £50k × 0.84 = £42k
Dec = £50k × 1.50 = £75k ✓

Control: average of all 12 normalized indices must equal 1.0.

If the base forecast already contains growth, apply seasonality only.
Do not multiply by a growth factor twice. ✓
Before — June has closed but still occupies the first forecast slot
ExcelHomeFormulasData
C2
fx
42000
ABCDEF
1Line ItemMay AJun FJul F… May F+1Forecast Horizon
2Revenue£40k£42k£45klinkedStill starts Jun
3COGS£16k£16.8k£18klinked
June is now a closed month. Leaving it inside the active forecast means the horizon is stale and no longer represents 12 future months.
After — prior June forecast is retained, June actual closes, and a new far-end month is added
ExcelHomeFormulasTrace Precedents
F2
fx
=E2*(1+Assumptions!F$2) /* example recurring-growth pattern */
ABCDEFG
1Line ItemMay AJun AJul F… May F+1Jun F+1 NEWActive Forecast
2Revenue£40k£44k£45klinkednew formulaJul→Jun = 12 months
3COGS£16k£17.6k£18klinked=Revenue*40%12 months
4Forecast 12M Total=SUM(Jul F : Jun F+1)Updated
Monthly roll-forward
Prior June forecast = £42k
Final June actual   = £44k
Forecast variance   = £44k − £42k = +£2k

Before close:
Active forecast = Jun 2025 → May 2026 (12 months)

After June closes:
June 2025 actual moves to history.
Active forecast = Jul 2025 → Jun 2026 (12 months)

The new June 2026 formula uses recurring drivers only.
Expired one-offs / dated overrides must not be copied blindly.
Historical June actual and the prior June forecast snapshot are both retained.
Forecast 12M Total sums Jul 2025 through Jun 2026 only. ✓
Four rolling-forecast design problems worth checking
Hard-coded forecasts
Forecast cells contain fixed numbers not formulas → can't update assumptions centrally
High risk
No assumptions tab
Growth rate embedded in each cell → must change 36 cells to update one assumption
High risk
Flat monthly forecast
Ignoring a known seasonal pattern → peak/trough months flattened and timing distorted
Easy fix
One-offs spread across months
Relocation cost spread or rolled forward instead of recorded as a dated one-off assumption
Invisible

Build a rolling forecast step by step

Build a 12-month rolling forecast with ChatGPT — 4 steps
1

Provide at least 3 months of closed actuals

Provide enough closed history to support the drivers you intend to use. A few months may show recent run-rate, but seasonality normally requires a fuller annual pattern and often multiple comparable periods. Do not let ChatGPT infer a growth assumption automatically from a short sample unless that is explicitly your chosen method.

2

State specific growth and cost assumptions

"Revenue grows 2% per month" is actionable. "Revenue will increase" is not. ChatGPT builds formulas from numbers — vague inputs produce vague models. Include COGS as a % of revenue, OpEx escalation rate, and any planned headcount changes with their hire months.

3

Put all assumptions on a separate tab

The prompt instructs ChatGPT to reference an Assumptions tab for every forecast driver. Central assumptions let future formulas recalculate consistently and make each forecast driver auditable instead of embedding the same input in many cells.

4

Update monthly using the Update with actuals prompt

At the end of each month, use the third tab prompt above. Paste the closed actuals; ChatGPT can identify the cells to move into history and provide the new far-end forecast formulas while keeping the active horizon at 12 future months.

Tip: If your organisation keeps an approved annual budget, preserve it as a separate baseline rather than overwriting it with each rolling forecast. This lets you compare Actual vs Budget and Actual vs Forecast without losing the original plan.

Build the Rolling Forecast

Add a seasonality index to your forecast — 4 steps
1

Extract historical monthly data

Use enough comparable historical periods to support a seasonal pattern, and remove/flag structural breaks or unusual one-offs before calculating monthly shares. The appropriate history depends on the business.

2

Calculate the monthly weighting

Calculate each monthly share, normalize the 12 shares to 100%, then convert them to an index whose 12-month average is 1.0. Verify both control totals before using the index.

3

Isolate seasonality on an assumptions tab

Keep these modifiers separate from your main calculation sheet. This allows you to tweak seasonal expectations without breaking cell formulas.

4

Apply the index to rolling formulas

Apply the index to a clearly defined revenue base only once. Confirm whether growth is already embedded in that base so seasonality does not accidentally compound growth twice.

Roll the Forecast Forward Each Month

Update model with closed actuals — 4 steps
1

Finalise month-end close

Use final reconciled actuals for the closed month and preserve the prior forecast/version before changing the active forecast horizon.

2

Run the Update prompt

Provide the final actuals, the current active horizon, the prior forecast for the closed month, and the far-end formulas/assumptions. ChatGPT should identify proposed changes; verify them before applying them in Excel.

3

Close the month without losing the forecast

Store the prior forecast snapshot for variance analysis, record the final actual, then remove that month from the active forecast horizon.

4

Append the new far-end month

Append the new far-end month using only valid recurring drivers, then check for expired one-offs, date-specific assumptions, missing months, duplicates and the 12-month total range.

Frequently asked questions

What is the difference between a rolling forecast and an annual budget?
An approved annual budget is typically preserved as a fixed baseline for variance reporting, while a rolling forecast is updated periodically. In this monthly workflow: the closed month moves into historical actuals, that month leaves the active forecast horizon, and a new period is added at the far end so the model continues to look 12 months ahead. This keeps planning current with business conditions rather than locked to assumptions made 10 months ago.
How many months should a rolling forecast cover?
This workflow uses a constant 12-month forward horizon. Other organisations may choose 13, 18 or another horizon based on their planning cycle; if you change it, update the month-count and total-range validation checks as well.
Can ChatGPT automatically pull actuals into the forecast each month?
The workflow does not assume an automatic live-data connection. Paste or upload your actuals into ChatGPT depending on what your interface supports. In every case, use final reconciled actuals, preserve the prior forecast version, and verify the changed formulas and horizon before relying on the update.
How do I handle seasonality in a rolling forecast?
Use the Add seasonality prompt tab above. Provide all 12 historical monthly shares. Normalize them against their actual 12-month sum, verify the normalized shares total 100% and the seasonality indices average 1.0, then apply the index once to a clearly defined forecast base.
Does this replace a 3-statement financial model?
No. A rolling forecast focuses on the P&L and key operating metrics. A 3-statement model links the income statement, balance sheet, and cash flow statement. They serve different purposes and complement each other well.

Related Excel workflows