Skip to main content

Command Palette

Search for a command to run...

AI-Driven SEO: Building a Next.js Site That Writes & Optimizes Its Own Pages

Updated
6 min read
AI-Driven SEO: Building a Next.js Site That Writes & Optimizes Its Own Pages
U

I'm a MERN Stack developer and technical writer that loves to share his thoughts in words on latest trends and technologies.

For queries and opportunities, I'm available at r.utkarsh.0010@gmail.com

Introduction

AI is no longer just a chatbot sitting on your landing page. The real opportunity? A website that generates, optimizes, updates, and improves its own SEO pages automatically.

In this deep-dive tutorial, we’ll build a production-grade AI-driven SEO system using Next.js that:

  • Auto-generates long-form content

  • Optimizes titles, meta tags & schema

  • Performs keyword clustering

  • Rewrites underperforming pages

  • Auto-internal-links content

  • Supports ISR & Edge caching

  • Works with App Router

  • Is monetizable & scalable

Architecture Overview

User Search → Keyword Discovery → AI Content Generation
              ↓
         SEO Optimization
              ↓
      Save to Database (MDX)
              ↓
  Next.js ISR → Cached Page
              ↓
Analytics Feedback → AI Rewrites

Tech Stack

  • Next.js 16 (App Router)

  • OpenAI / Anthropic / Gemini API

  • Prisma + PostgreSQL

  • MDX

  • Vercel Edge Functions

  • Google Search Console API

  • OpenAI embeddings for clustering

Implementation

Step 1 — Project Setup

npx create-next-app@latest ai-seo-engine
cd ai-seo-engine
npm install openai prisma @prisma/client gray-matter remark remark-html

Initialize Prisma:

npx prisma init

Step 2 — Database Schema

// prisma/schema.prisma

model Page {
  id           String   @id @default(uuid())
  slug         String   @unique
  title        String
  content      String
  metaTitle    String
  metaDesc     String
  keywords     String[]
  score        Float?
  impressions  Int?
  clicks       Int?
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt
}

Run:

npx prisma migrate dev

Step 3 — AI Content Generator

Create a new file at /lib/ai.ts

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY!,
});

export async function generateSEOPage(keyword: string) {
  const prompt = `
  Write a 2000 word SEO optimized article targeting:
  "${keyword}"

  Requirements:
  - Proper H1, H2, H3 structure
  - FAQ section
  - Include internal linking suggestions
  - Add JSON-LD schema
  - Use NLP semantic variations
  `;

  const completion = await client.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [{ role: "user", content: prompt }],
    temperature: 0.7,
  });

  return completion.choices[0].message.content;
}

Step 4 — API Route to Generate & Save Pages

Create a new file at - app/api/generate/route.ts

import { generateSEOPage } from "@/lib/ai";
import { prisma } from "@/lib/prisma";
import slugify from "slugify";

export async function POST(req: Request) {
  const { keyword } = await req.json();

  const content = await generateSEOPage(keyword);
  const slug = slugify(keyword, { lower: true });

  const page = await prisma.page.create({
    data: {
      slug,
      title: keyword,
      content,
      metaTitle: `${keyword} - Complete Guide`,
      metaDesc: `Learn everything about ${keyword}.`,
      keywords: [keyword],
    },
  });

  return Response.json(page);
}

Step 5 — Dynamic SEO Pages (ISR Enabled)

Create a new file at - /app/[slug]/page.tsx

import { prisma } from "@/lib/prisma";
import { notFound } from "next/navigation";

export const revalidate = 60 * 60; // 1 hour ISR

export async function generateMetadata({ params }) {
  const page = await prisma.page.findUnique({
    where: { slug: params.slug },
  });

  if (!page) return {};

  return {
    title: page.metaTitle,
    description: page.metaDesc,
  };
}

export default async function Page({ params }) {
  const page = await prisma.page.findUnique({
    where: { slug: params.slug },
  });

  if (!page) return notFound();

  return (
    <article className="prose mx-auto py-12">
      <h1>{page.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: page.content }} />
    </article>
  );
}

Step 6 — Automatic Internal Linking Engine

