Forge
Technical SEO

Technical SEO for developers: what to check in your code

On modern sites, most SEO problems are code problems: pages rendered only in the browser, one title for every page, no sitemap, wrong canonical links and a slow first paint. Each one is quick to find in the code, and usually quick to fix once found.

Last reviewed by the Forge team

What goes wrong

What it costs when this is missed

Critical

Pages left out of the index

A stray noindex, a robots.txt that blocks everything, or a canonical pointing elsewhere silently removes pages from Google.

High

Content crawlers can't see

If content needs JavaScript to appear, indexing is slower, and some crawlers and AI engines never see it at all.

High

Every page looks the same

With one title and description on every page, search engines can't tell your pages apart, so they show whatever they guess.

Medium

Slow first paint

Core Web Vitals feed into ranking. A heavy hero image or a render-blocking script costs you rankings and visitors.

Common problems

What to look for in your code

Each one: why it hurts, and how to spot it in your own project.

01Content rendered only in the browser

Google renders JavaScript, but in a second, delayed pass. Other search engines, link previews and many AI crawlers often don't run it at all.

How to spot it: Run curl -s https://yoursite.com/page | grep '<h1'. If your heading isn't in the result, that page is rendered in the browser.

Risky
"use client";
export default function Post() {
  const [post, setPost] = useState(null);
  useEffect(() => { fetch("/api/post").then((r) => r.json()).then(setPost); }, []);
  return <h1>{post?.title}</h1>;
}
Better
export default async function Post() {
  const post = await getPost();
  return <h1>{post.title}</h1>;
}

02Missing or duplicate titles and descriptions

Each page you want found needs its own <title> (about 30-60 characters) and meta description (about 70-160) in the HTML the server sends.

How to spot it: Check the layout and every page's metadata. In Next.js, look for pages that export neither metadata nor generateMetadata.

Risky
// app/layout.tsx, and nowhere else
export const metadata = { title: "My App" };
Better
export async function generateMetadata({ params }) {
  const p = await getProduct((await params).slug);
  return {
    title: p.name,
    description: p.summary,
    alternates: { canonical: "/products/" + p.slug },
  };
}

03robots.txt and sitemap.xml

robots.txt tells crawlers what they may fetch and where your sitemap is. The sitemap lists the pages you want indexed. A staging robots.txt that ships to production can block your whole site.

How to spot it: Open /robots.txt and /sitemap.xml on the live site. Check the sitemap lists your real routes and nothing private.

Risky
User-agent: *
Disallow: /
Better
User-agent: *
Allow: /
Disallow: /account
Sitemap: https://example.com/sitemap.xml

04Stray noindex and wrong canonicals

A canonical URL tells search engines which address is the real one. If every page's canonical points at the home page, or a noindex left over from staging is still set, pages disappear from search without any error.

How to spot it: Search the code for noindex and canonical. On each important page, check the canonical is that page's own URL.

05Social sharing tags

Open Graph and Twitter tags decide the title, text and image people see when your link is shared in Slack, LinkedIn or X. Without them you get a bare URL.

How to spot it: Check every important page has og:title, og:description, og:image and og:url, with absolute URLs and an image of about 1200×630.

06Headings and page text

One h1 that says what the page is about, a logical h2/h3 outline and the html lang attribute help search engines and screen readers understand the page.

How to spot it: Each page has exactly one h1, headings don't skip levels, and <html lang> is set.

07Links crawlers can't follow

Crawlers follow <a href> links. Navigation built from click handlers, and missing pages that return 200 instead of 404 ('soft 404s'), waste crawl time and hide pages.

How to spot it: Check navigation uses real links, and that an unknown URL returns a 404 status, not a page that says 'not found'.

Risky
<div onClick={() => router.push("/pricing")}>Pricing</div>
Better
<Link href="/pricing">Pricing</Link>

08Images without alt text or sizes

Alt text is how search engines and screen readers know what an image shows. Images without a width and height make the page jump as they load (layout shift).

How to spot it: Look for <img> tags without alt, width and height, and for multi-megabyte images in public/.

Risky
<img src="/hero.png" />
Better
<Image src={hero} alt="Findings grouped by priority" priority />

09Structured data that doesn't fit

JSON-LD helps search engines understand what a page is: an organisation, a product, an article, a breadcrumb trail. Google no longer shows FAQ or HowTo rich results, so put the effort into the types that still count.

How to spot it: Search the code for application/ld+json, and validate one page with Google's Rich Results Test.

Quick self-check

How does your project do?

Tick each one that's true today. Anything left unticked is worth a closer look.

Tick what's true for your project. 10 checks.

How Forge checks this

A second opinion on your code, from the SEO scan.

  • Reads your routes, layouts, metadata, robots and sitemap code.
  • Fetches your live home page, /robots.txt, /sitemap.xml and important pages, and compares them with the code.
  • Gives a 0-100 score and a page-by-page table, so you see which pages are weakest.
  • Each finding names the file to change, with the line it found.

Questions

Does Google run JavaScript?

Yes. Googlebot renders pages with a recent Chrome, but rendering is queued after crawling, which delays indexing. Other search engines, link previews and many AI crawlers don't run JavaScript reliably. Server rendering, static generation or pre-rendering removes the risk.

Is a single-page app bad for SEO?

Not for an app behind a login. For the pages you want found (landing, pricing, docs, blog), serve the content in the HTML: static generation, server rendering or pre-rendering.

Do I still need FAQ or HowTo structured data?

Google no longer shows HowTo rich results (since 2023) or FAQ rich results (since 2026). The markup does no harm, but Organization, Product or SoftwareApplication, Article and BreadcrumbList are better uses of your time.

How long until my fixes show in Google?

Recrawling takes days to weeks. Submit your sitemap in Google Search Console and use URL Inspection on your most important pages to speed it up.

Related guides

All guides

Sources