# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.modelreef.io/help/drivers-variables-and-timing/seasonality-and-schedules.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
