I look at a revenue chart almost every day. For a long time I read it the way most solo operators do: up is good, down is bad, and if this month beats last month I did something right. Then I ran a few businesses long enough to notice the same dip every August and the same bump every December, no matter what I actually did that month. That’s when I started paying attention to time series decomposition, which is just a formal way of asking: what part of this chart is a real trend, what part repeats on a schedule, and what part is just noise I should stop reacting to.
What decomposition actually splits apart
A time series is any metric measured at regular intervals: daily signups, weekly MRR, monthly churn rate, daily website sessions. Decomposition takes that single line and breaks it into three pieces.
Trend is the slow-moving direction underneath everything else. Is the underlying level of the metric rising, falling, or flat, once you ignore the week-to-week wobble?
Seasonality is the repeating pattern tied to the calendar. Not “seasons” in the weather sense, whatever period actually repeats in your business: day-of-week dips in B2B traffic on weekends, a January bump in signups after New Year’s resolutions, a slump every school holiday if you sell to parents.
Residual (sometimes called the remainder or noise) is whatever is left over after you subtract the trend and the seasonality. This is the part that’s genuinely unexplained: a one-off spike from a press mention, a random bad week, a payment processor outage.
The whole point is that a raw chart mixes all three together, and your eye is bad at separating them. You see a dip and your gut says “something’s wrong,” when the decomposition would show it’s the same seasonal dip you had at the same point last year, sitting on top of a trend that’s still climbing.
Additive versus multiplicative, without the jargon
Most explanations of this get bogged down in formulas, but the practical question is simple: does your seasonal swing stay a roughly constant size, or does it grow as the metric grows?
If your traffic drops by about 2,000 sessions every weekend whether you’re at 10,000 sessions a month or 40,000, that’s additive: trend + seasonality + residual, added together.
If your weekend drop is roughly 20% of whatever your traffic level is that month, so it’s 2,000 sessions when you’re small and 8,000 when you’re big, that’s multiplicative: trend × seasonality × residual, multiplied together.
Getting this wrong doesn’t break the analysis, but it makes the seasonal component harder to interpret. If your business has grown a lot over the period you’re analyzing, multiplicative is usually the better fit, because most real growth compounds rather than adding a flat amount each period.
A concrete example: MRR that looks scarier than it is
Say you run a small subscription tool and you look at MRR week over week. You notice it dropped for the third straight week and start wondering if churn is spiraling. Before you do anything, decompose it.
You’d typically use a moving average to estimate the trend line first, smoothing out enough periods that the seasonal wiggle averages out. In Python this is one line with statsmodels.tsa.seasonal.seasonal_decompose, or you can approximate it by hand with a rolling average in a spreadsheet. Once you subtract that trend from the raw series, what’s left is seasonality plus residual.
If you’ve been running long enough to have a year or more of weekly data, you might find that MRR growth always slows in the weeks around major holidays, because fewer new trials convert to paid during that window, and it recovers on its own afterward. If this year’s dip lines up with that recurring pattern and is roughly the same size as previous years, that’s seasonality doing what seasonality does, not a new problem. If the dip is much bigger than the seasonal pattern predicts, or it happens at a time of year that’s never dipped before, that’s a residual worth investigating, maybe a pricing change, a competitor, or an actual increase in churn.
The value here isn’t the math. It’s that decomposition gives you a reason to stop reacting to every wiggle and a reason to take the wiggles that don’t fit the pattern seriously.
What it can and can’t tell you
Decomposition is descriptive, not diagnostic. It will show you that a seasonal pattern exists. It will not tell you why it exists. You still have to go find out, by looking at your own funnel data, checking what marketing you ran that period, or just asking a few customers.
It’s also not a forecasting tool by itself, even though the same trend and seasonal estimates often get reused inside forecasting methods. Knowing last year’s December pattern doesn’t guarantee this December repeats it. Your business changes, your customer base changes, and a pattern built from twelve months of data is a thin foundation to bet on.
It needs enough history to be trustworthy. If you’re trying to find weekly seasonality, you want at least a couple of full annual cycles if the seasonality is annual, or several weeks of consistent data if you’re looking at day-of-week effects. Running this on three months of numbers for a business that’s six months old will mostly show you noise dressed up as a pattern.
It’s also sensitive to the window you choose for the trend estimate. A short window follows the data closely and can mistake real seasonality for trend. A long window smooths so much that you can miss a genuine shift in direction. There’s no single correct window, only one that’s honest about the tradeoff, and it’s worth trying more than one length before you trust the result.
And it does not replace judgment. A clean-looking seasonal pattern from two years of data can be coincidence, especially with a metric that only has twelve or twenty-four data points to work with. Treat what it shows you as a hypothesis about your business, not a verdict.
Where it’s actually worth the effort
I use this mostly for three things. First, evaluating whether a marketing push worked: if signups jumped in a month that historically jumps anyway, I look at the residual, not the raw increase, before crediting the campaign. Second, planning capacity or cash flow around known dips, like a support queue that always gets quieter in certain months, so I don’t overreact to a slow month that happens every year. Third, sanity-checking a metric before I report it anywhere, so I’m not writing “revenue fell 8%” without knowing whether that’s the expected seasonal move or something new.
For a lot of day-to-day decisions, a simple year-over-year comparison for the same period gets you most of the same benefit without any of the setup, and I’d start there before reaching for a decomposition. Save the full breakdown for metrics where the seasonal pattern is strong enough, and the stakes high enough, that separating trend from noise actually changes what you’d do next.
If you want more of this kind of grounded, no-hype walkthrough of the metrics and methods that actually run a small business, you can find the rest of what we cover on the home page.
Get new guides and videos first — join the Telegram channel.