← Back to Blog
SEONext.jsThailand

Building SEO-Ready Next.js Sites for Google.co.th

3 May 2026 · by Yunmin Shin

Why Does Technical SEO Matter More for Bangkok Businesses?

Most of the local businesses switching to Bluewich are coming from WordPress sites built years ago on a page-builder plugin stack — Elementor, dozens of SEO and caching plugins layered on top of each other, and a homepage that takes four or five seconds to load on a mid-range Android phone. That stack is competing for the same Google.co.th results as every other clinic, restaurant, or shop in Bangkok, and slow, poorly-structured pages simply lose that competition before content or backlinks even enter the picture.

Next.js, when configured properly, produces some of the best technical SEO output of any web framework — fast rendering, clean HTML, and a typed metadata system that makes it hard to forget the basics. Getting SEO right at the start of a project costs very little. Retrofitting it into a poorly structured codebase, or into a WordPress site with fifteen conflicting plugins, is expensive and often incomplete.

How Do You Handle Metadata for Bilingual Thai/English Sites?

Next.js App Router provides a typed Metadata API. Export a metadata object or a generateMetadata function from any page.tsx file:

export async function generateMetadata({ params }): Promise<Metadata> {
  const clinic = await getClinicService(params.slug);
  return {
    title: `${clinic.nameEn} | ${clinic.nameTh} - Bangkok Aesthetic Clinic`,
    description: clinic.description.slice(0, 155),
    openGraph: { images: [clinic.imageUrl] },
    alternates: {
      canonical: `https://yoursite.com/en/services/${params.slug}`,
      languages: {
        th: `https://yoursite.com/th/services/${params.slug}`,
        en: `https://yoursite.com/en/services/${params.slug}`,
      },
    },
  };
}

Always include: title, description (under 160 characters), openGraph images, and canonical URLs. If the site serves both Thai and English visitors — very common for clinics and restaurants near tourist areas — the alternates.languages field is critical. Without it, Google can index the Thai and English versions of a page as duplicate or competing content instead of understanding them as language variants of the same page. Write the title tag with the service name in whichever language a person is actually likely to search — many Thai users search in English for medical procedure names like "botox" or "filler" even when browsing a Thai-language page.

How Do You Add Structured Data for a Local Bangkok Business?

Structured data (JSON-LD) helps search engines understand your content and enables rich results — star ratings, prices, opening hours — in search listings. For a Bangkok clinic or restaurant, LocalBusiness (or a more specific subtype) matters more than almost any other technical SEO improvement, because it's what connects your website to local and Maps search:

const jsonLd = {
  "@context": "https://schema.org",
  "@type": "MedicalBusiness",
  name: "Clinic Name",
  address: {
    "@type": "PostalAddress",
    streetAddress: "123 Sukhumvit Soi 24",
    addressLocality: "Bangkok",
    addressRegion: "Bangkok",
    postalCode: "10110",
    addressCountry: "TH",
  },
  geo: { "@type": "GeoCoordinates", latitude: 13.7278, longitude: 100.5636 },
  openingHours: "Mo-Su 10:00-20:00",
  telephone: "+66-XX-XXX-XXXX",
};

Use schema types appropriate to your content: MedicalBusiness or Dentist for clinics, Restaurant for a dining site (with menu and servesCuisine fields), Product and Offer with priceCurrency: "THB" for e-commerce. Keep the name, address, and phone number in this schema identical — character for character — to what's listed on the business's Google Business Profile. Inconsistent NAP (name/address/phone) data across your website and Google Business Profile is one of the most common reasons a legitimate Bangkok business fails to rank in the Maps "near me" pack.

How Do You Generate a Sitemap for a Bilingual Site?

Create an app/sitemap.ts file that exports a default function returning your sitemap entries:

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const services = await getAllServices();
  return services.flatMap((service) => [
    { url: `https://yoursite.com/en/services/${service.slug}`, lastModified: service.updatedAt },
    { url: `https://yoursite.com/th/services/${service.slug}`, lastModified: service.updatedAt },
  ]);
}

Next.js serves this at /sitemap.xml automatically. Submit the URL for both language versions in Google Search Console after deployment, and verify both the .com (global) and any Thailand-specific property so you can see how the site performs specifically in google.co.th results, which sometimes differ from the global index.

What About Page Speed on Thai Mobile Networks?

Core Web Vitals are a confirmed Google ranking signal, and the gap between a good and bad score is larger in Thailand than in markets with faster average connections. Pages with poor LCP, INP, or CLS scores rank lower than equivalent pages with good scores — and on a mid-range Android phone over 4G, a heavy, unoptimized page produces exactly those poor scores.

The three highest-impact technical SEO improvements for any Bangkok website: the Next.js Image component (serving correctly sized WebP/AVIF instead of a 4MB photo straight from a phone camera), font optimization with next/font including a proper Thai subset, and avoiding render-blocking third-party scripts (a common WordPress plugin habit that Next.js sites should not repeat).

How Do You Get Found on Google Maps and "Near Me" Search?

For clinics and restaurants specifically, organic ranking is only half the picture — a huge share of local discovery in Bangkok happens through Google Maps "near me" search, which is driven primarily by your Google Business Profile, not your website's blog content. Your website's job is to reinforce that profile: matching NAP data, MedicalBusiness/Restaurant schema, embedded Google Maps on the contact page, and a fast mobile experience for the click-through from Maps to your site. A beautifully optimized website with an outdated or unclaimed Google Business Profile will still lose to a mediocre website with an active, well-reviewed profile.

Ready to Build Something Fast?

Get a free quote. We reply within 24 hours.

Ready to build something fast and scalable?

Get a free project quote. We reply within 24 hours.

Get a Free Quote →