We improve topical authority by auto-linking pages.

export function autoInternalLinks(content: string, pages: string[]) {
  pages.forEach((keyword) => {
    const regex = new RegExp(`\\b${keyword}\\b`, "gi");
    content = content.replace(
      regex,
      `<a href="/\({keyword.toLowerCase().replace(/\s/g, "-")}">\){keyword}</a>`
    );
  });

  return content;
}

Use embeddings to cluster related topics:

export async function getEmbedding(text: string) {
  const res = await client.embeddings.create({
    model: "text-embedding-3-small",
    input: text,
  });

  return res.data[0].embedding;
}

Then compute cosine similarity to auto-suggest related links.

Step 7 — AI Meta Optimization

Instead of hardcoding metadata:

export async function generateMeta(content: string) {
  const prompt = `
  Generate SEO meta title (60 chars) and meta description (155 chars)
  for this content:

  ${content.slice(0, 2000)}
  `;

  const res = await client.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [{ role: "user", content: prompt }],
  });

  return res.choices[0].message.content;
}

Step 8 — Schema Markup Auto Injection

export function generateFAQSchema(faqs: { q: string; a: string }[]) {
  return {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    mainEntity: faqs.map((faq) => ({
      "@type": "Question",
      name: faq.q,
      acceptedAnswer: {
        "@type": "Answer",
        text: faq.a,
      },
    })),
  };
}

Inject:

<script
  type="application/ld+json"
  dangerouslySetInnerHTML={{
    __html: JSON.stringify(schema),
  }}
/>

Step 9 — Performance-Based AI Rewriting

Connect to Search Console API:

async function updatePerformance(slug: string) {
  // fetch impressions + clicks
  // if CTR < threshold → rewrite intro & title
}

Rewrite with AI:

export async function improveCTR(title: string) {
  const prompt = `
  Rewrite this SEO title to maximize CTR:
  "${title}"
  `;

  const res = await client.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [{ role: "user", content: prompt }],
  });

  return res.choices[0].message.content;
}

Step 10 — Scheduled Regeneration (Self-Healing SEO)

Use Vercel cron:

export async function GET() {
  const lowPerforming = await prisma.page.findMany({
    where: {
      impressions: { gt: 100 },
      clicks: { lt: 10 },
    },
  });

  for (const page of lowPerforming) {
    const improvedTitle = await improveCTR(page.metaTitle);
    await prisma.page.update({
      where: { id: page.id },
      data: { metaTitle: improvedTitle },
    });
  }

  return Response.json({ success: true });
}

Advanced Scaling Ideas

Keyword Expansion Engine

  • Scrape Google suggestions

  • Use embeddings for clustering

  • Auto-generate content clusters

Programmatic SEO

Generate thousands of pages like:

/best-{tool}-for-{industry}
/how-to-use-{framework}-with-{tool}

Multi-Language SEO

Use AI for:

  • Translation

  • Localized keyword research

  • hreflang auto-generation

Deployment Strategy

  • Use Edge runtime for generation

  • Use ISR for caching

  • Use CDN for global SEO

  • Store content in DB + fallback static export

  • Add Redis caching for embeddings

Monetization Models

  • Affiliate SEO

  • SaaS feature (AI content engine)

  • Content-as-a-Service API

  • Automated niche sites

  • AI-powered landing page builder

Risks & How To Avoid Them

Risk Mitigation
Thin AI content Add human review loop
Google spam detection Add originality scoring
Keyword cannibalization Embedding clustering
Duplicate content AI uniqueness scoring

Final Result

You now have a fully automatic system with:

  • Self-writing pages

  • Self-optimizing metadata

  • Smart internal linking

  • Performance feedback loop

  • ISR + Edge powered SEO engine

Why This Is a Massive Opportunity

Google rewards:

  • Topical authority

  • Fresh content

  • Internal linking depth

  • Structured data

  • Behavioral improvements

An AI-driven SEO engine can do this at scale faster than any human team. If you're building something ambitious (like your own dev-focused AI SaaS or high-traffic blog), this architecture can literally become your growth engine.