Skip to content
Stackbirds  SEO · GEO · AEO Verification Audit
← SEO by Company 📝 Team handoff ↓ Download PDF
azizsaif.comAI MarketingSEO by CompanyStackbirds
AI Marketing · SEO Verification Audit

Stackbirds SEO Verification Audit

The full verification audit of Stackbirds (stackbirds.xyz) across three layers of discovery — classic search (SEO), answer engines (AEO) and generative engines (GEO) like ChatGPT, Perplexity and Gemini. It checks what's actually shipped, scores current visibility and lists the prioritised fixes.

Subject: stackbirds.xyz Type: SEO verification audit Scope: SEO · AEO · GEO Owner: Aziz Saif
SEO

Search Engines

Crawl, meta, headings, schema, Core Web Vitals and indexation — verified against what's live on the site.

AEO

Answer Engines

Featured snippets, People-Also-Ask and voice answers — whether Stackbirds is the quoted answer, not just a link.

GEO

Generative Engines

ChatGPT, Perplexity & Gemini — whether Stackbirds is named and cited when someone asks an AI about agentic browsers.

Read the full report

↓ Download PDF

Can't see the report above? Open the PDF directly →

Implementation snippets

v2 · 02 Jun 2026

Copy-paste code for the five highest-impact fixes from the report. Targeted at the existing Next.js App Router setup. Replace values in UPPERCASE before shipping.

1 · Unblock crawlers (fixes the HTTP 403)

CriticalSEO · GEOEffort: MedImpact: High

The live site returns 403 to non-browser user-agents, which can block Googlebot and AI crawlers (GPTBot, PerplexityBot, ClaudeBot). Allow them at the edge before any other fix can take effect.

// middleware.ts (repo root)
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";

const ALLOWED_BOTS = [
  "googlebot", "bingbot", "duckduckbot", "applebot",
  "gptbot", "oai-searchbot", "chatgpt-user",     // OpenAI
  "perplexitybot", "perplexity-user",            // Perplexity
  "claudebot", "claude-web", "anthropic-ai",     // Anthropic
  "google-extended", "ccbot",
];

export function middleware(req: NextRequest) {
  const ua = (req.headers.get("user-agent") || "").toLowerCase();
  const isBot = ALLOWED_BOTS.some(b => ua.includes(b));
  const res = NextResponse.next();
  if (isBot) res.headers.set("x-allow-bot", "1");
  return res;
}

export const config = { matcher: "/((?!_next|favicon|api).*)" };

Then: in the WAF / Cloudflare / Vercel Firewall rule currently returning 403, exempt requests whose UA matches the list (or whose response header carries x-allow-bot: 1). Verify with curl -A "GPTBot" https://stackbirds.xyz/ — should return 200.

2 · Organization + SoftwareApplication JSON-LD

CriticalSEO · GEOEffort: LowImpact: High

Add to app/layout.jsx, inside the document so AI engines can confirm the brand entity.

<script
  type="application/ld+json"
  dangerouslySetInnerHTML={{ __html: JSON.stringify({
    "@context": "https://schema.org",
    "@graph": [
      {
        "@type": "Organization",
        "@id": "https://stackbirds.xyz/#org",
        "name": "Stackbirds",
        "url": "https://stackbirds.xyz/",
        "logo": "https://stackbirds.xyz/logo.png",
        "description": "Self-trained agents for ops teams — record a workflow once, an agent runs it forever.",
        "sameAs": [
          "https://twitter.com/STACKBIRDS_HANDLE",
          "https://www.linkedin.com/company/STACKBIRDS_HANDLE",
          "https://github.com/stackbirds-engineering"
        ]
      },
      {
        "@type": "SoftwareApplication",
        "@id": "https://stackbirds.xyz/#app",
        "name": "Stackbirds",
        "applicationCategory": "BusinessApplication",
        "operatingSystem": "Web",
        "url": "https://stackbirds.xyz/",
        "description": "Self-trained agents for ops teams.",
        "publisher": { "@id": "https://stackbirds.xyz/#org" },
        "offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" }
      }
    ]
  })}}
/>

3 · robots.ts + sitemap.ts (Next.js metadata routes)

HighSEOEffort: LowImpact: High

Create both files under app/. Next.js serves them at /robots.txt and /sitemap.xml automatically.

// app/robots.ts
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
  return {
    rules: [{ userAgent: "*", allow: "/", disallow: ["/api/"] }],
    sitemap: "https://stackbirds.xyz/sitemap.xml",
    host: "https://stackbirds.xyz",
  };
}

// app/sitemap.ts
import type { MetadataRoute } from "next";
export default function sitemap(): MetadataRoute.Sitemap {
  const base = "https://stackbirds.xyz";
  const now = new Date();
  return [
    { url: `${base}/`,        lastModified: now, changeFrequency: "weekly",  priority: 1.0 },
    { url: `${base}/support`, lastModified: now, changeFrequency: "monthly", priority: 0.6 },
    { url: `${base}/policy`,  lastModified: now, changeFrequency: "yearly",  priority: 0.3 },
  ];
}

