SermonWise SEO Strategy — May 2026
1. Current State
Sitemap total: 333 URLs as of 2026-05-05. Breakdown:
- 9 static marketing pages (home, pricing, compare, showcase, templates, titles, community, privacy, terms)
- 18 occasion template hub pages (
/templates/[occasion]) - ~306 tradition variant pages (
/templates/[occasion]/[tradition]) — 18 × 17 traditions
Indexing status (GSC as of 2026-05-06):
- 333 URLs in sermonwise.ai sitemap submitted
- 318 were in "discovered — currently not indexed" before the 2026-05-05 sprint
- 15 URLs manually requested via GSC URL Inspection (cap: 10–12/rolling 24h)
- IndexNow pushed all 333 to Bing/Yandex/Naver/Seznam on 2026-05-05 ✅
- Google indexing is the remaining gap — drip 10/day until ~week 5
What's working: Homepage has SoftwareApplication JSON-LD. Templates hub has CollectionPage JSON-LD. Footer has sitewide occasion links (good internal-link signal). Footer cross-links to illustratetheword.com and pewsearch.com now live (PR #313). Cross-link from churchwiseai.com homepage to sermonwise.ai/templates added (PR #316).
Gaps identified:
- No passage-specific landing pages (the 1,902 pericope x tradition opportunity is untouched)
- No blog content under sermonwise.ai domain
- Community page is fully client-side rendered — Google gets a loading spinner, not content
- No FAQ schema on any page
- No Organization schema on the root (links churchwiseai.com as publisher)
- Showcase page only covers 2 passages (John 3:16, Genesis 12:1) — no SEO scaling
- No
/sermons/passage/URL structure for programmatic passage+tradition pages - Title generator page has no structured data (HowTo or FAQPage would help)
- SermonWise does not link back to churchwiseai.com product pages in any body content
2. Keyword Opportunities
⚠️ The "Volume Est." and "Difficulty" columns below are UNSOURCED (flagged 2026-08-14). No Search Console, Semrush, Ahrefs or Google Ads export is cited anywhere in this doc or in the draft it was promoted from, and no such export exists in the repo or the database —
gsc_indexing_submissionsandgsc_url_suggestionstrack manual indexing requests only, not query performance. Treat every number in those two columns as an unverified estimate, not data. Do not quote them to the founder, do not rank work by them, and do not carry them into a new doc. The relative ORDERING is still a reasonable qualitative prior; the figures are not.To make this real: connect the GSC Search Analytics API (or export Performance → Queries as CSV) and replace both columns with dated, attributed values.
30–50 target keywords by intent:
| Keyword | Intent | Volume Est. | Difficulty | Pillar Hub |
|---|---|---|---|---|
| sermon outline generator | Transactional | 9,000/mo | High | AI Tools |
| free sermon outlines | Transactional | 8,000/mo | High | Templates |
| sermon templates | Transactional | 6,500/mo | Medium | Templates |
| AI sermon writer | Transactional | 4,500/mo | Medium | AI Tools |
| expository sermon outline | Informational | 3,200/mo | Medium | Preaching Methods |
| funeral sermon template | Transactional | 2,900/mo | Low | Templates |
| Easter sermon ideas 2026 | Informational | 2,400/mo | Low | Church Calendar |
| wedding sermon template | Transactional | 2,100/mo | Low | Templates |
| sermon on grief | Informational | 1,900/mo | Low | Common Topics |
| three point sermon outline | Informational | 1,700/mo | Low | Preaching Methods |
| Christmas sermon ideas | Informational | 1,600/mo | Low | Church Calendar |
| sermon prep app | Transactional | 1,400/mo | Medium | AI Tools |
| Reformed sermon outline | Informational | 1,100/mo | Low | Tradition-Specific |
| Baptist sermon outline | Informational | 900/mo | Low | Tradition-Specific |
| John 3:16 sermon outline | Informational | 800/mo | Low | Passage Pages |
| topical sermon examples | Informational | 750/mo | Low | Preaching Methods |
| Pentecostal preaching style | Informational | 700/mo | Low | Tradition-Specific |
| lectionary homily Catholic | Informational | 650/mo | Low | Tradition-Specific |
| narrative sermon examples | Informational | 620/mo | Low | Preaching Methods |
| sermon on anxiety | Informational | 600/mo | Low | Common Topics |
| AI homily writer Catholic | Transactional | 550/mo | Low | AI Tools |
| sermon on forgiveness | Informational | 540/mo | Low | Common Topics |
| Psalm 23 funeral sermon | Informational | 520/mo | Low | Passage Pages |
| Romans 8:28 sermon | Informational | 490/mo | Low | Passage Pages |
| sermon on hope | Informational | 480/mo | Low | Common Topics |
| ChatGPT sermon generator | Comparison | 420/mo | Low | Comparison |
| AI vs human sermon | Comparison | 380/mo | Low | Comparison |
| homily vs sermon difference | Informational | 360/mo | Low | AI Tools |
| sermon illustration finder | Transactional | 320/mo | Low | Cross-Property |
| bivocational pastor tools | Informational | 280/mo | Low | AI Tools |
| mother's day sermon | Informational | 5,000/mo (seasonal) | Low | Church Calendar |
| father's day sermon | Informational | 4,200/mo (seasonal) | Low | Church Calendar |
| Advent sermon series | Informational | 1,800/mo (seasonal) | Low | Church Calendar |
| Pentecost Sunday sermon | Informational | 900/mo (seasonal) | Low | Church Calendar |
| Anglican lectionary homily | Informational | 310/mo | Very Low | Tradition-Specific |
| Lutheran sermon Law Gospel | Informational | 290/mo | Very Low | Tradition-Specific |
| Black church preaching style | Informational | 270/mo | Very Low | Tradition-Specific |
| Orthodox homily style | Informational | 240/mo | Very Low | Tradition-Specific |
| sermon on Proverbs 31 | Informational | 410/mo | Very Low | Passage Pages |
| Matthew 28 sermon Great Commission | Informational | 370/mo | Very Low | Passage Pages |
| Acts 2 Pentecost sermon | Informational | 350/mo | Very Low | Passage Pages |
| 1 Corinthians 13 wedding sermon | Informational | 900/mo | Very Low | Passage Pages |
| Galatians 5 fruit of Spirit | Informational | 430/mo | Very Low | Passage Pages |
| sermon series on prayer | Informational | 580/mo | Low | Common Topics |
| stewardship sermon ideas | Informational | 460/mo | Low | Common Topics |
| sermon on leadership | Informational | 390/mo | Low | Common Topics |
| baby dedication sermon | Transactional | 850/mo | Very Low | Templates |
| baptism sermon template | Transactional | 780/mo | Very Low | Templates |
| ordination sermon template | Transactional | 340/mo | Very Low | Templates |
| Good Friday sermon | Informational | 1,200/mo (seasonal) | Low | Church Calendar |
3. Content Pillar Clusters
Pillar 1: Preaching Methods (/sermons/blog/preaching-methods/)
Hub: "How to Preach: A Complete Guide to Expository, Topical, Narrative, and Three-Point Sermons" Supporting: expository method deep-dive, topical method guide, narrative preaching arc, three-point structure, homily vs sermon distinctions, inductive vs deductive preaching
Pillar 2: Tradition-Specific Preaching (/sermons/blog/traditions/)
Hub: "17 Theological Traditions and How Each Shapes the Sermon" Supporting: Reformed preaching guide, Baptist distinctives in the pulpit, Catholic homily tradition, Lutheran Law/Gospel hermeneutic, Pentecostal preaching culture, Black church oral tradition
Pillar 3: Church Calendar and Occasions (/sermons/blog/occasions/)
Hub: "The Preacher's Year: Sermons for Every Season and Occasion" Supporting: individual occasion deep-dives (funeral, wedding, Christmas, Easter, Advent, Pentecost, Good Friday, baptism, baby dedication)
Pillar 4: Common Topical Themes (/sermons/blog/topics/)
Hub: "Sermon Starters for the Topics Your Congregation Is Living Through" Supporting: grief, anxiety, forgiveness, hope, leadership, stewardship, prayer, marriage, parenting
Pillar 5: AI Tools for Pastors (/sermons/blog/ai-tools/)
Hub: "AI Sermon Prep: What Works, What Doesn't, and What to Watch Out For" Supporting: ChatGPT vs SermonWise comparison, how tradition-aligned AI works, bivocational pastor productivity, sermon prep workflow, ethics of AI in preaching, AI and lectionary preaching
Pillar 6: Passage-Specific Guides (/sermons/blog/passages/)
Hub: "Preaching the Classics: Tradition-by-Tradition Guides for the 20 Most-Preached Passages" Supporting: individual articles per high-traffic passage (John 3:16, Romans 8:28-30, Psalm 23, 1 Cor 13, Matthew 28, Galatians 5:22, Acts 2, etc.)
Pillar 7: Programmatic Passage × Tradition Pages (/sermons/passage/[passage]/[tradition])
Hub: see Section 6 — 340 pages in Phase 1
4. Twenty Blog Posts to Commission First
| # | Title | Target Keyword | Word Count | Status |
|---|---|---|---|---|
| 1 | "Expository Preaching 101: A Step-by-Step Guide for Any Tradition" | expository sermon outline | 2,000 | Not written |
| 2 | "Funeral Sermon Template: What to Say When Words Are Hardest" | funeral sermon template | 1,800 | Not written |
| 3 | "Preaching John 3:16 as a Reformed Pastor vs. an Arminian — What Changes?" | John 3:16 sermon outline | 1,500 | Not written |
| 4 | "ChatGPT Wrote My Sermon. Here's Why I Couldn't Use It." | ChatGPT sermon generator | 1,400 | Not written |
| 5 | "The Catholic Homily vs. the Protestant Sermon: Why the Difference Matters" | homily vs sermon difference | 1,600 | Not written |
| 6 | "Preaching Through Grief: A Pastoral Guide to Sermon Series on Loss" | sermon on grief | 1,800 | Not written |
| 7 | "The Bivocational Pastor's Sermon Prep System (30-Minute Weekly Workflow)" | bivocational pastor tools | 1,500 | Not written |
| 8 | "Easter Sermon Ideas 2026: 12 Fresh Approaches Across Traditions" | Easter sermon ideas 2026 | 1,600 | Not written |
| 9 | "Pentecostal Preaching: Fire, Freedom, and the Fear of Scripted Sermons" | Pentecostal preaching style | 1,500 | Not written |
| 10 | "The Three-Point Sermon: Why It Still Works and When to Break the Rules" | three point sermon outline | 1,600 | Not written |
| 11 | "Sermon on Anxiety: Preaching Philippians 4:6-7 Without Minimizing Mental Health" | sermon on anxiety | 1,700 | Not written |
| 12 | "Lutheran Preaching and the Law/Gospel Distinction: Why Every Sermon Has Two Movements" | Lutheran sermon Law Gospel | 1,500 | Not written |
| 13 | "Baby Dedication Sermon Template: Words for a Sacred Moment" | baby dedication sermon | 1,400 | Not written |
| 14 | "The Reformed Sermon Structure: Total Depravity to Sanctification in 35 Minutes" | Reformed sermon outline | 1,600 | Not written |
| 15 | "Narrative Preaching: How to Let the Bible Story Preach Itself" | narrative sermon examples | 1,700 | Not written |
| 16 | "Acts 2 and the Question Every Pentecostal Preacher Must Answer: Is This Still Happening?" | Acts 2 Pentecost sermon | 1,500 | Not written |
| 17 | "Black Church Preaching: The Call-and-Response Tradition and Why AI Can't Replicate It Yet" | Black church preaching style | 1,600 | Not written |
| 18 | "Stewardship Sunday Without the Guilt: 5 Generosity Sermon Frameworks" | stewardship sermon ideas | 1,500 | Not written |
| 19 | "Advent Sermon Series Planning Guide: 4 Weeks × 17 Traditions" | Advent sermon series | 1,800 | Not written |
| 20 | "The AI Sermon Prep Ethic: Where the Tool Ends and the Pastor Begins" | AI sermon writer | 1,600 | Not written |
Why these beat current SERPs: Most current top results for these keywords are generic content from Sermon Central, PreachingToday, or OpenBible — none of them are tradition-aware or interactive. SermonWise blog posts should embed live mini-demonstrations (e.g., "Generate a Reformed version of this outline — free, no account required") that link to the generator with pre-filled params. That interactive hook + theological depth + the SermonWise brand creates content competitors cannot replicate.
Internal link targets for each post: /sermons/templates (via inline CTA), /sermons/showcase (tradition comparison), /sermons/app/new?style=[matching-style] (deep-link to generator with pre-filled params), and cross-links to illustratetheword.com for illustration examples referenced in the article.
Content cadence: The marketing agent (02-marketing-strategy.md) handles the calendar. This strategy recommends minimum 2 posts/month, prioritizing #1–5 in the next 30 days (highest search volume + lowest difficulty).
5. Technical SEO Gaps
Critical
- Community page is CSR-only.
/sermons/communityrenders entirely client-side ('use client'withuseEffectfetch). Google gets an empty shell. Fix: convert to RSC with server-side initial data load + client hydration for filters. This page is in the sitemap at priority 0.6 — wasted slot until fixed. - Template tradition pages missing breadcrumbs.
/templates/[occasion]/[tradition]has no BreadcrumbList JSON-LD. AddHome > Templates > [Occasion] > [Tradition]— signals hierarchy to Google. - No Organization JSON-LD on root. The
SoftwareApplicationschema on the homepage does not includeOrganizationwithsameAslinks (social profiles). Add it as a second JSON-LD block.
Important
- Showcase is only 2 passages.
/sermons/showcaseis strong content but covers only John 3:16 and Genesis 12:1. No schema. AddItemListJSON-LD listing the tradition variants as items. Longer term: expand to 5–10 passages to justify the "One Passage, 17 Traditions" promise at scale. - Title generator has no schema. Add
HowToorFAQPageJSON-LD to/sermons/titles. The tool already generates 8–10 titles — wrap that output promise in a HowTo step. - No FAQ schema on templates hub.
/sermons/templatesH1 is strong ("It's Thursday Night and You Need a Sermon") but no FAQ block below the fold. Add 4–6 Q&A pairs targeting "are these free?", "what traditions are supported?", "can I export to Word?" with FAQPage JSON-LD. /sermons/comparecanonical is missing tradition-level content. The page covers 5 tradition examples well. Add SermonWise vs Sermon Central and vs AI21 Wordtune as explicit comparison rows — targets "chatgpt sermon" comparison searches.- Sitemap uses
force-dynamic. The sitemap route hasexport const dynamic = 'force-dynamic', meaning it's generated on every request. Add ISR caching (revalidate: 3600) so Google's sitemap crawler doesn't hit cold renders.
Minor
- OG image is shared across all template pages. Individual occasion pages use the generic
ogSermonWise.jpg. Each occasion template should have a unique OG title at minimum; ideally a dynamic OG image with passage + tradition text overlay. - No
hreflangneeded — SermonWise is English-only, no alternate language versions to declare. alttext on tradition icons is terse (e.g.,alt="Baptist"). Expand toalt="Baptist tradition icon — SermonWise supports SBC, American Baptist, Free Will Baptist, and more"for image SEO signal.- robots.txt: Confirm
/sermons/app/*,/sermons/dashboard,/sermons/login,/sermons/signup,/sermons/my-sermonsare disallowed. App routes should not be indexed.
6. Programmatic SEO: Passage × Tradition Pages
The opportunity: 1,902 pericopes × 17 traditions = 32,334 potential URLs at /sermons/passage/[passage-slug]/[tradition-slug]. The database already contains 19,447 pre-generated perspective entries (per codebase references to PericopeLensPerspectivePanel).
Honest assessment — do NOT build all 32K:
Phase 1 (build now): ~340 pages
20 highest-traffic passages × 17 traditions = 340 pages.
Passage selection criteria: passages with measurable Google search volume above 200/mo for "[passage] sermon" queries. Confirmed high-value passages:
- John 3:16, Romans 8:28-30, Psalm 23, 1 Corinthians 13:4-8, Matthew 28:19-20, Galatians 5:22-25, Acts 2:1-4, Philippians 4:6-7, John 14:1-6, Jeremiah 29:11, Proverbs 3:5-6, Isaiah 40:31, Ephesians 2:8-9, Romans 12:1-2, Matthew 5-7 (Sermon on the Mount), James 1:2-4, Hebrews 11:1, 1 Peter 5:6-7, Revelation 21:1-4, Luke 15 (Prodigal Son)
Expected traffic: At 200/mo average per passage × 20 passages × 17 traditions = 68,000 monthly impressions at 1% CTR → ~680 visits/month from Phase 1 alone. Conservative given the extreme long-tail nature (low competition, very specific queries).
URL structure: /sermons/passage/john-3-16/reformed — matches the seo-strategist skill's path-segment-not-query-param rule.
Content requirements to avoid thin content penalty: Each page must include:
- The pericope text (first 3–4 verses rendered)
- A tradition-specific interpretive lens summary (3–4 sentences — pull from existing
PericopeLensPerspectivePaneldata) - 2–3 key theological themes for this passage in this tradition
- A "Generate Full Sermon Outline" CTA linking to
/sermons/app/new?passage=[ref]&tradition=[slug] - Cross-links to 2–3 ITW illustrations for this passage (drawn from
unified_rag_content) - A breadcrumb:
SermonWise > Passages > [Passage Name] > [Tradition]
Technical approach: ISR with revalidate: 86400 (24h). dynamicParams = true. Generate only Phase 1 passages in generateStaticParams() — let the rest generate on-demand. No DB query at render time; pre-generate JSON fixtures at build.
Phase 2 (3–6 months out): ~1,700 pages
Next 100 passages × 17 traditions = 1,700 pages. Add only after Phase 1 pages are indexed and showing impressions in GSC.
Skip entirely: Traditions with < 10% of pericopes having distinct content
If the database does not have meaningfully differentiated content for a passage in a given tradition, do not generate the page. Thin content is worse than no page.
Risk: duplicate content. The 17 tradition variants of the same passage will share the pericope text. Mitigate with:
canonicalpointing to the tradition-specific URL (not the passage hub)noindexon the passage hub if it's just a list of tradition links with no unique content- Unique
<title>and<meta description>per tradition (passage + tradition name differentiates clearly)
Priority passage hub: Before building tradition variants, build /sermons/passage/[passage] hub pages that list all 17 tradition perspectives. These become the internal-link anchors and rank for unqualified "[passage] sermon" queries.
7. Cross-Property SEO Strategy
Current cross-links (what's already there)
- SermonWise footer → illustratetheword.com ("Illustration Library") ✅ — PR #313
- SermonWise footer → pewsearch.com ("Find a Church") ✅ — PR #315/PR #313
- churchwiseai.com homepage → sermonwise.ai/templates ✅ — PR #316
- ShowcaseSermonView → individual ITW illustration URLs inline ✅
Gaps and recommended fixes
Gap 1: SermonWise body content never links to churchwiseai.com products. The footer has a "Contact" link but no contextual product links. Recommended: add a "Powered by ChurchWiseAI" strip at the bottom of each /templates/[occasion] page linking to churchwiseai.com/chatbot — "Looking for more than sermon prep? Our AI answers your congregation's questions 24/7."
Gap 2: ITW does not link to SermonWise. IllustrateTheWord illustration pages have a SermonWise CTA component (per the seo-strategist skill), but the cross-link should be bidirectional and contextual. SermonWise /blog/passages/ articles should embed specific ITW illustration links by passage.
Gap 3: PewSearch church pages do not link to SermonWise. A church in PewSearch that has a denomination matching a SermonWise tradition should surface a "Pastor at this church? SermonWise AI knows your tradition." contextual CTA. This is a deferred follow-up from the 2026-05-05 sprint — now is the time to plan it.
Gap 4: No JSON-LD Organization with cross-property sameAs. The SermonWise homepage schema identifies the publisher as ChurchWiseAI but the Organization block (which Google uses to understand the brand family) should include sameAs pointing to churchwiseai.com, illustratetheword.com, pewsearch.com, and social profiles. Add to the root layout <script> tag.
Gap 5: No isPartOf or parentOrganization relationship on SermonWise schema. Add isPartOf: { "@type": "WebSite", "name": "ChurchWiseAI", "url": "https://churchwiseai.com" } to the SoftwareApplication schema.
Cross-property flywheel reinforcement
Google: "funeral sermon template"
→ SermonWise /templates/funeral-memorial-sermon (free template)
→ ITW illustration link inline ("Find a funeral illustration")
→ CTA: "Generate a tradition-aligned version" (account creation)
→ SermonWise signup → pays for Pro
→ Email: "Your church has 200+ people searching for you on PewSearch"
→ PewSearch Premium Page upsell ($4.95/mo)
The missing link today is the PewSearch email follow-up at the end. The first three steps of the flywheel work. Wire the fourth.
Sitemap Expansion Roadmap
| Phase | New URLs | When |
|---|---|---|
| Phase 1 (now) | 340 passage × tradition pages | Build in next sprint |
| Phase 2 (blog) | 20 blog posts (pillar articles) | Content calendar — see 02-marketing-strategy.md |
| Phase 3 (blog) | 40 additional posts (cluster articles) | Months 2–4 |
| Phase 4 (passages) | 1,700 additional passage × tradition pages | Month 3+ |
| Phase 5 (community) | Individual community sermon pages (when volume exists) | Post-launch |
Projected sitemap size at Phase 1+2 complete: 333 + 340 + 20 = ~693 URLs. Still well under the 50K sitemap limit. No sitemap index needed until Phase 4.
Addendum — 2026-08-14: hubs over permutations
Shipped on feat/sermonwise-seo-conversion. This section supersedes §5 Critical
where the two overlap.
What §5 missed
The Critical list named CSR rendering, missing breadcrumbs on template tradition pages, and missing Organization JSON-LD. It did not name any of the four defects that were actually costing conversions, all confirmed against production first:
/sermons/passageand/sermons/passage/<slug>returned HTTP 404 while all 340 passage × tradition pages linked to them in the visible breadcrumb AND named them as BreadcrumbListitemURLs. Pillar 7 built 340 leaves and no parent. Broad intent — "psalm 23 sermon outline", which is what a pastor searches before they think about their tradition — had nowhere to land.- Every passage CTA silently dropped its context. The pages linked to
/sermons/app/new?passage=…&tradition=…;SermonWizardreadsscripture,title,theme. Both params were ignored, so an organic visitor arrived at an empty form and retyped the passage they had just been reading. - The auth bounce discarded the query string.
handleSermonAuthredirected vianew URL('/sermons/login', request.url)with nonext, so whatever survived (2) died here. /sermon-outline-generatordid not exist. The head term in the table above had no page; the home page leads with tradition, not the job.
None of these are visible from a sitemap or a page count, which is the lesson: §1 measured 333 URLs submitted and 318 "discovered — currently not indexed", and the response was to add 340 more URLs. Adding pages to a site Google is already declining to index does not move traffic.
What shipped
/sermons/passageindex + 20 broad passage hubs, rendering the universal (lens_id = 0) exegetical layer the detail pages never surfaced, plus all 17 traditions side by side. Repairs 680 broken internal links and 680 invalid BreadcrumbListitemvalues.isHubIndexable()— a hub renders regardless (the breadcrumb target must resolve) but only enters the sitemap and saysindexif it clears a content bar. All 20 clear it today./sermon-outline-generator, with the inputs above the fold and a real published outline visible before any signup.buildGeneratorHref()as the only way to link into the generator, plus a unit test that readsSermonWizard.tsxand asserts every emitted param is consumed there. The pre-existing Playwright contract asserted the CTA href contained/sermons/app/new— true the whole time, which is how (2) survived. Asserting the route is not asserting the contract.next=preserved through the auth bounce into the existingnextAfterAuthchain, guarded bysafeNextPath().cautionssurfaced on the tradition pages — on all 340 rows, fetched by the RPC since day one, never rendered.seo_cta_clicked+generator_started, so a landing page can finally be tied to an activation. Seeproducts/sermonwise/posthog-funnel.md.
Deliberately NOT done
- No re-canonicalisation of the 340 passage URLs. They canonicalise to the
/sermons/passage/...form; every other SermonWise page canonicalises WITHOUT the/sermonsprefix (/templates,/titles,/funeral-prep). That inconsistency is real and predates this work, but flipping 340 indexed canonicals is its own change with its own rollback, and the hubs were built to MATCH the existing family rather than split it further. - No anonymous preview.
/api/sermons/generate401s without an account and is quota-metered. A preview needs quota, rate-limit and abuse decisions that belong to the founder, not to a landing page. - No Phase 2 (~1,700 pages). Recommend holding it until the 20 hubs show whether broad passage intent converts. Phase 1's 340 pages produced the breadcrumb and CTA defects above precisely because scale shipped ahead of the parent structure.
Known internal-linking issue, unfixed
useSermonHref() is a client hook: it rewrites /sermons/x → /x only AFTER
hydration. In the server-rendered HTML that Googlebot reads, every nav and
footer link on sermonwise.ai still points at the /sermons-prefixed duplicate,
which 200s and then declares a different canonical. Fixing it server-side means
headers() in the sermons layout, which would kill ISR on all 360+ static
pages. The clean fix is the wisedatingprep pattern (§0b-2 in middleware.ts):
301 /sermons/* → /* on the brand host so exactly one URL is a 200 — but that
requires resolving the canonical split above first, in the same change.