Case study 06 · Root-cause analysis · Seasonality

Is it churn, or is it seasonality?

In mid-2026 business transaction volume fell behind forecast and slid for five weeks in a row. The CMO wanted to know why, and what would stop it. Before anyone reached for a fix, I tested every lever behind the total on its own, compared each region with the two years before, and wrote the conclusion as a prediction with a date on it.

Role
Lead analyst on the investigation
Context
Business banking at a leading Nigerian fintech: merchants who take payments and move money through the platform
Methods
Hypothesis elimination, seasonal indexing, calendar alignment, volume decomposition, cohort retention and churn
Tools
SQL, Python (pandas, matplotlib), slide write-up

Situation

Weekly business transaction volume dropped against forecast in weeks 21–25 of 2026, after five weeks of week-on-week decline.

Task

The CMO asked me to find the cause, and to define a remedy that would stop the decline.

Action

Tested every lever behind the total: actual vs forecast by transaction type, new and returning customers, retention and churn, frequency and ticket size, and each region against 2024 and 2025.

Result

Not churn: seasonal drag from the rains, the school break, Eid al-Adha and the June 12 holiday. Volume rebounded from week 38, and the re-engagement campaign under discussion wasn't needed.

Situation and task

Weekly volume had grown steadily through the first months of 2026. Then, from week 21, it fell behind the forecast and went down week on week for five weeks, across every transaction type. A falling line on a growth chart makes people nervous, and the first instinct is usually "we are losing customers". The CMO asked me to find out what was causing it and to define a remedy.

The remedy depended entirely on the cause. If merchants were leaving, the business needed a re-engagement campaign. If the drop was seasonal, that campaign would spend money fixing something that fixes itself. So I treated it as a list of suspects and tested every lever that adds up to total volume, each on its own, rather than looking for evidence for the answer I expected.

Charts use illustrative data rebuilt from the shape of the real results: values are indexed and lightly perturbed, and the real figures stay with the company.

Six suspects, one survivor

Candidate causeTestIf true, I'd expectWhat I sawVerdict
One product breakingActual vs forecast by transaction type, month to date and year to dateOne type far off its forecastAll types affected alike; year to date within about 1% of forecast, with withdrawals and transfers the softestRuled out
AcquisitionSplit volume into new vs returning customersThe gap opens in new customersNew customers contributed almost nothing to the change; the drop sat in returning customersRuled out
ChurnWeekly and monthly churn across the full yearChurn rises in the drop windowChurn flat, at levels seen in other seasonal monthsRuled out
Retention of top customersRetention for the highest-volume merchantsTop-customer retention fallsSteadyRuled out
Regional collapseYear-on-year growth by region and stateOne or more regions shrinkEvery region still growing year on yearRuled out
Ticket sizeAverage transaction value by tierSmaller transactionsHeld roughly levelRuled out
Lower frequency (seasonal)Transactions per active customer, by tier and region, against prior yearsSame customers, fewer transactions, matching past years' shapeFrequency fell, mostly among top customers, most in the northSurvives

Which factor moved

Volume is a product of three things: how many customers are active, how often each one transacts, and how big each transaction is. Splitting it that way turns "volume fell" into a precise question. Taking logs makes the split additive, so each factor's share of the change can be read straight off a bar.

Volume = active customers × transactions per customer × ticket sizeIllustrative data
View
Customers
volume, drop window vs the six weeks before
active customers
transactions per customer
ticket size

2026, weeks 3 to 25. Each series is indexed to weeks 4–18 = 100; the shaded band is the drop window. "What moved" compares the drop window with the six weeks before it, in log points (roughly percentage change), so the three factors add up to the total.

