Cancelled Subscription — Expected Output Spec
Status: COMPLETE -- Lifecycle state spec covering all cancellation scenarios across all plans.
Applies to: All paid plans (chat, voice, bundle) after intentional cancellation.
Related: trial-expired.md covers trial expiry without payment (different trigger, similar end state).
Scope
This spec covers the complete cancellation experience:
- The cancellation flow (how the pastor cancels)
- Service during remaining billing period (what keeps working)
- Dashboard state after service ends (read-only mode)
- Email sequence (confirmation, service ended, win-back)
- Reactivation flow (coming back)
- Voice-specific scenarios (what callers hear, phone number retention)
- Edge cases (mid-trial cancel, tier changes on reactivation, PewSearch bonuses)
State Transitions
Customer clicks "Cancel Plan":
→ Stripe sets cancel_at_period_end = true
→ Webhook fires → cancellation confirmation email sent
→ Dashboard shows "Cancelling — ends [date]" banner
→ All features remain active until billing period ends
Billing period ends:
→ Stripe fires customer.subscription.deleted
→ Webhook fires → service cutoff
→ Dashboard enters read-only mode
→ Chatbot goes offline (chat plans)
→ Voice agent stops answering (voice plans)
→ "Service has ended" email sent
→ Win-back sequence begins
Reactivation:
→ Customer clicks "Reactivate" (in dashboard or email)
→ Lands on /pricing → picks plan → Stripe checkout
→ No new trial (pays immediately)
→ All data restored → service resumes
→ "Welcome back" email sent
A. The Cancellation Flow
Touchpoint CX-1: Cancel Plan Location
URL: https://churchwiseai.com/admin/[token]?tab=settings
Component: Settings tab, Billing section
Should See:
- In Settings > Billing section: current plan display, next billing date, amount
- "Cancel Plan" text link (not a prominent button — not encouraging cancellation, just making it accessible)
- Clicking "Cancel Plan" shows a brief inline note before redirect:
- "Your plan will continue until the end of your current billing period."
- "No refunds for the current period."
- "All your data is preserved -- you can reactivate anytime."
- "Manage My Subscription ->" button -> Stripe Customer Portal
Should NOT See:
- Hidden or hard-to-find cancel option
- "Contact support to cancel" (self-serve always)
- Cancel button styled as a prominent/primary action
Playwright Test Hints:
- Assert "Cancel Plan" link is visible in Settings > Billing
- Assert clicking it shows inline cancellation note
- Assert "Manage My Subscription" links to Stripe Customer Portal
Founder Decision: [x] Approved (self-serve; Settings > Billing; Stripe handles flow)
Touchpoint CX-2: Stripe Cancellation Confirmation
URL: Stripe Customer Portal (external) Component: Stripe-managed
Should See:
- Stripe's native cancellation flow: plan details, end date, "Cancel subscription" button
- After confirming: Stripe confirms cancellation with end date
Should NOT See:
- Custom cancellation page (we use Stripe's native flow)
- Dark patterns or hidden cancel buttons
Founder Decision: [x] Approved (Stripe native flow)
Touchpoint CX-3: Exit Survey (Post-Cancellation)
URL: Dashboard — shown when customer returns from Stripe after cancelling Component: Modal or inline survey in dashboard
Should See:
- Brief, optional survey: "Mind telling us why you're leaving? (This helps us improve)"
- Options:
- Too expensive
- Not enough features
- Congregation didn't use it
- Technical issues
- Switching to another solution
- Church is closing or major change
- Just trying it out
- Other (free text)
- "Skip" button always available
- Survey does NOT block dashboard access
Should NOT See:
- Required survey that prevents dashboard access
- Aggressive retention offers
- "Are you sure?" guilt language
Playwright Test Hints:
- Assert exit survey appears after returning from Stripe cancellation
- Assert "Skip" button is visible and functional
- Assert completing survey stores response
- Assert dashboard is accessible regardless of survey completion
Founder Decision: [x] Approved (optional exit survey; stored in premium_churches.cancellation_reason)
Touchpoint CX-4: Dashboard Immediately After Cancellation
URL: https://churchwiseai.com/admin/[token]
Should See:
- Normal dashboard with full functionality (they've paid through the billing period)
- Persistent amber/info banner on every tab:
- "Your plan cancels on [date] -- Reactivate to keep going"
- "Reactivate" button -> Stripe Customer Portal
- End date clearly displayed
- Status badge may show "Cancelling" (to distinguish from "Active")
Should NOT See:
- Reduced functionality or disabled features (full access until billing period ends)
- "Cancelled" state (that's post-billing-period)
- Removal of any tabs or features
Playwright Test Hints:
- Assert amber banner with cancellation date on every tab
- Assert "Reactivate" button links to Stripe Customer Portal
- Assert all dashboard features remain fully functional
- Assert all tabs are still present and interactive
Founder Decision: [x] Approved (full access + cancellation banner until billing period ends)
B. Service During Remaining Billing Period
Touchpoint CX-5: Chatbot Active (Chat/Bundle Plans)
During the remaining billing period after cancellation:
- Chatbot continues answering on
/chat/[slug] - Care hub continues working at
/care/[slug] - All agent chats functional
- Embed widget active on church website
- No degradation of service
Founder Decision: [x] Approved
Touchpoint CX-6: Voice Agent Active (Voice/Bundle Plans)
During the remaining billing period after cancellation:
- Voice agent continues answering calls
- All call logging and request capture active
- No degradation of service
Founder Decision: [x] Approved
C. Dashboard State After Service Ends
Touchpoint CX-7: Post-Cancellation Dashboard (Read-Only)
URL: https://churchwiseai.com/admin/[token]
Trigger: Billing period ends, Stripe fires customer.subscription.deleted
Should See:
- Status badge: "Cancelled" (red/amber)
- Persistent banner on every tab:
For chat-only plans:
"Your subscription has ended. Your chatbot is offline -- but everything you set up is still here. Reactivate to bring it back to life."
For voice-only plans:
"Your subscription has ended. Your voice agent is no longer answering calls -- but all your data is safely preserved. Reactivate anytime."
For bundle plans:
"Your subscription has ended. Your chatbot and voice agent are offline -- but everything you built is still here. Reactivate to bring them back."
- "Reactivate" CTA button (prominent, gold) ->
/pricing - "Export My Data" button — available on the cancelled dashboard (founder Decision #3). Allows pastor to download their church data (requests, contacts, training content) as a CSV/ZIP. Located in Settings tab or prominently in the banner area.
- All data visible in READ-ONLY mode:
- Training: viewable, not editable
- Settings: viewable, not editable
- Requests: viewable (status cannot be changed)
- Calls: viewable (transcripts, call history)
- Care: member list viewable (cannot send broadcasts)
- Overview: historical stats
- Tab navigation unchanged (same tabs as during active period)
Should NOT See:
- Functional editing (all inputs disabled/readonly)
- Working chatbot/voice agent
- Data deletion threats
- Locked-out dashboard (they can still log in)
- Punitive messaging
Playwright Test Hints:
- Assert "Cancelled" status badge
- Assert banner with channel-appropriate text
- Assert "Reactivate" button links to
/pricing - Assert "Export My Data" button is visible on the cancelled dashboard
- Assert Training tab inputs are disabled
- Assert Settings tab inputs are disabled
- Assert Requests data is still visible
- Assert Calls data (if voice) is still visible
Founder Decision: [x] Approved (read-only; channel-aware copy; data preserved indefinitely; "Export My Data" button available)
Touchpoint CX-8: Chatbot Offline (Chat/Bundle Plans)
URL: https://churchwiseai.com/chat/[slug]
Should See:
- Chat page loads (not a 404)
- Fallback message: "Hi! [Church Name]'s chatbot is not currently available. Please contact the church directly at [phone/email]."
- Church contact info from database
- "Powered by ChurchWiseAI" badge still visible
Should NOT See:
- AI-generated responses
- Technical error messages
- Billing-related messages visible to visitors
Playwright Test Hints:
- Assert chat page loads
- Assert fallback message with church contact info
- Assert no AI response on message send
Founder Decision: [x] Approved (same fallback as trial expired)
Touchpoint CX-9: Voice Agent Offline (Voice/Bundle Plans)
Trigger: Billing period ends for voice or bundle plan
What callers experience:
- If church set up call forwarding TO the AI number: Removing the forwarding (or the church not changing anything) means calls return to their original phone system. Their church phone rings normally again, or goes to their original voicemail.
- If the AI number was the only number (rare): Telnyx number is deactivated. Callers hear standard carrier "number not in service" message.
Phone number retention:
- Phone number held for 30 days after service ends (Telnyx number remains reserved but inactive)
- If customer reactivates within 30 days: same number restored
- After 30 days: number released; customer gets a new number on reactivation
Bundle plan cancellation:
- When a bundle customer cancels, both the phone number AND chatbot go offline simultaneously at the end of the billing period.
- The 30-day number hold applies to the phone number from that moment (end of billing period, not the cancellation request date).
Voice agent configuration:
- All settings preserved (voice picker, greeting, personality) indefinitely
- On reactivation: voice agent resumes with same settings; only number may change
Note: At scale, holding numbers costs ~$1/mo each. Review retention policy when cancelled voice customer count exceeds 100.
Founder Decision: [x] Approved (30-day number hold; bundle: both services end simultaneously at period end; settings preserved; auto-restore within 30 days)
Touchpoint CX-10: Care Hub + Subscribe (Chat/Bundle Plans)
After cancellation takes effect:
- Care hub page (
/care/[slug]): shows church info but agent "Chat Now" buttons disabled - Care subscribe page still functional (
/care/[slug]/subscribe) — congregation members can still opt in - Member list preserved, no broadcasts sent
Rationale: Subscribe page stays active because new care signups are valuable for re-engagement, and they cost nothing to maintain.
Founder Decision: [x] Approved (subscribe stays active; hub is limited)
Touchpoint CX-11: PewSearch Bonuses Suspended (Pro/Suite Plans)
After cancellation takes effect:
- Premium Listing: Access removed via tier config check. Listing reverts to basic (non-premium) state on PewSearch.
- Pro Website (Suite only): Access removed. Pro Website page shows basic state or redirect.
- Website tab in dashboard shows: "Your Premium Listing [and Pro Website] access has ended. Reactivate to restore."
- No immediate deletion — listing data preserved. On reactivation: bonus access auto-restores.
Founder Decision: [x] Approved (tier config gates access; data preserved; auto-restore on reactivation)
D. Email Sequence
Touchpoint CX-12: Cancellation Confirmation Email (Immediate)
Trigger: customer.subscription.updated with cancel_at_period_end: true
Sender: Resend (ChurchWiseAI <hello@churchwiseai.com>)
Subject: "Your ChurchWiseAI plan has been cancelled -- [Church Name]"
Body:
Hi {$name},
We've received your cancellation request for {$church_name}.
Here's what happens:
- Your {plan_name} continues until {end_date} -- no changes until then
- After {end_date}, your chatbot [and voice agent] will go offline
- All your data -- church info, agent settings, requests, care members -- is safely preserved
- You can reactivate anytime and pick up right where you left off
Changed your mind?
[Reactivate My Plan ->] (Stripe Customer Portal)
Thank you for giving ChurchWiseAI a try. If your church ever needs AI care tools in the future, we'll be here.
Grace and peace, John ChurchWiseAI
Tone: Empathetic, factual, door-open.
Channel-specific copy adjustments:
- Chat-only: "your chatbot will go offline"
- Voice-only: "your voice agent will stop answering calls"
- Bundle: "your chatbot and voice agent will go offline"
Founder Decision: [x] Approved
Touchpoint CX-13: Service Ended Email (On Billing Period End)
Trigger: customer.subscription.deleted webhook
Sender: Resend
Subject: "Your chatbot [and voice agent] is now offline -- [Church Name]"
Body:
Hi {$name},
Your subscription for {$church_name} has ended and your chatbot [and voice agent] is now offline.
Everything you built is still saved -- your church info, agent personalities, and all the requests captured during your time with us. It'll be here whenever you're ready to come back.
[Reactivate Anytime ->] (link to /pricing)
Grace and peace, John ChurchWiseAI
Voice-specific addition:
- "Your phone number [+1-XXX-XXX-XXXX] is being held for 30 days. Reactivate within that time to keep the same number."
Founder Decision: [x] Approved
Touchpoint CX-14: Win-Back Email #1 (7 Days After Service Ends)
Trigger: 7 days after customer.subscription.deleted
Sender: Resend
Subject: "Your chatbot is still set up and waiting for you"
Body:
Hi {$name},
It's been a week since your subscription ended for {$church_name}. We wanted you to know -- everything you set up is still there.
During your time with us, your AI:
- Answered {total_conversations} conversations
- Captured {prayer_count} prayer requests
- Logged {visitor_count} visitor contacts
All of it is saved and ready to go the moment you reactivate.
[Reactivate My Account ->] (link to /pricing)
If you had any issues, we'd love to help. Just reply to this email.
Grace and peace, John ChurchWiseAI
Founder Decision: [x] Approved (stats from active period; soft CTA)
Touchpoint CX-15: Win-Back Email #2 (30 Days After Service Ends — Final)
Trigger: 30 days after customer.subscription.deleted
Sender: Resend
Subject: "We're still here when you're ready"
Body:
Hi {$name},
A month ago, your ChurchWiseAI subscription for {$church_name} ended. We know timing isn't always right, and that's completely OK.
Your chatbot and all the data you entered are still saved. Whenever you're ready, you can pick up right where you left off -- no re-setup needed.
[Choose a Plan ->] (link to /pricing)
If you want to chat about what would work better for your church, I'd love to connect:
[Schedule a Call ->] (link to /book)
Grace and peace, John ChurchWiseAI
After this email, no more win-back emails. The decision is respected.
Voice-specific note in this email:
- "Note: Your phone number was held for 30 days and has now been released. If you reactivate, we'll set up a new number for you within 1 business day."
Founder Decision: [x] Approved (final contact; schedule option; voice number note)
E. Reactivation Flow
Touchpoint CX-16: Reactivate from Dashboard
URL: Dashboard -> "Reactivate" button
Destination: /pricing
Should See:
- Full pricing page with all plans
- Customer can choose ANY plan (not forced back to previous tier)
- Channel they were on previously may be pre-selected (convenience, not enforced)
- Normal checkout flow: pricing -> onboard (or simplified re-subscribe) -> Stripe
Should NOT See:
- Forced same-tier selection
- New trial offer (no second trial)
- Reactivation fee
Founder Decision: [x] Approved
Touchpoint CX-17: Reactivate from Email
Same as CX-16. Email CTAs link to /pricing.
Founder Decision: [x] Approved
Touchpoint CX-18: Post-Reactivation State
Trigger: Successful Stripe checkout
Should See:
- "Welcome back" email:
- Subject: "Welcome back to ChurchWiseAI -- [Church Name]"
- "Your chatbot [and voice agent] is back online!"
- Plan confirmation
- "Everything is exactly as you left it."
- Dashboard magic link
- If voice plan: "Your voice line is being restored -- same number (if within 30 days) or new number (we'll email when ready)."
- Dashboard: Status changes to "Active", read-only lifted, all features restored
- Chatbot: Back online immediately on
/chat/[slug] - Voice: If within 30 days -- same number, restored within hours. If >30 days -- new number provisioned within 1 business day (two-email flow again)
- All data preserved: training, requests, call logs, care members, settings
- If different tier: features adjust (hidden not locked principle)
Should NOT See:
- Data loss
- Need to re-enter church info
- Need to re-configure agents (unless they changed plans and features were hidden)
- "Start over" messaging
Founder Decision: [x] Approved (immediate restore for chat; voice may take 1 business day if new number needed)
F. Edge Cases
Touchpoint CX-19: Cancel During Trial
Trigger: Customer cancels before Day 14 of trial
Decision:
- Service continues until Day 14 (end of trial), not end of a billing period (no billing period exists yet)
- No charge on Day 14
- After Day 14: enters cancelled/expired state (same as CX-7)
- Cancellation confirmation email sent immediately (CX-12)
- No "service ended" email on Day 14 (trial expired email covers this)
- Win-back sequence starts from Day 14
Founder Decision: [x] Approved (trial cancellation = service until Day 14, then expired)
Touchpoint CX-20: Suite -> Lower Tier Reactivation (White-Label)
Trigger: Suite customer cancels, reactivates on Pro or Starter
Decision:
- White-label settings deactivated per tier config -- "Powered by ChurchWiseAI" badge reappears automatically
- On chat page, embed widget, and care hub
- No notification email about badge -- it's automatic per tier
- White-label config preserved in database (if they upgrade back to Suite, badge removal restores)
Founder Decision: [x] Approved (tier config gates badge; settings preserved)
Touchpoint CX-21: Bundle -> Standalone Reactivation
Trigger: Bundle customer cancels, reactivates on chat-only or voice-only
Decision:
- Customer selects any plan on
/pricing-- including standalone plans - If chat-only: voice features HIDDEN, voice data preserved
- If voice-only: chat features HIDDEN, chat data preserved
- All data always preserved regardless of channel change
Cancellation email for bundle customers:
- The cancellation confirmation email (CX-12) should include a soft suggestion: "Your Chat features will remain active on a standalone chat plan, or keep just your voice line on a Voice plan — visit churchwiseai.com/pricing to see your options."
- Framing: "Consider keeping just your chatbot on a Starter plan" — presents downsizing as an option, never a pressure.
Founder Decision: [x] Approved (data preserved across channel changes; bundle cancellation email suggests standalone alternatives)
Touchpoint CX-22: Failed Payment Leading to Cancellation
Trigger: Payment fails, Stripe retries exhaust, subscription cancelled automatically
Decision: Same end state as intentional cancellation, but with slightly different email tone:
- No exit survey (they didn't choose to cancel)
- Service ended email mentions payment failure: "We weren't able to process your payment and your subscription has ended."
- "Update your payment method to reactivate" CTA -> Stripe Customer Portal
- Same win-back sequence applies
- Same data retention and reactivation flow
Founder Decision: [x] Approved (same end state; payment-failure-aware copy)
Touchpoint CX-23: Multiple Cancellation/Reactivation Cycles
Trigger: Customer cancels, reactivates, cancels again
Decision:
- No limit on reactivation cycles
- Data is always preserved through each cycle
- No penalty for multiple cancellations
- No second trial (ever) -- always immediate charge on reactivation
- Win-back emails are suppressed after 2+ cancellation cycles (avoid spam; confirmed by founder Decision #4)