VetWiseAI Vertical — Expected Output Spec
DRAFT — Stage 1 complete (agent research from code + production, 2026-05-20). Stage 2 founder validation interview is required before any touchpoint is locked. Prior partial spec (authored 2026-05-01) covered touchpoints 2.1–2.12 at scaffold level. This extension adds full methodology coverage: all 8 categories, per-touchpoint templates, screenshots directory, and readiness YAML. Gaps and open questions from the original spec are preserved and renumbered.
Drift Found During Research
The following discrepancies were found between the existing spec and actual code/production. They are recorded here for remediation — NOT fixed in this spec.
| # | Source of truth | Spec said | Code/production says |
|---|---|---|---|
| D1 | vetProfile.intakePathSegment in vet.ts | /intake/<slug> | appointments — the public hub renders at /appointments/<slug>, NOT /intake/<slug>. Spec §2.12 must be corrected. |
| D2 | lifecycle-emails-vet.ts line 49 (FROM) | john@churchwiseai.com | VetWiseAI <hello@veterinarywiseai.com> — email from address is branded vet domain, not founder personal address. |
| D3 | lifecycle-emails-vet.ts email header gradient | Not specified | Uses blue gradient (#0c4a6e → #0369a1) — does NOT match the approved forest-green palette (#1A3A2A / #5B9A6E). Potential brand mismatch. |
| D4 | vetwiseai-vertical.md §9 User State | admin URL: veterinarywiseai.com/admin/[admin_token] | vet.ts → adminPath: '/admin/[token]' confirmed. But no premium_vet_clinics table confirmed to exist yet — vet.ts comments say "vet DB tables don't exist yet (Phase 6)". Admin routing may resolve to a stub/empty state. |
| D5 | Checkout success URL | Not specified | vet-checkout/route.ts redirects to https://veterinarywiseai.com/thank-you?source=vet_self_serve&session_id={CHECKOUT_SESSION_ID} — no vet-specific thank-you page observed; may fall through to global /thank-you. Founder to confirm. |
| D6 | Home page hero copy | Spec gave a placeholder example | Actual: headline is "Never miss a call from a worried pet owner." (not the placeholder). Sub-hero mentions HEAR protocol, not ASPCA directly. |
| D7 | vet-pricing.ts plan key vs email file | vet-pricing.ts maps checkout tier key as vwa_${tier} (e.g. vwa_starter) | lifecycle-emails-vet.ts uses vet_starter / vet_pro as plan keys. These may be different namespaces but founder should confirm the canonical plan key written to premium_vet_clinics.plan. |
1. Tier Definitions
vwa_starter — VetWiseAI Starter
| Field | Value | Source |
|---|---|---|
| Plan key | vwa_starter | vet-checkout/route.ts metadata |
| Setup fee | $745 USD / $995 CAD one-time | vet-pricing.ts, pricing.yaml |
| Monthly fee | $199 USD / $249 CAD/mo | vet-pricing.ts, pricing.yaml |
| Annual option | Founder to confirm (not wired in code) | Open Question #3 |
| Trial | None — no trial logic in vet checkout | vet-checkout/route.ts |
| Voice | Included | vet.ts |
| Chatbot | Deferred — "Coming Soon" at Phase 4 launch | vet.ts |
| Onboarding SLA | 10 business days | vet-pricing.ts VET_TIER_FEATURES |
| Species | Dogs / cats / 1-exotic | vet-pricing.ts VET_TIER_FEATURES |
| Plan label (UI) | "Starter" | VET_TIER_LABELS in vet-pricing.ts |
| Live Stripe product | prod_URiRlazRWaJWlc (setup), prod_URiS8R9aKu5N43 (monthly) | vet-pricing.ts |
Starter includes (from VET_TIER_FEATURES):
- Unlimited calls — no per-call charges
- HEAR-protocol empathy framework on every call
- ASPCA Poison Control escalation (1-888-426-4435)
- Emergency vet referral — AI asks and routes
- Dogs / cats / 1-exotic species knowledge base
- Prescription refill intake + dashboard callback queue
- Text + email notification after every call
- After-hours, weekends, and holiday coverage
- Secure web dashboard — nothing to install
- 10-day onboarding SLA
vwa_pro — VetWiseAI Pro
| Field | Value | Source |
|---|---|---|
| Plan key | vwa_pro | vet-checkout/route.ts metadata |
| Setup fee | $745 USD / $995 CAD one-time | vet-pricing.ts, pricing.yaml |
| Monthly fee | $299 USD / $379 CAD/mo | vet-pricing.ts, pricing.yaml |
| Annual option | Founder to confirm | Open Question #3 |
| Trial | None | Code |
| Onboarding SLA | 5-day priority SLA | vet-pricing.ts VET_TIER_FEATURES |
| Species | Multi-species (unlimited) | vet-pricing.ts |
| Cal.com | Included — direct appointment booking | vet.ts integrations |
| Plan label (UI) | "Pro" (badge: "Most popular") | pricing/page.tsx |
| Live Stripe product | prod_URiSvj3clfFN2O (setup), prod_URiSXu3iRfirnM (monthly) | vet-pricing.ts |
Pro adds over Starter:
- Cal.com integration — books appointments directly
- Multi-species knowledge base (unlimited)
- AVImark / Cornerstone integration placeholders
- Priority 5-day onboarding SLA
- Dedicated onboarding call with John
Stripe Price IDs (Live)
| Line item | USD price ID | CAD price ID |
|---|---|---|
| Starter setup (one-time) | price_1TSp13FaoK5IPzNoKJffH9bJ | price_1TSp13FaoK5IPzNoV3TwTuJ8 |
| Starter monthly | price_1TSp1SFaoK5IPzNoxEeUYozm | price_1TSp1TFaoK5IPzNo1QRCLWQk |
| Pro setup (one-time) | price_1TSp1xFaoK5IPzNoKeCZa0bb | price_1TSp1yFaoK5IPzNoIJ0d8CSH |
| Pro monthly | price_1TSp2DFaoK5IPzNoQO4LWl2n | price_1TSp2EFaoK5IPzNo5T86DGKv |
Test-mode price IDs: NOT YET CREATED. See Open Question #1.
2. User State Definition
| Field | Value |
|---|---|
| Plan | vwa_starter or vwa_pro |
| Tenant table | premium_vet_clinics (Phase 6 — not confirmed created in DB) |
| Status | active (post-payment) |
| Admin URL | veterinarywiseai.com/admin/[token] |
| Auth | Token-based magic link (same pattern as church + funeral) |
| Public Appointments Hub URL | veterinarywiseai.com/appointments/[slug] (see Drift D1) |
| Trial | None |
| Voice | Included in all tiers |
| Chatbot | "Coming Soon" placeholder at Phase 4 go-live |
| ASPCA disclosure | Required at onboarding |
A. Discovery Paths (Touchpoints 1–10)
A1. Direct navigation — veterinarywiseai.com homepage
State: Any pre-purchase prospect
URL: https://veterinarywiseai.com
Screenshot: knowledge/acceptance/screenshots/vetwiseai/A1-homepage.png
Should See:
- Nav:
VetWiseAIwordmark (lockup-horizontal.svg, 32px height) + links: How it works / Pricing / About / Book a demo + CTA button "Book a demo" - Hero eyebrow: "AI answering for veterinary practices"
- Hero headline: "Never miss a call from a worried pet owner." with "a worried pet owner" in accent color
- Hero sub-copy mentioning HEAR protocol and clinical empathy framing
- TWO hero CTAs: "Hear how it works" (primary, anchors to #how-it-works) + "Book a 30-min demo" (secondary, links to
https://cal.com/john-moelker/vetwiseai-demo) - Value-prop trio: "Always answers." / "Trained for your clinic." / "Clinical empathy built in."
- 4-step "How it works" section (ring → greeting → triage → notification)
- Trust signals block: "Live within 10 business days" / "Built on clinical empathy training" / "Your data stays yours"
- Pricing callout: two cards (Starter $745+$199/mo, Pro $745+$299/mo) with "Most popular" badge on Pro
- Founder story block (FounderStoryBlock variant="vet")
- Final CTA band: dark green background, "Every pet owner deserves a calm first voice.", "Book your demo call" button → cal.com
- Footer: VetWiseAI branding + links (How it works / Pricing / About / Book a demo / Privacy / Terms)
Should NOT See:
- ChurchWiseAI logo, navigation, or brand colors
- FuneralWiseAI branding
- Church, congregation, pastor, sermon, prayer, denomination in any text
- Funeral, director, mortuary, at-need in any text
- Any pricing for
cwa_*orfwa_*plans - PewSearch links or branding
Links:
- "Hear how it works" →
#how-it-works(same page anchor) - "Book a 30-min demo" →
https://cal.com/john-moelker/vetwiseai-demo - "See what's included" (Starter card) →
/vetwiseai/pricing - "Book a demo" (Pro card) →
https://cal.com/john-moelker/vetwiseai-demo - "Full pricing details" →
/vetwiseai/pricing
Success Criteria:
- Page loads in VetWiseAI brand chrome (forest-green palette,
data-brand="vetwiseai") - No cross-vertical terminology bleed detectable in DOM text
- Both CTAs in hero are visible above the fold on desktop
A2. How it works page
URL: https://veterinarywiseai.com/how-it-works
Screenshot: knowledge/acceptance/screenshots/vetwiseai/A2-how-it-works.png
Should See:
- HEAR protocol explained in veterinary context (Hear / Empathize / Advance / Respond)
- Call flow walkthrough (01–04 numbered steps)
- ASPCA Poison Control reference with
1-888-426-4435and$95 fee disclosed inline - Privacy / data section
- Integration section (existing phone number, no forwarding complexity)
- CTA to book demo
Should NOT See:
- Church or funeral terminology
- Confidentiality promises that violate the AI Bridge Principle
A3. Pricing page
URL: https://veterinarywiseai.com/pricing
Screenshot: knowledge/acceptance/screenshots/vetwiseai/A3-pricing.png
Should See:
- H1: "Simple pricing. No surprises."
- Two tier columns: Starter + Pro (Pro has "Most popular" badge)
- USD/CAD toggle (geo-defaulted by
getDefaultCurrency()) - Starter: $745 setup + $199/mo USD (or $995/$249 CAD)
- Pro: $745 setup + $299/mo USD (or $995/$379 CAD)
- Feature lists populated from
VET_TIER_FEATURESinvet-pricing.ts - "$745 setup fee includes (both tiers)" box with 7 bullet items
- ROI note: "One answered after-hours call typically covers the monthly fee."
- 9-item FAQ covering emergencies, AI disclosure, setup time, species changes, contracts, 30-day guarantee, staff access, AVImark/Cornerstone, after-hours
- Final CTA band: "Book your demo call" →
/vetwiseai/book - Secondary "Skip the call" link →
/vetwiseai/checkout(below the primary CTA) - 30-day satisfaction guarantee mentioned
Should NOT See:
- Any
cwa_*orfwa_*plan pricing - Annual pricing cards (not wired — confirm with founder if planned)
Links:
- Starter "See what's included" →
/vetwiseai/book - Pro "Book a demo" →
https://cal.com/john-moelker/vetwiseai-demo - "Book your demo call" →
/vetwiseai/book - "Skip the call" →
/vetwiseai/checkout
A4. About page
URL: https://veterinarywiseai.com/about
Screenshot: knowledge/acceptance/screenshots/vetwiseai/A4-about.png
Should See:
- Founder framing: 15 years software engineering + 15 years care/empathy work
- Four credential blocks: 15yr software / 15yr care work / CPE (1 unit) / Stephen Leader Training
- CPE described as "One completed CPE unit" — NOT "CPE-certified" (MEMORY.md constraint)
- Stephen Leader described as trained in the Stephen model — NOT "Stephen Leader credential" (MEMORY.md constraint)
- HEAR protocol origin story connected to pet-owner anxiety
- Founder photo (Image component)
- CTA to book demo
Should NOT See:
- "CPE-certified" (inaccurate — 1 unit, not full certification)
- "pastor-turned-engineer" framing (MEMORY.md: avoid this)
- Any church or funeral content
- "5 years pastoring" framing
A5. Book a demo page
URL: https://veterinarywiseai.com/book
Screenshot: knowledge/acceptance/screenshots/vetwiseai/A5-book-demo.png
Should See:
DemoRequestFormcomponent with vet-specific fields:- Your name (required)
- Practice name (required)
- Practice website (optional — "We use your website to build a personalized demo")
- Email address (required)
- Phone number (optional)
- Calls/day select: Under 20 / 20–50 / 50–100 / Over 100
- Species primarily treated select: Dogs & Cats / Exotics / Mixed-species / Large animals / Other
- Reason for AI answering (open textarea)
- Best time to talk select: Mornings / Afternoons / Evenings / Flexible
- Submit button: "Request your demo"
- On success: "Request received." confirmation card, "John will reach out within one business day"
- On error: error message with mailto:
hello@veterinarywiseai.comfallback
Form POST destination: /api/contact with source: 'vetwiseai'
Should NOT See:
- Church-specific fields (denomination, congregation size)
- Funeral-specific fields (at-need families, services per year)
A6. Self-serve checkout page
URL: https://veterinarywiseai.com/checkout
Meta: noindex, nofollow — not indexed
Screenshot: knowledge/acceptance/screenshots/vetwiseai/A6-checkout.png
Should See:
- H1: "Start VetWiseAI today."
- Tier selector: Starter / Pro toggle buttons (Starter pre-selected)
- USD/CAD currency toggle (geo-defaulted)
- Price summary box: "One-time setup $745 USD" + "Monthly subscription (Starter) $199/mo USD"
- Email field (required, placeholder: "you@yourpractice.vet")
- Practice name field (optional, placeholder: "Greenfield Animal Hospital")
- Submit: "Continue to secure checkout"
- Loading state: "Redirecting to secure checkout…"
- Footer disclaimer: "Payments processed by Stripe. We never see your card details."
- Alternative link: "Prefer to walk through it together? Book a 15-minute demo →"
Links:
- Book link →
/vetwiseai/book - Submit → POST
/api/stripe/vet-checkout→ redirects to Stripe-hosted Checkout
Should NOT See:
- Church or funeral plan options
- CWA chatbot widget or chatbot plans
A7. WiseAI Agency verticals page (referral path)
URL: https://wiseaiagency.com/verticals
State: Prospect browsing the WiseAI Agency portfolio
Should See:
- VetWiseAI card linking to
veterinarywiseai.com - Vet vertical listed alongside FuneralWiseAI and ChurchWiseAI
- Brief "AI phone answering for veterinary practices" description
Founder to confirm: Whether VetWiseAI card is visible and live on this page (currently out of scope to verify here — flag for Stage 2).
A8–A10: Additional discovery paths (N/A or TBD)
| Path | Status | Reason |
|---|---|---|
| A8. Google/paid ads | N/A — no vet ads running at spec date | No ad campaigns confirmed. Flag for founder. |
| A9. PewSearch upsell banner | N/A — PewSearch does not surface vet products | VetWiseAI is not a church product; no PewSearch integration. |
| A10. Referral / direct URL | Covered by A1 (homepage) | Direct URL lands on homepage. |
B. Pre-Purchase Journey (Touchpoints 11–16)
VetWiseAI is a sales-led service. The canonical purchase path is: Book demo → onboarding interview → provisioned by founder. A self-serve checkout is the secondary ("skip the call") path. There is no self-service wizard equivalent to the church onboarding form at this stage.
B11. Demo request flow (primary pre-purchase path)
State: Prospect who completed form at /vetwiseai/book
Component: DemoRequestForm → /api/contact
Screenshot: knowledge/acceptance/screenshots/vetwiseai/B11-demo-submitted.png
Should See (on success):
- In-place confirmation card: "Request received."
- "John will reach out within one business day to schedule your personalized demo."
- "Check your inbox — including your spam folder."
Success Criteria:
- Form submission reaches
/api/contactwithsource: 'vetwiseai' - No redirect — confirmation in-place
- Founder receives notification of new demo request (mechanism TBD — confirm with founder in Stage 2)
B12. Self-serve checkout — tier + currency selection
State: Prospect at /vetwiseai/checkout
Should See:
- Starter pre-selected by default
- Pro togglable
- Currency defaults to USD or CAD based on Vercel geo-IP
- Price summary updates live when tier or currency changes
- "Starter: $199/mo USD" sub-label visible on tier button
Success Criteria:
- Price summary reflects the selected tier + currency before form submission
- No stale prices shown on toggle
B13. Stripe checkout (hosted)
State: Prospect after clicking "Continue to secure checkout"
Should See:
- Stripe-hosted checkout page in Stripe's standard UI
- Product name: "VetWiseAI Starter" or "VetWiseAI Pro" (as set in Stripe product metadata)
- Line items: setup fee (one-time) + first monthly subscription charge
- Currency matches what was selected (USD or CAD)
- Promotion code field (checkout created with
allow_promotion_codes: true)
Should NOT See:
- "ChurchWiseAI" in any line item name
- CAD prices when USD was selected (adaptive pricing is disabled)
Stripe session metadata (critical — do not collapse):
vertical: 'vet'tier: 'vwa_starter'or'vwa_pro'— NEVER collapsed to'starter'or'pro'currency: 'USD'or'CAD'source: 'self_serve'
B14. Checkout confirmation / thank-you
State: After successful Stripe payment
URL: https://veterinarywiseai.com/thank-you?source=vet_self_serve&session_id={CHECKOUT_SESSION_ID}
Should See:
- VetWiseAI branded thank-you page (vet-specific or shared
/thank-you— see Drift D5) - Confirmation that payment was received
- What happens next: "We'll be in touch within one business day to schedule your onboarding interview"
- (Founder to confirm exact copy in Stage 2)
Open Question (OQ-10): Does a vet-specific /thank-you page exist or does the generic churchwiseai.com /thank-you page render? The success_url routes to veterinarywiseai.com/thank-you via middleware rewrite — the middleware rewrites this domain's paths to /vetwiseai/*. So the actual rendered page would be /vetwiseai/thank-you which may not exist, causing a 404. Founder/agent to verify.
B15–B16: N/A for VetWiseAI
| Touchpoint | Status | Reason |
|---|---|---|
| B15. Multi-step onboarding wizard (church pattern) | N/A — sales-led | VetWiseAI uses founder-conducted onboarding interview, not a self-serve wizard. The VetClinicInfoForm is used in-dashboard post-purchase, not pre-purchase. |
| B16. PewSearch claim path | N/A | VetWiseAI has no PewSearch integration. |
C. Email Journey (Touchpoints 17–24)
C17. Day 0 Welcome Email
Trigger: checkout.session.completed webhook for any vwa_* plan (or manual send by founder after demo onboarding)
From: VetWiseAI <hello@veterinarywiseai.com> (confirmed in lifecycle-emails-vet.ts)
Subject: Welcome to VetWiseAI, [contactName]
Screenshot: knowledge/acceptance/screenshots/vetwiseai/C17-welcome-email.png (text capture acceptable)
Should See (required elements):
- Personalized greeting with contact name
- Dashboard URL / magic link to
veterinarywiseai.com/admin/[token] - Next steps for the onboarding interview
- ASPCA Poison Control reference (
1-888-426-4435,$95 fee) mentioned or linked - Reply address accessible (not a no-reply)
Should NOT See:
- "church," "congregation," "pastor," "prayer," "denomination," "worship"
- Funeral-origin copy ("at-need," "pre-planning," "director")
- ChurchWiseAI or FuneralWiseAI branding
Drift flag (D3): Email header gradient in current code is blue (#0c4a6e → #0369a1), not the approved forest-green palette. This is a brand mismatch that should be corrected before go-live.
Timing: Within 5 minutes of checkout.session.completed (or immediately on manual send).
Submitter-only rule: Email goes to the personal address submitted at checkout. Do NOT Cc any shared clinic inbox.
C18. Day 2 Setup Nudge
Trigger: Lifecycle cron, Day 2 post-signup
Subject: "Quick step: confirm your triage protocol"
Skip condition: vet_has_protocol_configured (cron checks this flag)
Should See:
- Prompt to log into dashboard and confirm emergency triage protocol
- Dashboard link
- Explanation of what configuring the protocol enables
C19. Day 7 Activation Check
Trigger: Lifecycle cron, Day 7 post-signup
Subject: "Have any pet owners reached out after hours?"
Skip condition: vet_has_calls (cron checks this flag — skips if agent has already taken calls)
Should See:
- Check-in from John on whether after-hours calls have come in
- Offer to adjust agent training if needed
C20. Day 13 Check-in
Trigger: Lifecycle cron, Day 13 Subject: "Two weeks in — anything to adjust?"
Should See:
- Configuration review prompt
- Link to dashboard training section
C21. Day 30 Retention Check-in
Trigger: Lifecycle cron, Day 30 Subject: "Your first month — a quick check-in from John"
Should See:
- Founder personal check-in tone
- Offer for a review call
C22–C24: Stripe receipt + notification emails
| Touchpoint | Expected output | Source |
|---|---|---|
| C22. Stripe receipt | Standard Stripe receipt; shows VetWiseAI product names. | Stripe-generated. |
| C23. Call notification (after voice call) | Email + text to clinic owner with call summary, caller contact info, urgency assessment. From vet system — vet terminology only. | voice-agent-livekit/ notification system. Confirm mechanism with founder. |
| C24. Emergency escalation notification | Immediate notification when voice agent flags an emergency call. Must arrive within 2 minutes of call end. | Open Question — confirm SLA with founder. |
D. First Login and Dashboard Discovery (Touchpoints 25–29)
Note: VetWiseAI admin dashboard is scaffolded (Phase 6 for full wiring). Touchpoints below describe the expected state at Phase 4 go-live — some tiles show "0" until DB tables are live.
D25. Magic link click → dashboard load
State: Clinic owner clicks magic link from welcome email
URL: https://veterinarywiseai.com/admin/[token]
Screenshot: knowledge/acceptance/screenshots/vetwiseai/D25-dashboard-first-load.png
Should See:
- VetWiseAI brand header (forest-green chrome,
VetWiseAIadmin header name) - Home tab loaded by default
- Four metric tiles: "Today's Appointments" / "Prescription Refills" / "Emergency Calls" / "Pending Callbacks" (all showing 0 at first login)
- Tab navigation: Home / Inbox / Train AI / Settings
Should NOT See:
- Church dashboard (prayer requests, congregation stats, sermon tools)
- FuneralWiseAI dashboard (at-need families, pre-planning inquiries)
- "Prayer Requests," "Pastor Pulse," or any church-origin label
- "At-Need Calls," "Family Contacts," or any funeral-origin label
D26. Dashboard header
Should See:
- VetWiseAI admin name in header
- Plan badge showing "Starter" or "Pro"
- No "View Chat Page" (chatbot deferred — "Coming Soon")
- Settings gear or similar access
Should NOT See:
- "View Care Hub" label (vet uses "Client Hub" per
terminology.shareableHubTitle) - ChurchWiseAI branding in header
D27. Tab navigation
Tabs visible at Phase 4 go-live (from vet.ts):
- Home (overview/metrics)
- Inbox (appointment requests, prescription refills, emergency calls)
- Train AI (clinic knowledge base)
- Settings (profile, team, integrations)
Tabs NOT present (confirm with founder):
- Calls (listed in scaffold but marked Phase 6)
- Care (not applicable — vet uses "Client Hub")
- Social (not wired for vet)
- Upgrade (confirm with founder)
D28. Home tab first impression
State: First visit, zero data
Screenshot: knowledge/acceptance/screenshots/vetwiseai/D28-home-tab-zero-state.png
Should See:
- 4 metric tiles at zero: "Today's Appointments (0)" / "Prescription Refills (0)" / "Emergency Calls (0)" / "Pending Callbacks (0)"
- Recent activity feed (empty or with "No recent activity" state)
- Quick action buttons: "View Inbox" / "Train AI"
Should NOT See:
- Getting-started checklist in the church pattern (vet may have equivalent — confirm in Stage 2)
- "Chatbot" quick link (deferred)
D29. Getting started prompt (if applicable)
Founder to confirm: Does VetWiseAI have a guided setup checklist analogous to the church onboarding wizard? If yes, what steps are included? Mark as open question for Stage 2.
Open Question (OQ-11): What is the onboarding/setup experience for a new vet customer post-payment? Is there a guided checklist, or does the founder handle setup via the onboarding interview?
E. Setup Journey (Touchpoints 30–42)
VetWiseAI is a service-delivered product: the founder conducts the onboarding interview and configures the agent. The clinic owner's setup tasks are lighter than church admin setup. Touchpoints below cover what the clinic owner does in the dashboard.
E30. Train AI tab — Clinic knowledge base
URL: veterinarywiseai.com/admin/[token] → Train AI tab
Screenshot: knowledge/acceptance/screenshots/vetwiseai/E30-train-ai-tab.png
Should See:
- "Train AI" tab heading using vet terminology
- Clinic knowledge sections (species, services, protocols)
- Vet-specific knowledge taxonomy (vaccination protocols, species-specific conditions, emergency escalation rules)
- No church-origin sections (denomination, theology, sermon topics)
Should NOT See:
- Theological lens picker
- "Sermon" or "ministry" labels on any training section
E31. Settings → Account → Clinic Profile (VetClinicInfoForm)
Component: VetClinicInfoForm
Screenshot: knowledge/acceptance/screenshots/vetwiseai/E31-clinic-profile-settings.png
Should See:
| Field | UI label | Input type |
|---|---|---|
clinic_name | Clinic name | Text |
head_veterinarian | Head veterinarian | Text |
species_served | Species served | Multi-select checkboxes |
business_hours | Business hours | Weekly schedule editor |
emergency_referral_line | After-hours emergency clinic | Text (name) + Phone (E.164) |
aspca_disclosure_acknowledged | ASPCA disclosure | Read-only checkbox + acknowledgment date |
Should NOT See:
- Denomination picker
- "Director" as a role label (use "Head veterinarian")
- Church service times ("worship" framing)
ChurchInfoFormorFuneralHomeInfoFormrendered for vet tenant
E32. Settings → Integrations
Should See:
| Integration | Status | Expected UI |
|---|---|---|
| Cal.com | Live | "Connect" button or "Connected" state |
| AVImark | Placeholder | "Coming Soon" badge, one-sentence description, no Connect button |
| Cornerstone | Placeholder | "Coming Soon" badge, one-sentence description, no Connect button |
| Stripe Billing | Live | "View subscription" / "Update payment method" / "Download invoices" |
Should NOT See:
- Planning Center (church-only)
- Passare or Tribute Technology (funeral-only)
- Any integration showing an error or broken Connect button
E33. Settings → Team
Should See:
- Team member invitations (role-based)
- Role labels use vet terminology: "front desk," "veterinarian," "practice manager"
- No pastoral role labels ("elder," "deacon," "worship leader")
Founder to confirm: What roles are available for vet tenants? (Stage 2 open question)
E34–E42: Remaining setup touchpoints
| Touchpoint | Status | Notes |
|---|---|---|
| E34. Settings → Hours | Covered by E31 (business_hours in VetClinicInfoForm) | No separate Hours tab — confirm with founder |
| E35. Settings → Notifications | N/A pending — confirm in Stage 2 | Expected: configure who receives call summaries + emergency alerts |
| E36. Upgrade tab | N/A at Phase 4 — confirm if tab exists | If present: should show vwa_starter → vwa_pro ladder only |
| E37–E42 | N/A — church-admin-specific tabs not applicable | Social, Theology, Simulator, Care, Calls tabs are all N/A for vet at Phase 4 |
F. Public-Facing Pages (Touchpoints 43–48)
F43. Client Hub / Appointments page at /appointments/[slug]
URL: https://veterinarywiseai.com/appointments/[slug]
Note: Code confirmed intakePathSegment: 'appointments' — NOT /intake/ as the prior spec stated (Drift D1).
Screenshot: knowledge/acceptance/screenshots/vetwiseai/F43-client-hub.png
Should See:
- Clinic name + logo (if uploaded)
- Business hours (formatted weekly schedule)
- After-hours guidance: emergency vet clinic name + phone number
- ASPCA Poison Control reference: "Suspected poisoning? Call 1-888-426-4435 (ASPCA Animal Poison Control, $95 fee, 24/7)."
- "Book an appointment" CTA → Cal.com link
- "Request a prescription refill" form
- Heading: "Client Hub" (per
terminology.shareableHubTitle: 'Client Hub')
Should NOT See:
- "Care Hub" heading (church terminology bleed)
- Prayer request form for vet tenant
- "Subscribe for care messages from your congregation"
- Any church or funeral terminology
URL routing (middleware):
veterinarywiseai.com/appointments/[slug]rewrites to/appointments/[slug]in Next.js middleware- Middleware must correctly handle this path for the vet domain
F44. Chatbot / embedded widget
State: Phase 4 go-live — chatbot deferred Expected: Chatbot tab in admin shows "Coming Soon" state with Cal.com booking CTA Expected copy: "Your website chatbot is in development. In the meantime, add the appointment booking button below to your clinic website so pet owners can schedule online." CTA: "Copy booking link"
Should NOT See:
- A rendered chatbot UI (broken or empty)
- The hosted
/chat/[slug]route rendering a vet chatbot (should 404 or redirect to Cal.com)
F45–F48: N/A for VetWiseAI
| Touchpoint | Status | Reason |
|---|---|---|
F45. Care subscribe page /care/[slug]/subscribe | N/A | Vet uses appointments hub, not Care Subscribe |
F46. Agent-specific chat /care/[slug]/[agent] | N/A | No vet chatbot agents at Phase 4 |
| F47. Embed widget | N/A at Phase 4 | Chatbot deferred; no embed code shipped |
| F48. Pro Website vanity page | N/A | VetWiseAI has no Pro Website product |
G. Ongoing Dashboard Use (Touchpoints 49–54)
G49. Inbox tab
Screenshot: knowledge/acceptance/screenshots/vetwiseai/G49-inbox-tab.png
Should See (filter chips from vet.ts):
- "All" | "Appointment" | "Prescription Refill" | "Emergency" | "Pet Owner Inquiry"
Should NOT See:
- "Prayer" / "At-Need" / "Pre-Planning" / "Family Contact" chips
Row shape: Avatar, caller name, timestamp, AI summary, status badge, action button
Action labels (from terminology.inboxActionLabels):
- Visitor row: Reply / Schedule follow-up / Mark contacted / Send follow-up
- Prayer (mapped to pet inquiry) row: Reply / Mark contacted / Assign to vet / Send follow-up
Detail panel on row click:
- Full call transcript + AI summary
- Caller-reported species and presenting complaint
- Action buttons: "Mark resolved" / "Add note" / "Forward to doctor"
G50. Home tab metric tiles (ongoing use)
Should See:
- "Today's Appointments" tile: count → click → Inbox (all filter)
- "Prescription Refills" tile: count → click → Inbox (callback filter)
- "Emergency Calls" tile: count → click → Inbox (call filter) — requires voice channel
- "Pending Callbacks" tile: count → click → Inbox (callback filter) — requires voice channel
G51–G54: N/A or deferred
| Touchpoint | Status | Notes |
|---|---|---|
| G51. Care tab | N/A — vet uses Inbox for all client contact | No separate Care tab |
| G52. Social tab | N/A at Phase 4 | Not wired for vet |
| G53. Upgrade tab | TBD — confirm in Stage 2 | Should show vwa_starter → vwa_pro only if present |
| G54. Analytics | TBD — confirm in Stage 2 | No vet analytics route confirmed |
H. Lifecycle Events (Touchpoints 55–62)
H55–H56: Usage limits
Expected: VetWiseAI has no per-call or per-message cap (flat-rate unlimited voice per VET_TIER_FEATURES). No usage-limit warning banners expected.
Founder to confirm: Is there any soft cap, throttle, or overage logic? (Stage 2 open question)
H57–H58: Trial expiry
Expected: N/A — VetWiseAI has no trial period. Skip.
H59. Payment failure
Expected behavior:
- Stripe webhook fires
invoice.payment_failed stripe_webhook_inboxenqueues event- Cron processes: mark subscription
past_dueinpremium_vet_clinics - Email notification to clinic owner
- Dashboard shows payment failure state
- Voice agent behavior during grace period: TBD — confirm with founder
Founder to confirm: Grace period length, voice agent behavior when payment fails (Stage 2)
H60. Cancellation
Expected:
- Clinic owner cancels via dashboard (Stripe portal) or contacts founder
premium_vet_clinics.status→cancelled- Voice agent deactivated
- Data retained per data policy
Founder to confirm: Cancellation flow — is there a self-serve cancel path in dashboard or does clinic owner email founder? (Stage 2)
H61. Upgrade (Starter → Pro)
Expected:
- Clinic owner selects Pro on Upgrade tab (if present) or contacts founder
- Stripe subscription updated via checkout or proration
premium_vet_clinics.plan→vwa_pro- Dashboard immediately reflects Pro tier features (Cal.com integration, multi-species KB, 5-day SLA for next changes)
Anti-pattern (FAIL): premium_vet_clinics.plan receives normalizePlanTier() output ('pro') instead of raw key ('vwa_pro').
H62. Downgrade
Expected: Not applicable at launch — only 2 tiers, no documented downgrade path. Confirm with founder if a downgrade from Pro → Starter is supported.
3. Voice Agent Behavior Spec (from existing §2.10, preserved and verified)
Persona: Pet-owner empathetic. Warm, calm, competent. Clinically literate but not intimidating.
AI Bridge Principle (mandatory): The voice agent is a bridge to the clinic and to emergency services — NEVER a replacement for veterinary care. No confidentiality promises. Agent must identify itself as AI when directly asked.
Baseline crisis escalation (non-negotiable):
| Escalation | Required script fragment | Mandatory? |
|---|---|---|
| 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." | YES — every vertical baseline |
| ASPCA Animal Poison Control | "If your pet may have eaten something dangerous, call ASPCA Animal Poison Control at 1-888-426-4435. There is a $95 consultation fee, and they're available 24 hours a day." | YES — vet-specific |
| After-hours emergency vet referral | "For after-hours emergencies, [clinic name] uses [emergency_referral_line]. Let me give you that number: [number]. Do you need me to repeat it?" | YES |
Emergency vs regular routing logic:
- Active distress / trauma / suspected poisoning / rapid deterioration → emergency vet referral immediately
- Routine appointment booking, prescription refills, wellness questions → standard agent flow
- Agent NEVER SIP-bridges to emergency vet — reads number aloud and offers to repeat it
Species-specific handling:
- References
species_servedlist from clinic config - If caller mentions an unserved species: "I want to make sure you get the right care — [Clinic Name] specializes in [species list]. For [caller's species], you may need a specialist. Would you like help finding one?"
Prescription refill intake:
- Collects: pet name, species, medication name, callback number
- Writes to
voice_callback_requestswithvertical: 'vet'andcategory: 'prescription_refill' - Confirms: "I've recorded your refill request for [pet name]. Someone will call you back at [number] — typically within one business day."
Prohibited behaviors:
- Never offers spiritual or religious counsel
- Never offers grief support scripted for human bereavement
- Never gives medical dosage advice or diagnoses
- Never promises a callback within a specific time unless configured by the clinic
4. Banned Terminology (Test-Enforced)
Must NEVER appear in vet admin UI, vet public pages, or vet voice agent scripts.
Church-origin (banned): church, Pastor, Prayer, sermon, congregation, denomination, theology, worship, ministry, sacrament, Planning Center
Funeral-origin (banned): funeral home, director (as role label), mortuary, casket, burial, at-need, pre-planning, embalmer, Passare, Tribute Store, GriefShare, AFSP
5. Required Terminology
| Term | Where it must appear |
|---|---|
| pet owner | Inbox row labels, onboarding copy, voice agent scripts |
| clinic | Settings Account section heading, onboarding, email copy |
| appointment | Inbox filter chip, Home tile label, voice agent booking confirmation |
| prescription | Inbox filter chip, Home tile label, refill intake confirmation |
| emergency vet | Voice agent after-hours routing, Client Hub |
| ASPCA | Welcome email, ASPCA disclosure checkbox, voice agent poison-control escalation |
| species | Onboarding wizard species-served field, voice agent species-routing |
| head veterinarian | Settings Account profile form field label |
6. Brand Chrome
| Token | Confirmed value | Source |
|---|---|---|
| Primary color | #1A3A2A (forest green dark) | vetwiseai.ts — APPROVED 2026-05-02 |
| Accent color | #5B9A6E (sage green) | vetwiseai.ts — APPROVED 2026-05-02 |
| Font | Inter (display + body) | vetwiseai/layout.tsx |
| Brand name | VetWiseAI | Confirmed |
| Logo/lockup | /brand-assets/vetwiseai/lockup-horizontal.svg | layout.tsx, page.tsx |
| Favicon | /brand-assets/vetwiseai/favicon.svg | layout.tsx |
| Domain | veterinarywiseai.com | Confirmed |
| Admin header name | "VetWiseAI" | vetwiseai.ts |
| Page title template | %s | VetWiseAI | layout.tsx |
| Homepage title | VetWiseAI — AI Answering for Veterinary Practices (absolute) | page.tsx |
| Email from | VetWiseAI <hello@veterinarywiseai.com> | lifecycle-emails-vet.ts |
Email brand issue (Drift D3): Email header uses blue gradient, not forest-green. Needs correction before go-live.
7. Acceptance Test Stubs
e2e/vet-admin-no-bleed.spec.ts
test.fixme('vet admin contains no church/funeral terminology', async ({ page }) => {
await page.goto('https://veterinarywiseai.com/admin/vetwiseai-demo-token-2026');
const bodyText = await page.locator('body').innerText();
const banned = ['church', 'Pastor', 'Prayer', 'sermon', 'congregation', 'denomination',
'theology', 'worship', 'ministry', 'sacrament', 'funeral home', 'mortuary', 'casket',
'burial', 'at-need', 'pre-planning', 'embalmer', 'Passare', 'Tribute Store', 'GriefShare'];
for (const term of banned) {
expect(bodyText.toLowerCase()).not.toContain(term.toLowerCase());
}
});
e2e/vet-homepage.spec.ts
test.fixme('vet homepage renders in correct brand chrome', async ({ page }) => {
await page.goto('https://veterinarywiseai.com');
await expect(page.getByRole('heading', { level: 1 })).toContainText('worried pet owner');
await expect(page).not.toHaveURL(/churchwiseai\.com/);
// No church/funeral bleed check
const body = await page.locator('body').innerText();
expect(body.toLowerCase()).not.toContain('congregation');
expect(body.toLowerCase()).not.toContain('prayer');
});
e2e/vet-checkout.spec.ts
test.fixme('vet self-serve checkout submits correct metadata to stripe', async ({ page }) => {
// Navigate, select Pro, USD, fill email, submit
// Assert Stripe session metadata contains tier: 'vwa_pro' (not 'pro')
});
e2e/vet-inbox-filters.spec.ts
test.fixme('vet admin inbox shows vet-specific filter chips', async ({ page }) => {
await page.goto('https://veterinarywiseai.com/admin/vetwiseai-demo-token-2026');
await page.getByRole('tab', { name: 'Inbox' }).click();
for (const chip of ['Appointment', 'Prescription Refill', 'Emergency', 'Pet Owner Inquiry']) {
await expect(page.getByRole('button', { name: chip })).toBeVisible();
}
for (const banned of ['Prayer', 'At-Need', 'Family Contact']) {
await expect(page.getByRole('button', { name: banned })).not.toBeVisible();
}
});
e2e/vet-client-hub.spec.ts
test.fixme('vet client hub renders correct content', async ({ page }) => {
await page.goto('https://veterinarywiseai.com/appointments/vetwiseai-demo-clinic');
await expect(page.locator('body')).toContainText('1-888-426-4435');
await expect(page.locator('body')).toContainText('$95');
await expect(page.locator('body')).not.toContainText('Care Hub');
await expect(page.locator('body')).not.toContainText('prayer');
});
e2e/vet-voice-crisis.spec.ts
test.fixme('vet voice agent crisis copy is present', async () => {
// Load vetProfile.crisisCopy and assert required strings
const { vetProfile } = await import('@/lib/verticals/vet');
const crisisLines = vetProfile.crisisCopy?.lines.join(' ') ?? '';
expect(crisisLines).toMatch(/988/);
expect(crisisLines).toMatch(/1-888-426-4435/);
expect(crisisLines).toMatch(/\$95/);
});
8. Open Questions for Stage-2 Founder Interview
| # | Question | Why it blocks | Priority |
|---|---|---|---|
| OQ-1 | Stripe test-mode products — No test-mode Stripe products exist for VetWiseAI. When should they be created? | Required before any QA testing that touches the checkout flow in test mode. | P0 for QA |
| OQ-2 | premium_vet_clinics DB table — Confirmed it doesn't exist in DB yet (vet.ts says "Phase 6"). When will it be created? Until then, admin routing may fail. | Required before ANY vet customer onboarding. | P0 for go-live |
| OQ-3 | Annual billing option — Is annual pricing planned for VetWiseAI (Starter/Pro)? Code has no annual wiring, pricing page shows no annual option. | Affects pricing page, checkout, Stripe product creation. | P1 |
| OQ-4 | Demo token — Confirmed placeholder vetwiseai-demo-token-2026 is referenced in Playwright stubs. Has this been provisioned in the DB? | All E2E tests reference this token. | P1 for testing |
| OQ-5 | Thank-you page — The self-serve checkout redirects to veterinarywiseai.com/thank-you. Does a vet-specific or generic thank-you page exist under the /vetwiseai/ segment? A 404 here is a broken post-purchase experience. | Post-purchase UX. | P0 for self-serve checkout |
| OQ-6 | Canonical plan key in DB — Is the correct canonical plan key vwa_starter (as set by vet-checkout/route.ts) or vet_starter (as used in lifecycle-emails-vet.ts)? These are inconsistent. | If wrong key is written to premium_vet_clinics.plan, lifecycle emails and tier gating break. | P0 |
| OQ-7 | Email brand colors — Lifecycle email HTML header uses blue gradient (#0c4a6e), not forest-green palette. Is this intentional or a bug? | Brand consistency. | P1 |
| OQ-8 | Client Hub URL — Confirmed as /appointments/[slug] from vet.ts. Is /intake/<slug> (from old spec) retired? | Prior spec and any printed QR codes using /intake/ will be wrong. | P1 |
| OQ-9 | Voice agent go-live scope — Is voice agent in Phase 4 scope or deferred? vet.ts has scaffold only; no voice agent YAML confirmed for vet vertical. | Determines which crisis-copy and voice tests run at launch. | P0 for sprint planning |
| OQ-10 | Thank-you page 404 risk — Middleware rewrites veterinarywiseai.com/* to /vetwiseai/*. So veterinarywiseai.com/thank-you → /vetwiseai/thank-you. Does this page exist? | Broken post-purchase UX if it 404s. | P0 |
| OQ-11 | Post-payment onboarding UX — Is there a guided setup checklist in the vet admin dashboard, or is all setup handled by the founder's onboarding interview? | Determines whether E-category touchpoints are self-served or service-delivered. | P1 |
| OQ-12 | Cancellation path — Is there a self-serve cancel flow in the vet admin, or does the clinic owner email the founder? | H60 lifecycle touchpoint. | P2 |
9. Touchpoint Coverage Summary
| Category | Touchpoints | Status |
|---|---|---|
| A. Discovery | A1–A10 (10 total) | 6 specified; A8 N/A (no ads); A9 N/A (no PewSearch integration); A10 N/A (same as A1) |
| B. Pre-Purchase | B11–B16 (6 total) | 4 specified; B15 N/A (sales-led); B16 N/A (no PewSearch) |
| C. Email | C17–C24 (8 total) | 7 specified; C24 open question |
| D. First Login | D25–D29 (5 total) | 4 specified; D29 open question |
| E. Setup | E30–E42 (13 total) | 5 specified; E37–E42 N/A (church-admin tabs); E34–E36 TBD |
| F. Public-Facing | F43–F48 (6 total) | 2 specified; F45–F48 N/A (no care/embed/Pro Website) |
| G. Ongoing | G49–G54 (6 total) | 3 specified; G51 N/A (no Care tab); G52 N/A (no Social) |
| H. Lifecycle | H55–H62 (8 total) | 6 specified; H57–H58 N/A (no trial); H62 N/A (no downgrade path) |
| Total | 62 methodology touchpoints | ~37 fully or partially specified; ~15 N/A with reasons documented; ~10 TBD pending founder Stage-2 answers |
10. Agents Reading This Spec
Before modifying any vet vertical code path, cross-reference against this spec. If a code change would contradict an expected output here:
- Update this spec first (with founder sign-off via explicit "yes" in session), THEN change the code.
- OR flag the contradiction as a FAIL in the
/ensure-solid vetwiseaiscorecard.
When vet admin code lands (Phase 6), the Playwright stubs in §7 should be un-fixed and run against https://veterinarywiseai.com/admin/vetwiseai-demo-token-2026 per the production-testing rule.
The knowledge/readiness/vetwiseai.yaml config references this spec and is required before /ensure-solid vetwiseai can run for the first time.