Skip to main content

Pastor buys Voice Agent

Persona

A solo or small-staff pastor at a church of 50–500 members. Calls go to voicemail constantly — members needing prayer, first-time visitors looking for service times, people in crisis calling after hours. The church can't afford a full-time receptionist. The pastor hears about ChurchWiseAI through a PewSearch outreach email, a Google search, or a recommendation and clicks through wanting their phone answered with warmth and empathy, not a generic voicemail box. Tech comfort is low-to-moderate. They trust the product will "just work" once set up. Decision cycle is fast (same session) when price is visible.

Entry points

  • /voice — dedicated Voice Agent product page with ROI calculator and agent showcase
  • /pricing — channel toggle to "Voice Only" or "Both" reveals voice pricing
  • PewSearch chatbot upsell — "Want your phone answered too?" CTA surfaced in the PewSearch admin dashboard for churches already using PewSearch Premium
  • Outreach email CTA — church-outreach campaign emails link directly to /voice or /pricing?channel=voice
  • Organic Google search — "AI answering service for churches" → /voice or /pricing

Click-through flow

Steps

  1. Step 1 — Lands on /voice

    • URL: https://churchwiseai.com/voice
    • What the user sees: Voice Agent product page — headline, HEAR protocol explanation, ROI calculator, agent showcase (Care + Coordinator demo), pricing CTA.
    • What they do: Reads, tries the ROI calculator, clicks "See Pricing" or "Get Started."
    • Server-side: Static page render. No auth required.
  2. Step 2 — Reviews pricing

    • URL: https://churchwiseai.com/pricing
    • What the user sees: Channel toggle defaults to Chat. Pastor toggles to "Voice Only." Annual/Monthly toggle disappears (voice is monthly only). Two cards appear: Starter Voice $49.95/mo (+$49.95 setup fee) and Pro Voice $99.95/mo (+$49.95 setup fee, waived on annual). No free trial — "Your card will be charged today."
    • What they do: Selects a tier, clicks "Get Started."
    • Server-side: CTA appends ?plan=starter_voice (or pro_voice) to the onboard URL.

    Pricing note: Starter Voice $49.95/mo, Pro Voice $99.95/mo, $49.95 one-time setup fee. Both/bundle plans: Starter Both $54.95/mo, Pro Both $79.95/mo, Suite Both $99.95/mo. See C:\dev\PRICING.md for Stripe price IDs.

  3. Step 3 — Onboard form

    • URL: https://churchwiseai.com/onboard?plan=starter_voice
    • What the user sees: Single-step form — church name, pastor name, email, phone, denomination. Plan pre-selected ("Starter Voice — $49.95/mo"). No annual toggle. Clear "no trial" copy.
    • What they do: Fills in church details, clicks "Continue to Payment."
    • Server-side: Form data saved in session/query params; passed to Stripe checkout.
  4. Step 4 — Stripe Checkout

    • URL: https://churchwiseai.com/onboard/checkout → redirects to Stripe-hosted checkout
    • What the user sees: Stripe checkout page. Product: "ChurchWiseAI Starter Voice." Amount: $49.95/mo + $49.95 setup fee line item. No trial badge. "Subscribe" button.
    • What they do: Enters card details, clicks "Subscribe."
    • Server-side: Stripe creates subscription + one-time setup invoice. On success, redirects to /onboard/return?session_id=...
  5. Step 5 — Post-checkout confirmation

    • URL: https://churchwiseai.com/onboard/return
    • What the user sees: "Welcome to ChurchWiseAI — [Church Name]!" confirmation. "We're setting up your voice line — you'll hear from us within 1 business day." "Go to Your Dashboard" button.
    • What they do: Reads confirmation, clicks dashboard link or waits for email.
    • Server-side: Stripe webhook (POST /api/stripe/webhook) fires, verifies signature, inserts event into stripe_webhook_inbox (idempotent on stripe_event_id), returns 200 in under 200ms. No provisioning work inline.
  6. Step 6 — Automated provisioning pipeline (server-side, ~10–60s after payment)

    • No URL — background pipeline.
    • What happens: Cron job at /api/cron/process-stripe-webhooks (runs every minute) claims the event from stripe_webhook_inbox and calls processStripeEvent():
      1. provisionNewChurch() — creates premium_churches row, church_voice_agents stub (status: 'pending_setup')
      2. provisionVoiceLine() — calls Telnyx API to search for a local number in the church's area code, buys the number (connection_id 2925081061861885519), creates LiveKit SIP inbound trunk (no auth — Telnyx uses FQDN routing, not credential auth), creates dispatch rule pointing to churchwiseai-voice agent, updates church_voice_agents.twilio_phone_number and sets status: 'active'
      3. Magic link generated, welcome email sent (Email 1 of 2)
    • Failure handling: If provisionVoiceLine() throws (e.g., no number available in area code), inbox row moves to failed status, retries with exponential backoff (0s/30s/2m/10m/30m), max 10 attempts. After 10: abandoned + P0 alert in founder_action_items. Founder provisions manually via POST /api/admin/provision-number with desired areaCode.
  7. Step 7 — First login and agent configuration

    • URL: https://churchwiseai.com/admin/[token]
    • What the user sees: Dashboard with onboarding checklist. Calls tab visible. Phone number shown (or "Provisioning..." if still pending). Onboarding wizard slides for: church profile, voice greeting (Coordinator script), hours, escalation/notification settings. Training tab shows Church Knowledge, This Week, Theology, Agents, Safety sub-tabs (no FAQs, no Simulator — Starter tier).
    • What they do: Completes wizard steps. Configures Coordinator greeting script (e.g., "Thank you for calling [Church Name], I'm the AI assistant for [Pastor Name]..."). Sets business hours. Adds emergency escalation contact.
    • Server-side: Settings saved to organization_settings and church_voice_agents in Supabase. Voice agent reads greeting from church_voice_agents.welcome_greeting at call initialization via load_product_knowledge() in session.py.
  8. Step 8 — Voice Line Live email and call forwarding

    • Trigger: After provisioning completes and founder QA-checks the line.
    • What the user receives: Email 2 of 2 — "Your Voice Line Is Live!" Contains: assigned phone number (e.g., +1-414-400-7103), carrier-specific call-forwarding instructions ("To forward your existing church number to your new AI line, dial..."), link to admin dashboard.
    • What they do: Forwards their existing church landline/cell to the Telnyx number, OR simply gives out the new number directly.
  9. Step 9 — Test call (live verification)

    • What the user does: Calls the assigned Telnyx number from their own phone.
    • What the user hears: Coordinator agent answers with the configured greeting, routes prayer requests and visitor contacts appropriately, offers callback scheduling.
    • What they see in dashboard: New row in Calls tab with transcript and summary. Requests tab shows any prayer request or visitor contact captured during the call.
    • Success state: AI agent answers, transcript appears, pastor receives a staff notification email for any action item captured.

    Testing note: Do NOT dial any 555-prefix number (e.g., +13035550108, +16125550105). These are NPA-reserved fiction placeholders and cannot receive real calls. Use the Demo Router (+14696152221 US / +13658254095 CA) to reach demo churches. Only real provisioned numbers (Telnyx or Twilio) are dialable. See memory/feedback_555_phone_numbers_are_fake.md.

