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
| Field | Value |
|---|---|
| Plan | ps_premium (renamed from starter/premium) |
| Status | preview (pre-payment) then active (paid) |
| Admin URL | pewsearch.com/admin/[admin_token] |
| Auth | Token-based magic link (UUID in URL) |
| Chatbot | NOT included — chatbot is a Pro Website and ChurchWiseAI feature |
| Features | Custom photos, staff, ministries, events, hours, what-to-expect, verified badge, priority placement |
| NOT included | Chatbot, Pro Website template, video hero, subdomain, logo, beliefs, featured sermon, giving section |
Feature Access (from premium-shared.ts)
| Feature | Premium | Notes |
|---|---|---|
premium_page | Yes | Enhanced directory listing |
basic_chatbot | No | Pro Website and ChurchWiseAI plans only |
hosted_chat | No | Pro Website and ChurchWiseAI plans only |
pro_website | No | Pro Website only |
template_selection | No | Pro Website only |
logo_upload | No | Pro Website only |
featured_video | No | Pro 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_hoursif 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 (
ClaimBannercomponent) -- prominent CTA StickyClaimCTA-- sticky bottom bar appears on scrollPastorLeadCapture-- lead capture for pastorsCrossPromoBanner-- ChurchWiseAI cross-promotionShareChurchButton-- social sharingReportButton-- report inaccurate infoUpdateRequestForm-- 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](viaSiteHeaderCTA)
Touchpoint 2: Homepage / Directory Search
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 (
ChurchCardcomponent) - 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
ClaimFormwith 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-linkto 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 percentageTrainingProgress-- 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, orvoice), content, status - Mark as read / archive functionality
- Confidential prayer text visible to
PASTORAL_ROLESonly (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_hoursJSONB) - 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_leaderorcare_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_enabledon/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 = trueand 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 overlayPremiumBadge-- verified checkmark badge- Custom description (
custom_description) - Staff grid (
StaffGridcomponent) 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_churchesdata retained withstatus=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.deletedwebhook fires, status set tocancelled
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=cancelledand 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();
});