4 · Open Graph + Twitter Card + favicon + per-page metas

HighSEO · GEOEffort: LowImpact: High

Replace the existing metadata export in app/layout.jsx.

// app/layout.jsx
export const metadata = {
  metadataBase: new URL("https://stackbirds.xyz"),
  title: {
    default: "Stackbirds — self-trained agents for ops teams",
    template: "%s | Stackbirds",
  },
  description:
    "Record a workflow once. A self-trained agent runs it forever. Built for ops teams.",
  alternates: { canonical: "/" },
  openGraph: {
    type: "website",
    siteName: "Stackbirds",
    title: "Stackbirds — self-trained agents for ops teams",
    description: "Record a workflow once. An agent runs it forever.",
    url: "https://stackbirds.xyz/",
    images: [{ url: "/og.png", width: 1200, height: 630, alt: "Stackbirds" }],
  },
  twitter: {
    card: "summary_large_image",
    title: "Stackbirds — self-trained agents for ops teams",
    description: "Record a workflow once. An agent runs it forever.",
    images: ["/og.png"],
    creator: "@STACKBIRDS_HANDLE",
  },
  icons: { icon: "/icon.png", apple: "/apple-icon.png" },
};

Then: drop a 1200×630 share image at public/og.png and a 512×512 mark at public/icon.png. Override the inherited description in app/policy/page.jsx and app/support/page.jsx with their own export const metadata.

5 · FAQ section + FAQPage schema (biggest AEO win)

HighAEO · GEOEffort: MedImpact: High

Adds a real FAQ block to the homepage and marks it up so it can win featured snippets and AI-answer citations.

// components/Faq.jsx
const FAQS = [
  { q: "What is Stackbirds?",
    a: "Stackbirds is a platform for self-trained agents for ops teams — you record a workflow once, and an agent runs it forever." },
  { q: "How do self-trained agents work?",
    a: "You demonstrate a task in the browser. Stackbirds captures the steps, generalises them, and replays them autonomously — typically training in about five minutes." },
  { q: "Is it secure?",
    a: "SOC 2 ready, SSO included, and agents run in isolated browser sessions per workflow." },
  { q: "Who is it for?",
    a: "Ops, RevOps and back-office teams that move data between SaaS tools and want to automate without writing scripts." },
];

export default function Faq() {
  return (
    <section id="faq">
      <h2>Frequently asked questions</h2>
      {FAQS.map(f => (
        <details key={f.q}><summary>{f.q}</summary><p>{f.a}</p></details>
      ))}
      <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify({
        "@context": "https://schema.org",
        "@type": "FAQPage",
        "mainEntity": FAQS.map(f => ({
          "@type": "Question",
          "name": f.q,
          "acceptedAnswer": { "@type": "Answer", "text": f.a }
        }))
      })}} />
    </section>
  );
}

Bonus AEO: add a one-line "Stackbirds is…" definition above the hero so AI engines have a clean extractable claim.

After shipping any of these: log it below, re-audit, and the verification PDF can be regenerated to v3. Unblocking the 403 should move GEO immediately because crawlers can finally reach the page.

June 2026 plan — 4 weeks to make Stackbirds AI-easy

02 Jun → 29 Jun · v2

A week-by-week implementation plan to turn stackbirds.xyz from an SEO 5 / GEO 4 / AEO 3 page into one that AI answer engines (ChatGPT Search, Perplexity, Gemini, Google AI Overviews) confidently cite when someone asks about agentic browser automation for ops. Targets shipped fixes, not vanity tickets.

North star · End of June

Make Stackbirds the AI-quotable answer for "self-trained agents for ops teams"

Concrete: crawlers receive 200 OK · brand entity, product and FAQ are in JSON-LD · 4-6 real FAQ answers shipped · OG share + favicon live · combined audit score moves from 12/30 to 22+/30 by 29 Jun. Re-test by asking Perplexity / ChatGPT Search "what is Stackbirds" and checking the citation.

Week 1 · Foundation02 → 08 Jun

Unblock the crawlers & declare the brand

  • Ship middleware.ts + WAF rule to allow Googlebot, GPTBot, PerplexityBot, ClaudeBot, Bingbot, Applebot. Verify with curl -A "GPTBot" → 200.
  • Add Organization + SoftwareApplication JSON-LD to app/layout.jsx.
  • Add app/robots.ts + app/sitemap.ts Next.js metadata routes.
  • Submit sitemap in Google Search Console + Bing Webmaster Tools.
Impact: GEO 4 → 6 · SEO 5 → 6 (crawlers can finally read the page)
Week 2 · Visibility09 → 15 Jun

