SaaStock — SEO, AEO & GEO Master Playbook
The single reference for how every page on saastock.com should be built, linked, and optimized for traditional search, AI answer engines, and generative search.
1. URL Architecture
saastock.com/
├── europe/ ← Series hub
│ ├── 2016/ ← Historical event page (the only per-event route)
│ ├── 2017/
│ ├── ...
│ ├── 2025/
│ └── 2026/ ← Upcoming event
│
├── usa/ ← Series hub
│ ├── 2023/
│ ├── 2024/
│ ├── 2025/
│ └── 2026/
│
├── local/ ← Local events hub
│ ├── amsterdam/ ← City rollup
│ ├── barcelona/
│ ├── dublin/
│ └── ...
│
├── speakers/ ← Global speaker directory (filter via ?event=<slug>)
│ ├── sarah-kiley/ ← Individual speaker profile
│ ├── mark-walker/
│ └── ...
│
├── recordings/ ← Global recordings library (filter via ?event=<slug>)
│
├── podcast/ ← SaaS Revolution Show hub
│ └── [episode-slug]/ ← Individual episode with transcript
│
├── about/
│ └── our-story/ ← Timeline narrative
│
└── llms.txt ← Site-wide AI summary
Rules:
- Event pages live under their series (
/usa/2026,/europe/2024), never at root. The event page itself is the only per-event route — there is no/usa/2025/speakers/and no/usa/2025/talks/. Don't add them. - Speaker profiles live at
/speakers/[slug]globally, not nested under events. A speaker speaks at multiple events — their profile is the canonical page, and each event links to it. - Recordings are surfaced two ways: (1) up to 6 featured recordings embedded directly on the event page itself, (2) the complete archive at the global
/recordings/hub, deep-linked from each event page via/recordings/?event=<event-slug>. There are no per-talk pages — the canonical home of every recording is the event page (which embeds the YouTube video) and the global hub. - Use
/recordings/, not/talks/. Users organically search "SaaStock 2022 recordings", not "talks". The URL slug and user-facing copy ("All {event} recordings →", "Featured recordings", "See all recordings") all follow this. - Podcast episodes live at
/podcast/[slug]. They're not tied to a specific event. - The
/speakers/and/recordings/hubs are index pages that aggregate across all events and all time. Tag filters via?event=<slug>give event-scoped views without creating thin per-event index pages that would split link equity. (One filtered view per event would be ~25 near-duplicate pages competing for the same queries — bad for SEO.)
Hard rule: never link to a route that does not exist. Before adding a CTA, anchor, or quicklink, confirm the destination route is built. If it isn't, either build the route, anchor to an on-page section, or drop the CTA. A 404 from a featured CTA is worse than no CTA at all. This was the failure mode that produced the /europe/2022/speakers/ and /europe/2022/talks/ 404s — the playbook described those routes as if they existed, and the rendered event pages linked to them, but they were never built.
2. Page Types and Content Requirements
2a. Historical Event Page (/usa/2026)
This is the page we've already designed. Requirements:
- Cinematic hero — full-bleed silent video (or photo fallback) with ONLY the eyebrow + H1 overlaid. The video is the most important visual element of the page. Everything else (sub-headline, venue/date meta row, quicklinks, stats) moves into a continuous dark band immediately below the hero so the video reads at full strength. The hero
min-h-[clamp(440px,62vh,680px)]so the sizzle has presence; the only dark overlay is a localized bottom-anchored gradient (~lower 60%) for H1 legibility — no section-wide tint. Earlier builds had a 2-column hero with a YouTube iframe on the right, then a 5-col grid with all metadata stuffed into the left 2 cols; both were rejected because the supporting text fought the video for attention. The rule now is:hero = video + eyebrow + H1, full stop. - Hero background video (the silent loop). When an event has an official sizzle, encode it as a silent autoplay-loop background. Specs:
- 720p H.264 MP4 + VP9 WebM, audio stripped at encode time (
ffmpeg -an),+faststarton the MP4. - Files live next to the event's gallery, e.g.
/europe/<year>/gallery/video/video-<year>-sizzle-recap-hero.{mp4,webm}. - Wired via
EventData.hero.videoSources: { mp4?: string; webm?: string }. The hero photo (data.hero.image) doubles as both the<video>posterand the prefers-reduced-motion fallback (the video carriesmotion-reduce:hidden). <video autoPlay muted loop playsInline preload="metadata" aria-hidden>— never autoplay with audio, never YouTube iframes in the hero.- Quality bar: 1080p+ source, post-produced (graded, crowd cuts, b-roll), landscape, no on-screen lower-thirds. If you only have shaky audience-POV footage, ship with the still photo hero instead — never downgrade to low-quality motion just to have motion.
- 720p H.264 MP4 + VP9 WebM, audio stripped at encode time (
- Hero meta band — sub-headline, venue/dates, quicklinks, stats. Same
bg-[#0D1117]as the hero so it reads as a continuation, but with no video and no gradient. Two columns onmin-[820px](text on the left, stat grid on the right); single column on mobile. This is where the supporting context lives — the hero stays cinematic, this band stays scannable. - Event highlight video embed — its own dark band BELOW the photo strip, NOT in the hero. The 2–3 minute highlight reel from YouTube renders in a dedicated dark band ("Highlight reel · Two minutes inside <event>.") between the photo strip and the speakers grid. This is independent of the silent hero loop — the hero is the texture, this is the watchable embed. Still the highest-traffic YouTube asset (68K–107K views) and still creates a two-way authority bridge. Include
VideoObjectschema (see below). - Photo strip (5 images) — sits between the hero-meta band and the highlight-reel band.
- 6 featured speakers with name, title, company, talk title — each name links to their
/speakers/profile - Up to 6 featured recordings embedded inline (YouTube), with a CTA
All {event} recordings →linking to/recordings/?event=<event-slug>for the rest of the archive - Key themes / tracks (3–6 with descriptions)
- Floor plan or venue section
- Full sponsor list by tier (text names required, not just logos — AI crawlers can't read images)
- Hub CTAs in the hero-meta quicklinks and section headers:
See all speakers→/speakers/?event=<event-slug>andSee all recordings→/recordings/?event=<event-slug>. Never link to/<series>/<year>/speakers/or/<series>/<year>/talks/— those routes do not exist. - CTA to next edition
- Previous/next edition navigation
- Full footer with all editions linked
Hero-meta quicklinks must reflect data completeness. The "See all speakers / See agenda / See all talks and recordings" <ul> in the hero-meta band is suppressed when the corresponding archive is incomplete. Partial-roster pages damage trust — a reader who clicks "See all speakers" and finds 5 of 100 will discount the whole event. Each link is gated on a per-event flag (program.hasFullSpeakerRoster, program.hasAgenda, program.hasFullTalks) defined on EventData. Default is "on" for backwards compatibility; legacy / archive events explicitly opt out in their data.ts. When all three are false, the whole <ul> collapses to nothing — never render an empty list above the meta row.
Apply this for every archive year where the source data is partial (early SaaStock editions, pre-2020 events, etc.). Don't gate by raw count — a SaaStock with 30 great recordings might be "complete enough" to surface; a SaaStock with 5 of 100 is not. The judgement is the data-file editor's, encoded as an explicit flag, not inferred from array length.
SEO content rule: First 100 words must contain event name, date, venue name, city, and exact attendee count.
Event highlight video schema:
Every event page with an embedded highlight reel must include a VideoObject in the JSON-LD. This is separate from the main Event schema — it's an additional block.
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "SaaStock USA 2025 — Event Highlights",
"description": "Highlights from SaaStock USA 2025 in Austin, TX. 1,376 SaaS founders, operators, and investors gathered for two days of tactical content, networking, and deal-making.",
"uploadDate": "2025-07-11",
"duration": "PT3M",
"thumbnailUrl": "https://img.youtube.com/vi/[VIDEO_ID]/maxresdefault.jpg",
"embedUrl": "https://www.youtube.com/embed/[VIDEO_ID]",
"contentUrl": "https://www.youtube.com/watch?v=[VIDEO_ID]",
"interactionStatistic": {
"@type": "InteractionCounter",
"interactionType": "https://schema.org/WatchAction",
"userInteractionCount": 68115
},
"recordedAt": {
"@type": "BusinessEvent",
"name": "SaaStock USA 2025",
"url": "https://saastock.com/usa/2025"
},
"publisher": {
"@type": "Organization",
"name": "SaaStock",
"url": "https://saastock.com"
}
}
The interactionStatistic with WatchAction tells Google this video has significant engagement. The recordedAt links the video entity to the event entity. Together with the YouTube embed on the page, this creates three reinforcing signals: the embed itself (Google can see it), the schema (structured data), and the YouTube video's own metadata (which should link back to this event page in its description).
Why this matters: Google treats YouTube embeds as a ranking signal. A page with an embedded video that has 68K views sends a much stronger engagement signal than a page with only images. For AI answer engines, the VideoObject schema gives them a direct path from "What was SaaStock USA 2025 like?" to both the event page and the video.
2b. Speaker Profile Page (/speakers/sarah-kiley)
This is a new page type. One page per speaker, covering their entire SaaStock history.
Content:
- H1:
Sarah Kiley — SaaStock Speaker - Headshot image — high-resolution, minimum 800×800px, file named
sarah-kiley-headshot.jpg(see Image SEO below) - Current title and company: Chief Sales Officer, ChurnZero
- Bio: 2–3 sentences. Can be pulled from the event program, LinkedIn, or the speaker's own site.
- SaaStock appearances: A list of every event they've spoken at, with:
- Event name (linked to event page)
- Talk title (linked to
/recordings/?event=<slug>filtered to that event, OR to the recording's anchor on the event page when known) - Date
- Featured talk embed: YouTube embed of their most-viewed talk
- Key quotes: 2–3 pull quotes extracted from transcripts (factual, citable statements — not motivational fluff)
- Related speakers: 3–4 speakers from the same events or same topic area (creates internal linking mesh)
Target queries:
[speaker name] keynote— the page title, H1, and meta description must all contain the word "keynote" or the event context[speaker name] headshot— the headshot image must be optimized for image search (see Section 8)[speaker name] SaaStock— entity connection between person and event brand[speaker name] [topic]— transcript content on the linked talk page captures long-tail queries
Title tag: [Speaker Name] — Keynote Speaker at SaaStock | [Company]
Meta description: [Speaker Name], [Title] at [Company], has spoken at [N] SaaStock events. Watch their keynote on [topic] from SaaStock [Event] [Year].
Schema:
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Sarah Kiley",
"jobTitle": "Chief Sales Officer",
"affiliation": {
"@type": "Organization",
"name": "ChurnZero"
},
"image": "https://saastock.com/speakers/sarah-kiley/sarah-kiley-headshot.jpg",
"url": "https://saastock.com/speakers/sarah-kiley",
"sameAs": [
"https://www.linkedin.com/in/sarahkiley"
],
"performerIn": [
{
"@type": "BusinessEvent",
"name": "SaaStock USA 2025",
"url": "https://saastock.com/usa/2025"
}
]
}
2c. (deprecated) Per-talk pages
Earlier drafts of this playbook called for a /usa/2025/talks/[slug] page per recording. That route does not exist and is not planned. Every recording's canonical home is:
- The event page itself — embeds the YouTube video inline (as one of the up-to-6 featured recordings, with the anchor
#talk-<slug>for deep links). The full editorial recap, FAQ, and event schema all live on the event page, which gives Google plenty of unique content to index alongside each embed. - The
/recordings/global hub — every recording is listed and playable inline with a?event=<slug>filter to scope to a single year.
The VideoObject schema described in the event-page section (2a) covers the structured-data side of each recording. Transcripts, when published, live on the speaker profile page (/speakers/<slug>/) — that's where they belong, attributed to the person who said them rather than orphaned on a per-talk URL.
If we ever revive per-talk pages, build the route first before adding any CTAs that link to it. (See the hard rule in §1.)
2d. Speaker Directory Page (/speakers/)
Index page listing all speakers who have ever appeared at a SaaStock event.
Content:
- H1:
SaaStock Speakers — Every Keynote Speaker Since 2016 - Filterable grid of speaker cards: headshot, name, title, company, number of appearances, most recent event
- Event tag filter via
?event=<event-slug>— when a user lands on/speakers/?event=europe-2022from an event-page CTA, the event dropdown auto-selects and the list is scoped to speakers from that event. The URL stays shareable. - Each card links to the speaker profile page
- Sorted by most recent appearance first (keeps the page fresh)
- Total count in the opening paragraph: "Since 2016, SaaStock has hosted [N] speakers across [N] events in [N] cities."
Title tag: SaaStock Speakers — Keynote Speakers from 10 Years of SaaS Conferences
Meta description: Browse every keynote speaker who has appeared at SaaStock since 2016. [N] speakers from companies like [top 3 logos]. Full talk transcripts and headshots.
2e. Recordings Directory Page (/recordings/)
Index page listing every recorded talk across every SaaStock event.
Why /recordings/, not /talks/: users search "SaaStock 2022 recordings", not "SaaStock 2022 talks". The URL matches search intent; the user-facing copy ("All {event} recordings", "Featured recordings", "See all recordings") matches the URL.
Content:
- H1:
SaaStock Recordings — Every Keynote, Fireside & Panel Since 2016 - Each card embeds the YouTube video (click-to-play with a thumbnail to keep first-paint cheap)
- Card metadata: talk title, speaker name (links to
/speakers/<slug>/), event name (links to event page), format, view count - Event tag filter via
?event=<event-slug>— matches the speakers-hub pattern. Default sort is by all-time YouTube views; toggle to "Most recent" or "A–Z". - Search input over title + speaker + company
Title tag: SaaStock Recordings — Keynote Recordings from 10 Years of SaaS Conferences
Meta description: Watch [N] recorded talks from SaaStock conferences since 2016. Filter by event, search by speaker — keynotes, firesides, and panels from SaaStock USA, SaaStock Europe, and the Local series.
2f. Series Hub (/usa or /europe)
- Next edition details (date, venue, CTA)
- Year-over-year table with attendee counts
- Links to every historical edition
- Brief series description for GEO targeting
2g. City Page (/local/barcelona)
- Every event held in that city, most recent first
- City-specific SaaS ecosystem content
- Link to Local hub
- CTA for attending or hosting
2h. Timeline Page (/about/our-story)
- Chronological narrative from 2016 to present
- Key milestones with dates and exact numbers
- Links to every flagship event page
- Growth metrics over time
2i. Implementation contract for the hub + tag-filter pattern
This section is binding for any agent that touches /speakers/, /recordings/, or the shared EventPage component. Read it before editing.
What the user sees on an event page (e.g. /europe/2022):
- Hero quicklinks:
See all speakers→/speakers/?event=<slug>·See agenda(only ifdata.agenda?.length > 0, jumps to#agenda) ·See all recordings→/recordings/?event=<slug>. - Featured speakers section (6 cards,
id="speakers") with a CTAAll {event} speakers →linking to/speakers/?event=<slug>. - Featured recordings section (
id="talks"for legacy anchor compat) showing up to 6 recordings inline as YouTube embeds, with a CTAAll {event} recordings →linking to/recordings/?event=<slug>. Each card has an anchorid="talk-<talkSlug>"so deep-links survive.
The featured cap is 6, not 3. Three is too few to show the depth of programming and starves the page of indexable embedded video. The full archive (which can be 15–25 per flagship) lives on the recordings hub, deep-linked from the section CTA. Do not go past 6 — beyond that, page weight and time-to-interactive degrade since each YouTube iframe ships ~700KB of JS even in nocookie mode.
Slug contract: the event data.slug field (e.g. europe-2022, usa-2025) is the canonical identifier. The same slug appears as SpeakerAppearance.eventSlug in the speaker registry. The hubs read ?event=<slug> from the URL and match against this field. If you add a new event, set slug in data.ts to <series-lowercase>-<year>.
Hub browser components (SpeakersBrowser, RecordingsBrowser) are client components. They:
- Read the initial
?event=<slug>value viauseSearchParams. - Validate against the derived event list (
deriveEventOptionsinapps/web/app/speakers/event-options.ts) — an unknown slug falls back to "All events" instead of throwing. - On filter change, call
router.replace(${pathname}?event=<slug>, { scroll: false })so the URL stays shareable without a page-scroll jump. - Because they call
useSearchParams, the parent server component must wrap them in<Suspense fallback={null}>— Next.js will fail static export otherwise.
Server-rendered HTML on /recordings/?event=<slug> is the unfiltered list. The filter applies after JS hydrates. This is fine for SEO because the metadata canonical on /recordings points at the unfiltered URL — Google consolidates query-param variants. We do NOT want filtered URLs treated as separate documents (that would split link equity across ~25 near-duplicate index pages, which is the exact failure mode the hub-with-tag-filter pattern was designed to avoid).
Recording card click target: the play button swaps the thumbnail (https://i.ytimg.com/vi/<id>/hqdefault.jpg) for a YouTube nocookie iframe in place. Do NOT make the entire card a hyperlink to the event page — the user came to the recordings hub to watch, not to navigate. Speaker name and event name are individually linked inside the card meta.
Recording → event-page anchor: the EventPage template stamps id="talk-<talkSlug>" on every featured-recording <article>. JSON-LD subEvent URLs on event pages point at <eventUrl>/#talk-<talkSlug>. The recordings hub does not currently deep-link back to these anchors per-card (the inline embed makes the round-trip unnecessary), but the anchor convention is the source of truth if we need it.
Source of recordings data: the /recordings/ hub builds its list from apps/web/app/speakers/registry.ts (auto-generated from apps/web/public/agents/searchops/data/saastock-youtube-master.xlsx). Every speaker appearance with a youtubeId AND a talkTitle becomes a card. When new recordings are added to the master sheet, re-running scripts/generate_speaker_registry.py automatically populates both hubs and the event-page featured sections — no per-event data.ts edit required for the hub-level views.
3. Schema Markup (JSON-LD)
Every page carries the schemas listed in its section above. Additionally, every page on the site carries these two universal blocks:
BreadcrumbList (adjust per page)
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "SaaStock", "item": "https://saastock.com" },
{ "@type": "ListItem", "position": 2, "name": "[Section]", "item": "https://saastock.com/[section]" },
{ "@type": "ListItem", "position": 3, "name": "[Page]", "item": "https://saastock.com/[section]/[page]" }
]
}
Organization (site-wide)
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "SaaStock",
"url": "https://saastock.com",
"foundingDate": "2016",
"description": "SaaStock is the world's largest community of B2B SaaS founders scaling to $10M ARR and beyond.",
"sameAs": [
"https://twitter.com/SaaStock",
"https://www.linkedin.com/company/saastock",
"https://www.youtube.com/@SaaStock"
]
}
4. Meta Tags
Title tag formulas
| Page type | Formula |
|---|---|
| Event | `SaaStock [Series] [Year] — [Month Day–Day], [City] [State] |
| Speaker profile | `[Name] — Keynote Speaker at SaaStock |
| Talk page | `[Talk Title] |
| Speaker directory | SaaStock Speakers — Keynote Speakers from 10 Years of SaaS Conferences |
| Talks directory | SaaStock Talks — Keynotes & Interviews with Full Transcripts |
| Series hub | SaaStock [Series] — The Premier B2B SaaS Conference in [Region] |
Meta description formulas
| Page type | Formula |
|---|---|
| Event | Lead with exact attendee count and venue. Include sponsor and speaker counts. End with one differentiating phrase. Under 155 chars. |
| Speaker profile | [Name], [Title] at [Company], has spoken at [N] SaaStock events. Watch their keynote on [topic] from SaaStock [Event] [Year]. |
| Talk page | [Name] ([Title], [Company]) keynote at SaaStock [Event] [Year]. Full transcript and key takeaways on [topic]. |
5. AEO — Answer Engine Optimization
5a. The llms.txt file
Host at saastock.com/llms.txt (site-wide) and optionally per-event at /usa/2026/llms.txt.
Structure:
# SaaStock — Summary for AI Systems
> Canonical: https://saastock.com
> Last updated: [date]
## What is SaaStock?
[2-3 sentences]
## Event History
[Tables showing every edition with dates, attendee counts]
## Speaker Archive
[Total speaker count, link to /speakers/, top 10 speaker names with companies]
## Recordings Archive
[Total recording count, link to /recordings/, note that the hub supports ?event=<slug> filtering]
## Key Themes Covered
[List of recurring topics across events]
## How to Reference
[Standard names, short names, URLs]
## Contact
[Links and emails]
5b. Content structure for AI parsing
Every section of every page must contain at least one standalone factual sentence that an AI system could excerpt as a direct answer.
Do: "SaaStock USA 2026 took place April 14–15 at Palmer Events Center in Austin, Texas, with 1,547 attendees."
Don't: "An incredible two days of building, learning, and connecting." (No facts. AI can't cite vibes.)
For talk pages specifically: The key takeaways section is the most citable part. Write each takeaway as a complete, attributed statement:
- "Sarah Kiley, CSO of ChurnZero, recommends stepping into agentic SDR tools gradually, starting with website engagement before deploying autonomous outbound."
AI systems strongly prefer statements that include: a named person, their title, their company, and a specific position or recommendation.
5c. Entity consistency
- Always use "SaaStock USA 2026" — not "SUSA26," not "SaaStock Austin," not "the conference."
- Always use full speaker names: "Sarah Kiley" — not "Sarah" or "the speaker."
- Always include organizational affiliation: "Sarah Kiley, Chief Sales Officer at ChurnZero."
- These patterns help AI systems build entity relationships.
6. GEO — Generative Engine Optimization
6a. Target queries by page type
Event pages should rank for:
- "SaaStock USA 2026"
- "best SaaS conferences 2026"
- "B2B SaaS events in the US"
- "SaaS conferences in Austin"
Speaker profiles should rank for:
- "[speaker name] keynote"
- "[speaker name] headshot"
- "[speaker name] SaaStock"
- "[speaker name] [company] conference"
Talk pages should rank for:
- "[speaker name] keynote"
- "[speaker name] [topic]"
- "[specific topic] SaaS conference talk"
- Long-tail queries matching transcript content (e.g., "should I use agentic SDRs," "how to improve SaaS discovery calls")
6b. Winning category queries
When someone asks "best SaaS conferences 2026," AI systems look for:
- A clear self-identification in the first 100 words
- Comparative data (attendee counts, speaker counts, years running)
- Historical trajectory (year-over-year growth table)
- Specific audience definition ("B2B SaaS founders scaling to $10M ARR")
6c. Freshness signals
- Series hubs always show the next event, even if it's "2027 — dates coming soon"
- Talk pages include
uploadDatein schema - llms.txt files include
Last updateddate - Organization schema includes
foundingDate: 2016
7. Internal Linking Rules
7a. Required links on every event page
| Destination | Location | Anchor text |
|---|---|---|
| Series hub | Nav, CTA, footer | "SaaStock USA" |
| Previous edition | Edition nav | "SaaStock USA 2025" |
| Next edition or hub | Edition nav, CTA | "SaaStock USA 2027" |
| Speakers hub (event-scoped) | Speakers section | "All SaaStock USA 2026 speakers" → /speakers/?event=usa-2026 |
| Recordings hub (event-scoped) | Recordings section | "All SaaStock USA 2026 recordings" → /recordings/?event=usa-2026 |
/speakers/ | Footer or nav | "Speakers" |
/recordings/ | Footer or nav | "Recordings" |
/about/our-story | Footer | "Our Story: 2016–Today" |
/local | Footer | "SaaStock Local — 20+ Cities" |
7b. Required links on every speaker profile
| Destination | Location | Anchor text |
|---|---|---|
| Each event they spoke at | Appearances list | "SaaStock USA 2025" |
| Each talk they gave | Appearances list | "[Talk Title]" |
/speakers/ | Breadcrumb | "Speakers" |
| Related speakers (3–4) | Sidebar or bottom | "[Speaker Name]" |
7c. Required links on every recording card (on the /recordings/ hub and on event-page featured recordings)
| Destination | Location | Anchor text |
|---|---|---|
| Speaker profile | Speaker name under the title | "[Speaker Name]" |
| Event page | Event name in card meta | "SaaStock USA 2025" |
| Event-scoped recordings hub | Below the featured grid on the event page | "All SaaStock USA 2025 recordings" → /recordings/?event=usa-2025 |
7d. Anchor text rules
Use entity-rich anchor text:
- "SaaStock USA 2025" — names event, series, year
- "Sarah Kiley" — names the person
- "Sarah Kiley's keynote on ICP and discovery" — names person + topic
Never use:
- "Click here" — zero SEO value
- "Learn more" — zero SEO value
- "Watch video" — misses the entity
- "Previous event" — misses the entity name
Variation rule: When linking to the same page multiple times on one page, vary the anchor text:
- Nav: "Speakers"
- Body: "SaaStock USA 2026 Speakers"
- Footer: "All Speakers"
7e. Footer structure (site-wide)
Four columns on every page:
Column 1 — SaaStock Europe: Link to every flagship. Anchor: "[City] [Year]"
Column 2 — SaaStock USA: Link to every flagship. Anchor: "Austin [Year]"
Column 3 — SaaStock Local: Hub link + top 5 cities
Column 4 — Content & About:
- Speakers →
/speakers/ - Recordings →
/recordings/ - Podcast →
/podcast/ - Our Story: 2016–Today →
/about/our-story
7f. The linking mesh
The power of this architecture is the internal linking density. Here's how the entities connect:
Event Page ──→ Speaker Profiles (via featured speakers)
Event Page ──→ Inline YouTube embeds for up to 6 featured recordings (via featured-recordings section)
Event Page ──→ Speakers hub, event-scoped (`/speakers/?event=<slug>`)
Event Page ──→ Recordings hub, event-scoped (`/recordings/?event=<slug>`)
Event Page ──→ Previous/Next Event (via edition nav)
Event Page ──→ Series Hub (via breadcrumb, CTA)
Speaker Profile ──→ All Events they spoke at
Speaker Profile ──→ Inline YouTube embed of their top-viewed talk
Speaker Profile ──→ Related Speakers
Recordings Hub ──→ Speaker Profiles (via card meta) and Event Pages (via card meta), filterable by ?event=<slug>
Series Hub ──→ All Events in the series
Speaker Directory ──→ All Speaker Profiles
Recordings Directory ──→ Every recorded talk (inline, filterable by event)
Timeline Page ──→ All Event Pages
Footer (every page) ──→ All Event Pages
Every page links out. Every page gets linked to. No orphans.
8. Image SEO
8a. Speaker headshots
Speaker headshots are a high-value SEO asset. People search for "[speaker name] headshot" when building event materials, press coverage, blog posts, and social content. If SaaStock's speaker page is the top result, you capture that traffic and that person's network sees the SaaStock brand.
File naming:
/speakers/sarah-kiley/sarah-kiley-headshot.jpg
/speakers/sarah-kiley/sarah-kiley-keynote-saastock-usa-2025.jpg
Never use IMG_4392.jpg or speaker-photo-1.jpg. The filename is a ranking signal.
Alt text formula:
<img src="sarah-kiley-headshot.jpg"
alt="Sarah Kiley, Chief Sales Officer at ChurnZero — SaaStock speaker headshot"
title="Sarah Kiley — Keynote Speaker at SaaStock USA 2025">
The alt text must contain: full name, title, company, and the word "headshot." The title attribute can add the event context.
Image specifications:
- Minimum 800×800px (Google prefers large images for image search)
- Square aspect ratio for headshots
- WebP format with JPG fallback
- File size under 200KB (compress aggressively)
- Serve via CDN with proper cache headers
Structured data for images:
On the speaker profile page, the Person schema must include:
"image": {
"@type": "ImageObject",
"url": "https://saastock.com/speakers/sarah-kiley/sarah-kiley-headshot.jpg",
"width": 800,
"height": 800,
"caption": "Sarah Kiley, Chief Sales Officer at ChurnZero"
}
8b. Event photos
Event photos on historical pages should follow the same discipline:
File naming:
saastock-usa-2026-main-stage-crowd.jpg
saastock-usa-2026-expo-hall.jpg
saastock-usa-2026-keynote-sarah-kiley.jpg
Alt text formula:
<img src="saastock-usa-2026-main-stage-crowd.jpg"
alt="Main stage crowd at SaaStock USA 2026, Palmer Events Center, Austin TX — 1,547 attendees">
Include: event name, venue, city, and a relevant fact (attendee count, what's visible in the photo).
8c. OG images
Every page needs an OG image for social sharing:
- Event pages: hero crowd photo, 1200×630px
- Speaker profiles: headshot on branded background, 1200×630px
- Talk pages: YouTube thumbnail or speaker photo with talk title overlay, 1200×630px
9. Transcript Processing
Raw transcripts from YouTube need cleanup before publishing. Here's the processing pipeline:
9a. Cleanup steps
- Add speaker labels: Replace
>>markers with actual speaker names in bold - Add paragraph breaks: Break at natural topic shifts, roughly every 3–5 sentences
- Remove artifacts: Strip
[music],[laughter],>>, and other non-content markers - Fix proper nouns: Correct misspellings of company names, product names, and people
- Add timestamps: Insert timestamps every 2–3 minutes for navigation (these can link to YouTube timecodes)
9b. Key takeaways extraction
For each talk, write 3–5 key takeaways. Each must be:
- A complete sentence
- Attributed to the speaker by name, title, and company
- A specific claim, recommendation, or data point — not a vague summary
- Written so an AI system could quote it as a standalone answer
Good: "Sarah Kiley, CSO at ChurnZero, reports that the company does not currently use Clay for dynamic account assignment, instead daisy-chaining several tools together to achieve signal-based account tiering."
Bad: "Sarah discussed her approach to technology and tools."
9c. Scale
If SaaStock has had ~80 speakers per flagship event across 10 flagships, that's ~800 unique speaker appearances. ~30% have a YouTube recording — call it 240 recordings with cleaned transcripts, ~20,000 characters each. That's 4.8 million characters of unique, keyword-rich, expert-attributed content. Surfaced via inline embeds + transcript on the event page and speaker profile, indexable in one canonical place per entity — no per-talk URL needed for any of it.
10. External Signals
10a. YouTube optimization
Event highlight reels:
Every flagship event should have a 2–3 minute highlight reel on YouTube. These are the highest-traffic videos in the SaaStock YouTube library (68K–107K views versus 100–2,000 for individual talks) and serve as the primary video asset for each event page.
Highlight reel optimization:
- Title:
SaaStock [Series] [Year] — Event Highlights - Description: First line: one-sentence summary with attendee count, city, and dates. Second line: link to the event page (
saastock.com/usa/2025). Include a list of featured speakers mentioned in the video with links to their speaker profile pages. End with: "Watch every recording from this event at saastock.com/recordings/?event=usa-2025" - Tags: "SaaStock," "SaaS conference," "[City]," "SaaStock [Year]," "B2B SaaS event"
- Pinned comment: "Explore the full SaaStock USA 2025 experience — 84 speakers, 61 sponsors, 1,547 attendees. Browse every recording: saastock.com/recordings/?event=usa-2025"
- End screen: Link to the next edition's event page or ticket page
- Embed on event page: Every highlight reel must be embedded on its corresponding event page with
VideoObjectschema (see Section 2a)
The highlight reel is the bridge between YouTube's massive reach and saastock.com's event pages. A viewer who watches the highlight on YouTube and clicks through to the event page is entering the content ecosystem: event page → speaker profiles → talk pages → related talks. The highlight reel is the top of that funnel.
Individual talk videos:
Every talk on YouTube should have:
- Title:
[Talk Title] — [Speaker Name], [Company] | SaaStock [Series] [Year] - Description: First line is a one-sentence summary. Second line links to the event page on saastock.com (e.g.
saastock.com/usa/2025) — the event page embeds this exact recording and carries the editorial recap, FAQ, and event schema. Include speaker name, title, company. Link to the speaker profile page (saastock.com/speakers/<slug>). - Tags: "SaaStock," "SaaS conference," "[Speaker Name]," "[Company]," "[Topic]," "keynote"
- Pinned comment: Link to the event page and the speaker profile: "Watch on the event page (with recap and FAQ): saastock.com/usa/2025 — speaker profile: saastock.com/speakers/<slug>"
The YouTube description and pinned comment create backlinks from YouTube to saastock.com, and they give AI crawlers a direct path from the video to the event page and speaker profile (the two pages that carry the full editorial context).
10b. Speaker and sponsor backlinks
After every event:
- Ask speakers to link to their SaaStock speaker profile from LinkedIn and personal sites
- Provide speakers with a pre-written LinkedIn post including the link
- Ask sponsors to add "Partner at SaaStock USA 2026" with a link to the event page
- Create embeddable badges: "I Spoke at SaaStock USA 2026" and "We Sponsored SaaStock USA 2026" with backlinks
10c. Wikipedia
SaaStock should have a Wikipedia page. Events with Wikipedia pages get cited by AI systems at significantly higher rates. The page should reference founding year, annual attendance figures, notable speakers, and link to saastock.com.
10d. Podcast directories
The SaaS Revolution Show should be listed on every major podcast directory (Apple, Spotify, Google) with show notes that link to the relevant speaker profile on saastock.com for each episode (and the recordings hub when a conference recording is referenced).
11. Measurement
Traditional SEO
- Ranking for "[Event Name]" queries
- Ranking for "best SaaS conferences [year]"
- Ranking for "[speaker name] keynote"
- Ranking for "[speaker name] headshot" (image search)
- Organic traffic to event pages, speaker profiles, and the recordings hub
- Pages indexed in Google Search Console (target: all events + all speakers + the recordings hub)
AEO / GEO
Test monthly by asking the major AI systems:
- "What are the top SaaS conferences?"
- "Tell me about SaaStock"
- "How many people attend SaaStock?"
- "Who spoke at SaaStock USA 2025?"
- "[Speaker name] views on [topic from their talk]"
Track whether SaaStock is mentioned, whether saastock.com is cited as a source, and whether the facts cited are accurate (which means the AI system is reading our structured data, not hallucinating).
Internal linking health
- Every event page: 10+ internal links pointing to it
- Every speaker profile: 3+ internal links (from event pages, the recordings hub, related speakers)
- Every recording surfaced in at least two places: as an inline embed on the event page (top 6) AND on the
/recordings/hub (all of them) - No orphan pages
- Full crawl quarterly with Screaming Frog
12. Pre-Publish Checklist
Before publishing any page on saastock.com:
All pages
- URL follows the architecture in Section 1
- Title tag follows the formula for its page type
- Meta description includes exact numbers and entity names
- Canonical URL set
- OG image is a real photo, 1200×630px minimum
- BreadcrumbList JSON-LD present
- Organization JSON-LD present
- First 100 words contain the primary entity name and key facts
- Every section has at least one factual, citable sentence
- No generic anchor text ("click here," "learn more," "read more")
- No rounded numbers with "+" — use exact counts
- Footer contains full link structure per Section 7e
Event pages
- Event JSON-LD with
superEvent,previousStartDate,performer,offers - Event highlight video embedded with
VideoObjectschema (includinginteractionStatisticandrecordedAt) - YouTube highlight reel description updated with link to event page and speaker profile URLs
- YouTube highlight reel pinned comment includes attendee count, speaker count, and link to the event-scoped recordings hub (
/recordings/?event=<slug>) - All sponsor names in text (not just logo images)
- Up to 6 featured recordings embedded inline with
All {event} recordings →CTA pointing at/recordings/?event=<slug>;See all speakersquicklink points at/speakers/?event=<slug>(do NOT link to per-event/speakers/or/talks/subroutes — they don't exist) - Edition nav with entity-rich anchor text
- CTA links forward to next edition
Speaker profiles
- Person JSON-LD with
performerInlinking to events - Headshot image: 800×800px+, named
[name]-headshot.jpg, alt text includes name + title + company + "headshot" - Title tag contains the word "keynote"
- All appearances listed with links to event pages (and to the event-scoped recordings hub view when relevant)
- 3–4 related speaker links
Recording entries (per recording, surfaced on both the event page and the /recordings/ hub)
- Speaker registry entry has
youtubeIdandtalkTitlepopulated (these are the two required fields for a recording to appear in the hub) - Event page
data.speakers[].talkSlugmatches the kebab-case slug used in the anchorid="talk-<slug>"so deep-links from JSON-LDsubEventURLs land on the right card - YouTube nocookie iframe used (
youtube-nocookie.com/embed/<id>), not the cookied embed - VideoObject JSON-LD with
recordedAtlinking to the event entity,authorlinking to the speaker entity - When a transcript is published, it lives on the speaker profile page — not on a per-talk URL (there are no per-talk URLs; see §2c)
Hubs (/speakers/ and /recordings/)
- Hub page metadata sets
canonicalto the unfiltered URL (/speakersor/recordings) — never to a?event=variant - Hub browser component is wrapped in
<Suspense fallback={null}>in the server page (required because it usesuseSearchParams) - Event filter dropdown reads from
?event=<slug>on mount, validates againstderiveEventOptions, and updates the URL viarouter.replace(..., { scroll: false })on change - Unknown event slug falls back to "All events" (no throw, no 404)
- Recording cards: click-to-play thumbnail using
hqdefault.jpg, lazy-loaded; swap to nocookie iframe withautoplay=1on click - Recording card meta: speaker name links to
/speakers/<slug>/, event name links to/<series>/<year>/ - Sitemap includes
/speakers/and/recordings/as priority-0.9 hubs (filtered variants are not added — thecanonicalconsolidates them)
Forbidden patterns (CTAs and links that have caused 404s in the past)
- No
href="/<series>/<year>/speakers/"anywhere — use/speakers/?event=<slug> - No
href="/<series>/<year>/talks/"anywhere — use/recordings/?event=<slug> - No
href="/<series>/<year>/talks/<slug>/"anywhere — use the event-page anchor/<series>/<year>/#talk-<slug>if you need to deep-link a specific recording - No
/talks/in any user-facing label or URL — useRecordings//recordings/
