FuneralWiseAI Vertical — Expected Output Spec
DRAFT — Stage 1, authored 2026-05-20 by an acceptance-spec agent. Pre-populated from code reads of the
funeralwiseai/route segment andadmin/funeral/[token]/dashboard. All values marked[FOUNDER: confirm]must be validated in the Stage-2 interview before this spec is promoted to APPROVED.AI Bridge Principle applies to ALL voice agent behavior in this spec. The agent is a bridge to the funeral director, not a replacement. It never promises confidentiality, never acts as a counsellor or grief therapist, and always offers to connect the family to a human director when appropriate.
1. Product Overview
FuneralWiseAI is the first non-church commercial vertical under WiseAI Agency. It is a sales-led AI phone-answering service for funeral homes — not a self-serve SaaS dashboard product in the same sense as ChurchWiseAI chat/voice tiers.
Key structural differences from ChurchWiseAI
| Property | ChurchWiseAI | FuneralWiseAI |
|---|---|---|
| Tier structure | Starter / Pro / Suite / Bundle | Single tier (one plan, no tier ladder at launch) |
| Primary CTA | Onboard form → Stripe checkout | Book a demo (/funeralwiseai/book) |
| Secondary CTA | N/A | Self-serve checkout (/funeralwiseai/checkout) |
| Dashboard complexity | Full multi-tab admin (Training, Calls, Requests, Care, Upgrade, Settings) | Simpler dashboard — confirmed tabs unknown (see Open Questions §9) |
| Domain | churchwiseai.com | funeralwiseai.com (hostname rewrite) |
| Brand | Sacred gold + navy + cream | Slate #1E293B + Copper #B45309 + Bone #FAF8F3 |
| Fonts | Playfair Display + Inter | Fraunces (display) + Manrope (body) |
| HEAR protocol | Ministry / pastoral care | Grief care / bereavement intake |
| Chatbot | Core product (4 agent types) | Sales chatbot on marketing pages only; product-facing chatbot is voice only at launch |
2. Tier Definition
fwa_starter (sole active tier at launch)
| Field | Value |
|---|---|
| Plan key | fwa_starter |
| Setup fee | $745 USD / $995 CAD one-time |
| Monthly fee | $199 USD / $249 CAD per month |
| Annual option | [FOUNDER: confirm] — not mentioned on any public page observed |
| Trial | None (demo account + demo call serve this purpose) |
| Voice minutes | Unlimited (no per-call charges) |
| Chatbot | Voice agent only — no website chatbot at launch |
| Plan label (UI) | "FuneralWiseAI" or "FuneralWiseAI Starter" [FOUNDER: confirm label text] |
| 30-day guarantee | Yes — first month subscription refundable if cancelled within 30 days of go-live. Setup fee non-refundable after agent is built and deployed. |
Demo / prospect plan keys observed in code
From FuneralUpgradeTab.tsx:
fwa_demo— demo accountfwa_demo_prospect— prospect pre-purchase demofwa_trial— trial state
fwa_pro
fwa_pro is referenced in FuneralUpgradeTab.tsx ACTIVE_PLAN_KEYS but not displayed on any public pricing page. Either a future tier or an internal designation. [FOUNDER: confirm if fwa_pro is live, in progress, or deprecated]
Stripe Live Price IDs
From src/lib/funeral-pricing.ts (verified against FuneralUpgradeTab):
| Item | Product ID | USD Price ID | CAD Price ID |
|---|---|---|---|
| Setup (one-time) | prod_UPiJXweJzvHN1V | price_1TQssTFaoK5IPzNookD1Gzgv ($745) | price_1TQssTFaoK5IPzNoRLkcP4qk ($995) |
| Monthly | prod_UPiJmrmNg6JKiP | price_1TQssUFaoK5IPzNomEAL0zzw ($199/mo) | price_1TQssUFaoK5IPzNoI0iN99ky ($249/mo) |
Stripe session metadata stamped on checkout: vertical: 'funeral', tier: 'funeral_pro', currency, source: 'self_serve' (or 'demo_led' for demo path — [FOUNDER: confirm demo-led metadata]).
Note: Session metadata carries
tier: 'funeral_pro'— this does NOT matchfwa_starter. See Drift section §10.
3. User State Definitions
| State | Plan | Status | Entry path |
|---|---|---|---|
| Active paying | fwa_starter | active | Self-serve checkout OR demo-led booking |
| Demo / prospect | fwa_demo or fwa_demo_prospect | demo | Founder provisions manually for outreach |
| Trial | fwa_trial | trial | [FOUNDER: confirm if trial path exists] |
| Active Pro | fwa_pro | active | [FOUNDER: confirm if this tier is offered] |
| Cancelled | any | cancelled | Stripe subscription cancelled |
Admin URL: funeralwiseai.com/admin/[token] (canonical). Legacy route /admin/funeral/[token] 308-redirects permanently to canonical URL.
4. Touchpoints — Expected Outputs
A. Discovery Paths
A1 — Direct navigation / organic search
State: Any prospect
Landing URL: https://funeralwiseai.com
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/discovery-home.png (to be captured)
Should See:
- FuneralWiseAI brand chrome (slate nav, copper accent, bone background)
- FuneralWiseAI lockup SVG in nav (not ChurchWiseAI logo)
- Nav items: How it works | Pricing | About | Book a demo
- Nav CTA: "Book a demo" →
/funeralwiseai/book - Hero eyebrow: "AI answering for funeral homes"
- Hero headline: "Never miss a call from a grieving family."
- Two hero CTAs: "Hear how it works" (anchor to
#how-it-works) and "Book a 30-min demo" (Cal.com linkhttps://cal.com/john-moelker/funeralwiseai-demo) - Dial demo CTA section (conditional: shows if
FUNERAL_DEMOplayground code exists) - Value-prop trio: "Always answers." | "Trained for you." | "Grief-sensitive intake."
- How-it-works 4-step section (ring → greeting → capture → notify)
- Trust signals (live in 5 business days / built on grief-care training / your data stays yours)
- Free AI Prompt Pack CTA section (dark slate background)
- Pricing callout: $745 setup + $199/mo — one pricing card only
- Founder story section
- Final CTA band: "Every family deserves a calm first voice."
- Footer: FuneralWiseAI brand with links to How it works / Pricing / About / Book a demo / Privacy / Terms
Should NOT See:
- ChurchWiseAI logo, nav, or brand elements
- Church terminology (pastor, congregation, prayer, sermon, denomination, worship)
- VetWiseAI or any other vertical brand elements
- Pricing table with multiple tiers (single-tier card only)
Links:
- "Book a demo" nav + all hero CTAs →
/funeralwiseai/bookorhttps://cal.com/john-moelker/funeralwiseai-demo - "Get the Funeral Director Prompt Pack" →
/funeralwiseai/skills - "Book your demo call" final CTA →
https://cal.com/john-moelker/funeralwiseai-demo - "Skip the call and check out now" →
/funeralwiseai/checkout
Success Criteria:
- Page loads with correct FuneralWiseAI brand chrome (slate + copper + bone), no ChurchWiseAI gold/navy/cream
- Pricing callout shows $745 / $199 accurately
- All CTAs route correctly
A2 — WiseAI Agency verticals page
State: Any prospect
Landing URL: https://wiseaiagency.com/verticals (or https://churchwiseai.com/wiseaiagency/verticals)
Should See:
- FuneralWiseAI listed as an active vertical with link to
funeralwiseai.com - Correct pitch copy and pricing summary
Should NOT See:
- FuneralWiseAI listed as "coming soon" if it is live
[FOUNDER: confirm live status]
A3 — WiseAI Agency playground
State: Any prospect
URL: /wiseaiagency/playground (funeral vertical card)
Should See:
- Funeral home vertical card with demo CTA
- Live pre-trained demo for funeral context
- Conversion CTA routes to
funeralwiseai.com/book
B. Pre-Purchase Journey
B1 — How It Works page
State: Discovery / pre-purchase
URL: funeralwiseai.com/how-it-works
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/pre-purchase-how-it-works.png
Should See:
- HEAR protocol 4-step explanation (H=Hear, E=Empathize, A=Advance, R=Respond)
- HEAR described as emerging from Clinical Pastoral Education — not as a general AI framework
- Call flow 5-step (family calls → greeting → urgency routing → summary → follow up)
- Integration section: existing phone number / configurable hours / under-a-week setup / no software to install
- Call forwarding modes: Forward on no-answer (most common) | After hours only (popular) | When busy | Unconditional
- Privacy section: 4 items — data in your dashboard / no HIPAA (funeral homes not covered entities) / configurable retention / not recorded to train models
- Final CTA: "Book your demo call"
AI Bridge Principle compliance:
- HEAR page copy must frame AI as facilitating connection to the funeral director, not replacing human care
- Page explicitly says agent notifies director and captures data — director follows up
Should NOT See:
- Any claim that the AI provides grief counselling
- Any claim that the AI replaces the director's role
- Any religious or faith-specific language
B2 — Pricing page
State: Discovery / pre-purchase
URL: funeralwiseai.com/pricing
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/pre-purchase-pricing.png
Should See:
- H1: "Simple pricing. No surprises."
- Subhead: "One plan. Everything included."
- What's included list (9 items as defined in code):
- Unlimited calls — no per-call charges
- HEAR-protocol empathy framework on every call
- Full training on your services, prices, chapel names, and staff
- Complete call transcripts in your dashboard
- Text + email notification after every call
- After-hours, weekends, and holiday coverage
- Urgent call routing to your phone
- Secure web dashboard — nothing to install
- Ongoing agent updates as your offerings change
- Setup fee includes (5 items): Onboarding interview / Agent training on website+pricing+service list / Integration with existing number / Test call review before go-live / Dashboard setup and team access
- PricingCardClient (right column): USD/CAD currency toggle. Shows setup ($745 USD / $995 CAD) + monthly ($199 USD / $249 CAD). Book a demo CTA button.
[FOUNDER: confirm PricingCardClient also shows self-serve checkout button or only demo CTA] - ROI section: "One answered call typically covers the entire monthly fee." ($8,000–$15,000 average arrangement value noted)
- FAQ (8 questions in code; production renders all 8): immediate routing / families know it's AI / setup timeline / updating services / no long-term contract / 30-day guarantee scope / multi-staff access / call summary delivery
- Final CTA band with "Book your demo call" primary + self-serve checkout secondary text link
Currency toggle behavior:
- Default currency determined server-side from Vercel geo-IP (
getDefaultCurrency()) - CAD prospects see CAD prices by default; USD prospects see USD by default
- Toggle is client-side interactive (
PricingCardClient)
Should NOT See:
- Multiple tier options (Starter / Pro / etc.)
- ChurchWiseAI plan comparison
- Free trial mention
Success Criteria:
- USD visitor: sees $745 + $199/mo by default
- CAD visitor: sees $995 + $249/mo by default
- Toggle works correctly
- All FAQ items readable and accurate
B3 — About page
State: Discovery / pre-purchase
URL: funeralwiseai.com/about
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/pre-purchase-about.png
Should See:
- Founder photo (John Moelker)
- H1: "I've been in the room. At 2 a.m. With a family who just lost someone."
- Founder story: 15 years software engineering → 15 years pastoral ministry + grief support
- Credential cards (4):
- 15 years in software engineering
- 15 years in grief care and crisis response
- Clinical Pastoral Education (CPE) — "One completed CPE unit"
- Stephen Leader Training (currently inactive —
[FOUNDER: confirm how to handle "inactive" framing on about page])
- Mission box: "A portion of every subscription funds our mission work" → goodnewsready.org
Accuracy guards (see memory/user_founder_background.md):
- MUST say "1 CPE unit" — never "CPE-certified"
- Stephen Leader: trained but currently inactive — never "Stephen Leader credential"
- Never say "pastor-turned-engineer" (direction is wrong — engineer-then-pastor)
- Never say "5 years pastoring"
B4 — Book a Demo page (primary funnel)
State: Discovery / pre-purchase
URL: funeralwiseai.com/book
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/pre-purchase-book.png
Should See:
- Two-column layout: left context + right form card
- Left: "See FuneralWiseAI on your funeral home's own content." headline
- Trust points (3): 15 minutes / Your content / No obligation
- Cal.com direct-schedule link:
https://cal.com/john-moelker/funeralwiseai-demo(for those who prefer to skip the form) - Right: Form card titled "Tell us about your funeral home"
DemoRequestForm fields:
- Your name (required)
- Funeral home name (required)
- Funeral home website (optional, URL type) — with helper text "We use your website to build a personalized demo."
- Email address (required)
- Phone number (optional, tel type)
- Best time to talk (select: Mornings 8am–noon / Afternoons noon–5pm / Evenings 5pm–8pm / Flexible)
- Submit button: "Request your demo"
On success:
- In-place success state: "Request received." heading
- Sub-copy: "John will reach out within one business day to schedule your personalized demo. Check your inbox — including your spam folder."
- No redirect — form replaced with confirmation in-place
POST target: /api/contact with source: 'funeralwiseai'
Error fallback: Error banner shows, includes link to john@funeralwiseai.com
Should NOT See:
- Error page or crash on submit
- Any PewSearch church search UX
- Onboarding form (church claim flow) — this is a demo request, not an instant-checkout flow
B5 — Self-serve Checkout page (secondary funnel)
State: Prospect who has decided to skip the demo
URL: funeralwiseai.com/checkout
noindex (confirmed in code: robots: { index: false, follow: false })
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/checkout-page.png
Should See:
- H1: "Start FuneralWiseAI today."
- Subhead: "You'll be redirected to Stripe-hosted secure checkout."
- Checkout form (CheckoutFormClient):
- Currency toggle (USD default for USD visitors, CAD for CAD visitors)
- Price summary card: setup fee + monthly subscription with currency-aware amounts
- Helper text: "Setup fee + first month bill together at checkout. Monthly billing continues until you cancel."
- Email field (required) — "We'll send your receipt and onboarding interview link here."
- Funeral home name (optional)
- Submit button: "Continue to secure checkout" / "Redirecting to secure checkout…" (loading state)
- Footer note: "Payments processed by Stripe. We never see your card details."
- Link back to demo: "Prefer to walk through it together? Book a 15-minute demo →"
On submit:
- POSTs to
/api/stripe/funeral-checkout - On success:
window.location.assign(data.url)— redirects to Stripe-hosted Checkout
Stripe session:
- Mode:
subscription - Line items: recurring monthly price + one-time setup fee (both billed at first invoice)
allow_promotion_codes: true— launch coupons work- Success URL:
https://funeralwiseai.com/thank-you?source=funeral_self_serve&session_id={CHECKOUT_SESSION_ID} - Cancel URL:
https://funeralwiseai.com/funeralwiseai/checkout[DRIFT: cancel URL has double /funeralwiseai/ path — see §10]
Rate limiting: 10 requests/minute per IP
B6 — Stripe Checkout (Stripe-hosted)
State: Prospect completing purchase
URL: Stripe-hosted (external)
Should See:
- Product name visible in Stripe checkout as "FuneralWiseAI" — not "ChurchWiseAI" or "VetWiseAI"
- Two line items: setup fee (one-time) + first month
- Total shown as setup + month combined for first invoice
- Currency matches what prospect selected
- Promo code field (promotion codes enabled)
Success Criteria:
- Stripe session created with metadata
vertical: 'funeral'andtier: 'funeral_pro' premium_funeral_homes.planreceives raw tier key (nevernormalizePlanTier()output)- Webhook routes correctly via stripe_webhook_inbox pattern
C. Email Journey
C1 — Post-checkout welcome / onboarding interview email (Day 0)
State: Post-payment (checkout.session.completed)
Trigger: Stripe webhook → stripe_webhook_inbox → cron-processed
Expected delivery: Within 15 minutes of payment completion
From: john@churchwiseai.com (or john@funeralwiseai.com — [FOUNDER: confirm sender address])
Reply-to: Same (not a no-reply address)
Subject: [FOUNDER: confirm — not defined in code]
Body (required elements):
- Welcome / acknowledgment of purchase
- Onboarding interview scheduling link (John's calendar for intake call, or instructions for next step)
- Expectation: "You'll be live within 5 business days of the onboarding interview"
- Admin dashboard link:
https://funeralwiseai.com/admin/[token] - What to expect next: interview → agent training → test call review → go-live
Submitter-only rule: Email sent to personal email entered at checkout. NEVER Cc the shared funeral home inbox.
Should NOT contain:
- Church, congregation, pastor, prayer, denomination, or ministry language
- PewSearch references
- VetWiseAI references
C2 — Post-demo booking confirmation (demo-led path)
State: Demo request submitted via /funeralwiseai/book
Trigger: Successful POST to /api/contact
Expected: John receives notification with lead details (funeral home name, website URL, contact info, best time). Lead-facing confirmation is the in-page success state (B4 above) — [FOUNDER: confirm if an autoresponder email goes to the prospect after form submit, or just the in-page confirmation]
C3 — Day 3 setup follow-up [FOUNDER: confirm if MailerLite automation exists]
Subject: [FOUNDER: confirm]
Body: Guide covering first steps — ensuring agent is trained on services/pricing/chapel names, configuring call routing rules, reviewing first call transcripts in dashboard.
C4 — Day 7 check-in [FOUNDER: confirm if exists]
Subject: [FOUNDER: confirm]
Body: Founder personal check-in — "How are your families responding? Any questions the agent is getting that you wish it answered better?"
C5 — Call summary notifications (ongoing, after every call)
State: Active subscriber, any call received
Trigger: Voice agent completes a call
Delivery: Text message + email to designated contacts
Required elements:
- Caller name
- Relationship to deceased (if at-need call)
- Reason for call
- Contact info
- Full transcript (in dashboard; summary in notification)
- Urgency flag if applicable
Delivery timing: [FOUNDER: confirm — immediately after call, or batched?]
D. First Login and Dashboard Discovery
D1 — Magic link click → dashboard
State: New paying customer, first visit
URL: funeralwiseai.com/admin/[token]
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/dashboard-first-visit.png
Should See:
- FuneralWiseAI brand chrome (slate + copper + bone) — NOT ChurchWiseAI gold/navy
- Dashboard with funeral-specific tabs and terminology
- Onboarding state if no calls yet
Should NOT See:
- ChurchWiseAI admin dashboard header ("ChurchWiseAI" brand name, sacred gold accent)
- Church tabs (Calls, Requests, Care, Training with church-specific sub-tabs)
- PewSearch listing panel
Note: The canonical admin now lives at funeralwiseai.com/admin/[token] via middleware rewrite. Legacy /admin/funeral/[token] issues 308 redirect to canonical URL.
D2 — Dashboard tab structure
State: Active paying customer
[FOUNDER: confirm exact tabs for funeral admin — the following are inferred from code but not verified against a live funeral dashboard]
Expected tabs (inferred from FuneralUpgradeTab + InboxTab usage patterns):
| Tab | Content | Confidence |
|---|---|---|
| Home / Overview | Call metrics tiles, recent activity feed, quick actions | INFERRED |
| Inbox | Call records, at-need inquiries, pre-planning inquiries, callbacks | INFERRED |
| Train AI | Funeral home profile: services, pricing, chapel names, staff contacts | INFERRED |
| Upgrade | FuneralWiseAI plan overview, Stripe portal link | CONFIRMED (FuneralUpgradeTab.tsx) |
| Settings | Call routing rules, notification contacts, team access | INFERRED |
Should NOT See:
- Care tab (church-specific broadcast messaging)
- Social tab (ShareWiseAI)
- Theology / denomination settings
- Planning Center integration
D3 — Dashboard Upgrade tab
State: Active customer (fwa_starter) or demo (fwa_demo)
Component: FuneralUpgradeTab.tsx
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/dashboard-upgrade-tab.png
Active paying state (fwa_starter) — Should See:
- "FuneralWiseAI Starter" current plan display
- Feature list (12 items from code):
- Unlimited calls — no per-call charges
- HEAR-protocol empathy framework on every call
- Full training on your services, prices, chapel names, and staff
- Complete call transcripts in your dashboard
- Text + email notification after every call
- After-hours, weekends, and holiday coverage
- Urgent call routing to your phone
- Secure web dashboard — nothing to install
- Ongoing agent updates as your offerings change
- At-need callback queue with urgency flags
- Pre-planning inquiry tracking
- Multi-staff dashboard access
- "More tiers coming soon" placeholder (from FuneralUpgradeTab design notes)
- Stripe portal link for billing management
Demo state (fwa_demo or fwa_demo_prospect) — Should See:
- Upgrade prompt with USD/CAD checkout option
- "Continue to secure checkout" button (POSTs to
/api/stripe/funeral-checkout)
Should NOT See:
- ChurchWiseAI plan ladder (Starter/Pro/Suite/Bundle)
- VetWiseAI plans
- Church-specific features
E. Setup Journey (Getting the Product Live)
The FuneralWiseAI setup is not self-serve — it is mediated by John (the founder) through an onboarding interview. The customer does not configure the agent themselves in a wizard flow (unlike ChurchWiseAI's Training tab).
E1 — Onboarding interview (sales-mediated)
State: Post-payment
Format: Video/phone call with John
What is gathered:
- Funeral home name, address, contact info
- Services offered and pricing menu
- Chapel names and capacities
- Staff names and roles
- After-hours and on-call routing instructions (who to page, under what conditions)
- Special cultural or religious traditions served (faith-neutral default, family supplies context)
- Pre-arrangement / pre-planning inquiry handling preferences
What is produced:
- Agent configuration in
premium_funeral_homesDB row - Voice agent trained on funeral home's specific content
- Test call scheduled for director's review
E2 — Test call review (before go-live)
State: Post-training, pre-go-live
Should See:
- Director receives a test call from the configured number
- Agent demonstrates HEAR protocol with a sample scenario
- Director approves or requests changes
Go-live gate: Director confirmation required before agent is activated on live number
E3 — Phone number setup
State: Post-training, go-live
Mechanism:
- Director keeps existing business phone number
- Provider provisions a private routing number
- Director sets up call forwarding on their carrier (using dial codes e.g.
*21*[routing_number]#) - Forwarding mode: forward on no-answer / after hours / when busy / unconditional
Agent training on how-it-works page:
- Common codes:
*21*to enable,##21#to cancel — agent confirms exact codes for their carrier during setup
F. Public-Facing Product Pages (what callers experience)
F1 — Voice agent behavior (inbound call)
State: Active subscriber, incoming family call
Mechanism: Call forwarded from funeral home's existing number via Telnyx (or Twilio legacy)
AI Bridge Principle — mandatory:
- Agent introduces itself as the answering service for [Funeral Home Name]
- Agent does NOT claim to be a human director
- Agent does NOT promise confidentiality or claim "just between us"
- Agent explicitly offers to connect the family to the human director when appropriate
- Agent is a bridge to the director, never a replacement
HEAR protocol compliance (test-enforced):
Step H — Hear:
- Agent listens fully without interrupting
- Agent follows caller's lead, does not rush to an IVR-style menu
Step E — Empathize:
- Before capturing any information: "I'm so sorry for your loss — thank you for calling [Funeral Home Name]."
- Acknowledgment is mandatory, not optional
Step A — Advance:
- Open-ended questions only: "What can we help you with tonight?" not "Please state the name of the deceased."
- Paced at caller's pace
Step R — Respond:
- Captures: caller name, relationship to deceased, contact info, nature of call
- Routes urgent calls (at-need, family in immediate distress) to director's phone
- Handles routine after-hours inquiries and creates call summary for dashboard
Escalation scenarios:
| Scenario | Required behavior |
|---|---|
| Mental health crisis (any caller) | "If you or someone with you is in emotional crisis, please call or text 988 — there are people there to help right now." |
| At-need first call (death just occurred) | Warm empathetic acknowledgment → collect name + contact → determine if immediate director needed → page or hold for callback |
| Pre-planning inquiry | Capture interest, collect contact, schedule follow-up |
| General information question | Answer from trained funeral home knowledge (services, pricing, chapel info) |
| Caller requesting a specific person | "I'll make sure [person's name] receives your message. May I take your contact information?" |
Prohibited behaviors:
- Agent NEVER provides grief counselling or acts as a therapist
- Agent NEVER makes promises about specific arrangements without director confirmation
- Agent NEVER quotes prices as final without noting director may provide updated information
- Agent NEVER tells caller "your conversation is private" or "what you share stays between us" — AI Bridge Principle hard prohibition
F2 — Family Hub / public intake page
State: Active subscriber
[FOUNDER: confirm if a family-facing public page exists (analogous to /care/[slug] for churches) or if the voice agent is the only public touchpoint]
If exists:
- URL pattern:
[FOUNDER: confirm slug format] - Expected content: funeral home name, hours, call instructions, director contact, online inquiry form
G. Ongoing Dashboard Use
G1 — Inbox / call records
State: Active subscriber, calls received
Tab: Inbox
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/dashboard-inbox.png
Row types (funeral-specific terminology):
- At-need call (family calling within hours/days of a death)
- Pre-planning inquiry
- General inquiry
- Callback request
Filter chips (expected — [FOUNDER: confirm exact chips]):
- All | At-Need | Pre-Planning | General | Callback
Row detail panel:
- Full transcript
- AI call summary
- Caller name + contact info
- Nature of call / urgency flag
- Action buttons: "Mark resolved," "Schedule callback," "Flag for director" (not "pastoral review")
Should NOT See:
- Prayer request filter (church-only)
- Care/broadcast messaging filter
- Denomination or theology filter
G2 — Train AI tab (funeral home profile)
State: Active subscriber
Tab: Train AI [FOUNDER: confirm tab label]
Expected editable fields:
- Funeral home name
- Services offered and pricing menu
- Chapel names and capacities
- Staff names and contact info
- After-hours routing rules
- Special traditions served
- Pre-arrangement program information
Should NOT See:
- Theological lens / tradition picker (church-only)
- Sermon or ministry content
- Congregation or parishioner references
G3 — Settings tab
State: Active subscriber
Tab: Settings
Expected sub-sections [FOUNDER: confirm]:
- Notification contacts (who gets text/email after each call)
- Call routing rules (when to page director vs. handle and summarize)
- Team access (add/remove staff dashboard access)
- Billing (Stripe portal link)
H. Lifecycle Events
H1 — Payment failure
State: Active subscriber, card declined
[FOUNDER: confirm — email? Dashboard banner? Grace period?]
Expected:
- Email notification to billing contact
- Dashboard banner indicating payment issue
- Grace period before service suspension
H2 — Cancellation
State: Active subscriber cancelling
[FOUNDER: confirm cancellation flow — self-serve via Stripe portal, or must contact John?]
From FAQ on pricing page:
- Monthly billing, cancel anytime
- Setup fee non-refundable after agent goes live
- 30-day guarantee covers first month subscription fee only
Expected:
- Agent deactivated on cancellation
- Data retained for
[FOUNDER: confirm retention period] - Dashboard accessible for
[FOUNDER: confirm duration]in read-only state
H3 — Agent updates (ongoing)
State: Active subscriber, services/pricing changes
From FAQ on pricing page:
- "Send us the changes and we update the agent within one business day. There is no charge for updates."
- Mechanism: email John with changes → John updates agent configuration
Skills / Lead Magnet (Acquisition touchpoint)
Skills Index — /funeralwiseai/skills
State: Any prospect
URL: funeralwiseai.com/skills
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/skills-index.png
Should See:
- Slate dark hero with copper accent glow
- H1: "Five AI prompts for the calls you take at 2am."
- Sub: Copy-paste into any AI assistant (ChatGPT, Claude.ai, Gemini, Grok, Perplexity, Copilot)
- "Works in" strip: links to supported AI tools
- 5 prompt cards (email-gated — one MailerLite signup unlocks all)
- "Funeral Director AI Prompt Pack · Free Forever" eyebrow
- Total minutes count for full pack
- MIT licensed badge
- Funnel CTA at bottom: "These prompts prepare you. FuneralWiseAI answers the call."
Email gate mechanism:
- MailerLite tag:
skill-pack-funeral(from layout code reference) - Drip automation:
187733617933288772(from CLAUDE.md page table) - Local unlock:
localStoragekeywiseai-skill-unlocked:skill-pack-funeral - Cross-device unlock: drip email links carry
?u=skill-pack-funeral
5 prompts (confirmed from production funeralwiseai.com/skills on 2026-05-20):
- Overnight Inbox Triage
- Bereavement Call Intake Script
- Obituary Drafter (3 Lengths)
- Pre-Need Consultation Guide
- Funeral Service Program Builder
AI Bridge compliance:
- Prompt descriptions include "AI prepares you; you take the call"
- Step 3 in "how it works": "AI drafts the artifact. You take the call. You deliver. AI Bridge safety baked in."
Should NOT See:
- Church, congregation, pastor, prayer, denomination language anywhere on this page
Individual Skill Page — /funeralwiseai/skills/[slug]
State: Email-unlocked prospect
Screenshot: knowledge/acceptance/screenshots/funeralwiseai/skills-individual-slug.png
Should See:
- Intro prose (what this prompt does, when to use it)
- Monospace
<pre>PromptBlock with Copy button - Outro (follow-up guidance)
- EmailGate rendered until
localStorageunlock key present ?u=skill-pack-funeralquery param on drip email links for cross-device unlock
5. Brand Chrome
| Token | Value | Confirmed in code |
|---|---|---|
| Primary color (slate) | #1E293B | Yes (layout.tsx + CSS token) |
| Accent color (copper) | #B45309 | Yes (used in page.tsx, skills/page.tsx) |
| Surface (bone) | #FAF8F3 | Yes (CSS token) |
| Brand name | FuneralWiseAI | Yes |
| Display font | Fraunces (variable --font-display) | Yes (layout.tsx) |
| Body font | Manrope (variable --font-body) | Yes (layout.tsx) |
| Logo path | /brand-assets/funeralwiseai/lockup-horizontal.svg | Yes (all pages) |
| Favicon | /brand-assets/funeralwiseai/favicon.svg | Yes (layout.tsx) |
| Apple icon | /brand-assets/funeralwiseai/app-icon.svg | Yes |
| OG image | /brand-assets/funeralwiseai/og-card.svg | Yes (SVG — see Drift §10) |
| Domain | funeralwiseai.com | Yes (metadata.metadataBase) |
| Admin URL | funeralwiseai.com/admin/[token] | Yes (via middleware) |
6. Banned Terminology
The following terms must NEVER appear in any FuneralWiseAI marketing pages, admin dashboard, or voice agent scripts. A DOM-grep E2E test should enforce this.
Church-origin terms (banned on funeral surfaces):
- church, congregation, pastor, prayer, sermon, denomination, theology, worship, ministry, sacrament, Planning Center, parishioner
VetWiseAI-origin terms (banned on funeral surfaces):
- veterinary, veterinarian, ASPCA, species, vaccine, prescription refill, pet owner, clinic
AI confidentiality phrases (banned per AI Bridge Principle + moderation.py):
- "just between us," "this stays between us," "our conversation is private," "I'm here for you anytime," any phrasing that implies the AI is a confidential counsellor or replaces human director contact
7. Required Terminology
The following terms must appear in appropriate contexts, confirming vertical taxonomy is correctly applied.
| Term | Where it must appear |
|---|---|
| funeral home | Settings Account section, onboarding copy, voice agent greeting, email copy |
| director / funeral director | Notification copy, admin UI for "flag for director" action |
| at-need | Inbox filter chip (or equivalent), voice agent routing logic |
| pre-planning | Inbox filter chip (or equivalent), settings routing rules |
| HEAR protocol | How-it-works page, about page, voice agent behavior spec |
| grieving family / families | Hero copy, email copy, voice agent empathy phrases |
8. Crisis Baseline (Test-Enforced)
8.1 Mental health — 988 (universal baseline, every vertical)
Required copy in voice agent prompts:
"If you or someone with you is in emotional crisis, please call or text 988 — there are people there to help right now."
This line is mandatory in every vertical's crisis copy registry.
8.2 Grief crisis escalation (funeral-specific)
Required behavior:
- If a caller expresses acute grief distress (suicidal ideation, self-harm references, extreme emotional crisis), agent must:
- Acknowledge with empathy
- Provide 988 referral
- Offer to connect to the funeral director (if caller consents)
- Never promise confidentiality or counsel
8.3 Immediate at-need death call (time-sensitive)
Required behavior:
- If a family calls reporting a death just occurred (at-need, fresh):
- Agent acknowledges with HEAR empathy first
- Collects caller name, contact, circumstances
- Pages the director immediately (per configured urgency routing)
- Confirms with caller that director will call back within [configured SLA]
9. Open Questions (Stage-2 Founder Validation Required)
| # | Question | Why it blocks | Priority |
|---|---|---|---|
| 1 | Exact dashboard tab names and content — what tabs does the funeral admin have? (Home, Inbox, Train AI, Settings, Upgrade — or different?) | Touchpoints D2, G1, G2, G3 cannot be finalized | P0 |
| 2 | Annual pricing option — is annual billing available for FuneralWiseAI? (Not mentioned on any public page) | Tier definition §2, Stripe billing config | P0 |
| 3 | fwa_pro tier — is it live, planned, or deprecated? | Tier definition §2 | P0 |
| 4 | Welcome email — exact subject line, sender address (john@churchwiseai.com or john@funeralwiseai.com), full body text? | Touchpoint C1 | P0 |
| 5 | Demo path email — does the demo-led buyer also go through self-serve checkout, or does John provision manually and send a magic link directly? | Touchpoints C1, C2, billing flow | P0 |
| 6 | Family-facing public page — does a /care/[slug] or /intake/[slug] equivalent exist for funeral tenants? (VetWiseAI has /intake/[slug].) | Touchpoint F2 | P1 |
| 7 | Cancellation flow — does the customer cancel via Stripe portal, or must they contact John? | Touchpoint H2 | P1 |
| 8 | Data retention on cancellation — how long is data retained? Dashboard accessible how long after cancellation? | Touchpoint H2 | P1 |
| 9 | Day 3 and Day 7 follow-up emails — do these exist as MailerLite automations? What are the exact subject lines and body copy? | Touchpoints C3, C4 | P1 |
| 10 | Skills touchpoint §4 | RESOLVED | |
| 11 | Stephen Leader on About page — should the "Stephen Leader Training" credential note that it is currently inactive? Or only state that the training was completed? | About page accuracy (per memory/user_founder_background.md) | P1 |
| 12 | fwa_demo_prospect vs fwa_demo distinction — what is the operational difference? Does fwa_demo_prospect get a different dashboard experience or just a different plan key? | Demo account management | P2 |
| 13 | Demo token naming convention — what is the demo admin token for testing? (VetWiseAI uses vetwiseai-demo-token-2026) | Playwright test setup | P1 |
10. Drift Found During Research
The following discrepancies were found between canonical specs and observed code. A remediation agent should fix these after the spec is confirmed.
Drift 1 — Stripe session metadata tier: 'funeral_pro' does not match plan key fwa_starter
File: churchwiseai-web/src/app/api/stripe/funeral-checkout/route.ts line 79
Observed: tier: 'funeral_pro' stamped on both sessionMetadata and subscriptionMetadata
Expected per CLAUDE.md Rule #23 / plan-column-contract.md: tier in session metadata must match the canonical plan key that will be written to premium_funeral_homes.plan. If the sole tier at launch is fwa_starter, metadata should read tier: 'fwa_starter' not tier: 'funeral_pro'.
Risk: Stripe webhook handler that reads session.metadata.tier to determine which plan key to write to premium_funeral_homes.plan will receive 'funeral_pro' not 'fwa_starter'. Depending on how the webhook processes this, could write wrong plan key or create an unrecognized plan state. [Remediation agent: verify webhook handler reads this field and maps it correctly — or align the metadata value with the DB plan key]
Drift 2 — Self-serve checkout cancel_url has double /funeralwiseai/ path
File: churchwiseai-web/src/app/api/stripe/funeral-checkout/route.ts line 74
Observed: cancel_url: 'https://funeralwiseai.com/funeralwiseai/checkout'
Expected: 'https://funeralwiseai.com/checkout' (since funeralwiseai.com already rewrites to the /funeralwiseai segment via middleware — the path funeralwiseai.com/funeralwiseai/checkout would 404 or double-resolve)
Risk: If a prospect cancels Stripe checkout, they land on a broken URL instead of being returned to the checkout page. Remediation: change cancel_url to 'https://funeralwiseai.com/checkout'.
Drift 3 — OG image is SVG (not PNG)
File: churchwiseai-web/src/app/funeralwiseai/layout.tsx line 59
Observed: OG image is /brand-assets/funeralwiseai/og-card.svg (SVG format)
From layout comment: "NOTE: og-card.svg is served as SVG. Facebook/LinkedIn/Twitter prefer PNG. TODO Phase 4: convert og-card.svg → og-card.png via build-time sharp step."
Risk: OG card may not render on social media platforms. Not a blocking launch issue but degrades social sharing quality.
Drift 5 — Home page renders "Pastor · Engineer · Founder" label (violates memory rule)
Observed: Production home page (funeralwiseai.com) renders "Pastor · Engineer · Founder" in the Founder Story section (likely from FounderStoryBlock component variant="funeral").
Expected per memory/user_founder_background.md: Never use "Pastor" as a primary professional label — the correct label (as shown in the About page code) is "Engineer · Grief-Care Practitioner · Founder." The term "Pastor" is imprecise and the memory file specifically prohibits the "pastor-turned-engineer" framing (which this implies in reverse).
Risk: Misrepresents the founder's background on the highest-traffic marketing page. Should be changed to "Engineer · Grief-Care Practitioner · Founder" to match about/page.tsx line 119.
File to check: churchwiseai-web/src/components/brand-family/FounderStoryBlock.tsx — the variant="funeral" branch likely sets this label independently from the about page.
Drift 4 — products.yaml lists FuneralWiseAI as a "future vertical" (not live)
File: knowledge/data/products.yaml line 166
Observed: funeralwiseai.com is listed under future_verticals — same as VetWiseAI and ShopWiseAI — with no status: live entry
Expected: FuneralWiseAI is now live (based on code, Stripe live price IDs, deployed marketing pages, and CLAUDE.md/PRICING.md references). products.yaml should have an active product entry for FuneralWiseAI analogous to churchwiseai, pewsearch, illustratetheword, sermonwise.
11. Acceptance Test Stubs
The following Playwright spec files should be created as test.fixme() skeletons before any production testing begins.
e2e/funeral-marketing-no-bleed.spec.ts
test.fixme('funeralwiseai.com home page contains no church/vet terminology', async ({ page }) => {
await page.goto('https://funeralwiseai.com');
const bodyText = await page.locator('body').innerText();
const banned = ['church', 'pastor', 'prayer', 'congregation', 'denomination', 'sermon',
'theology', 'worship', 'ministry', 'sacrament', 'Planning Center',
'veterinary', 'ASPCA', 'species', 'prescription refill'];
for (const term of banned) {
expect(bodyText.toLowerCase()).not.toContain(term.toLowerCase());
}
});
e2e/funeral-pricing.spec.ts
test.fixme('funeralwiseai pricing page shows correct USD amounts', async ({ page }) => {
await page.goto('https://funeralwiseai.com/pricing');
await expect(page.getByText('$745')).toBeVisible();
await expect(page.getByText('$199')).toBeVisible();
await expect(page.getByText('/mo')).toBeVisible();
});
test.fixme('funeralwiseai pricing page shows no tier ladder', async ({ page }) => {
await page.goto('https://funeralwiseai.com/pricing');
await expect(page.getByText('Starter')).not.toBeVisible();
await expect(page.getByText('Pro')).not.toBeVisible();
await expect(page.getByText('Suite')).not.toBeVisible();
});
e2e/funeral-demo-form.spec.ts
test.fixme('funeralwiseai book page submits demo request form', async ({ page }) => {
await page.goto('https://funeralwiseai.com/book');
await page.fill('[name="name"]', 'Test Director');
await page.fill('[name="funeralHomeName"]', 'Test Funeral Home');
await page.fill('[name="email"]', 'test@example.com');
await page.click('button[type="submit"]');
await expect(page.getByText('Request received.')).toBeVisible();
});
e2e/funeral-admin-no-bleed.spec.ts
test.fixme('funeralwiseai admin shows no church terminology', async ({ page }) => {
// Requires a valid demo token
await page.goto('https://funeralwiseai.com/admin/[demo-token]');
const bodyText = await page.locator('body').innerText();
const banned = ['congregation', 'pastor', 'prayer', 'denomination', 'theology',
'worship', 'ministry', 'Planning Center', 'ChurchWiseAI'];
for (const term of banned) {
expect(bodyText.toLowerCase()).not.toContain(term.toLowerCase());
}
});
e2e/funeral-voice-crisis.spec.ts
test.fixme('funeral voice agent crisis copy contains 988', async () => {
// Load the funeral vertical profile and check crisisCopy
// (implementation depends on how verticalProfile is exported)
const profile = await import('@/lib/verticals/funeral');
expect(JSON.stringify(profile.crisisCopy)).toContain('988');
});
12. Agents Reading This Spec
Before modifying any FuneralWiseAI code path, cross-reference against this spec. If a code change would contradict an expected output:
- Update this spec first (with explicit founder sign-off), THEN change the code.
- OR flag the contradiction as a FAIL in the
/ensure-solid funeralwiseaiscorecard.
When production testing occurs, the Playwright stubs in §11 should be un-fixed and run against https://funeralwiseai.com/admin/[demo-token] per the production-testing rule (memory/feedback_playwright_production_testing.md).
The knowledge/readiness/funeralwiseai.yaml file configures /ensure-solid funeralwiseai scoring.