Pre-CEO Hardening Audit — 2026-03-30
Purpose: Proactively check all remaining products for the same categories of issues found during the Starter Chat CEO test (40+ issues across marketing copy, tier-gating, email content, UX labels, payment flows).
Products audited:
- IllustrateTheWord Premium ($9.95/mo)
- PewSearch Premium ($9.95/mo) / Pro Website ($19.95/mo)
- SermonWise Pro ($19.95/mo)
- CWA Pro Chat ($34.95/mo)
- CWA Voice Starter ($39.95/mo)
Auditor: QA hardening agent
Date: 2026-03-30
1. IllustrateTheWord Premium ($9.95/mo)
Marketing Copy Consistency
| Check | Status | Notes |
|---|
| Pricing amounts correct | PASS | $9.95/mo, $99.50/yr — matches PRICING.md |
| Annual savings % correct | PASS | Calculates ~17% dynamically from prices |
| Feature list accurate | PASS | 50,000+ illustrations, 17 traditions, favorites, etc. |
| FAQ matches features | PASS | No FAQ section on pricing page (just email support link) |
| No church-size language | PASS | No church-size references found |
| No competing upsells | PASS | Only B2C loyalty discount banner (contextually appropriate) |
Checkout Flow
| Check | Status | Notes |
|---|
| No DB writes before payment | PASS | Checkout only creates Stripe session, webhook handles DB |
| Currency forced to USD | FIXED | Was missing currency: 'usd' on checkout session creation. Fixed in feat/harden-itw |
| adaptive_pricing disabled | WARN | Not set. Less critical since price is already in USD via Stripe price object, but inconsistent with CWA |
| Trial notice | N/A | ITW has no trial (per PRICING.md — correct) |
| Founder notified | PASS | Cross-promo seed logged; trial reminder email wired |
Email Content
| Check | Status | Notes |
|---|
| Welcome email | N/A | ITW has no welcome email — uses Supabase Auth + Stripe confirmation email + redirect to /profile?subscription=success. This is by design (B2C auth pattern, not token-based) |
| Payment failed email | PASS | Clear copy, correct links, branded template |
| Trial reminder email | PASS | Dynamic urgency, correct feature list, proper CTA |
| Plain-text URL fallbacks | N/A | No welcome email to need fallback |
UX Labels/Jargon
| Check | Status | Notes |
|---|
| "visibility_tier" exposed | PASS | Not user-facing — internal DB/code only |
| "B2C loyalty" label | PASS | User sees "ChurchWiseAI family" and "save 20%" — no jargon |
| Billing toggle labels | PASS | "Monthly" / "Annual" with "Save X%" badge |
Summary: ITW is clean. One fix made (USD currency), one minor inconsistency noted (no adaptive_pricing).
2. PewSearch Premium ($9.95/mo) / Pro Website ($19.95/mo)
Marketing Copy Consistency
| Check | Status | Notes |
|---|
| Pricing amounts correct | PASS | $9.95/mo Premium, $19.95/mo Pro Website — matches PRICING.md |
| Feature lists accurate | PASS | Premium: branding, staff, events, verified badge. Pro Website: templates, chatbot, vanity URL |
| FAQ matches features | PASS | 7 FAQs all accurate, including CWA upsell FAQ |
| No church-size language | PASS | Only found in state-content.ts (geographic descriptions, not sizing) |
| Demo links correct | PASS | CWA upsell links point to churchwiseai.com |
| Upsell placement | PASS | CWA upsell section is below the pricing cards, not competing with buy buttons |
Checkout Flow
| Check | Status | Notes |
|---|
| No DB writes before payment | PASS | Both pre-checkout and checkout routes pass metadata to Stripe; webhook creates premium_churches row |
| Currency forced to USD | PASS | Both checkout routes set currency: 'usd' |
| adaptive_pricing disabled | WARN | Not set. Same minor inconsistency as ITW |
| Trial notice | N/A | PewSearch has no trial (preview mode serves this purpose — correct per PRICING.md) |
| Founder notified | PASS | sendClaimNotificationEmail fires on pre-checkout to admin@churchwiseai.com |
Email Content
| Check | Status | Notes |
|---|
| Welcome email accuracy | PASS | Tier-aware: Premium vs Pro Website have different subject, header, body, features list, CTA |
| Plan features in email | PASS | Premium: photos, staff, events, social. Pro Website: templates, vanity URL, chatbot |
| Plain-text URL fallback | FIXED | Was missing. Added plain-text URL fallback in feat/harden-pewsearch |
| Trial reminder | PASS | Wired to webhook, sends church name and admin token |
| Payment failure | PASS | Sends email with church name and admin link |
UX Labels/Jargon
| Check | Status | Notes |
|---|
| Claim flow labels | PASS | "Claim Your Church" — clear, non-technical |
| Plan names | PASS | "Premium" and "Pro Website" — clear |
| Admin panel | PASS | "Your Admin Panel" — clear |
Summary: PewSearch is solid. One fix made (plain-text URL fallback in welcome email). One minor inconsistency (no adaptive_pricing).
3. SermonWise Pro ($19.95/mo)
Marketing Copy Consistency
| Check | Status | Notes |
|---|
| Pricing amounts correct | PASS | $19.95/mo, $199.50/yr — matches PRICING.md and sermon-pricing.ts |
| Annual savings calculated | PASS | Dynamically shows savings (e.g., "save $39.90/year") |
| Feature list accurate | PASS | 15 outlines/mo, 17 traditions, RAG illustrations, export formats |
| FAQ matches features | PASS | 5 FAQs all accurate — free plan details, premium AI, billing, limits, cancellation |
| "300,000+ resources" claim | PASS | Consistent across homepage and pricing page |
| No church-size language | PASS | No church-size references found |
| Illustration count | PASS | "300,000+ curated theological resources" (refers to RAG corpus, not ITW library) |
Checkout Flow
| Check | Status | Notes |
|---|
| No DB writes before payment | PASS | Checkout only creates Stripe session |
| Currency forced to USD | PASS | currency: 'usd' set in checkout route |
| adaptive_pricing disabled | WARN | Not set (same pattern as ITW/PewSearch) |
| Trial | N/A | SermonWise has no trial (correct per PRICING.md) |
| B2C loyalty discount | PASS | Cross-property discount wired and tested |
Email Content
| Check | Status | Notes |
|---|
| Welcome email | N/A | SermonWise uses B2C subscription pattern (user_subscriptions table) — redirect to /app?upgraded=1, no welcome email (same as ITW pattern) |
UX Labels/Jargon
| Check | Status | Notes |
|---|
| "RAG-powered" label | PASS | Used in feature list but explained as "Real illustrations, not hallucinated stories" — contextually clear |
| "Premium AI model" | PASS | FAQ explains what it means in plain language |
| Billing toggle | PASS | "Monthly" / "Annual Save 17%" — clear |
| Sermon vs Homily | PASS | Metadata description says "sermon & homily outlines" — denomination-aware |
Summary: SermonWise is clean. No fixes needed. One minor inconsistency (no adaptive_pricing).
4. CWA Pro Chat ($34.95/mo) + Suite Chat ($59.95/mo)
Marketing Copy Consistency
| Check | Status | Notes |
|---|
| Agent counts | FIXED | StripeSetupTab said "2 agents" for Pro — actually 4 agents (Care, Coordinator, Discipleship, Stewardship). Fixed in feat/harden-sermonwise |
| Tool counts | PASS | Starter: 12, Pro: 35, Suite: 39 — consistent across pricing.ts, PricingGrid, chatbot page, and pricing page |
| Role counts | FIXED | chatbot/page.tsx and PricingGrid.tsx said "7 roles" — actual TeamRole type has 9 roles. pricing.ts was correct with "9 roles". Fixed all to 9 |
| Pricing amounts | PASS | $14.95/$34.95/$59.95 — consistent everywhere |
| Duplicate features | FIXED | pricing.ts Starter had both "Embed widget for your website" and "Embed widget" — duplicate removed |
| Pro Website included claim | PASS | Pro tier correctly claims "Pro Website included" |
| FAQ accuracy | PASS | All 10 FAQs accurate and consistent with product capabilities |
| ITW illustration count | FIXED | StripeSetupTab said "30,000+" for ITW — corrected to "50,000+" |
Checkout Flow
| Check | Status | Notes |
|---|
| No DB writes before payment | PASS | Onboard route has "Payment-first: NO database writes here" comment. Checkout-embedded and church-checkout both correct |
| Currency forced to USD | PASS | All 3 checkout routes set currency: 'usd' |
| adaptive_pricing disabled | PASS | Embedded checkout sets adaptive_pricing: { enabled: false } |
| 14-day trial for chat plans | PASS | trial_period_days: 14 only applied when isChatbotTier |
| No trial for voice plans | PASS | Voice plans correctly skip trial |
| Founder notified | PASS | sendNewSaleNotification and sendPaymentReceivedNotification wired |
Email Content
| Check | Status | Notes |
|---|
| Welcome email accuracy | PASS | Tier-aware: Starter vs Pro get different 5-minute checklist items |
| Trial notice with date | PASS | Trial end date shown when present: "You won't be charged until [date]" |
| Voice setup notice | PASS | Voice plans get additional "About your phone number" section |
| Plain-text URL fallback | PASS | "If the button doesn't work: [URL]" included |
| Starter Kit delivery | PASS | sendStarterKitDeliveryEmail wired in webhook |
Dashboard Tier-Gating
| Check | Status | Notes |
|---|
| Pro features unlock | PASS | canAccess('pro', ...) gates FAQ management, document upload, analytics, theological lens |
| Suite features unlock | PASS | Unlimited docs/FAQs, 90-day analytics, CSV export, API access, remove badge |
| Starter restrictions | PASS | FAQ management, document upload, analytics all locked behind canAccess |
| Pro Website plan gets Starter-level | PASS | canAccess explicitly returns Starter features for pro_website plans |
UX Labels/Jargon
| Check | Status | Notes |
|---|
| "H.E.C.I.C." trademark | PASS | Used on chatbot page with explanation ("Hear, Empathize, Connect, Invite, Capture") |
| "RAG" label | PASS | Not exposed to users — internal only |
| "Agentic" | PASS | Not used in user-facing copy |
| Agent names | PASS | "Care Agent", "Coordinator Agent" etc. — clear and friendly |
Summary: Multiple fixes made. Duplicate feature removed, role/agent/illustration counts corrected across 4 files.
5. CWA Voice Starter ($39.95/mo) + Voice Pro ($69.95/mo)
Marketing Copy Consistency
| Check | Status | Notes |
|---|
| Pricing amounts | PASS | $39.95 Starter, $69.95 Pro — correct everywhere including JSON-LD |
| Feature lists | PASS | Starter: 100 calls, 24/7, prayer, visitor, transcripts, service times. Pro: unlimited, custom personality, multi-language, PCO |
| Demo phone numbers | PASS | (469) 615-2221 and (365) 825-4095 displayed on voice page |
| "No free trial" callout | PASS | Explicitly stated: "No free trial — each agent gets its own dedicated phone number provisioned instantly" |
| Founder pricing badge | PASS | "Limited Founder Pricing. Lock in $39.95 USD/mo for Voice Starter for life" |
Checkout Flow
| Check | Status | Notes |
|---|
| No trial on voice | PASS | isChatbotTier check correctly excludes voice from trial |
| Currency USD | PASS | Set in checkout routes |
| Voice setup email | PASS | sendVoiceSetupAlertEmail wired for voice plans |
Email Content
| Check | Status | Notes |
|---|
| Voice-specific welcome | PASS | Welcome email includes "About your phone number" section for voice plans |
| No voice copy in chat emails | PASS | includesVoice flag controls voice-specific sections |
Dashboard Tier-Gating
| Check | Status | Notes |
|---|
| Voice features visible | PASS | planIncludesVoice gates voice-specific dashboard tabs |
| Chat features on voice-only | PASS | Voice-only plans still get basic chatbot features (Starter-level) |
Summary: Voice is clean. No issues found.
Cross-Product Issues
1. adaptive_pricing Not Disabled Everywhere
Severity: Low
Products affected: ITW, PewSearch, SermonWise, CWA church-checkout
Status: CWA embedded checkout has adaptive_pricing: { enabled: false }. All other checkout routes do not. Since all prices are defined as USD in Stripe, the risk is that Stripe may show localized pricing to international visitors. Not a showstopper but worth standardizing.
Recommendation: Add adaptive_pricing: { enabled: false } to all checkout session creation calls across all 3 codebases.
2. No Welcome Email for B2C Products (ITW, SermonWise)
Severity: Low
Status: By design. B2C products (ITW, SermonWise) use Supabase Auth + Stripe confirmation emails. Users redirect to /profile?subscription=success or /app?upgraded=1 after checkout. No separate welcome email is sent. This is a different pattern from the B2B products (CWA, PewSearch) which send branded welcome emails with admin dashboard links.
Recommendation: Consider adding a simple "welcome to Premium" email for ITW subscribers to improve onboarding. Not urgent.
3. Inconsistent Source of Truth for Counts
Severity: Medium (now fixed for known instances)
Status: Multiple files had different role/agent/illustration counts. Fixed the known instances, but this pattern will recur without a centralized source.
Recommendation: Create a shared constants file or use the knowledge system derivation to propagate counts to all marketing pages. The knowledge/data/features.yaml file should be the single source for these numbers.
Priority Fixes (Things That WILL Confuse the CEO)
Already Fixed (on feature branches)
| Fix | Branch | File(s) |
|---|
| Force USD currency on ITW checkout | feat/harden-itw | src/app/api/stripe/checkout/route.ts |
| Add plain-text URL fallback to PewSearch welcome email | feat/harden-pewsearch | web/src/lib/email.ts |
| Remove duplicate "Embed widget" from Starter features | feat/harden-sermonwise | src/lib/pricing.ts |
| Fix "7 roles" -> "9 roles" on chatbot page + PricingGrid | feat/harden-sermonwise | src/app/chatbot/page.tsx, src/app/pricing/PricingGrid.tsx |
| Fix "2 agents" -> "4 agents" for Pro in StripeSetupTab | feat/harden-sermonwise | src/app/founder/[token]/components/StripeSetupTab.tsx |
| Fix "30,000+" -> "50,000+" illustrations in StripeSetupTab | feat/harden-sermonwise | src/app/founder/[token]/components/StripeSetupTab.tsx |
Recommended But Not Fixed (Larger Scope)
| Issue | Product | Effort | Priority |
|---|
Add adaptive_pricing: { enabled: false } everywhere | ITW, PewSearch, SermonWise | Small | Low |
| Add welcome email for ITW Premium subscribers | ITW | Medium | Low |
| Centralize feature/role/agent counts in shared constants | All | Medium | Medium |
Conclusion
The non-CWA products (ITW, PewSearch, SermonWise) are substantially cleaner than what was found on Starter Chat. The payment-first pattern is correctly implemented across all products. Email templates are branded and tier-aware where applicable. No DB records are created before payment confirmation in any product.
The most impactful fixes were:
- ITW missing USD currency — could have caused international customers to see non-USD checkout
- PewSearch missing email URL fallback — could have left new subscribers unable to access their admin panel if email button was broken
- Role/agent/illustration count inconsistencies — CEO would have immediately noticed "7 roles" on the chatbot page vs "9 roles" on the pricing page
All fixes are on feature branches ready for review. No changes pushed to main/master.