Skip to main content

PewSearch Premium Page — Expected Output Spec

Status: COMPLETE -- Agent-derived from codebase analysis. Flagged items require founder confirmation. Product: Premium Church Page | Price: $4.95/mo | Trial: None (preview mode) URL: pewsearch.com | Auth: Token-based magic link (NOT Supabase Auth) Codebase: pewsearch/web/


User State Definition

FieldValue
Planps_premium (renamed from starter/premium)
Statuspreview (pre-payment) then active (paid)
Admin URLpewsearch.com/admin/[admin_token]
AuthToken-based magic link (UUID in URL)
ChatbotNOT included — chatbot is a Pro Website and ChurchWiseAI feature
FeaturesCustom photos, staff, ministries, events, hours, what-to-expect, verified badge, priority placement
NOT includedChatbot, Pro Website template, video hero, subdomain, logo, beliefs, featured sermon, giving section

Feature Access (from premium-shared.ts)

FeaturePremiumNotes
premium_pageYesEnhanced directory listing
basic_chatbotNoPro Website and ChurchWiseAI plans only
hosted_chatNoPro Website and ChurchWiseAI plans only
pro_websiteNoPro Website only
template_selectionNoPro Website only
logo_uploadNoPro Website only
featured_videoNoPro Website only

A. Discovery & Claim Flow (Touchpoints 1--8)

Touchpoint 1: Find Church Listing

URL: https://pewsearch.com/churches/[slug] Component: pewsearch/web/src/app/churches/[slug]/page.tsx

Should See:

  • Church name, address, phone, website link, denomination
  • Map embed (Leaflet/OpenStreetMap)
  • Service times (from scraped working_hours if available)
  • Photo (from Google if scraped, or placeholder)
  • About data (scraped amenities, music style, etc. as tag chips)
  • Rating / review count (from Google data)
  • Nearby churches section
  • "Claim this church" banner (ClaimBanner component) -- prominent CTA
  • StickyClaimCTA -- sticky bottom bar appears on scroll
  • PastorLeadCapture -- lead capture for pastors
  • CrossPromoBanner -- ChurchWiseAI cross-promotion
  • ShareChurchButton -- social sharing
  • ReportButton -- report inaccurate info
  • UpdateRequestForm -- suggest corrections

Should NOT See:

  • Custom photos, staff, ministries, events (free listing has none)
  • Verified badge
  • Chatbot widget
  • Pro Website template

CTA -> Destination:

  • "Claim this church" -> /claim/[slug]
  • Header "Claim Your Church" -> /claim/[slug] (via SiteHeaderCTA)

URL: https://pewsearch.com/ and https://pewsearch.com/directory Component: pewsearch/web/src/app/page.tsx, directory/page.tsx

Should See:

  • Homepage: hero section, search bar, stats, featured churches
  • Directory: search/filter with denomination dropdown, state filter
  • Church cards in results (ChurchCard component)
  • Premium churches may show verified badge in results
  • "Claim Your Church" CTA in header

CTA -> Destination:

  • Search results -> /churches/[slug]
  • "Claim Your Church" -> generic claim flow

Touchpoint 3: Pricing Page

URL: https://pewsearch.com/pricing Component: pewsearch/web/src/app/pricing/page.tsx

Should See:

  • Three tier cards: Free / Premium ($4.95/mo) / Pro Website ($19.95/mo)
  • Free features: Church listing, Basic contact info, Map & directions, Denomination & service info, Claim & manage
  • Premium features: Everything in Free + Custom photos & hero branding, Staff profiles with photos & bios, Ministries & events showcase, Custom hours/parking/dress code, Verified badge, Higher search ranking, Premium placement, Priority support
  • Pro Website features: Everything in Premium + Stunning one-page website, 3 cinematic templates with video backgrounds, churchname.pewsearch.com URL, Custom logo, Featured sermon video, Basic AI chatbot, SEO-optimized, Mobile-friendly
  • FAQ section (What is Pro Website? What is free? What does Premium add? Do I need a chatbot? Can I cancel?)
  • FAQ mentions ChurchWiseAI for advanced AI features ($14.95/mo)
  • JSON-LD structured data for FAQs

Should NOT See:

  • Annual pricing (PewSearch is monthly only)
  • CWA chatbot/voice tier details (just a mention with link)

CTA -> Destination:

  • "Claim Your Page" (Free) -> /claim/[slug] or generic claim
  • "Get Premium" -> /claim/[slug]?tier=premium
  • "Get Pro Website" -> /claim/[slug]?tier=pro_website

