Static Blog Got 0 Google Impressions for 6 Weeks — 5 GSC Fixes
New Hugo blog indexed but zero Search Console impressions. Fix sitemap 404, wrong canonical, accidental noindex, and trailing slash traps.
Site: Hugo + PaperMod blog, 23 posts, deployed on Cloudflare Pages
Timeline: Launched March 1. GSC showed 0 impressions until mid-April. Fixed 5 issues, impressions started climbing week 5.
This isn't an SEO checklist. These are the exact GSC errors I saw and what fixed each one.
TL;DR
- Submit sitemap.xml only after confirming it returns 200.
- Canonical must match production domain, not localhost.
- Check tag pages aren't noindex'd; fix trailing slash consistency.
Issue 1: Sitemap returned 404
GSC → Sitemaps → submitted https://myblog.dev/sitemap.xml
Status after 3 days:
Status: Couldn't fetch
Last read: N/A
Discovered pages: 0
Checked the URL in browser:
404 Not Found
Cause: Hugo generates sitemap at build time, but Cloudflare Pages was serving from public/ and my hugo.toml had wrong baseURL:
# WRONG — was still the default
baseURL = "https://example.org/"
Fix:
# hugo.toml
baseURL = "https://myblog.dev/"
languageCode = "en-us"
title = "My Blog"
[sitemap]
changefreq = "weekly"
priority = 0.5
Rebuild, redeploy. Verify:
$ hugo --minify
$ ls public/sitemap.xml
# File exists
$ curl -I https://myblog.dev/sitemap.xml
HTTP/2 200
content-type: application/xml
Resubmitted in GSC. Status changed to "Success" within 48 hours.
Issue 2: Canonical pointed to localhost
GSC → Pages → one post showed:
URL: https://myblog.dev/posts/hugo-tips/
User-declared canonical: http://localhost:1313/posts/hugo-tips/
Google-selected canonical: (none — excluded)
Every page had localhost as canonical. Google refused to index them.
Cause: I ran hugo server and committed the public/ folder by mistake. The dev build's baseURL got deployed.
Fix:
# .gitignore
public/
resources/
Never commit public/. Let CI build it:
# .github/workflows/deploy.yml
- name: Build
run: hugo --minify --baseURL https://myblog.dev/
Also add explicit canonical in theme override layouts/partials/head.html:
<link rel="canonical" href="{{ .Permalink }}" />
After redeploy, GSC → URL Inspection → "Request Indexing" on top 5 posts. Canonical issue cleared in about a week.
Issue 3: Tag pages had noindex but posts didn't link anywhere
GSC → Pages → Indexed:
Indexed: 4 pages
Not indexed: 47 pages
Drilling into "Not indexed" reasons:
Excluded by 'noindex' tag: 31 pages
Crawled — currently not indexed: 8 pages
The 31 pages were /tags/* pages. PaperMod adds noindex to tag and category pages by default — that's fine.
The real problem was the 8 "crawled but not indexed" posts. They had zero internal links. Google found them via sitemap but ranked them as low-quality orphans.
Fix: Added related posts to every article. PaperMod has built-in support:
{{/* layouts/partials/related-posts.html */}}
{{ $related := .Site.RegularPages.Related . | first 3 }}
{{ with $related }}
<nav class="related-posts" aria-label="Related posts">
<h3>Related</h3>
<ul>
{{ range . }}
<li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
{{ end }}
</ul>
</nav>
{{ end }}
Also manually linked between pillar posts in the Markdown body. Rule I follow now: every post links to at least 2 other posts.
Issue 4: www vs non-www duplicate
Site was accessible at both:
https://myblog.devhttps://www.myblog.dev
Both returned 200. GSC treated them as duplicates:
Duplicate, Google chose different canonical than user
Fix: Cloudflare Page Rule (or DNS redirect):
www.myblog.dev/* → 301 → https://myblog.dev/$1
Pick one canonical domain. Stick with it in baseURL, sitemap, and all internal links.
Issue 5: Trailing slash inconsistency
Hugo generates URLs with trailing slashes: /posts/my-article/
I wrote some internal links without: /posts/my-article
Both resolve, but Google sees them as different URLs:
Page indexing → Alternate page with proper canonical tag
Fix: Always use Hugo's permalink helpers, never hardcode paths:
<!-- Wrong -->
[See this post](/posts/hugo-tips)
<!-- Right -->
[See this post]({{< relref "hugo-tips.md" >}})
Or in templates:
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
Results after fixes
| Week | Impressions | Indexed pages |
|---|---|---|
| 1-4 | 0 | 4 |
| 5 | 23 | 12 |
| 6 | 89 | 18 |
| 8 | 340 | 21 |
Not viral growth — but went from invisible to actually appearing in search. The fixes above were 90% of it. Content quality is the other 10%.
My pre-publish SEO checklist now
□ hugo --minify --baseURL https://actual-domain.com/
□ curl -I https://actual-domain.com/sitemap.xml → 200
□ View source: canonical href matches live URL (not localhost)
□ www redirects to non-www (or vice versa)
□ Internal links between posts (min 2 per article)
□ GSC property verified, sitemap submitted
□ robots.txt allows crawling:
User-agent: *
Allow: /
Sitemap: https://myblog.dev/sitemap.xml
□ Lighthouse SEO score > 90
□ Request indexing on top 3 posts after deploy
Tools I actually use
- Google Search Console — the only tool that shows what Google actually sees
curl -I— faster than opening browser devtools for headers/canonicalsnpx linkinator https://myblog.dev --recurse— catches broken internal links before deploy- Lighthouse (Chrome DevTools) — catches missing meta descriptions, bad tap targets
Don't obsess over SEO plugins or paid tools for a static blog. Fix what GSC tells you is broken. In my case, that was sitemap 404, localhost canonical, and orphan pages.
FAQ
Why does my static blog have 0 impressions in Google Search Console?
Common causes: sitemap 404, wrong canonical domain, noindex on templates, or site too new without indexed pages.
How do I fix Hugo sitemap 404 on Cloudflare Pages?
Ensure hugo generates sitemap.xml, output goes to correct folder, and no _redirects rule blocks /sitemap.xml.
How long until a new static blog gets impressions?
Usually 2–6 weeks after fixing technical SEO. GSC impressions lag behind actual indexing.