> ## Documentation Index
> Fetch the complete documentation index at: https://docs.runway.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Seasonal forecasting

> This guide walks through several ways to model seasonality in Runway, depending on where it occurs in your business.

Revenue and expenses often fluctuate throughout the year. Runway makes it easy to handle time-based variability, since all data is a time series.

## Where should I be forecasting seasonality?

Forecast seasonality at the same level where it shows up in your business.

* If it’s **company-wide**, apply seasonality factors to a high-level driver in a model or directly to a default formula in a database column.
* If seasonality varies by **customer, store, or contract**, use **formula overrides** in the relevant database.

We’ll walk through both approaches below. Runway offers flexibility, so you can adapt the method to what makes the most sense for your model.

<Info>
  Need a refresher on formulas? [Start here →](https://docs.runway.com/concepts/formulas/formulas-basics)
</Info>

### Annual seasonality - Driver & default formula

1. Define a new driver to capture your seasonal pattern. If this pattern is global (not tied to a particular customer), add it in a [driver table block in a page](https://docs.runway.com/concepts/pages/drivers-table-block) or a [model](https://docs.runway.com/concepts/models/models-basics).
   * **No historical data?** Hardcode seasonality for a typical year.
     <img src="https://mintcdn.com/runway-5055a12e/tzN-u1troKtnvvuu/images/seasonal-forecasting/annual-1.png?fit=max&auto=format&n=tzN-u1troKtnvvuu&q=85&s=00db20c051ba86452148d5b2ba1d192b" alt="Annual 1 Pn" width="3024" height="1328" data-path="images/seasonal-forecasting/annual-1.png" />
   * **Have historical data?** Calculate seasonality directly in the driver’s actuals formula.
     In this example, we’re taking 1 month’s value of ARR and dividing it by the sum of the last rolling 12 months of ARR. Doing so will give us the proportion of ARR incurred in a particular month.
     <img src="https://mintcdn.com/runway-5055a12e/tzN-u1troKtnvvuu/images/seasonal-forecasting/annual-2.png?fit=max&auto=format&n=tzN-u1troKtnvvuu&q=85&s=00f0c9ae3f6a9568e605b5995bd34a89" alt="Annual 2 Pn" width="3022" height="1028" data-path="images/seasonal-forecasting/annual-2.png" />
2. To keep seasonality consistent across future months, reference the same month from the previous year in your forecast formula using the **One Year Ago** date reference.
   <img src="https://mintcdn.com/runway-5055a12e/tzN-u1troKtnvvuu/images/seasonal-forecasting/annual-3.png?fit=max&auto=format&n=tzN-u1troKtnvvuu&q=85&s=b40d0b993bb52682a4cf550c2f665f61" alt="Annual 3 Pn" width="3022" height="1018" data-path="images/seasonal-forecasting/annual-3.png" />
3. Apply this seasonal adjustment to the relevant forecast drivers.
   In this example, we’re multiplying the Account Executive (AE) quota projection by the seasonality driver within a database. This allows you to use a shared formula while giving each AE a tailored goal.
   <img src="https://mintcdn.com/runway-5055a12e/tzN-u1troKtnvvuu/images/seasonal-forecasting/annual-4.png?fit=max&auto=format&n=tzN-u1troKtnvvuu&q=85&s=3f6da287174e279d3f455b4a1e9702db" alt="Annual 4 Pn" width="3024" height="1090" data-path="images/seasonal-forecasting/annual-4.png" />
   The impact will cascade into downstream metrics like ARR that aggregate the AE quota projection.
   <img src="https://mintcdn.com/runway-5055a12e/tzN-u1troKtnvvuu/images/seasonal-forecasting/annual-5.png?fit=max&auto=format&n=tzN-u1troKtnvvuu&q=85&s=46a929422bad9dda2832977efb5e8c03" alt="Annual 5 Pn" width="3020" height="1224" data-path="images/seasonal-forecasting/annual-5.png" />

### Quarterly seasonality - Date math & date drivers

Let’s take it up a notch and add in date functions and drivers. For this walkthrough, we’ll be working with a sales team that closes 80% of their quota during the last month of the quarter .

1. Create a **Quarter End** helper driver. Go to Format and display > Type > Date to change to a date driver. This will output a human-readable date, rather than a number.
   <img src="https://mintcdn.com/runway-5055a12e/wYNFXrpTLTSnjdee/images/seasonal-forecasting/quarterly-1.png?fit=max&auto=format&n=wYNFXrpTLTSnjdee&q=85&s=784ccbca05e8c3906b89acd26b628300" alt="Quarterly 1 Pn" width="3016" height="1466" data-path="images/seasonal-forecasting/quarterly-1.png" />
2. Use `thisQuarter()` to return the start of each quarter, then add 2 months to return the *end* of that quarter.
   <Info>
     For more details on date functions in Runway, please refer to[ this article](https://docs.runway.com/concepts/formulas/functions-operators#date-functions).
   </Info>
   <img src="https://mintcdn.com/runway-5055a12e/wYNFXrpTLTSnjdee/images/seasonal-forecasting/quarterly-2.png?fit=max&auto=format&n=wYNFXrpTLTSnjdee&q=85&s=78cc85905af293d13fc4d6a50bee4826" alt="Quarterly 2 Pn" width="3018" height="1232" data-path="images/seasonal-forecasting/quarterly-2.png" />
3. Head back to your sales roster database and calculate their monthly quota using the **Quarter End driver** you just made. Wrapping this logic in an `IF()` statement allows us to allocate 80% of a quarter’s quota in the last month and 10% in the other months.
   <img src="https://mintcdn.com/runway-5055a12e/wYNFXrpTLTSnjdee/images/seasonal-forecasting/quarterly-3.png?fit=max&auto=format&n=wYNFXrpTLTSnjdee&q=85&s=d370c7eee8235c331c8cfb251bbb19fd" alt="Quarterly 3 Pn" width="3020" height="1188" data-path="images/seasonal-forecasting/quarterly-3.png" />
   <img src="https://mintcdn.com/runway-5055a12e/wYNFXrpTLTSnjdee/images/seasonal-forecasting/quarterly-4.png?fit=max&auto=format&n=wYNFXrpTLTSnjdee&q=85&s=cfa5ab2db0e3d1393a320d25f0551f93" alt="Quarterly 4 Pn" width="3016" height="1114" data-path="images/seasonal-forecasting/quarterly-4.png" />

### Granular seasonality

For this walkthrough, let’s think about customer usage of a SaaS business. Given each customer’s business, they might use a platform at different intensities throughout the year. A florist will not have the same usage as a ski resort, for example.

In this case, because seasonality occurs at a more granular level, we'll want to forecast it at that same level—on a customer-by-customer basis.

We’ll take all the core concepts we’ve walked through above, but apply them by overriding the default formula in a database column.

1. Within your database, create a column for your seasonality factor.
   Give it a sensible default - depending on your business, this could be a general seasonality factor (like those discussed above) or just a flat forecast.
   <img src="https://mintcdn.com/runway-5055a12e/tzN-u1troKtnvvuu/images/seasonal-forecasting/granular-1.png?fit=max&auto=format&n=tzN-u1troKtnvvuu&q=85&s=2a0feed548171e0f37c6bb27342460be" alt="Granular 1 Pn" width="2864" height="842" data-path="images/seasonal-forecasting/granular-1.png" />
2. Apply the seasonality factor to the affected database columns.
   In this example, we are applying our seasonality factor to the Usage driver.
   <img src="https://mintcdn.com/runway-5055a12e/tzN-u1troKtnvvuu/images/seasonal-forecasting/granular-2.png?fit=max&auto=format&n=tzN-u1troKtnvvuu&q=85&s=e2b146f0e26a1426f385f37654540ccb" alt="Granular 2 Pn" width="2862" height="860" data-path="images/seasonal-forecasting/granular-2.png" />
3. For relevant segments, instead of using the default column formula defined in the previous step, you can override it by changing the formula for the row.
   For example, you could offset the overall seasonality factor to match a customer’s usage patterns.
   <img src="https://mintcdn.com/runway-5055a12e/wYNFXrpTLTSnjdee/images/seasonal-forecasting/granular-3.png?fit=max&auto=format&n=wYNFXrpTLTSnjdee&q=85&s=7246b1fe2e0334d5c0edaf5ccd9f3245" alt="Granular 3 Pn" width="2858" height="762" data-path="images/seasonal-forecasting/granular-3.png" />
   Alternatively, you could hardcode a customer’s typical year’s worth of seasonality and have that recur annually.
   <img src="https://mintcdn.com/runway-5055a12e/wYNFXrpTLTSnjdee/images/seasonal-forecasting/granular-4.png?fit=max&auto=format&n=wYNFXrpTLTSnjdee&q=85&s=36fd950183da3b8e7a1f917024d31e74" alt="Granular 4 Pn" width="2862" height="658" data-path="images/seasonal-forecasting/granular-4.png" />

## Wrap-up

Seasonality doesn’t have to be hardcoded across dozens of drivers. By using Runway’s date references and formula flexibility, you can structure your model to scale seasonality cleanly—whether annually, quarterly, or by segment.

If you need help deciding which method fits your use case, reach out to your CXM or drop us a line in Slack.
