Skip to main content

Acceptance Spec — Sermon Prep Desk section

Why (one paragraph)

Every @SermonPrepDesk YouTube episode promises "the full prep pack, free, at SermonWise.ai" but the link lands on the homepage. This section gives each episode a canonical companion page: the episode's prep content as indexable text + the video embed + a tradition-aware CTA into the product. It is the SEO landing surface for "Matthew 13 sermon outline"-class queries and the conversion bridge of the hub-and-spoke funnel (strategy.md §6).

Routes

RoutePurpose
/sermons/prep-deskIndex: all episodes, newest Sunday first. On sermonwise.ai this is sermonwise.ai/prep-desk.
/sermons/prep-desk/[slug]One page per episode, e.g. /sermons/prep-desk/matthew-13-the-sower

Static content model (no DB): typed data file(s) in the repo (follow existing editorial-content convention if one exists, else src/content/prep-desk/episodes.ts). Adding an episode = adding one object + redeploying.

Episode content model

slug, episodeNumber, passageRef ("Matthew 13:1-9, 18-23"), title, servesSunday (date + lectionary label "Proper 10A"), youtubeVideoId (OPTIONAL — page must render cleanly without it), bigIdea, lensLines {classic, pastoral, edgy}, titleClinic {safe, fresh, edgy}, showDontTell (labeled imaginative retelling), detailYouMissed, dosAndDonts {dont, do}, pathToJesus, outline {bigIdea, points[{text, verses?}]}, discussionQuestion.

Episode 1 ships with the section, content drawn verbatim from knowledge/marketing/sermonwise-youtube/hub-scripts-batch1.md (Episode 1 — The Sower).

Expected output — episode page (Pastor Ruth test)

A pastor landing from Google or the video description sees, in order:

  1. Header block: passage ref + "Serves Sunday, July 12, 2026 (Proper 10A)" + H1 title. Brand-consistent with the rest of /sermons.
  2. Video embed (lazy iframe, 16:9) — ONLY when youtubeVideoId is set; no broken/empty player otherwise.
  3. The prep content as structured sections with the show's segment names as H2s: The Text's Big Idea · LensLines™ · Show, Don't Tell (labeled: "an imaginative retelling — a preaching move, not exegesis") · The Detail You Missed · Sermon Title Clinic · Do's & Don'ts · Walk the Path to Jesus · The Outline. All readable as plain text (SSR — view-source shows the content).
  4. Primary CTA (appears after Outline and once mid-page): "Get the full prep pack for YOUR tradition — free" → wizard entry URL, passage prefilled if the wizard supports a query param (recon will confirm; otherwise plain wizard URL). Free-tier honesty: "Free account · 2 prep packs/month · no card."
  5. Discussion prompt mirroring the episode's pinned comment, linking to the YouTube comments when videoId exists.
  6. Footer cross-links: the Prep Desk index · the YouTube channel (https://www.youtube.com/@SermonPrepDesk) · /sermons/community.

Expected output — index page

Hero ("The Sermon Prep Desk — weekly sermon prep for working preachers, in video and in text"), channel link, then episode cards (passage, title, Sunday served, watch/read links). Sorted by servesSunday descending.

SEO / structured data (hard requirements)

  • generateMetadata per episode: title "<passageRef> Sermon Prep — <title> | SermonWise", description from bigIdea, canonical URL on the sermonwise.ai host.
  • JSON-LD: Article always; VideoObject only when videoId set.
  • Pages added to the sermons sitemap.
  • SSR/ISR — content visible to bots without JS (no client-only rendering of the prep text).

Non-goals (v1)

  • No email-capture form (Tuesday list doesn't exist yet — leave a clearly marked component seam, not a dead form).
  • No DB writes, no migrations, no per-tradition page variants (that's the separate programmatic-pages workstream, launch plan §2.2).
  • No comments/community features on these pages.

Edge cases

  • Episode without videoId → page valid, no player, no VideoObject schema, CTA unaffected.
  • Unknown slug → 404 (Next notFound()).
  • Index with 1 episode must not look broken/empty.

Verification gate (evidence-or-nothing)

  • pnpm build + lint green.
  • Deployed-URL check (Vercel preview or prod): both routes return 200; episode page view-source contains "LensLines" and outline point text (SSR proof); CTA href resolves; no console errors on load.
  • Playwright or scripted fetch evidence attached to the PR.