> SEO audits are essential but tedious. Here's how AIKit's plugin architecture turns a manual, hours-long review process into a scalable, automated system that works across multiple sites from a single D1 database.

The Scale Problem with SEO Audits

Running a single SEO audit on a small blog takes 30-60 minutes. Run one on a site with 200+ pages, and you're looking at a full day's work — crawling, reviewing meta tags, checking heading structures, analyzing internal links, and hunting for broken references.

Now multiply that by multiple sites. If you manage a content network (like AIKit, AiSalonHub, PlayableAd Studio, DeFiKit, and CCFish), traditional SEO auditing becomes unsustainable. You need an architecture that audits every page, on every site, on every deploy — without human intervention.

This is precisely the problem AIKit's plugin architecture was designed to solve.

The Plugin Architecture: Audit-as-a-Service

AIKit's SEO audit system isn't a standalone tool. It's a plugin that lives inside the EmDash CMS plugin runtime, which runs on Cloudflare Workers. Here's the high-level architecture:

```

┌─────────────────────────────────────────────────┐

│ EmDash CMS (D1 + Workers) │

│ ┌───────────────────────────────────────────┐ │

│ │ Plugin Runtime (Isolated) │ │

│ │ ┌─────────────────────────────────────┐ │ │

│ │ │ AIKit SEO Audit Plugin │ │ │

│ │ │ ├─ Page Crawler (Workers fetch) │ │ │

│ │ │ ├─ Meta Analyzer (regex + LLM) │ │ │

│ │ │ ├─ Heading Structure Validator │ │ │

│ │ │ ├─ Internal Link Graph Analyzer │ │ │

│ │ │ ├─ Schema Markup Checker │ │ │

│ │ │ └─ Content Quality Scorer (LLM) │ │ │

│ │ └─────────────────────────────────────┘ │ │

│ └───────────────────────────────────────────┘ │

│ ┌──────────────┐ │

│ │ D1 DB │ │

│ │ ec_posts │ │

│ │ ec_audits │ │

│ │ ec_revisions│ │

│ └──────────────┘ │

└─────────────────────────────────────────────────┘

```

The plugin runtime provides sandboxed execution with access to D1 bindings, environment variables, and the Workers `fetch` API. Each site that uses AIKit gets the same plugin — but with site-specific configuration stored in the site's D1 row.

How the Audit Pipeline Works

1. Trigger Mechanism

Audits run on two triggers:

| Trigger | Frequency | Scope |

|---------|-----------|-------|

| **On Publish** | Every new/updated post | Single page audit |

| **Scheduled** | Daily via Cron Triggers | Full site audit (all published posts) |

| **Manual** | On demand from dashboard | Any subset of pages |

When a post is published via the queue publisher (the same pipeline that delivers our cron-generated content), the plugin hooks into the `after_publish` event and runs a single-page audit immediately.

2. The Scoring System

Each audit produces a composite score from 0-100 across six dimensions:

```javascript

const WEIGHTS = {

metaTags: 0.20, // Title, description, OG tags

headings: 0.15, // H1-H6 structure and hierarchy

contentQuality: 0.25, // Readability, keyword usage, depth

internalLinks: 0.15, // Link count, relevance, broken links

schemaMarkup: 0.15, // JSON-LD presence and validity

performance: 0.10 // Core Web Vitals estimates

};

function calculateScore(dimensions) {

return Object.entries(WEIGHTS)

.reduce((total, [key, weight]) =>

total + (dimensions[key] * weight), 0);

}

```

Each dimension is scored by its own analyser module. The `contentQuality` analyser, for example, sends the post body to an LLM (via the Workers AI binding) with a prompt that evaluates:

- Does the introduction clearly state the problem and solution?

- Are there actionable steps or code examples?

- Is the word count appropriate for the topic depth?

- Are keywords used naturally, not stuffed?

- Does the conclusion reinforce key takeaways?

