My 2.9K Visitors Were Mostly Robots 🪤
Cloudflare's domain list said consumablecalculators.com was getting about 2,900 unique visitors a month. The real number was closer to fifty, and finding that out turned into a fairly useful couple evenings of work.
The site is a small project of mine. You tell a calculator what you own ("HVAC filter, two dogs, fan set to on") and it tells you how often to replace it. There are sixteen of them, covering things like furnace filters, razor blades, toothbrush heads and smoke alarm batteries. It's a static Astro site on Cloudflare Pages, each calculator is a JSON config validated with Zod, and it started as an academic exercise to learn Astro and get some agentic engineering practice. The last commit was in March, and after that it sat untouched for about six months.
When I came back to it at the end of September, I filtered Cloudflare's traffic view down to the host and looked at the actual requests. Over 30 days there were 93k requests and 62k "visits." The biggest source was curl, at 22.4k requests, followed by an empty user agent at 8.5k and a couple of hosting IPs making five or six thousand each. France and the Netherlands both outranked the US. The paths being requested were /wp-login.php, /wordpress/ and /.env, which is a lot of interest in WordPress for a static site (I'm choosing to be flattered).
Cloudflare Web Analytics, which leaves bots out, showed 200 visits for the same period. Most of those came from one day of headless browsers in China, and with that removed there were somewhere around 40 to 70 actual people a month, mostly in the US. Google referrals were roughly zero, which made me want to know why.
Search Console had the answer, or at least the first half of it. Of the 36 URLs Google knew about, 8 were indexed and 28 weren't. Seventeen of the 28 were listed as "crawled, currently not indexed," and that status is worth reading carefully, because it's different from "discovered." Google had fetched those pages, read them, and decided not to keep them.
Eight of the 17 turned out to be old URL variants, which pointed at a real bug. Cloudflare Pages redirects /calculators/x to /calculators/x/ with a 308, and my sitemap listed the trailing-slash URLs, but my canonical tags pointed at the version without the slash. Every page was telling Google that its preferred URL was one that redirected somewhere else. Separately, any unknown path returned the homepage with a 200 instead of a 404. The crawl stats showed both: 18% of Googlebot's requests were redirects and 0% were 404s, which is not what a real site looks like. Both fixes took an afternoon.
If you run anything similar, it's worth ten minutes with curl before you ever open Search Console. Run curl -I on a page URL without the trailing slash and look at the status code and the Location header. Compare the canonical tag in the page's HTML to the URL in your sitemap, since those two should be character-for-character the same. Then request a path that can't possibly exist and make sure you get a 404 back. I hadn't done any of this, and between them those checks would have found both problems.
The other nine were real pages, and those were harder. Each calculator had the same layout, with a what-it-is section, a when-to-replace section, a how-to section and a set of FAQs, and the text inside was close to interchangeable. The filter cluster was the worst, with fridge, pitcher, shower, pet fountain and humidifier wick pages all saying nearly the same sentences. Google declining to index those was a reasonable call. Writing another page is close to free now, and I'd been treating that as if it meant the page was worth having.
So I went through all sixteen and wrote a guide for each that cites whoever actually decides the answer, with the sources linked. The smoke alarm page leans on USFA and NFPA, and the CPAP page on ResMed. The interval each calculator returns is capped at what its sources support. A few of my FAQs contradicted those sources, so I fixed them. CPAP gained a ResMed option, since ResMed says six months where generic advice says thirty nights. The smoke alarm result now reads "1 year, at least," because the fire agencies say replaceable batteries go in at least once a year, and no combination of inputs should talk someone out of that.
I also deleted the AI-generated share images, which looked like AI-generated share images. They're rendered from a template now, with the real interval in a ring, so at least they're correct.
The money side is short. The calculators link to Amazon, and those links are affiliate links, so I earn a small commission if you buy through one. Year to date that's 107 clicks, 3 orders and $0.90. About 2.8% of clicks turn into orders, which seems fine, and the real constraint is that very few people arrive in the first place. Each calculator has its own tracking ID now, so the Associates report shows which pages earn clicks without any analytics code. Generic Amazon search links for ten to forty dollar consumables have a low ceiling, so this stays a free, low-maintenance site with a monthly checkup. Anything meant to earn real money would be a separate project built on things I've actually used.
The fixes went live on September 30. Google has started re-crawling, and five of the previously unindexed pages show as indexed in URL Inspection now. I've requested indexing for the rest, and the About page is the one it still won't take. It's far too early to say whether traffic moves, so I'll write a follow-up whichever way it goes.
If you're curious, the site is consumablecalculators.com.
Anyway.
Comments