SermonWise Pro — Expected Output Spec
Status: COMPLETE -- Agent-derived from codebase analysis. Flagged items require founder confirmation.
Product: SermonWise Pro | Price: $19.95/mo ($199.50/yr) | Trial: None (free tier is the trial)
URL: sermonwise.ai (hostname rewrite -> churchwiseai-web /sermons)
Auth: Supabase Auth (email/password + Google OAuth)
Codebase: churchwiseai-web/src/app/sermons/
How to Read This Spec
SermonWise has two tiers: Free (2 outlines/month) and Pro (15 outlines/month). This spec covers both, with Pro-specific features called out:
Pro only: ...
Free tier: ...
User State Definition
Free Tier
| Field | Value |
|---|---|
| Plan | free (no Stripe subscription) |
| Auth | Supabase Auth (email + password OR Google OAuth) |
| Monthly limit | 2 sermon outlines |
| Theological traditions | All 17 |
| RAG illustrations | Yes |
| Export | Copy + Word |
| Save to library | Yes |
| Derivative materials | Yes (Small Group Guide, Children's Sermon, Social Media Posts) |
| Title Generator | Yes |
| Templates | Yes |
| Community | Yes (browse) |
Pro Tier
| Field | Value |
|---|---|
| Plan | sermon_pro (or sermon_pro_annual) |
| Auth | Supabase Auth |
| Monthly limit | 15 sermon outlines |
| Theological traditions | All 17 |
| RAG illustrations | Yes |
| Export | Copy + Word |
| Save to library | Yes |
| Derivative materials | Yes |
| Title Generator | Yes |
| Templates | Yes |
| Community | Yes |
| Premium AI model | Yes (deeper, more nuanced outlines) |
| Sermon series planning | REMOVED — not built. Backlogged for future development. Must be removed from pricing page copy. |
A. Discovery & Marketing (Touchpoints 1--4)
Touchpoint 1: Marketing Landing Page
URL: https://sermonwise.ai/ (hostname rewrite to /sermons)
Component: churchwiseai-web/src/app/sermons/page.tsx
Should See:
SermonNavheader with SermonWise branding- Video background hero (
SermonHerowithsw-hero.mp4): text transitions left-to-right as video plays - "Why Pastors Choose SermonWise" -- 6 feature cards:
- 17 Theological Traditions (Reformed, Baptist, Catholic, Lutheran, Pentecostal, Orthodox, and more)
- Real Illustrations, Not Hallucinations (300,000+ curated theological resources)
- Preaching Styles That Fit Your Voice (Expository, Topical, Narrative, Devotional)
- Built for Your People (youth, mixed, seniors, specific contexts)
- Simple Export, No Lock-In (Copy/export to Word, Google Docs)
- Built for Ministry, Not Just Content (From the team behind ChurchWiseAI)
- 17 tradition icons strip (visual display of supported traditions)
- 4-step "How it works" section
- Pricing section embedded: Free ($0) and Pro ($19.95/mo) cards with features
VideoTransitionbetween sectionsScrollRevealanimations on sectionsSermonFooterwith links- JSON-LD structured data
Should NOT See:
- CWA voice/chatbot pricing
- PewSearch branding
- Complex multi-tier pricing (just Free and Pro)
CTA -> Destination:
- "Get Started Free" ->
/sermons/signup - "Upgrade to Pro" ->
/sermons/pricingor Stripe checkout (viaSermonUpgradeButton) - "Learn more" links within feature cards
Touchpoint 2: Pricing Page
URL: https://sermonwise.ai/pricing (-> /sermons/pricing)
Component: churchwiseai-web/src/app/sermons/pricing/page.tsx
Should See:
- Dark hero: "Simple, Honest Pricing" with gold radial glow
- Two pricing cards:
- Free: $0, no credit card required
- 2 sermon outlines per month
- 17 theological traditions
- RAG-powered illustrations
- Copy & export to Word
- Save to library
- CTA: "Get Started Free" ->
/sermons/signup
- Pro ($19.95/mo): "Most Popular" badge
- 15 sermon outlines per month
- Everything in Free
- Premium AI model (deeper, more nuanced outlines)
Sermon series planningREMOVED — not built. Must be deleted from this card before launch.- CTA: "Upgrade to Pro" -> Stripe checkout (via
SermonUpgradeButton)
- Free: $0, no credit card required
- Annual pricing option: $199.50/yr (~$16.63/mo, save ~17%)
- FAQ section:
- "Can I really use SermonWise AI for free?" -> Yes, 2 outlines/month
- "What does 'Premium AI model' mean?" -> More capable model for Pro
- "Can I switch between monthly and annual billing?" -> Yes, from account settings
- "What happens if I hit my monthly limit?" -> Can still access saved sermons, no new generation until reset
- "Can I cancel anytime?" -> Yes, no contracts
ScrollRevealanimations on cards
Should NOT See:
- CWA chat/voice pricing tiers
- Annual toggle visible by default (may be shown on card or as tab)
CTA -> Destination:
- "Get Started Free" ->
/sermons/signup - "Upgrade to Pro" -> Stripe checkout
RESOLVED — ACTION REQUIRED BEFORE LAUNCH:
"Sermon series planning" was listed as a Pro feature but is NOT built. Per interview-action-items.md #9, this must be removed from the pricing page before launch. Do not build it now — it is backlogged. The pricing page copy (/sermons/pricing) and any marketing copy referencing this feature must be updated. This is a launch blocker.
Implementation Note: "Sermon series planning" was removed from 3 locations simultaneously: churchwiseai-web/src/lib/sermon-pricing.ts, churchwiseai-web/src/content/docs/sermonwise/overview.md, and churchwiseai-web/src/content/docs/sermonwise/billing.md. If this feature is later built and approved, it must be added back to ALL THREE files at the same time.
Touchpoint 3: SEO Landing Pages
URL: https://sermonwise.ai/compare/[slug], https://sermonwise.ai/showcase
Component: churchwiseai-web/src/app/sermons/compare/, showcase/
Should See:
- Comparison pages against other sermon tools (SEO content)
- Showcase of generated sermon examples
Touchpoint 4: Cross-Promotion from CWA/ITW
URL: https://churchwiseai.com/ (homepage ecosystem section)
Should See:
- SermonWise mentioned in the ChurchWiseAI ecosystem products section
- "SermonWise AI -- AI Sermon Preparation Tools" with link to sermonwise.ai
B. Signup & Onboarding (Touchpoints 5--9)
Touchpoint 5: Signup Page
URL: https://sermonwise.ai/signup (-> /sermons/signup)
Component: churchwiseai-web/src/app/sermons/signup/page.tsx
Implementation Note: This page (and the login page) has two email inputs — the auth form and a footer newsletter subscription input. Use .first() or a data-testid selector to target the auth form email field and avoid strict mode violations.
Should See:
- Dark hero background (gradient from stone-900 to stone-800)
- White card centered:
- "Create Your Account" heading (serif font)
- "Start generating sermon outlines for free" subtext
SignupFormcomponent with:- Google OAuth button
- Email + password form (name, email, password, confirm)
- Tradition dropdown (17 flat options with descriptive labels, e.g. "Reformed (Presbyterian, PCA, OPC)", "Baptist (SBC, Independent)" —
data-testid="cw-signup-auth-tradition") - Newsletter opt-in: "Email me sermon tips, new templates, and feature updates"
- Cloudflare Turnstile captcha
- "Create Account" button (gold accent)
- "Already have an account? Sign in" ->
/sermons/login
appSource = "sermon_starter"(tracks source in Supabase)
Implementation Note (tradition flow): Tradition is captured at signup (not post-signup onboarding gate). On signup it is stored in user_metadata.tradition. The auth callback (/auth/callback) reads this and writes theological_lens_id to the profiles table. Because profiles has the lens set, the OnboardingGate component does NOT redirect to /sermons/app/onboarding — user goes straight to the app. This was fixed 2026-04-03.
Should NOT See:
- Church name fields
- Cascading denomination family picker (signup uses flat 17-option list)
- Credit card fields
- CWA branding in the form
CTA -> Destination:
- "Create Account" -> email confirmation ->
/auth/callback->/sermons/app - "Sign in" ->
/sermons/login
Touchpoint 6: Login Page
URL: https://sermonwise.ai/login (-> /sermons/login)
Component: churchwiseai-web/src/app/sermons/login/page.tsx
Implementation Note: Same dual-email-input pattern as the signup page — footer newsletter input coexists with the auth form. Use .first() or a data-testid selector to target the auth form email field.
Should See:
- Email + password login form
- Google OAuth option
- "Forgot password?" link ->
/sermons/forgot-password - "Don't have an account? Sign up" ->
/sermons/signup
Touchpoint 7: Onboarding Gate
URL: https://sermonwise.ai/app/onboarding (-> /sermons/app/onboarding)
Component: churchwiseai-web/src/app/sermons/app/onboarding/page.tsx
Current behavior (as of 2026-04-03): Tradition is now collected at signup (Touchpoint 5). The auth callback writes theological_lens_id to profiles on first login. The OnboardingGate checks profiles.theological_lens_id — users who signed up via the form (and picked a tradition) skip this page entirely and land directly on /sermons/app.
This page is only reached by:
- Google OAuth signups (tradition not collected during OAuth flow)
- Legacy accounts that signed up before the tradition selector was added to signup
Should See (for Google OAuth users):
- Denomination/tradition picker -- single question
- Dropdown with 17 tradition options matching the signup page list
- "Save & Continue" button
- Saves
user_metadata.traditionand writestheological_lens_idtoprofiles
Should NOT See:
- Multiple onboarding questions (just one: tradition)
- Church info fields
- Pricing or upgrade prompts
Behavior:
OnboardingGatecomponent wraps all/sermons/app/*pages- Checks if user has
traditionin user_metadata ordenominationin profiles table - If not set: redirects to onboarding
- If set: passes through to the app
CTA -> Destination:
- "Save & Continue" ->
/sermons/app(dashboard)
Touchpoint 8: First Dashboard Visit
URL: https://sermonwise.ai/app (-> /sermons/app)
Component: churchwiseai-web/src/app/sermons/app/page.tsx
Should See:
CrossPromoBanner(dismissible navy bar): "Your AI ministry team goes beyond sermons. Explore ChurchWiseAI Voice + Chat ->"SermonAppHeaderwith navigation- Empty state dashboard (no sermons yet):
- Stats showing zeros (Time Saved: 0h, Sermons: 0, Materials: 0, Traditions: 0/17)
- Usage badge in header: "2 remaining" (green) for Free tier
- Prominent "+ New Sermon" button
- Empty sermon list with "Create your first sermon" prompt
- If upgraded just now (
?upgraded=true): Green banner "Welcome to SermonWise Pro! You now have 15 sermon outlines per month."
Should NOT See:
- Complex onboarding wizard
- Locked features for free users (everything visible, just usage-limited)
Touchpoint 9: App Header (All Pages)
URL: Any /sermons/app/* page
Component: churchwiseai-web/src/components/sermons/SermonAppHeader.tsx
Should See:
- Logo: "SermonWise" (navy serif) + "AI" (gold badge)
- Nav links: My Sermons | Title Generator | Templates | Community
- Usage badge:
- Free: "X/2" remaining (green when > 0, red when 0)
- Pro: "X/15" remaining (green when > 0, red when 0)
- "+ New Sermon" button (gold accent)
- User dropdown: Profile name, Sign Out
- Mobile: hamburger menu
C. Core Feature Experience (Touchpoints 10--17)
Touchpoint 10: New Sermon Wizard -- Step 1 (Scripture)
URL: https://sermonwise.ai/app/new (-> /sermons/app/new)
Component: churchwiseai-web/src/components/sermons/SermonWizard.tsx (step 1)
Should See:
- Scripture passage text input (primary)
- Optional theme/topic input
- Lectionary suggestions shown below (auto-detected from RCL calendar)
- Step indicator: 1 of 4
- "Next" button
Should NOT See:
- Credit card or pricing (generation is the natural gating point via usage limits)
Touchpoint 11: New Sermon Wizard -- Step 2 (Theological Lens)
Component: SermonWizard.tsx (step 2)
Should See:
- 17 theological traditions displayed (cards or grid)
- User's default tradition pre-selected (from onboarding)
- Can change for this specific sermon
- Each tradition with icon/badge and brief description
- "Next" button
Touchpoint 12: New Sermon Wizard -- Step 3 (Preaching Method)
Component: SermonWizard.tsx (step 3)
Should See:
- AI-recommended preaching methods based on the passage
- Fit scores for each method (how well it suits the passage)
- User selects one method
- Methods include various homiletical approaches
- "Next" button
Touchpoint 13: New Sermon Wizard -- Step 4 (Style + Generate)
Component: SermonWizard.tsx (step 4)
Should See:
- Sermon style selection: Expository, Topical, Narrative, Devotional
- Audience selection: 8 options (youth, mixed, seniors, etc.)
- Voice style: Additional tone customization
- "Generate Sermon Outline" button (primary action)
- Usage remaining indicator
Free vs Pro difference:
Free tier: Uses standard AI model Pro only: Uses premium AI model (richer, more nuanced output)
When usage limit reached (0 remaining):
- Generate button disabled or shows upgrade prompt
- "Upgrade to Pro for 15 outlines/month" CTA
- Can still browse saved sermons and generate derivatives
Touchpoint 14: Generated Sermon Outline
URL: https://sermonwise.ai/app/[id] (-> /sermons/app/[id])
Component: churchwiseai-web/src/app/sermons/app/[id]/page.tsx
Should See:
- Full sermon outline (title, scripture, structure, illustrations, application)
- RAG-powered illustrations from
unified_rag_content(300K+ resources) - Theological lens applied (tradition-specific language and emphasis)
- Copy button (clipboard)
- Export to Word option
- Save to library (automatic)
- Derivative materials section:
- Small Group Guide (generate from this outline)
- Children's Sermon (generate from this outline)
- Social Media Posts (generate from this outline)
- Sermon metadata: scripture, tradition, style, audience, date created
Should NOT See:
- Paywall on already-generated content (if they had remaining quota when generated)
- "Upgrade" prompts interrupting the content
Touchpoint 15: Derivative Materials
URL: Same as Touchpoint 14 (embedded on sermon detail page)
Should See:
- Three derivative cards: Small Group Guide, Children's Sermon, Social Media Posts
- Click to generate each derivative
- Generated derivative displayed inline or in modal
- Copy/export for each derivative
- Derivative count reflected in dashboard stats
Free vs Pro:
Both Free and Pro users can generate derivatives from their saved sermons (not gated).
Touchpoint 16: Title Generator
URL: https://sermonwise.ai/titles (-> /sermons/titles)
Component: churchwiseai-web/src/app/sermons/titles/page.tsx
Should See:
- Input field for scripture passage or topic
- Generate button
- List of AI-generated sermon title suggestions
- Select/save functionality
Free vs Pro:
Available to all users (not gated).
Touchpoint 17: Templates & Community
URL: https://sermonwise.ai/templates and https://sermonwise.ai/community
Component: churchwiseai-web/src/app/sermons/templates/page.tsx, community/page.tsx
Templates Should See:
- Pre-built sermon outline templates
- Browse by style, tradition, topic
- Use template as starting point for new sermon
Community Should See:
- Sermons other pastors have made public
- Browse/search functionality
- Inspiration for sermon prep
D. Dashboard Experience (Touchpoints 18--20)
Touchpoint 18: Dashboard with Sermons
URL: https://sermonwise.ai/app
Component: churchwiseai-web/src/app/sermons/app/page.tsx
Should See:
- 5 stat cards:
- Time Saved (calculated as ~2 hours per sermon)
- Sermons (total created)
- Materials (total derivatives)
- Traditions (X/17 explored)
- Usage Remaining (X/15 for Pro, X/2 for Free)
- Sermons by Bible Book donut chart
- Scripture Balance (OT vs NT %)
- Traditions Explored progress bar
- Sermon list: All saved sermons with:
- Title, scripture reference, tradition, style, date
- Derivative count badge
- Search/filter within sermons
- "+ New Sermon" button
All users (Free + Pro):
All saved sermons visible regardless of tier. No past sermons hidden even if limit is reached.
Touchpoint 19: Usage Limit Reached (Free Tier)
URL: https://sermonwise.ai/app
Should See:
- Usage badge: "0 remaining" in red
- Sermon list still fully accessible (view, export, derivative generation)
- New sermon generation blocked
- Soft upgrade CTA: "Upgrade to Pro for 15 outlines per month"
- Count resets on the 1st of next month
Should NOT See:
- Full-page paywall blocking access to saved content
- Aggressive urgency language
- Locked past sermons
Touchpoint 20: Usage Limit Reached (Pro Tier)
URL: https://sermonwise.ai/app
Should See:
- Usage badge: "0 remaining" in red (out of 15)
- Same behavior as free: saved sermons accessible, new generation blocked
- No upgrade path shown (already on highest tier)
- Reset on 1st of next month
E. Cross-Sell & Ecosystem (Touchpoints 21--22)
Touchpoint 21: CWA Cross-Promotion Banner
URL: All /sermons/app/* pages
Component: churchwiseai-web/src/components/sermons/CrossPromoBanner.tsx
Should See:
- Navy bar at top of app: "Your AI ministry team goes beyond sermons."
- Link: "Explore ChurchWiseAI Voice + Chat ->" (gold text)
- Links to
churchwiseai.com/voice - Dismissible via X button
- Shows for ALL users (free and Pro)
Should NOT See:
- Undismissible banner (respects user choice)
- Banner reappearing after dismissal in same session
Touchpoint 22: SermonWise Footer
URL: All marketing pages (/sermons, /sermons/pricing, /sermons/terms, etc.)
Component: churchwiseai-web/src/components/sermons/SermonFooter.tsx
Should See:
- SermonWise AI branding
- Links: Pricing, Privacy, Terms
- Ecosystem mention: "From the team behind ChurchWiseAI"
- Copyright: ChurchWiseAI LTD
F. Lifecycle & Billing (Touchpoints 23--30)
Touchpoint 23: Upgrade Flow
URL: Various (pricing page, dashboard upgrade CTA, usage limit prompt)
Component: SermonUpgradeButton component
Should See:
SermonUpgradeButtonhandles upgrade via Stripe checkout- Redirects to Stripe for payment
- After success: redirect to
/sermons/app?upgraded=true - Dashboard shows green banner: "Welcome to SermonWise Pro!"
- Usage badge updates to X/15
Touchpoint 24: Stripe Checkout (Upgrade)
URL: Stripe hosted checkout
Should See:
- Product: "SermonWise Pro" -- $19.95/mo (or $199.50/yr for annual)
- No trial period
- Email pre-filled from Supabase Auth
- Standard Stripe fields
Touchpoint 25: Payment Failed
Should See:
- Stripe automatic retries
- After all retries fail: subscription lapses, user reverts to Free tier
- All saved sermons preserved
FLAGGED FOR FOUNDER REVIEW:
No custom payment failure handling exists. Recommendation: add a banner in the app header when subscription is past_due, with link to update billing.
Touchpoint 26: Cancellation
Should See:
- Access continues until end of billing period
- After period: usage limit drops from 15 to 2 (free tier)
- ALL saved sermons remain accessible (soft delete pattern)
- Can still view, export, and generate derivatives from existing sermons
- Can still generate 2 new outlines per month
Touchpoint 27: Re-subscription
Should See:
- Standard Stripe checkout flow
- All past sermons immediately accessible at Pro level
- Usage limit restored to 15
Touchpoint 28: Billing Management
FLAGGED FOR FOUNDER REVIEW -- CRITICAL GAP:
No billing management exists in the SermonWise app. There is no settings page, no "Manage Subscription" link, no way for a Pro subscriber to:
- View their subscription status
- Cancel their subscription
- Switch between monthly and annual billing
- Update their payment method
The pricing page FAQ says "You can switch at any time from your account settings" -- but no account settings page exists.
Minimum requirement before launch:
- Add "Manage Subscription" link in the user dropdown menu
- Route to Stripe Customer Portal via API call
Touchpoint 29: Password Reset
URL: https://sermonwise.ai/forgot-password and /update-password
Component: churchwiseai-web/src/app/sermons/forgot-password/ and /update-password/
Should See:
- Standard Supabase Auth password reset flow
- Email with reset link
- Update password form
Touchpoint 30: Account Deletion
FLAGGED FOR FOUNDER REVIEW:
No account deletion mechanism exists within the SermonWise app. The Supabase Auth user account is shared across all CWA properties. Deleting the account would affect SermonWise, CWA, and any other services using the same Supabase Auth.
Decision needed: Should SermonWise have its own "Delete Account" button? Or should users contact support? Consider GDPR/privacy requirements.
Gaps and Issues Summary
| Issue | Severity | Status | Details |
|---|---|---|---|
| Sermon series planning not built | HIGH | NOT YET BUILT — REMOVE FROM PRICING (launch blocker) | Listed on pricing page as Pro feature, does not exist in codebase. Remove the claim immediately; backlog the feature. |
| No settings/billing page | HIGH | RESOLVED 2026-04-24 | "Manage Subscription" button lives in SermonAppHeader for Pro users → POSTs /api/sermons/portal → Stripe billing portal session. Verified on re-stamp 2026-04-24. |
| No welcome email | MEDIUM | RESOLVED 2026-04-24 (FA-077) | sendSermonWelcomeEmail() (src/lib/sermon-welcome-email.ts) fires from auth/callback on first login for app_source='sermon_starter'. Sends branded welcome via Resend (SES fallback). Dedup stored in user_metadata.welcome_email_sent_at. MailerLite group sync (SERMONWISE_USERS) still runs for long-term newsletter nurture. |
| No payment failure handling | MEDIUM | NOT YET BUILT | No banner, no email when payment fails. Recommendation: add a past_due banner in SermonAppHeader + custom email. |
| No cancellation email | LOW | NOT YET BUILT | User gets no confirmation when they cancel. Recommendation: Stripe webhook -> MailerLite cancellation automation. |
| No account deletion | MEDIUM | NOT YET BUILT | No way to delete account from within the app. Decision needed: shared Supabase Auth with all CWA properties — support contact may be the right answer. |
| FAQ copy/reality mismatch | MEDIUM | NOT YET BUILT | FAQ says "switch from account settings" but no settings page exists. Fix: update FAQ copy until settings page is built. |
Playwright Test Hints
// Touchpoint 1: Marketing page loads with features
test('marketing page shows 6 feature cards', async ({ page }) => {
await page.goto('https://sermonwise.ai');
await expect(page.getByText('17 Theological Traditions')).toBeVisible();
await expect(page.getByText('Real Illustrations')).toBeVisible();
});
// Touchpoint 2: Pricing shows Free and Pro
test('pricing page shows Free and Pro tiers', async ({ page }) => {
await page.goto('https://sermonwise.ai/pricing');
await expect(page.getByText('Free')).toBeVisible();
await expect(page.getByText('$19.95')).toBeVisible();
await expect(page.getByText('Most Popular')).toBeVisible();
});
// Touchpoint 5: Signup page renders
test('signup page has create account form', async ({ page }) => {
await page.goto('https://sermonwise.ai/signup');
await expect(page.getByText('Create Your Account')).toBeVisible();
await expect(page.getByText('Start generating sermon outlines for free')).toBeVisible();
});
// Touchpoint 7: Onboarding gate redirects
test('app redirects to onboarding without tradition set', async ({ page }) => {
// Login as new user without tradition
await page.goto('https://sermonwise.ai/app');
// Should redirect to onboarding
await expect(page).toHaveURL(/onboarding/);
});
// Touchpoint 8: Dashboard shows stats
test('dashboard shows 5 stat cards', async ({ page }) => {
// Login as user with tradition set
await page.goto('https://sermonwise.ai/app');
await expect(page.getByText('Time Saved')).toBeVisible();
await expect(page.getByText('remaining')).toBeVisible();
});
// Touchpoint 9: Header shows usage badge
test('header shows usage remaining', async ({ page }) => {
await page.goto('https://sermonwise.ai/app');
// Usage badge should show X/2 for free or X/15 for pro
await expect(page.getByText(/\d+\/\d+/)).toBeVisible();
});
// Touchpoint 21: Cross promo banner visible
test('cross promo banner shows CWA link', async ({ page }) => {
await page.goto('https://sermonwise.ai/app');
await expect(page.getByText('Your AI ministry team goes beyond sermons')).toBeVisible();
});