Touchpoint 4: Claim Page (Generic -- No Premium Record)

URL: https://pewsearch.com/claim/[slug] Component: pewsearch/web/src/app/claim/[slug]/page.tsx (GenericClaimPage state)

Should See:

  • Church name and basic info displayed
  • ClaimForm with fields:
    • Your Name (required)
    • Your Email (required)
    • Your Role (dropdown: Pastor, Associate Pastor, Office Administrator, Volunteer, Other)
    • Tier Selection: Premium ($9.95/mo) or Pro Website ($19.95/mo) -- side-by-side comparison with feature lists
  • Feature comparison between Premium and Pro Website
  • Pricing clearly displayed
  • "Start your [tier]" submit button

Should NOT See:

  • Credit card fields (Stripe handles payment)
  • Free trial messaging (no trial -- preview mode serves this)
  • CWA branding

CTA -> Destination:

  • Submit form -> POST /api/stripe/pre-checkout -> creates premium record (status=preview) + sends preview-started email -> redirects to admin dashboard (/admin/[admin_token])

Touchpoint 5: Preview Mode — Admin Dashboard (Pre-Payment)

URL: https://pewsearch.com/admin/[admin_token] (redirected from claim form, status=preview) Component: PreviewBanner component within admin dashboard

Should See:

  • PreviewBanner at top of admin dashboard: 48-hour countdown timer, "Activate Now" / "Complete Payment" CTA
  • If preview has expired: expired gate message instead of countdown
  • Admin dashboard content (preview of what active plan looks like)
  • Church name and tier in banner

Should NOT See:

  • Active premium features gated by payment
  • Stripe payment fields inline (payment happens via checkout redirect)

CTA -> Destination:

  • "Activate Now" / "Complete Payment" -> POST /api/stripe/checkout-link (with adminToken) -> Stripe hosted checkout

Fallback: Claim Page PreviewPage

If pastor returns to /claim/[slug] (not admin dashboard):

  • Same 48-hour countdown, "Complete Payment" CTA
  • CTA also calls /api/stripe/checkout-link to generate Stripe session

Touchpoint 6: Stripe Checkout

URL: Stripe hosted checkout (URL returned from /api/stripe/checkout-link)

Should See:

  • Product: "PewSearch Premium Page" -- $4.95/mo
  • Email pre-filled from claim form
  • Card fields, billing address
  • No trial period

Should NOT See:

  • "CWA" abbreviations
  • Trial badge
  • Annual billing option

Touchpoint 7: Activation Success

URL: https://pewsearch.com/claim/[slug]?activated=true Component: pewsearch/web/src/app/claim/[slug]/page.tsx (ActivationSuccessPage state)

Should See:

  • PartyPopper icon + "You're all set!" heading
  • "Welcome to PewSearch" subtitle
  • Admin dashboard link (magic link URL)
  • Next steps guidance
  • Success animation/visual

Should NOT See:

  • Payment form
  • Preview mode countdown

CTA -> Destination:

  • Admin dashboard link -> pewsearch.com/admin/[admin_token]

Touchpoint 8: Welcome Email

URL: Email inbox Component: pewsearch/web/src/lib/email.ts (sendPremiumWelcomeEmail)

Should See:

  • Church name in subject/body
  • Admin magic link URL prominently displayed
  • Getting started steps (add photos, staff, hours)
  • Support contact

Should NOT See:

  • CWA upsell in welcome email (keep it focused on PewSearch)

B. Admin Dashboard (Touchpoints 9--16)

Implementation Note: PewSearch admin tabs use data-testid="ps-admin-tab-{name}" pattern (e.g., ps-admin-tab-overview, ps-admin-tab-requests, ps-admin-tab-training). Pro Website plans show a Website tab but Premium plans do NOT. Tab visibility depends on the plan type — always use data-testid for tab selectors, not text matching.

Touchpoint 9: Admin Dashboard -- Overview

URL: https://pewsearch.com/admin/[token] (Overview tab) Component: pewsearch/web/src/app/admin/[token]/components/DashboardOverview.tsx

Should See:

  • Metrics: page views, chatbot conversations, prayer requests, visitor contacts, callback requests
  • CompletenessDonut -- profile completion percentage
  • TrainingProgress -- section-by-section completion
  • Activity feed (recent events)
  • Church name + plan badge

Should NOT See:

  • Website tab content (Pro Website only)
  • Voice call logs (if no voice subscription)

Touchpoint 10: Admin Dashboard -- Requests Tab

URL: https://pewsearch.com/admin/[token]#requests Component: pewsearch/web/src/app/admin/[token]/components/RequestManager.tsx

