Challenge
A mid-stage B2B SaaS with a great product, a site that couldn't be crawled past the second level, and a content strategy that amounted to "publish whatever the last intern wrote."
Rankings had plateaued for 18 months. Traffic was flat. Demo requests were declining despite strong product reviews. The team suspected the site was the problem; they couldn't prove it.
Diagnosis
Two weeks of audit work surfaced the real issues:
- Crawl budget wasted: 8,000 URLs indexed, only 1,200 earning any traffic. The rest were low-value parameter variants and stale blog drafts.
- CWV in the red: 4.3s LCP on the homepage, 4.2 MB of JS on landing pages, layout shifting on every scroll.
- Topical drift: 140 blog posts spread across 60+ themes. No cluster. No authority.
- Zero schema: no Organization, no Article, no FAQ, no Breadcrumb — on a site that sold a developer tool to technical buyers.
- Metadata copy-pasted: same title pattern across 80% of URLs.
Approach
We proposed and the client approved a three-track engagement over six months:
Track 1 — Rebuild the marketing site
Next.js 16 on the App Router, Tailwind + shadcn/ui, MDX content in the repo. Design system rebuilt from scratch with a real brand voice. 32 legacy pages consolidated to 14. Every template below 150 KB of JS.
Track 2 — Fix the technical SEO
Crawl budget consolidated via canonicals and parameter handling. Schema baked into the design system — every route emits the right JSON-LD automatically. Sitemap dynamic, Search Console errors cleared, CWV green across the top 20 templates.
Track 3 — Build a real content engine
Content audit retired 70% of legacy posts (redirected or merged). One pillar chosen (the term the client had been losing to a bigger competitor for two years). 24-piece cluster scoped. Editorial-grade writing at 4 pieces per month.
Stack
Next.js 16 · React 19 · TypeScript strict · Tailwind CSS 4 · shadcn/ui · MDX · PostgreSQL · Drizzle · Resend · Docker · nginx on a self-hosted VPS · GitHub Actions for CI
Outcome
Six months in:
- Organic traffic up 3.1× vs. the six months pre-launch.
- Primary keyword moved from page 4 to #2 — the #1 is the bigger competitor, and closing.
- LCP dropped from 4.3s to 1.1s across the homepage and core landing pages.
- Bounce rate down 47% on blog templates.
- Demo requests doubled.
- Sales team stopped needing to introduce the product in cold outbound — inbound leads arrived already educated.
The compound effect is the most valuable part: every piece shipped now inherits the schema, the internal linking, the performance budget. The next six months will cost less and produce more than the first six did.
What we'd do differently
We under-scoped the content audit initially — it took twice as long as planned because the legacy posts were more tangled than expected. Next time, we'd price the audit separately and let the scope breathe.
What the client said
> “They replaced a team of four contractors with two people and shipped more in eight weeks than we had in the previous quarter. The site is fast, the content engine hums, and Search Console stopped yelling at us.”