All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 1m14s
Stripe portal "cancel" schedules a cancel_at timestamp while keeping the sub active until period end. Without persisting that state the UI kept saying "renews on X" even though the user had already canceled. New `users.plan_cancels_at` column populated from the subscription webhook (handles both `cancel_at` and legacy `cancel_at_period_end`). Settings now shows a banner "Subscription scheduled to end on X" and flips the footer label from "renews" to "ends" while the cancellation window is open. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>