Should See:

  • Three sections: Prayer Requests, Visitor Contacts, Callbacks
  • Each request shows: date, source (pewsearch, churchwiseai, or voice), content, status
  • Mark as read / archive functionality
  • Confidential prayer text visible to PASTORAL_ROLES only (admin, office_admin)

Touchpoint 11: Admin Dashboard -- Training Tab

URL: https://pewsearch.com/admin/[token]#training Component: pewsearch/web/src/app/admin/[token]/components/TrainingTab.tsx

Should See:

  • Pastor Pulse: Church personality/values (text area)
  • Hours: Custom hours editor (custom_hours JSONB)
  • Staff: StaffEditor -- add name, title, photo upload, bio. CRUD operations. Reorder.
  • Ministries: MinistriesEditor -- add name, description. CRUD operations.
  • What to Expect: Structured fields -- dress code, parking, kids ministry, music style, communion, baptism
  • FAQs: FaqsEditor -- question/answer pairs for chatbot training
  • Documents: Upload documents for chatbot knowledge base
  • Section completion indicators (TrainingProgress)

Should NOT See:

  • Voice-specific training sections
  • Pro Website content sections (those are in the Website tab)

Touchpoint 12: Admin Dashboard -- Settings Tab

URL: https://pewsearch.com/admin/[token]#settings Component: pewsearch/web/src/app/admin/[token]/components/SettingsTab.tsx

Should See:

  • Basic Info: Church name, address, phone, website, denomination
  • Contact: Admin name, email, phone
  • Chatbot: Enable/disable toggle, basic configuration
  • Team Members: Add/manage team with 7 roles (admin, office_admin, prayer_team, care_team, treasurer, volunteer_coordinator, worship_leader). Note: PewSearch has 7 roles — it does NOT include spiritual_leader or care_leader (those are CWA-specific roles). This is correct and intentional.
  • Integrations: Planning Center and other integration settings
  • Team invite link generation

Should NOT See:

  • Voice agent configuration (requires CWA voice plan)
  • Website/template settings (Pro Website only)

Touchpoint 13: Admin Dashboard -- Upgrade Tab

URL: https://pewsearch.com/admin/[token]#status Component: pewsearch/web/src/app/admin/[token]/components/UpgradeTab.tsx

Should See:

  • Current plan: "Premium Page -- $4.95/mo"
  • Upgrade option: "Pro Website -- $19.95/mo" with feature comparison
  • "Manage Subscription" link -> Stripe Customer Portal
  • CWA cross-promotion: "Want AI voice and advanced chatbot? See ChurchWiseAI plans" -> churchwiseai.com

Touchpoint 14: Admin Dashboard -- Care Tab

URL: https://pewsearch.com/admin/[token]#care Component: pewsearch/web/src/app/admin/[token]/components/CareTab.tsx

Should See:

  • Care toggle (care_enabled on/off)
  • Member list (congregation care subscribers)
  • Broadcast composer (when enabled)
  • Topic management (announcements, prayer_chain, daily_verse, encouragement)
  • Public care page URL: pewsearch.com/churches/[slug]/care

Should NOT See:

  • Care tab only visible when care_enabled = true and plan is paid

Touchpoint 15: Team Member Access

URL: https://pewsearch.com/admin/[team_member_token] Component: Same admin dashboard, filtered by role

Should See:

  • Dashboard filtered to role permissions (see ROLE_TABS in premium-shared.ts)
  • Role-appropriate tabs only
  • Own role label shown
  • Confidential content gated by PASTORAL_ROLES

Should NOT See:

  • Tabs outside their role permissions
  • Team management (admin only)
  • Full prayer text (unless PASTORAL_ROLES)

Touchpoint 16: Public Premium Listing

URL: https://pewsearch.com/churches/[slug] (active Premium) Component: pewsearch/web/src/app/churches/[slug]/page.tsx

Should See:

  • PremiumHero -- custom hero photo/banner with church name overlay
  • PremiumBadge -- verified checkmark badge
  • Custom description (custom_description)
  • Staff grid (StaffGrid component) with photos and bios
  • Ministries section
  • Events list (EventsList)
  • Custom hours (ChurchHoursCard)
  • What to Expect section (WhatToExpectSection)
  • Social media links (SocialLinks)
  • Next service time highlight (NextServiceHighlight)
  • Map embed
  • PewSearch header/footer chrome (standard site navigation)