Make every link & SERP look like Stackbirds

  • Ship Open Graph + Twitter Card meta + 1200×630 share image.
  • Add favicon (app/icon.png) + apple-touch-icon.
  • Give /policy and /support their own meta descriptions; consider noindex on utility pages.
  • Replace placeholder href="#" links (Pricing, Docs, Blog, Terms, Security) — real pages or remove.
  • Add a one-line "Stackbirds is…" definition above the hero for snippet/AI extraction.
Impact: SEO 6 → 7 · social/chat previews now render correctly
Week 3 · Answers16 → 22 Jun

Win featured snippets & AI citations

  • Ship the FAQ section + FAQPage schema with 6 real buyer questions.
  • Mark up the Record → Train → Delegate flow as HowTo schema.
  • Rewrite 3 H2/H3 headings as questions ("How do self-trained agents work?", "Is it secure?", "What's the setup time?").
  • Add a 40-60 word direct-answer paragraph under each question heading.
Impact: AEO 3 → 6 · GEO 6 → 7 (eligible for featured snippets & AI citations)
Week 4 · Authority23 → 29 Jun

E-E-A-T + measure + re-audit

  • Ship an About / Team page with named founder bio + credentials.
  • Replace anonymised testimonials with named, attributable quotes (job title + company, with permission).
  • Real sameAs social links (Twitter, LinkedIn, GitHub) in the footer + Organization schema.
  • Set up GSC + GA4 baselines; manually run AI-citation tests in ChatGPT Search / Perplexity / Gemini.
  • Re-run the seo-geo-aeo audit; regenerate the verification PDF as v3; update the Status Log.
Impact: GEO 7 → 8 · brand entity confirmable by AI · combined target 22+/30

What we need from the team

Inputs and decisions to unblock each week. The plan can ship at this pace only if these land in week 1.

From engineering (week 1)
  • Write access to stackbirds-engineering/stackbirds-site for the implementer.
  • WAF / edge rule access (Cloudflare, Vercel Firewall — whichever is returning the 403) so the bot allowlist can be applied.
  • Confirmation that the middleware.ts bot-allow header approach is acceptable, or pointer to the rule that's blocking.
  • Deploy access (Vercel / production) for the implementer or a deploy reviewer in the loop.
From design / brand (week 1-2)
  • OG share image 1200×630 PNG (or approved Figma source to generate it).
  • Favicon 512×512 PNG + monochrome SVG for the Stackbirds mark.
  • Founder/team headshots (3 max) + 1-line bio per person for the About page.
  • Approval to use the existing yellow STACKBIRDS wordmark as the Organization logo URL.
From product / marketing (week 1-3)
  • 4-6 real FAQ Q&A pairs — what buyers actually ask sales / on the waitlist form.
  • Named testimonials — 3 customers willing to be cited by name + title + company (with logos).
  • One-line definition sign-off: "Stackbirds is a platform for self-trained agents for ops teams." Approve or rewrite.
  • Target head-term keywords (e.g. "self-trained browser agents", "ops workflow automation") to anchor titles and headings.
From founders / ops (week 1)
  • Verified social profile URLs for sameAs: Twitter, LinkedIn (company), GitHub org.
  • Google Search Console + GA4 admin access (or a 1-hour pairing slot to set it up).
  • Decision on blog — keep the footer "Blog" link as a real page in scope this month, or remove the placeholder.
  • Sign-off on the 22+/30 target and the weekly check-ins (15 min, end of each week).
MetricToday (02 Jun)Target (29 Jun)How we measure
Crawler access403 to bots200 OKcurl -A "GPTBot" + GSC URL inspect
Combined audit score12 / 3022+ / 30/skill seo-geo-aeo re-run
Schema coverageNoneOrg · App · FAQ · HowToRich Results Test (Google)
Indexed pagesUnknown / blocked3 indexedGoogle Search Console
AI citation testStackbirds not namedNamed by 2/3 AI engines"What is Stackbirds" in Perplexity, ChatGPT Search, Gemini
OG / faviconMissingLive + verifiedopengraph.xyz + DM/Slack share preview
Cadence: 15-min weekly check-in every Friday (06 / 13 / 20 / 27 Jun) — what shipped, what's blocked, what's next. Status Log gets a row each Friday. Final re-audit Monday 29 Jun.

Status log

Dated record of audit revisions and any shipped fixes.

02 Jun 2026
June 2026 plan added. Four-week implementation plan (02 → 29 Jun) published in the section above — week-by-week deliverables, team handoff list, and the 22+/30 score target.
02 Jun 2026
v2 refresh. Live re-crawl still blocked from the audit environment; v1 signals re-verified. Added the five copy-paste implementation snippets above so the dev team can ship the top fixes without leaving the report.
28 May 2026
v1 viewer published. Verification audit PDF embedded; SEO · AEO · GEO triad scored. Combined verdict: discoverability infrastructure is the gap, not on-page basics.
Stackbirds · SEO · GEO · AEO Verification Audit © 2026 Aziz Saif · azizsaif.com