Skip to content

Detect seasonality in revenue and expenses

Compares the same calendar months across multiple years to find the spikes and dips that repeat, and the ones that do not.

Workflow · Forecasting | Role · FP&A Analyst | Advanced | 15 min | Updated Jun 2, 2026
The prompt

Copy and customize

prompt.txt
You are an FP&A analyst testing for seasonality before building a forecast.

Context: amounts are in the Amount field, the reporting date is Reporting Month,
and the split is Account Group L2 (or a revenue/expense flag). Use as many full
fiscal years as the data contains.

{financial_data}

Task: compare the same calendar months across years and identify repeating
seasonal patterns, separating them from one-off events.

Output format:
- A table: each calendar month's figure in each year, side by side, with an average.
- The months that are consistently strongest and weakest across years.
- Patterns that repeat in the same month across multiple years, kept separate from
  single-year events.
- A confidence note: how many full years the pattern rests on and how consistent
  it is. Require at least two full years before calling anything seasonal; with
  fewer, say the data is insufficient. Exclude partial or open months and name them.
Open in
We’ll copy the prompt and open the chat.
How to use

Run it in four steps

  1. Export at least two, ideally three or more, full fiscal years from the Amount field on a stable Reporting Month, with non-recurring items flagged.
  2. Paste it into {financial_data}.
  3. Run it to compare the same months across years and flag repeating patterns.
  4. Separate growth from seasonality yourself; a business growing each year shows recent months as strong for reasons that are not seasonal.
When to use

When to reach for this prompt

Use this before building a forecast, so the baseline reflects real seasonality rather than a flat line or naive growth. It is also the right tool when someone insists a given quarter is "always" the strongest and you want to test the claim. It is best run once date fields and groupings are clean, and it needs at least two full years; a fiscal-calendar or revenue-recognition change inside the window invalidates it.

Example output

What you can expect back

Revenue by calendar month, across years (Amount)

MonthYr-1Yr-2Yr-3AvgPattern
Jan1,610K1,720K1,840K1,723Kbelow average, consistent
Mar1,510K1,640K1,760K1,637Kweakest month, all 3 years
Nov2,180K2,310K2,470K2,320Kstrong, building
Dec2,640K2,790K2,980K2,803Kstrongest month, all 3 years

Consistently strongest: December, highest in all three years.

Consistently weakest: March, lowest or near-lowest in all three years.

Repeating pattern: a Q4 build (Nov-Dec) and a Q1 trough (Feb-Mar), present in all three years.

Confidence: based on three complete fiscal years; the Q4/Q1 pattern holds in all three. Mid-year months are noisier and the seasonal read there is weaker, so those should be treated with some caution.

Limitations · Worth knowing

This prompt has real limitations you should understand.

Seasonality is the most over-claimed pattern in finance, because both human readers and language models are pattern-completion engines. With only two or three years, almost any month can be made to look seasonal, which is exactly why the confidence note exists; the headline finding is often statistically thin, and the number of years behind it should be read before the pattern is trusted.

The deeper issue in the example above is that growth and seasonality are entangled. A business growing 15% a year shows every recent month as above average, which is a trend, not a season, and untangling the two properly requires deseasonalizing rather than comparing raw totals. A single large deal or one-time write-off in a given month also poisons that month for the whole analysis, and the model cannot know which rows were one-offs unless the data marks them.

A dependable seasonality read needs several full years on a stable fiscal calendar, with non-recurring items flagged and the underlying growth trend separated out, all of which are properties of how the historical data is assembled and labeled. No prompt can deseasonalize data that was never structured to support it, which is why this analysis is only as good as the multi-year record beneath it.

Prerequisites

What your data needs to look like

  • An Amount field spanning at least two, ideally three or more, full fiscal years
  • A consistent Reporting Month with no calendar changes inside the window
  • A stable revenue and expense classification across all years
  • Non-recurring items flagged so they can be excluded from the pattern
See it run on real data

See how FinanceOS handles this prompt on real financial data.

Book a 20-minute walkthrough. We’ll run this exact prompt against a sample dataset reconciled through FinanceOS, and show you what changes when the data underneath is right.

Book a walkthrough
The Hub

Join the FinanceOS Hub.

Subscribe to get new sessions, use cases, and AI workflows for finance teams — straight to your inbox, every Monday.

  • Weekly · ~4 min read
  • No spam, unsubscribe anytime
  • 2,400+ finance leaders