Skip to content

seo(p0): H1 benchmark on products + FAQPage on compare + RSS discovery + rich SERP - #916

Merged
Flotapponnier merged 1 commit into
devfrom
feat/seo-p0-schema-h1-rss
Jul 6, 2026
Merged

seo(p0): H1 benchmark on products + FAQPage on compare + RSS discovery + rich SERP#916
Flotapponnier merged 1 commit into
devfrom
feat/seo-p0-schema-h1-rss

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

3 P0 SEO fixes from post-shipping audit.

Changes

  1. products/[slug] — H1 emits {Provider} Benchmark (matches title {Provider} Benchmark 2026). Semantic mismatch was killing CTR (only 1 click on 'sui benchmark' pos 2).
  2. compare/[slug] — FAQPage JSON-LD with 3-4 data-driven questions per pair (which is better, which wins on {bench}, how measured). Bing + Google render rich FAQ dropdowns in SERP.
  3. layout.tsx — RSS <link rel=alternate> + max-snippet=-1 max-image-preview=large robots directives so SERP stops truncating our data-rich prose.

Skipped from audit (separate PR)

  • Cache-Control s-maxage=300 on dynamic routes
  • next/image migration for WebP/AVIF
  • Preconnect hints for analytics.ahrefs.com

Test plan

  • pnpm typecheck clean
  • Staging: /products/moralis H1 contains 'Benchmark'
  • Staging: /compare/codex-vs-mobula emits FAQPage JSON-LD (Google Rich Result validator)
  • Staging: view-source homepage contains <link rel="alternate" type="application/rss+xml"
  • Staging: HTTP response headers on / contain X-Robots-Tag: max-snippet:-1, max-image-preview:large (via meta or header)

…+ rich SERP
Three P0 SEO wins from post-shipping audit (2026-07-05):
1. products/[slug]/page.tsx — H1 now emits '{Provider} Benchmark'
instead of bare '{Provider}'. Matches the SEO title '{Provider}
Benchmark 2026' shipped in #908. Semantic mismatch was killing CTR
(only 1 click observed on 'sui benchmark' at pos 2). Small styled
'Benchmark' suffix preserves visual hierarchy.
2. compare/[slug]/page.tsx — FAQPage JSON-LD. Bing + Google render rich
FAQ dropdowns in SERP for pages emitting valid FAQPage. Every answer
is derived from the shared benchmarks (winner + metric + link to
methodology), so it re-uses data already in DOM — no editorial claim.
3. layout.tsx — RSS feed discovery + rich SERP directives:
- <link rel='alternate' type='application/rss+xml' href='/rss.xml'>
via Metadata.alternates.types so feed readers, Perplexity, Bing
News, Claude auto-discover the existing /rss.xml route.
- meta robots gains max-snippet:-1 + max-image-preview:large +
max-video-preview:-1 so SERP stops truncating our data-rich prose
and stops suppressing og:image on AI-scraped queries.
Skipped from the audit punch list (deferred to a separate PR):
- Cache-Control s-maxage / stale-while-revalidate on dynamic routes
- next/image migration for WebP/AVIF
- Preconnect hints for analytics.ahrefs.com
The 3 shipped here are the highest-signal / lowest-risk subset.
@Flotapponnier
Flotapponnier merged commit 97b7eb2 into devJul 6, 2026
1 check passed
Flotapponnier added a commit that referenced this pull request Jul 6, 2026
…+ rich SERP (#916) (#917)
Three P0 SEO wins from post-shipping audit (2026-07-05):
1. products/[slug]/page.tsx — H1 now emits '{Provider} Benchmark'
instead of bare '{Provider}'. Matches the SEO title '{Provider}
Benchmark 2026' shipped in #908. Semantic mismatch was killing CTR
(only 1 click observed on 'sui benchmark' at pos 2). Small styled
'Benchmark' suffix preserves visual hierarchy.
2. compare/[slug]/page.tsx — FAQPage JSON-LD. Bing + Google render rich
FAQ dropdowns in SERP for pages emitting valid FAQPage. Every answer
is derived from the shared benchmarks (winner + metric + link to
methodology), so it re-uses data already in DOM — no editorial claim.
3. layout.tsx — RSS feed discovery + rich SERP directives:
- <link rel='alternate' type='application/rss+xml' href='/rss.xml'>
via Metadata.alternates.types so feed readers, Perplexity, Bing
News, Claude auto-discover the existing /rss.xml route.
- meta robots gains max-snippet:-1 + max-image-preview:large +
max-video-preview:-1 so SERP stops truncating our data-rich prose
and stops suppressing og:image on AI-scraped queries.
Skipped from the audit punch list (deferred to a separate PR):
- Cache-Control s-maxage / stale-while-revalidate on dynamic routes
- next/image migration for WebP/AVIF
- Preconnect hints for analytics.ahrefs.com
The 3 shipped here are the highest-signal / lowest-risk subset.
Co-authored-by: Florent Tapponnier <contact@mobula.io>
Flotapponnier added a commit that referenced this pull request Jul 6, 2026
Next Metadata.alternates.types silently drops the RSS alternate
in App Router — validated on prod after #916 shipped and the tag
never rendered in HTML. Falling back to a direct <link> in the
<head> JSX so feed readers + AI crawlers (Perplexity, Bing News,
Claude) can auto-discover /rss.xml.
Co-authored-by: Florent Tapponnier <contact@mobula.io>
Flotapponnier added a commit that referenced this pull request Jul 6, 2026
Next Metadata.alternates.types silently drops the RSS alternate
in App Router — validated on prod after #916 shipped and the tag
never rendered in HTML. Falling back to a direct <link> in the
<head> JSX so feed readers + AI crawlers (Perplexity, Bing News,
Claude) can auto-discover /rss.xml.
Co-authored-by: Florent Tapponnier <contact@mobula.io>
@Flotapponnier
Flotapponnier deleted the feat/seo-p0-schema-h1-rss branch July 17, 2026 14:42
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Flotapponnier