> For the complete documentation index, see [llms.txt](https://help.modelreef.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.modelreef.io/help/drivers-variables-and-timing/seasonality-and-schedules.md).

# Seasonality & Schedules

This article explains how **seasonality** and **schedules** work in the timing engine.

You will learn:

* The difference between seasonality patterns and schedules.
* How to model recurring events such as payroll, rent and subscriptions.
* How to capture seasonal peaks and troughs in revenue and costs.

Seasonality and schedules let you move beyond flat monthly assumptions to more realistic timing patterns.

{% stepper %}
{% step %}

### Schedules: when something happens

A **schedule** tells the timing engine **exactly when** a variable accrues within the model timeline.

Examples of schedules:

* Every month.
* Every quarter.
* Specific days such as the 15th of every month.
* Every second month.
* Every X weeks in weekly models.

Schedules are conceptually similar to calendar recurrence rules. They are used for variables such as:

* Payroll runs.
* Rent and lease payments.
* Regular subscription billings.
* Repeating supplier invoices.

The schedule determines which periods contain accruals. Amounts can still be flat or driven by formulas.
{% endstep %}

{% step %}

### Seasonality: how values change across the year

**Seasonality** describes relative strength or weakness across periods within a cycle, for example within a year.

Examples:

* Retail sales stronger in November and December.
* Hospitality revenue higher in summer and lower in winter.
* Utility usage varying by season.

Seasonality is usually represented as an **index driver** such as:

* `Seasonality - Retail - Monthly Index`.
* Values might be centred around 1.0, with higher values in peak months and lower values in troughs.

Seasonality does not create events. It **scales** the magnitude of events that already exist via schedules and frequency.
{% endstep %}

{% step %}

### Using both schedules and seasonality together

You can combine schedules and seasonality by:

* Defining when the variable accrues using a schedule.
* Applying a seasonality index via a formula or modifier driver.

For example:

{% code title="Example formula" %}

```
Revenue = BaseTrend * SeasonalityIndex
```

{% endcode %}

Where:

* `BaseTrend` gives the overall level of revenue per period.
* `SeasonalityIndex` boosts peak months and suppresses quiet months.

The timing engine uses the schedule to place accruals on the timeline and the seasonality driver to adjust their size.
{% endstep %}

{% step %}

### Modelling irregular events

For irregular events that do not fit simple schedules, you can:

* Enter values directly for the periods they occur.
* Use a one off schedule with explicit dates.
* Combine a base schedule with manual overrides if only a few periods differ.

The goal is to keep the timing logic as simple as possible while still matching the real pattern.
{% endstep %}

{% step %}

### Seasonality and scenarios

Seasonality is often scenario dependent, for example:

* Base Case: normal seasonal pattern.
* Downside: lower overall level but same shape.
* Upside: stronger peaks or faster recovery from weak periods.

You can implement this by:

* Keeping the same seasonality index shape in each scenario.
* Scaling the base trend or seasonality index differently per scenario.
* Or, if required, adjusting the index shape itself in extreme scenarios.

Because each scenario is a separate model, each can have its own seasonality driver paths.
{% endstep %}
{% endstepper %}

***

## Related articles

* [Seasonality & Commodity Pricing](/use-cases/agriculture-and-primary-production/seasonality-and-commodity-pricing.md)
* [Build a Seasonality Adjusted Forecast](/how-tos/scenarios-and-planning/build-a-seasonality-adjusted-forecast.md)
* [Cash Waterfall Overview](/help/financial-outputs-and-valuation/cash-waterfall-overview.md)
* [Subcategory Selection](/syntax/variables-syntax/subcategory-selection.md)
