KPI Tree

Metric Definition

Recurring cycles in engineering throughput

Seasonal Index = (Period Throughput / Average Period Throughput) x 100
Period ThroughputOutput for the period, such as merged pull requests or completed story points
Average Period ThroughputMean output for that same calendar period across multiple years
100Scaling factor so an index of 100 means an average period

Track from

Metric GlossaryOperations Metrics

Seasonal development patterns

Seasonal development patterns are the recurring, calendar-driven swings in engineering output that repeat at predictable times each year. They show up as faster shipping in some months and slower shipping in others, driven by holidays, hiring cycles, planning quarters and on-call load. Recognising them stops a quiet December or a busy January from being read as a real change in team performance.

7 min read

Generate AI summary

What is seasonal development patterns?

Seasonal development patterns are the recurring, calendar-driven swings in engineering output that repeat at predictable times each year. The same months tend to be fast, and the same months tend to be slow, because the work is shaped by holidays, hiring cycles, planning quarters and on-call load rather than by the underlying capability of the team. A December slowdown around the winter break is seasonal. A sudden drop in a normally busy month is not.

These patterns matter because they change how you read every other delivery metric. A fall in merged pull requests in late December may be entirely normal, while the same fall in a peak shipping month signals a genuine problem. Without seasonal context, teams investigate normal lulls, set targets that ignore predictable dips, and credit or blame engineers for swings they did not cause.

Seasonality also drives planning. If output reliably climbs after a January hiring wave ramps up, roadmaps can be loaded accordingly. If a summer holiday stretch thins on-call cover, release freezes and reduced scope can be planned in advance rather than scrambled together when velocity drops.

Definition

A seasonal development pattern is only confirmed when the same swing repeats across multiple years in the same calendar period. A one-off slow quarter caused by a single launch, an outage, or a reorganisation is event-driven, not seasonal, and should not be baked into forecasts.

How to measure seasonal development patterns

You measure seasonal development patterns with a seasonal index that compares each period against its own long-run average. If a team averages 200 merged pull requests a month but December typically lands at 120, the December index is 60, meaning December runs at 60 percent of normal. A March that typically hits 240 has an index of 120.

You need at least two full years of history to separate seasonality from noise. Compare the same calendar period year over year: a swing that repeats every year is seasonal, while a swing that appears once is event-driven. Use a throughput measure that is hard to game, such as merged pull requests, completed story points, or deployment count, and divide actuals by the seasonal index to read the underlying trend.

  1. 1

    Choose a throughput measure

    Pick a stable output signal such as merged pull requests, completed story points, or deployment frequency. Avoid lines of code or commit count, which reward churn rather than delivery.

  2. 2

    Gather at least two years of history

    Collect the chosen measure by month or by sprint across two or more years. One year cannot tell a recurring cycle apart from a single unusual period.

  3. 3

    Calculate the average for each calendar period

    For every month or sprint slot, average the output across all the years you hold. This baseline is what each individual period is compared against.

  4. 4

    Compute the seasonal index per period

    Divide each period actual by its multi-year average and multiply by 100. An index near 100 is a normal period, below 100 is a seasonal lull, and above 100 is a seasonal peak.

Seasonal development patterns in a metric tree

A seasonal index tells you that output dipped, but not which part of the delivery system caused the dip. A metric tree decomposes engineering throughput into the drivers beneath it, so a seasonal swing can be traced to capacity, flow, or quality rather than treated as a single mysterious number.

KPI Tree builds this decomposition and attaches RACI ownership to every node, so each branch has a Responsible and Accountable owner. When the winter slowdown arrives, the team can see whether it came from reduced available capacity, slower review cycles, or a spike in incident load, and the accountable owner for that branch is pushed the change rather than discovering it in a retro weeks later.

Metric tree insight

When throughput drops in a holiday month, the tree shows whether available capacity fell as expected or whether flow efficiency quietly worsened underneath the seasonal dip. The first is normal and needs no action. The second is a real problem hiding behind a predictable lull.

Seasonal development patterns benchmarks

There is no universal benchmark for engineering throughput, because team size, stack and definition of done all differ. What does generalise is the shape of the seasonal index across the year. Most software teams in the northern hemisphere see the same broad rhythm, with deep troughs around major holidays and recoveries in the planning quarters that follow.