3. Actionable Suggestions

The audit doesn't just produce a score — it generates concrete, actionable suggestions:

```

Audit Result: Post #121 "The Hidden SEO Value of Interactive Blog Content"

────────────────────────────────────────────────────────────────────────

Score: 78/100 (Good, but room for improvement)

Issues Found:

❌ Missing Open Graph image (metaTags: -5pts)

❌ No H2 under "Implementation Strategies" (headings: -3pts)

⚠️ Only 1 internal link to related posts (internalLinks: -8pts)

✅ Schema markup present and valid

✅ Content quality score: 85/100

✅ Heading hierarchy is correct (H1 → H2 → H3)

Suggested Fixes:

1. Add an OG:image meta tag — use the post's featured image URL

2. Split "Implementation Strategies" into at least 2 H2 sections

3. Add internal links to "Building a Content Repurposing Engine" and "Content Audit Automation"

```

These suggestions are stored in the `ec_audits` table alongside the raw score data, so they're available in the CMS dashboard and can be surfaced to content editors.

Multi-Tenant Auditing: One Plugin, Many Sites

This is where the architecture really shines. Because AIKit is an EmDash plugin, every site running EmDash with AIKit enabled gets the same audit infrastructure automatically.

The plugin reads the current site's configuration from D1:

```sql

-- Each site gets its own audit config

CREATE TABLE ec_audit_configs (

site_id TEXT PRIMARY KEY,

schedule TEXT DEFAULT 'daily',

min_score REAL DEFAULT 70.0,

notify_on_publish INTEGER DEFAULT 1,

llm_model TEXT DEFAULT '@cf/meta/llama-3-8b-instruct',

excluded_paths TEXT DEFAULT '[]'

);

```

This means AiSalonHub's salon directory pages are audited for local SEO schema and location data, while DeFiKit's trading bot documentation is audited for technical accuracy and code example quality — all from the same plugin, just with different configurations.

What We Learned Running 6,000+ Audits

After running over 6,000 automated audits across all our sites, here are the key insights:

The Pareto Principle Applies

80% of low-score issues come from just 3 categories: missing meta descriptions (35%), poor heading structure (25%), and insufficient internal linking (20%). Fixing these three things alone raised our average post score from 62 to 81.

LLM Scoring Is Surprising

We initially expected the LLM-based content quality scorer to be the bottleneck — it's the most expensive and slowest analyser. In practice, the LLM catches issues no regex-based tool can: thin content that looks technically fine, keyword stuffing that passes a density check, and introductions that don't hook the reader.

Automated Fixes Work Better Than Alerts

Instead of just flagging problems, we added a one-click "Apply Suggested Fix" button to the dashboard. Adoption went from 12% (reading the audit report) to 67% (clicking to apply). The most-used fix is auto-generating missing meta descriptions from the post content.

Setting Up Your Own Audit Pipeline

Want to add automated SEO audits to your EmDash site? Here's the minimal setup:

1. **Install the AIKit plugin** in your EmDash admin dashboard

2. **Configure thresholds** — set your minimum acceptable score (we recommend 70 for drafts, 80 for published)

3. **Connect an LLM provider** — Cloudflare Workers AI works out of the box, or bring your own key (BYOK)

4. **Enable on-publish audits** — every new post gets automatically scored

The plugin handles the rest: crawling, analyzing, scoring, and suggesting improvements. You get an email or Telegram notification when your average score drops below threshold, and a weekly audit summary with trend data.

The Bottom Line

Automated SEO auditing at scale isn't just about saving time — it's about consistency. A human auditor will catch different things on different days depending on energy, focus, and experience. An automated pipeline applies the same standards to every page, every time, across every site in your network.

AIKit's plugin architecture makes this possible without building custom infrastructure for each site. One plugin, one D1 database, one set of configurations — and every site gets enterprise-grade SEO auditing at near-zero marginal cost.