DEV Community

Aritomo Fukuda
Aritomo Fukuda

Posted on • Originally published at Medium

I Built Backlinks for 3 Weeks. Then I Connected Ahrefs and Found Three Bugs.

One bug hid two more. By the end I'd shipped 9 PRs in 4h36m and resolved 285 audit issues.

I'm a 25-year engineer who launched his first SaaS on Product Hunt three weeks ago. Since then, I've been doing what every indie founder is told to do: build backlinks.

I submitted to directories. I sent HARO pitches. I wrote on Medium. I built badges into my footer for every clean dofollow source I could find.

Slowly, the numbers moved.

  • 60 referring domains.
  • 12 dofollow backlinks.
  • DR 21 on Ahrefs.
  • For a one-month-old site, I was quietly proud.

Then I connected Ahrefs Webmaster Tools to my site for the first time.

Then I clicked "Site Audit."

Then everything fell apart.

Bug #1: My Sitemap Was Telling Google to Ignore Itself
The first error caught my eye immediately:

Non-canonical page in sitemap: 40 pages.

I stared at it.

Forty pages. My entire sitemap. All flagged.

I opened the CSV export. Every page in my sitemap — except the language homes — had a canonical tag pointing to /en or /ja. Not to itself. To the language root.

Translation: my site was telling Google, "These pages are duplicates of the home page. Don't index them."

The pages affected weren't the ones earning my backlinks — most of those went to the homepage, which had a correct self-referencing canonical. But the pages I'd been adding — every weekly research report, every new sample page, every individual report URL I was so proud of generating — those were being told to disappear.

Three weeks of new content. Invisible.

The Fix That Created a New Bug
I wrote a helper that returns the correct canonical URL based on the actual route. Overrode alternates in every public page's generateMetadata. One PR. 25 new tests. Merged the same day.

I curl'd seven URLs in production:

  • /en → canonical /en ✓
  • /en/pricing → canonical /en/pricing ✓
  • /en/sample → canonical /en/sample ✓ For the first time, every page on my site was telling Google: "Index me as my own URL."

I re-ran Site Audit, expecting to see Errors: 0.

Errors: 56. Up from 42.

I had made it worse.

Bug #2: The 42 → 120 Page Explosion
The new errors were strange.

"More than one page for same language in hreflang"
"Some pages are not returning 200 status code"

56 URLs flagged with both. Crawled URLs: 120. (It had been 42 before the fix.)

I was very confused.

I opened the next-intl source. I read the type definitions. I grep'd for hreflang.

There it was, buried in node_modules/next-intl/dist/types/routing/config.d.ts:

alternateLinks?: boolean // default: true
Enter fullscreen mode Exit fullscreen mode

next-intl's middleware was, by default, adding hreflang annotations to the HTTP Link header of every response. Meanwhile, my Phase 1 fix had added hreflang annotations to the HTML head.

Both worked individually. Together, they duplicated. Google saw "two versions of the same page" and started counting URLs that didn't exist.

Hence 42 → 120.

The fix:

// src/i18n/routing.ts
export const routing = defineRouting({
  // ...
  alternateLinks: false, // <-- one line
})

Enter fullscreen mode Exit fullscreen mode

One line. PR #43. Merged 45 minutes after Phase 1.

Re-run Site Audit.

Errors: 0. Health Score: 100%.

I sat there for a moment.

What I Did Next Was Stupid (in a Good Way)
I had just spent 90 minutes turning 42 errors into 0. I should have closed the laptop and walked away.

Instead, I scrolled down to the warnings section.

Title too short: 6 pages.
Meta description too short: 16 pages.
Open Graph tags incomplete: 56 pages.
Pages with only one dofollow inlink: 22 pages.
Title too long: 28 pages.
I cracked my knuckles.

What followed was a 4-hour, 36-minute coding session that produced 9 PRs and resolved approximately 285 audit issues.

  • Phase 1: canonical URL value (44 errors)
  • Phase 2: HTML lang mismatch (1 error)
  • Phase 2.5: hreflang Link header duplication (112 errors)
  • Phase 3: title and meta description (22 warnings)
  • Phase 4: Open Graph and Twitter Card tags (56 warnings)
  • Phase 5: Related Reports section (22 warnings)
  • Phase 6: title rewrite — stopped using AI to generate titles, used the user's theme name verbatim (28 warnings)
  • Phase 7: legal-notice page metadata
  • Phase 9: migrated CI from GitHub Actions to a local pre-push hook (saved 95% of monthly CI minutes)
    By the end:

  • Health Score: 65% → 100%

  • Errors: 42 → 0

  • Tests: 949 → 1,026 (+77)

  • I had not slept yet.

What I Actually Learned
Three things, and the third one matters most.

  1. One bug hides two more.

I thought I was hunting for a single canonical issue. Fixing it surfaced a hreflang issue. Fixing that revealed an entire warnings section I hadn't read. The audit was a fractal: every level of zoom revealed more structure.

If I'd stopped at "Errors: 42," I would have shipped a worse version of my site. The discipline isn't fixing bugs — it's keeping the audit running until the report is empty.

  1. SEO problems hide in the silence.

None of these bugs threw errors. Nothing broke the build. Lighthouse gave me a green score. The pages rendered correctly to humans. The only signal that anything was wrong was a tool that crawls your site like Google does.

The default state of an indie founder's site is "things look fine and quietly aren't." You don't find this stuff by inspecting the page. You find it by running an audit and reading every line.

  1. Verify the foundation before you optimize for growth.

This is the one that hurt.

I had spent three weeks earning backlinks, writing Medium posts, submitting to directories, and refining HARO pitches. Most of those backlinks went to the homepage, which was structurally fine — so they weren't wasted. But every new page I'd been generating since launch — weekly research reports, sample content, the actual proof of my product — was invisible to Google.

I was building a growth funnel on top of a foundation I had never inspected. Three weeks of "content marketing" produced exactly zero indexable content beyond the home page.

The lesson isn't "don't build backlinks." The lesson is: before you spend a single hour earning backlinks, run a Site Audit on your own site. Make sure the pages receiving those backlinks actually exist, in Google's eyes.

Most indie founders skip this. I did. The cost is silent and compounding.

What I'd Tell My One-Month-Ago Self
Plug Ahrefs (or any crawler-based audit tool) into your site on launch day. Free tier is enough for sites under 100 pages.

Run a Site Audit. Don't read it once and move on. Re-run it after every fix. Treat "Errors: 0, Warnings: 0" as a non-negotiable launch checklist.

Then build.

Where I Am Now
DR 21. Health Score 100%. Zero errors. Backlinks counted properly. New pages now actually indexable.

Still zero paying users.

But for the first time since launch, the foundation is real, and the next three weeks of work won't be invisible.

Top comments (0)