The answer was clear. Active customers kept growing slowly. Ticket size barely moved overall (the long tail's slipped a little, but the long tail carries a small share of volume). Almost all of the drop came from transactions per customer, and nearly all of that from the top customers, who carry most of the volume. The same merchants were still here; they were just less busy. That points away from churn and towards something that makes good customers trade less for a few weeks.

Comparing a year with itself

Seasonality is the obvious candidate for "good customers trade less for a few weeks", but comparing raw volume across years is misleading because the business grows. So I indexed each year to its own early-year baseline (weeks 4–18 = 100). That puts every year on the same scale and asks only: compared with its own normal, how did this week look?

That still didn't line up. The reason is that the biggest holiday in the window, Eid al-Adha, follows the Islamic lunar calendar and arrives about eleven days earlier each year. On a calendar-week axis, Eid fell in week 24 in 2024, week 23 in 2025 and week 22 in 2026. Shifting each prior year so that Eid falls in the same week is the fair comparison for trade that follows Eid. Try the toggle, then pick a region: the deck broke the comparison out for all seven.

2024, 2025 and 2026 weekly volume, each indexed to its own baselineTraced from the original deck
Axis
Region
shape gap between 2026 and 2024–25, Eid ±3 weeks, calendar weeks
the same gap with 2024 and 2025 aligned with the Islamic calendar

Each year = 100 on its own weeks 4–18. Hover any week to see which holidays fell in it in each year. Regions start at week 2; nationally, week 1 dips sharply every year because of the New Year holiday, then volume climbs through the first quarter. Triangles mark Eid al-Adha in each year; the shaded band is 2026's drop window. In the Islamic-calendar view 2024 and 2025 are shifted by whole weeks so their Eid falls in 2026's Eid week. The strips across the top show each year's own holidays where they fall on the chart: in the calendar view the Islamic holidays drift a week or two between years, and in the Islamic-calendar view they line up while Easter, Workers' Day and June 12 move instead. Hover a week for the names; 2026 has data only up to the read-out at week 25. Regional lines were read off the original deck's charts, with a few hidden points filled from their neighbours. The shape gap scales each year to its own average over the seven weeks around Eid, so level differences drop out, then takes the mean absolute difference in index points between 2026 and the average of 2024 and 2025.

Two things stand out. First, 2024, 2025 and 2026 have nearly the same shape: the New Year dip, a steady climb through the first quarter, a plateau, then a mid-year dip and a climb into the second half. 2024 and 2025 dipped at this time of year too, and recovered; 2026 sits a touch lower in the drop window, but the dip is shallow. In 2024 the dip was partly masked because new customers were a bigger share of activity; by 2026 they were a smaller share, so the same seasonal dip showed through. Second, the regions disagree about what causes it:

Nationally the calendar view fits better, because fixed-date holidays, the rains and the school break do not move with the lunar calendar. Calendar alignment is a trade-off: lining up Eid knocks the fixed-date holidays out of line, so I read the two views side by side rather than trusting either alone.

Writing the conclusion so it could fail

Put together, every lever told the same story. Volume per transaction type was tracking its forecast year to date. Retention was steady for top customers and the long tail, in every onboarding channel and every region, and churn was within its normal range. Merchant numbers and ticket size held. What fell was the number of transactions per merchant, concentrated in the top customers who move the national total most. The surviving explanation was seasonal drag: the rainy season, the third-term school break and Eid al-Adha, in a different mix in each region, plus the June 12 holiday. The year before, merchants around schools and universities had dropped up to 75% in volume when schools closed.

"It's seasonal" is easy to say and hard to disprove, which is exactly why I didn't want to leave it there. I wrote it as a falsifiable hypothesis with a date:

The hypothesis

If the drop is seasonal drag, volume per active returning customer should move the way prior years moved from the same point on their Eid-aligned path, climbing back rather than slipping further. First read at week +2 after the read-out; confirmation at week +3. If it is still below the range at +3, the seasonal explanation is rejected and the diagnostic plan below starts.

The metric matters. Total volume would mix in new-customer growth and hide a problem. Volume per active returning customer isolates the behaviour that actually moved. The figure below shows what each outcome would look like against the test; it illustrates the test, not the result. It is drawn on the national seasonal index, which I have for all three years.

The dated test: what a pass and a fail look likeIllustrative data
Scenario

National seasonal index, every series rebased so the read-out week (week 0) = 100. Grey band: the range of the two prior years' Eid-aligned paths from that point, with a point of tolerance. Solid line: this year, observed to the read-out. Dashed: illustrative scenarios. Vertical markers: the first read (+2) and confirmation (+3).

What happened

2026 followed the seasonal path of the years before it: the rains and the long school vacation kept volume subdued through the summer, and it rebounded from week 38. Because the rebound came as the seasonal read predicted, the re-engagement campaign that had been on the table was never needed, and the money and team time went elsewhere.

The plan if it didn't rebound

A hypothesis is only useful if you know what you'll do when it fails. I agreed the next checks in advance, so a miss would trigger work immediately instead of a fresh debate. The first and fourth started that same week, so they would already be ruled in or out by the first read:

  1. Terminal uptime and declines. Are merchants trying to transact and failing? Check device downtime and decline rates by region and device type.
  2. Competitor displacement. Are top merchants splitting volume to another provider? Look for merchants whose volume fell while their activity days held.
  3. Pricing and policy changes. Walk the change log for fee, limit and policy changes that landed near the start of the plateau.
  4. Cohort engagement. Compare engagement curves for recent onboarding cohorts against older ones, to catch a quality problem in acquisition.
  5. Macro pressure. Inflation, cash availability and fuel prices hit merchant trade directly; check whether the drop tracks them by region.

Caveats and what I'd do differently

Skills shown

Root-cause analysisHypothesis testingSeasonal indexingCalendar alignmentVolume decompositionChurn and retentionStakeholder communication