Research Seasonal Demand Patterns with Google Trends Data
Identify seasonal demand patterns for e-commerce and marketing planning using Google Trends data. Timeseries analysis, peak detection, and inventory timing.

Thirdwatch's Google Trends Scraper returns structured Google Trends data for any keyword -- interest timeseries, average interest (0-100), directional slope, peak date, and related queries across time windows from the past hour to all-time back to 2004. Built for e-commerce operators, media buyers, content marketers, and supply chain planners who need to quantify seasonal demand patterns rather than guess at them. No login, no API key, pay-per-result pricing.
Why research seasonal demand with Google Trends
Seasonality drives more commerce than most teams quantify. According to the U.S. Census Bureau's Monthly Retail Trade Report and Google's own documentation on Trends data interpretation, November-December retail sales consistently run 20-30% above the annual monthly average, but the timing and magnitude of seasonal demand varies dramatically by product category. A swimwear brand peaks in May-June; a tax software company peaks in January-March; a wedding vendor peaks in spring. The question is not whether seasonality exists, but exactly when your category's demand ramps, peaks, and declines -- and whether that pattern is stable, intensifying, or eroding year over year.
Google Trends is the fastest way to answer this. The timeseries data shows weekly interest scores across any time window up to 22 years. The peakDate field pinpoints the exact week of maximum interest. Running the same query across today 5-y reveals whether the seasonal shape is consistent or shifting. E-commerce teams use this to time ad spend ramps, inventory purchasing, content publication, and promotional calendars. The alternative -- waiting for your own sales data to accumulate over multiple years -- is slower and blind to category-level shifts happening outside your customer base.
How does this compare to the alternatives?
Three approaches to seasonal demand research:
| Approach | Cost | Reliability | Setup time | Maintenance |
|---|---|---|---|---|
| Internal sales data analysis | Free (you own the data) | Accurate for YOUR customers only | 2-4 weeks of data engineering | Annual refresh |
| Google Keyword Planner seasonal data | Free with Google Ads account | Monthly granularity, limited history | 30 minutes | Google Ads account required |
| Thirdwatch Google Trends Scraper | Pay per result | Weekly granularity, 22-year history | 5 minutes | Thirdwatch maintains |
Internal sales data is the ground truth for your business but cannot show market-level demand or competitor-category dynamics. Google Keyword Planner provides monthly search volume with seasonal indices, but requires an active Google Ads account, offers only monthly granularity, and caps at three years of history. The Google Trends Scraper returns weekly-resolution data across up to 22 years with slope and peak detection built in.
How to research seasonal demand in 4 steps
Step 1: How do I set up my API token?
Sign up at apify.com (free tier, no credit card required). Copy your API token from Settings and export it:
export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"Step 2: How do I pull multi-year seasonal data for a product category?
Use the today 5-y time range to capture five years of seasonal cycles. Pass product category keywords in keywords and scope to your target market with geo.
import os, requests, pandas as pd
ACTOR = "thirdwatch~google-trends-scraper"
TOKEN = os.environ["APIFY_TOKEN"]
resp = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={
"keywords": [
"swimwear", "winter jackets", "prom dresses",
"running shoes", "sunscreen", "space heater"
],
"geo": "US",
"timeRange": "today 5-y",
"includeRelated": False,
},
timeout=300,
)
categories = pd.DataFrame(resp.json())
print(categories[["keyword", "avgInterest", "slope",
"peakInterest", "peakDate"]])Six product categories, five years of data each. The peakDate field immediately tells you the highest-interest week across the entire window. For categories with strong annual seasonality, this is the most recent peak occurrence.
Step 3: How do I extract the seasonal pattern from the timeseries?
Parse the timeline array to identify monthly averages across multiple years. This reveals the seasonal shape -- which months are peak, which are trough.
from collections import defaultdict
for item in resp.json():
monthly = defaultdict(list)
for point in item.get("timeline", []):
month = point["time"][:7] # YYYY-MM
month_num = int(point["time"][5:7])
monthly[month_num].append(point["value"])
print(f"\n{item['keyword']} — seasonal profile (avg by month):")
for m in range(1, 13):
values = monthly.get(m, [])
if values:
avg = sum(values) / len(values)
bar = "#" * int(avg / 2)
print(f" {m:2d}: {avg:5.1f} {bar}")This produces a month-by-month demand fingerprint for each product. "Swimwear" will show a clear June peak. "Winter jackets" will peak in October-November as people shop before winter arrives. "Prom dresses" will spike in March-April. The bar chart makes the seasonal shape immediately visible.
Step 4: How do I detect if seasonal peaks are strengthening or weakening?
Compare peak values across consecutive years to identify long-term trends in seasonal intensity.
from collections import defaultdict
for item in resp.json():
yearly_peaks = defaultdict(int)
for point in item.get("timeline", []):
year = point["time"][:4]
yearly_peaks[year] = max(yearly_peaks[year], point["value"])
print(f"\n{item['keyword']} — year-over-year peaks:")
years = sorted(yearly_peaks.keys())
for y in years:
peak = yearly_peaks[y]
delta = ""
if years.index(y) > 0:
prev = yearly_peaks[years[years.index(y) - 1]]
change = peak - prev
delta = f" ({change:+d} vs prior year)"
print(f" {y}: peak={peak}{delta}")
overall_slope = item["slope"]
print(f" Overall slope: {overall_slope:+.2f} "
f"({'strengthening' if overall_slope > 0 else 'weakening'})")A product category with declining yearly peaks but stable troughs is losing its seasonal spike -- the market is either shifting to year-round purchasing or the category is in secular decline. A category with growing peaks is intensifying its seasonality, which means your ad spend and inventory timing become more critical, not less.
Sample output
A single record from a five-year seasonal analysis run:
{
"keyword": "swimwear",
"geo": "US",
"timeRange": "today 5-y",
"avgInterest": 38,
"slope": 0.05,
"peakInterest": 100,
"peakDate": "2025-06-15",
"timeline": [
{ "time": "2021-06-13", "value": 92 },
{ "time": "2021-12-19", "value": 12 },
{ "time": "2022-06-12", "value": 95 },
{ "time": "2022-12-18", "value": 11 },
{ "time": "2025-06-15", "value": 100 }
],
"relatedTop": [],
"relatedRising": [],
"scraped_at": "2026-05-26T10:45:00.000Z"
}avgInterest of 38 with peakInterest of 100 shows extreme seasonality -- the peak is nearly 3x the average. June peaks are consistent across years (92, 95, 100), confirming the pattern is stable and slightly strengthening. December troughs at 11-12 confirm the off-season depth. For an e-commerce operator, this data directly informs when to ramp ad spend (April-May), when to have full inventory (May-June), and when to shift budget elsewhere (September-February).
Common pitfalls
Three mistakes when using Google Trends for seasonal analysis. Using too short a time window -- a 12-month window shows one seasonal cycle, which is not enough to confirm a pattern. You need at least three years (use today 5-y) to distinguish genuine seasonality from one-time events like a viral moment or a pandemic-driven spike. Assuming global seasonality -- "winter jackets" peaks in October in the US but in April in Australia. Always run separate queries per geo for each market you serve. Worldwide data averages away hemisphere-specific patterns and produces a misleadingly flat timeseries. Confusing the slope with seasonality -- the slope field measures overall direction across the entire window, not seasonal rhythm. A product with strong December seasonality will show a positive slope when queried in October (climbing toward peak) and a negative slope when queried in February (declining from peak). For seasonality analysis, ignore slope and work directly with the timeline array to identify repeating monthly patterns.
Thirdwatch's actor handles the data collection infrastructure so your seasonal analysis starts from structured JSON, not from chart screenshots.
Related use cases
Frequently asked questions
How far back should I look to identify seasonal patterns?
Use the today 5-y or all time range. Five years of data reveals repeating annual cycles and lets you distinguish genuine seasonality from one-time spikes. A single year of data cannot confirm a pattern is seasonal rather than coincidental. The all range goes back to 2004 for maximum historical context.
Can I use Google Trends to plan inventory?
Yes, as a directional signal. Google Trends shows when search interest peaks for a product category, which correlates with purchase intent. Combine the peak date and interest curve shape with your own sales data to forecast demand windows. Trends data is normalized, not absolute volume, so it indicates timing and direction rather than exact unit demand.
How do I compare seasonality across different countries?
Run the actor once per country using the geo parameter. Compare the timeline arrays to see how peak timing differs. For example, swimwear peaks in June in the US but in December in Australia. Separate runs per geography ensure each timeseries is normalized correctly for that market.
Does the slope field account for seasonality?
No. The slope is a simple directional measure across the full time window. A product with strong December seasonality will show a positive slope in Q3 runs as it climbs toward the peak and a negative slope in Q1 runs as it declines from the peak. For true seasonality analysis, examine the raw timeline array and look for repeating annual peaks.
Can I detect if a seasonal pattern is weakening year over year?
Yes. Use the all time range to get data back to 2004. Compare peak values across consecutive years. If the December peak was 100 in 2023, 85 in 2024, and 70 in 2025, the seasonal spike is eroding. The avgInterest field across a 5-year window will also reflect this decline.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.