Use the ranges below as a starting point for what a typical seasonal index looks like, then replace them with your own multi-year figures. A period that sits far outside its expected band, in either direction, is the signal worth investigating.

Calendar periodTypical seasonal indexCommon driver
Late December holidays50 to 70Annual leave and code freezes reduce available capacity
January and February95 to 110Fresh quarter planning and returning staff lift output
Mid-year summer70 to 90Staggered holidays thin on-call cover and review throughput
September and October105 to 120Full headcount and pre-year-end push raise throughput

How to improve seasonal development patterns

You cannot remove seasonality, and trying to force a holiday month to match a peak month usually just burns people out. The goal is to plan around the pattern so predictable dips do not derail the roadmap and so genuine problems are not lost inside expected lulls.

Set seasonally adjusted targets

Apply the seasonal index to delivery targets so a holiday month is judged against its own historical baseline, not against a peak month. This stops teams being penalised for predictable troughs.

Plan capacity around the calendar

Schedule large initiatives for high-index months and lighter, well-scoped work for low-index months. Stagger leave and on-call so summer cover does not collapse review throughput.

Separate capacity dips from flow dips

Use the metric tree to check whether a seasonal slowdown came from fewer available engineers or from worsening review and rework. Only the second needs a fix.

Alert the owner on off-pattern moves

Push the accountable owner when throughput drifts outside its expected seasonal band, so the team reacts to real change rather than to the normal shape of the year.

Common mistakes when tracking seasonal development patterns

  1. 1

    Calling one slow quarter seasonal

    A single low period caused by a reorganisation, a big migration, or an outage is event-driven. Labelling it seasonal bakes a one-off into every future forecast.

  2. 2

    Using commit count as the measure

    Commit and line counts reward churn, not delivery, and noisy refactors distort the seasonal index. Use merged pull requests, completed story points, or deployments instead.

  3. 3

    Ignoring seasonality in targets

    Setting the same flat target for every month makes good months look heroic and holiday months look like failure. Targets should follow the seasonal curve.

  4. 4

    Letting a real regression hide in a lull

    A genuine drop in flow efficiency can be masked by an expected holiday dip. Always read the seasonally adjusted figure, not just the raw throughput.

Related metrics

Deployment frequency

DORA metric

Operations Metrics
GitHub

Metric Definition

Deployment Frequency = Number of Production Deployments / Time Period

Deployment frequency measures how often an organisation successfully releases code to production. It is one of the four DORA (DevOps Research and Assessment) metrics that predict software delivery performance and organisational outcomes. Teams that deploy more frequently deliver value to users faster, reduce the risk of each individual release, and create tighter feedback loops between development and production.

View metric

Sprint velocity

Agile planning metric

Operations Metrics
Jira

Metric Definition

Sprint Velocity = Sum of Story Points Completed in a Sprint

Sprint velocity measures the amount of work a team completes during a sprint, typically expressed in story points, ideal days, or another unit of estimation. It is a planning tool that helps agile teams forecast how much work they can commit to in future sprints based on their historical completion rate. Velocity is one of the most widely used and most frequently misunderstood metrics in agile software development.

View metric

Cycle time

Process speed

Operations Metrics
Jira

Metric Definition

Cycle Time = Process End Time − Process Start Time

Cycle time measures the total elapsed time from the start to the end of a process. It is a fundamental operations metric used in manufacturing, software development, service delivery, and any context where the speed of a process directly affects throughput, cost, and customer satisfaction.

View metric

Why did my metric change?

Metric Definition

Use this diagnostic framework to separate genuine seasonal cycles in engineering throughput from one-off shifts that need investigation.

View metric

Metric trees for engineering teams

Metric Definition

See how recurring throughput cycles fit into an engineering metric tree so the team can plan around predictable seasonal swings.

View metric

See your delivery rhythm, not just the dip

Build engineering throughput as a metric tree in KPI Tree with seasonally adjusted targets and an accountable owner on every branch, so the team acts on genuine change and leaves predictable lulls alone.

Experience That Matters

Built by a team that's been in your shoes

Our team brings deep experience from leading Data, Growth and People teams at some of the fastest growing scaleups in Europe through to IPO and beyond. We've faced the same challenges you're facing now.

Checkout.com
Planet
UK Government
Travelex
BT
Sainsbury's
Goldman Sachs
Dojo
Redpin
Farfetch
Just Eat for Business