Should NOT See:

  • Chatbot widget (chatbot is NOT included in Premium — it is a Pro Website and ChurchWiseAI feature)
  • Pro Website template (no video hero, no StickyNav, no full-page website layout)
  • Subdomain URL
  • Logo upload display
  • Beliefs section
  • Giving section
  • Featured sermon
  • Contact form (Pro Website only)

C. Lifecycle (Touchpoints 17--22)

Touchpoint 17: Cancellation

URL: Stripe Customer Portal (via admin dashboard Upgrade tab)

Should See:

  • Cancel option in Stripe portal
  • Access continues until end of billing period
  • After period: listing reverts to free (custom content hidden, data retained in DB)
  • Verified badge removed
  • "Claim" banner reappears on the listing

Should NOT See:

  • Data deletion (soft delete -- all premium_churches data retained with status=cancelled)

Touchpoint 18: Payment Failed

URL: Email + admin dashboard

Should See:

  • Stripe automatic retries (3 retries over ~7 days)
  • If all retries fail: customer.subscription.deleted webhook fires, status set to cancelled

FLAGGED FOR FOUNDER REVIEW:

No custom payment failure email or dashboard warning banner exists. Recommendation: add both.


Touchpoint 19: Upgrade to Pro Website

URL: Admin dashboard Upgrade tab or Stripe portal

Should See:

  • Upgrade option from Premium to Pro Website
  • Feature comparison showing what Pro Website adds
  • Pricing: $19.95/mo (replaces $9.95/mo)
  • Immediate access to Pro Website features after upgrade
  • Website tab appears in admin dashboard

Subscription Reconciliation: CWA Pro + PewSearch Premium

Note: CWA Pro includes a PewSearch Premium Listing as a bundled benefit ($9.95 value free). When a church upgrades to CWA Pro (which includes the free Premium Listing entitlement), the separate PewSearch Premium billing ends at the current period end — CWA Pro absorbs it. No double-billing. The entitlement delivery mechanism is not yet implemented (see pewsearch-pro-website.md Touchpoint 16 for decisions needed). Until implemented, churches that buy CWA Pro and already have a PewSearch Premium subscription should contact support for manual reconciliation.


Touchpoint 20: Token Rotation

URL: Admin dashboard Settings tab or API

Should See:

  • "Rotate Token" option -- generates new admin_token, invalidates old magic link
  • "Resend Magic Link" -- sends new email with current admin URL
  • Team member tokens are separate and unaffected

Touchpoint 21: Re-activation (After Cancellation)

URL: /claim/[slug]

Should See:

  • If premium record exists with status=cancelled and plan = free: GenericClaimPage (can re-claim)
  • All previous data (staff, ministries, events, etc.) restored when reactivated
  • Same Stripe checkout flow

Touchpoint 22: Already Claimed

URL: https://pewsearch.com/claim/[slug] (active subscription) Component: pewsearch/web/src/app/claim/[slug]/page.tsx (AlreadyActivePage state)

Should See:

  • "This church has already been claimed" message
  • If the visitor is the admin: link to dashboard
  • Contact information for support if they believe this is an error

Playwright Test Hints

// Touchpoint 1: Free listing shows claim banner
test('free listing shows claim CTA', async ({ page }) => {
await page.goto('https://pewsearch.com/churches/grace-community-church-...');
await expect(page.getByText(/claim this church/i)).toBeVisible();
});

// Touchpoint 3: Pricing page shows three tiers
test('pricing page shows Free, Premium, Pro Website', async ({ page }) => {
await page.goto('https://pewsearch.com/pricing');
await expect(page.getByText('$4.95')).toBeVisible();
await expect(page.getByText('$19.95')).toBeVisible();
await expect(page.getByText('Free')).toBeVisible();
});

// Touchpoint 4: Claim form has required fields
test('claim form shows name, email, role, tier selection', async ({ page }) => {
await page.goto('https://pewsearch.com/claim/[test-slug]');
await expect(page.getByLabel(/name/i)).toBeVisible();
await expect(page.getByLabel(/email/i)).toBeVisible();
await expect(page.getByLabel(/role/i)).toBeVisible();
});

// Touchpoint 9: Admin dashboard loads with metrics
test('admin dashboard shows overview metrics', async ({ page }) => {
await page.goto('https://pewsearch.com/admin/[test-token]');
await expect(page.getByText('Overview')).toBeVisible();
});

// Touchpoint 17: Premium listing shows verified badge
test('premium listing shows verified badge and staff', async ({ page }) => {
await page.goto('https://pewsearch.com/churches/[premium-church-slug]');
await expect(page.getByText('Verified')).toBeVisible();
});