Pastor cancels chatbot subscription
Persona
A pastor on Starter Chat who has decided to cancel — congregation didn't engage, switching tools, or budget cut. They want a clean, self-serve exit. They need to know when service stops, whether their data is safe, and whether they can come back. They should feel respected, not retained.
Entry points
- Billing section —
/admin/[token]?tab=settings→ Billing → "Cancel Plan" link. - Stripe Customer Portal — "Manage Subscription" link in Stripe emails.
- Exit interview email — "You can cancel anytime" link to cancel flow.
Click-through flow
Steps
-
Navigate to Billing section — "Cancel Plan" text link (not a prominent button — cancellation is accessible but not encouraged).
-
See cancellation terms — Inline note: "Your plan will continue until the end of your current billing period. No refunds for the current period. All your data is safely preserved. You can reactivate anytime." Button: "Manage My Subscription →" (Stripe portal).
-
Stripe Customer Portal — Subscription details visible. Pastor clicks "Cancel subscription," confirms in Stripe's native modal.
-
Cancellation confirmation (webhook processing) —
customer.subscription.updatedwithcancel_at_period_end=trueenqueued to inbox. Cron processes within ~60 seconds.processCancellation()sends confirmation email (see Acceptance Spec CX-12 for full text). -
Dashboard during cancelling period — Amber "Cancelling" banner on every tab. Status badge shows "Cancelling." All tabs remain functional: Training, Requests, Website, Calls. Service runs normally until period-end.
premium_churches.statusstays'active'; UI readscancel_at_period_endfrom Stripe for banner. -
Service ends — Billing cycle ends; Stripe fires
customer.subscription.deleted. Cron setspremium_churches.status = 'cancelled'. Dashboard goes read-only: inputs disabled, data visible. Public/chat/[slug]shows fallback: "Hi! [Church Name]'s chatbot is not currently available. Please contact the church at [phone/email]." Service ended email sent with "Come back anytime" reactivation link.
Acceptance spec
Canonical: knowledge/acceptance/cancelled.md
Key touchpoints:
- Self-serve via Stripe Customer Portal (CX-1 through CX-4)
- Full features through period-end (CX-5 through CX-6)
- Read-only dashboard with export (CX-7)
- Email sequence: confirmation + service ended + win-back at 7 and 30 days (CX-12 through CX-15)
- Data preserved indefinitely (no auto-delete)
Success criteria
- Cancellation processed immediately by Stripe.
- Confirmation email within 5 minutes.
- Chatbot continues working through end of billing period.
- After period-end, chatbot shows friendly fallback (not 404 or error).
- Dashboard remains accessible with all data in read-only mode.
- "Export My Data" button available post-cancellation.
- Can reactivate via
/pricingat any time.
Known failure modes
-
Webhook loss on cancellation. Pastor gets charged but no "Cancelling" banner. Inbox pattern retries; cron checks
cancel_at_period_endon every sync. Source:memory/project_stripe_webhook_inbox.md. -
Chatbot still responds after period-end.
/api/chatbot/streammust checkpremium_churches.statuson every request (no cache). Source:memory/feedback_offline_check_missing.md. -
Export data fails. If ZIP is corrupted or empty, pastor feels data is lost. Export job must have error handling and P1 alert. Source:
memory/feedback_data_export_failure.md. -
Export includes sensitive data without security gate. Download link should be short-lived (24h expiry). Phone numbers in callback requests are PII — flagged in 2026-04-17 security review. Source:
memory/feedback_data_export_privacy.md. -
Reactivation forces same plan.
/pricingon reactivation should allow any plan — no forced pre-selection. Source:memory/feedback_reactivation_choice.md.