How to Estimate RSS Subscribers from VPS Logs

Recently in a WeChat group, I came across ROYWANG’s article [ “Who is Secretly Following You? Adding an RSS Subscription Counter to Your Blog” ]( https://roy.wang/rss-stats/) . The author created a small script to count blog RSS subscribers, but it only works for blogs whose domain is hosted on Cloudflare. Since my blog uses both VPS and Vercel, the situation is different. Over the weekend, I explored this issue and found the process surprisingly straightforward.
Statistical Principle
Previously I wrote an article Using GoAccess in 1Panel to Replace Website Analytics and Page Statistics where I researched Nginx log structures. For example, the following four log entries represent users retrieving my blog updates via WordPress (likely an RSS plugin), FreshRSS, Tiny Tiny RSS, and NetNewsWire RSS clients respectively.
bash
88.88.88.88 - - [17/Jan/2026:06:02:39 +0000] "GET /index.xml HTTP/1.1" 200 92659 "-" "WordPress/6.9; https://www.domain.com" "-"
99.99.99.99 - - [17/Jan/2026:06:11:03 +0000] "GET /index.xml HTTP/2.0" 304 0 "-" "FreshRSS/1.28.0 (Linux; https://freshrss.org)" "-"
66.66.66.66 - - [17/Jan/2026:06:19:39 +0000] "GET /index.xml HTTP/1.1" 304 0 "-" "Tiny Tiny RSS/25.07-dea3f2d (Unsupported) (https://tt-rss.org/)" "-"
77.77.77.77 - - [17/Jan/2026:06:12:08 +0000] "GET /index.xml HTTP/2.0" 304 0 "-" "NetNewsWire (RSS Reader; https://netnewswire.com/)" "-"Thus, we only need to count unique visits to index.xml by IP and host header. Since most RSS retrieval frequencies exceed twice daily, counting unique visits over the last day is sufficient. To reduce error, we can compare this with weekly or monthly data.
Counting RSS Requests in VPS Logs
My blog’s VPS logs are typically located at /www/sites/lawtee.com/log/access.log, with the RSS file at /index.xml. First, extract relevant requests:
bash
grep 'GET /index.xml' /www/sites/lawtee.com/log/access.log > rss.logExclude browser and crawler traffic by filtering common User-Agents:
bash
grep -Ev 'Mozilla|Chrome|Firefox|Safari|Edg|bot|Bot|spider|Spider|crawl|Crawl|Finder' rss.log > rss_clean.logThis yields genuine RSS client access logs on the VPS.
Parsing Access Logs
As shown earlier, RSS client logs typically contain IP, timestamp, and User-Agent. We can use awk to extract and deduplicate data for subscription counts.
- Generate rss_key.log
1awk -F\" '{
2 # Segment 1: IP + Timestamp
3 split($1, a, " ");
4 ip = a[1];
5
6 # Segment 4 format: [17/Jan/2026:05:59:32
7 date_raw = a[4];
8 gsub("\\[", "", date_raw);
9 split(date_raw, d, ":");
10 date = d[1];
11
12 ua = $6;
13
14 print date "|" ip "|" ua;
15}' rss_clean.log > rss_key.log- Count Occurrences + Active Days per IP+UA
1awk -F\| '{
2 key = $2 "|" $3;
3 seen[key, $1] = 1;
4 count[key]++;
5}
6END {
7 for (k in count) {
8 day_count = 0;
9 for (x in seen) {
10 split(x, p, SUBSEP);
11 if (p[1] == k) day_count++;
12 }
13 if (day_count >= 3 && count[k] >= 10) {
14 print count[k], day_count, k;
15 }
16 }
17}' rss_key.log | sort -nr > subscribers_strict.txt- Count Subscribers
1wc -l subscribers_strict.txtFor example, my VPS counted 339 subscribers.
Vercel Traffic Estimation
Vercel’s free plan doesn’t provide detailed logs, but you can view /index.xml visits in Observability/Edge Requests for the past 12 hours. My data showed 349 visits. Assuming similar user behavior to the VPS, we estimate Vercel subscribers based on the VPS data.
Counting VPS Visits (Last 12 Hours)
1awk '
2$0 ~ /GET \/index.xml/ {
3 n = split($4, a, ":")
4 datehour = a[1]
5 sub("\\[", "", datehour)
6
7 mon = substr(datehour,4,3)
8 if (mon=="Jan") mon="01"
9 else if (mon=="Feb") mon="02"
10 else if (mon=="Mar") mon="03"
11 else if (mon=="Apr") mon="04"
12 else if (mon=="May") mon="05"
13 else if (mon=="Jun") mon="06"
14 else if (mon=="Jul") mon="07"
15 else if (mon=="Aug") mon="08"
16 else if (mon=="Sep") mon="09"
17 else if (mon=="Oct") mon="10"
18 else if (mon=="Nov") mon="11"
19 else if (mon=="Dec") mon="12"
20
21 day = substr(datehour,1,2)
22 year = substr(datehour,8,4)
23 hour = a[2]
24
25 ts = year mon day hour
26 if (ts >= "2026011618") {
27 print
28 }
29}
30' access.log > rss_12h.logThen count visits:
1wc -l rss_12h.logMy 12-hour count was 393 visits. With 339 subscribers, each subscriber accesses ~1.17 times per 12 hours. Thus, Vercel’s 349 visits estimate ~300 subscribers (349 ÷ 1.17 ≈ 300).
Total RSS Subscription Estimate
Combining VPS and Vercel gives a conservative total of 339 + 300 ≈ 639 subscribers. However, neither ROYWANG’s method nor this approach provides precise counts.
Modern platforms like Folo.is (formerly Follow.is) don’t follow traditional RSS conventions. They simulate browser behavior rather than fetching /index.xml or /feed/, meaning their visits blend with regular web traffic and cannot be filtered through RSS-specific patterns or frequency analysis.
Thus, log analysis primarily measures traditional RSS clients. For platforms like Folo.is, it only reveals traffic volume, not actual subscriber count.
#rss #vps #log analysis #subscription analytics