Blog

9 SEO fundamentals every small business site needs

Most “SEO” advice is either vague (“write good content”) or drowns you in 200-point checklists. This is the opposite: the concrete, technical fundamentals that a small business website actually needs — explained through the changes I recently made to a real bilingual (Polish/English) site built with Astro.

None of these are growth hacks. They’re the plumbing. Get them right and search engines can find, understand, and correctly present your pages. Skip them and even great content underperforms.

1. A sitemap

A sitemap (sitemap.xml) is a machine-readable list of every page you want indexed. Without one, Google discovers pages only by crawling links — slower and less reliable, especially for newer sites.

At its simplest, a sitemap is just a list of URLs:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/</loc>
  </url>
  <url>
    <loc>https://example.com/blog/</loc>
  </url>
</urlset>

For a bilingual site there’s a bonus: inside each entry you can declare the page’s language alternates, so Google knows the Polish and English versions are the same page in two languages rather than two unrelated URLs.

Tip: If your site is small (a handful of stable pages), a hand-written static sitemap is perfectly fine — no plugin or build step required.

2. A robots.txt

A tiny file every crawler reads first. It states what may be crawled and points to your sitemap’s location. It’s a standard signal that confirms crawling is allowed and advertises where the sitemap lives.

A minimal one allows every crawler and points to the sitemap:

User-agent: *
Allow: /

Sitemap: https://example.com/sitemap.xml

3. hreflang — the single biggest fix for a multilingual site

If you serve the same content in two languages, you must tell Google which is which. Each page declares its counterparts:

<link rel="alternate" hreflang="pl" href="https://example.com/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />

These <link> tags go in the document <head>, alongside your <title> and canonical — never in the <body>, where they’re ignored. (You can also declare hreflang via an HTTP Link: response header or inside the XML sitemap; one method is enough.)

In context, the page’s <head> looks like this:

<!doctype html>
<html lang="en">
  <head>
    <title>…</title>
    <link rel="canonical" href="https://example.com/en/" />
    <link rel="alternate" hreflang="pl" href="https://example.com/" />
    <link rel="alternate" hreflang="en" href="https://example.com/en/" />
    <link rel="alternate" hreflang="x-default" href="https://example.com/" />
  </head>
  <body>…</body>
</html>

One rule that trips people up: every page in a language set must list all the alternates including itself, and the references must be reciprocal — if the Polish page points to the English one, the English page must point back, or Google ignores them.

Both pages declare the same set of links — each points to itself and to the other:

<!-- https://example.com/  (Polish version) -->
<html lang="pl">
  <head>
    <link rel="alternate" hreflang="pl" href="https://example.com/" />
    <link rel="alternate" hreflang="en" href="https://example.com/en/" />
  </head>
</html>

<!-- https://example.com/en/  (English version) -->
<html lang="en">
  <head>
    <link rel="alternate" hreflang="pl" href="https://example.com/" />
    <link rel="alternate" hreflang="en" href="https://example.com/en/" />
  </head>
</html>

Without hreflang, two bad things happen: Google may treat your two language versions as duplicate content competing against each other, and it may show the wrong language to a searcher. With it, a Polish searcher gets the Polish page and an English searcher the English one.

4. Canonical tags

A canonical tag tells Google the one official URL for a page:

<link rel="canonical" href="https://example.com/en/" />

The same page is often reachable at several URLs — www vs bare domain, with or without a trailing slash, with tracking parameters. A canonical consolidates all of that onto a single address so your ranking signals don’t get split. It pairs well with a www → bare-domain 301 redirect at the server level.

5. Unique titles and descriptions per page

A common bug: secondary pages (like a privacy policy) inherit the homepage’s <title> and meta description, so several pages claim the same title. Duplicate titles confuse ranking and look bad in search results.

Every page should have its own title and description that describe that page. This is a core best practice that’s easy to get wrong when pages share a layout template.

6. Open Graph and Twitter cards

These tags control your social preview — what appears when someone shares your link on LinkedIn, Slack, Facebook, or X:

<meta property="og:title" content="…" />
<meta property="og:description" content="…" />
<meta property="og:image" content="…" />
<meta property="og:url" content="…" />

Without them, a shared link shows as a bare URL with no image. With them, it becomes a proper card with a title, description, and image — far more clickable.

Tip: The ideal social image is 1200×630. If you only have a square logo, use the summary Twitter card type (a small thumbnail) rather than summary_large_image, which would awkwardly letterbox a square.

7. Structured data (JSON-LD)

Structured data is a small JSON block that describes your business in a vocabulary search engines understand (schema.org):

<script type="application/ld+json">
{ "@type": "ProfessionalService", "name": "…", "founder": {…}, "areaServed": "PL" }
</script>

Instead of making Google infer who you are from prose, you tell it explicitly: business name, founder, contact, languages served. This can earn richer search results and increasingly feeds AI assistants that answer questions about businesses.

8. Make your visible content match your positioning

Technical tags aside, your visible H1 and intro paragraph are strong ranking signals — and they should reflect what you actually offer. If your headline says one thing but your business has since pivoted, fix the headline. On a multilingual site, keep both languages saying the same thing.

This isn’t a meta tag, but it’s SEO: search engines rank pages on what’s actually on them.

9. Speed and privacy: self-host your fonts

Page speed (Core Web Vitals) is a genuine ranking factor. A common culprit is render-blocking external fonts loaded from a third party. Self-hosting fonts removes that blocking request and removes a third-party data transfer — a privacy win that also simplifies your privacy policy.

The takeaway

None of these are clever. They’re fundamentals: a sitemap and robots.txt so you can be crawled, hreflang and canonicals so the right version of each page is understood, unique titles so pages don’t compete with themselves, Open Graph and structured data so you’re presented well, and content that honestly matches what you do.

Do these once, correctly, and you’ve cleared a bar that a surprising number of small business sites never do.

← Back to blog

Comments