Acceptance spec

Primary spec: knowledge/acceptance/starter-voice.md (62 touchpoints, status: COMPLETE).

Tier-specific deltas:

PlanPriceTrialChat?Voice agentsTools
Starter Voice$49.95/moNoneNo2 (Care + Coordinator)12
Pro Voice$99.95/moNoneNo2 (Care + Coordinator)12
Starter Both$54.95/moNoneYes2 voice + 2 chat12
Pro Both$79.95/moNoneYes2 voice + 4 chat35
Suite Both$99.95/moNoneYes2 voice + 4 chat39

See knowledge/acceptance/pro-both.md and knowledge/acceptance/suite-both.md for bundle-tier touchpoints. Voice provisioning pipeline is identical across all voice-inclusive plans. Voice picker UI (to change Cartesia voice) is not yet builtvoice_id DB field exists but dashboard control is pending.

Success criteria

From the user's point of view:

  1. Assigned phone number (Telnyx local number) answers real inbound calls within 2 rings.
  2. Coordinator agent speaks the church's configured greeting — correct church name, correct pastor name.
  3. Care agent takes over for emotional/crisis callers and offers a callback or human transfer.
  4. Prayer request captured during call appears in the Requests tab within seconds.
  5. Staff notification email arrives after the call for any action items.
  6. Pastor can log into the admin dashboard, read the call transcript, and update the greeting without contacting support.
  7. "Voice Line Live" email (Email 2 of 2) contains the real phone number and forwarding instructions.

Known failure modes

  • Stripe webhook silent loss (pre-2026-04-14 pattern, now fixed): Previously, if the webhook route threw during inline provisioning, it still returned 200 to Stripe and the customer was never provisioned. The inbox pattern (stripe_webhook_inbox + cron worker) now guarantees every paid event gets retried until succeeded or escalated. First observed: real-card signup that billed the customer but created zero DB rows. Fix committed 47424fe0. See memory/project_stripe_webhook_inbox.md.

  • Telnyx area code exhausted: provisionVoiceLine() tries multiple patterns (0000, 5000, 4000, 000, 500, 400, 200, 100, then first available) before giving up. If exhausted, inbox row enters retry queue and a P0 alert fires. Founder manually selects an adjacent area code via POST /api/admin/provision-number with areaCode param.

  • SIP trunk auth misconfiguration: LiveKit SIP inbound trunks must have NO auth credentials. Telnyx routes via FQDN (5u9xu5ysoly.sip.livekit.cloud:5060) and does not attach SIP credential headers. If auth is accidentally set on the trunk, every inbound call is rejected. Verify with C:\dev\lk.exe sip inbound list --project cwa-voice — Authentication column must be blank. See knowledge/runbooks/voice-provisioning.md for the clear-auth curl pattern.

  • 555-prefix demo numbers undiallable: Demo seeder rows sometimes use +1-NPA-555-XXXX placeholders. These cannot receive real PSTN calls. Always query church_voice_agents.twilio_phone_number and check pattern ^\+1\d{3}555\d{4}$ before directing anyone to dial. Route fictional demos via the Demo Router (+14696152221). See memory/feedback_555_phone_numbers_are_fake.md.

  • Cartesia TTS vendor risk: Cartesia had a 5-day outage (SDK 0.2.4 + wrapper crash) that would have silenced all voice agents. The voice agent uses Cartesia Sonic via the LiveKit plugin. If TTS goes silent, callers hear nothing. Monitor Cartesia status page at launch. See memory/project_cartesia_vendor_risk.md.

  • Welcome email provisioning gap (inner try/catch issue): If the welcome email step inside provisionNewChurch() fails all 3 retries, the inbox row is marked succeeded but the customer never receives their magic link. Monitor provisioning_summary field on stripe_webhook_inbox rows for partial failures. Fix tracked in webhook inbox follow-up PR.

  • Wrong church greeting plays: session.py:resolve_route() maps phone number → church UUID via PHONE_REGISTRY dict first, then DB fallback. If a new number is provisioned but the agent is not redeployed and the number is not in PHONE_REGISTRY, the DB fallback handles it automatically. If the greeting is wrong, check church_voice_agents.welcome_greeting and PHONE_REGISTRY mapping in voice-agent-livekit/session.py.