Area: Engagement (audit p9) · Surface: Engagement area (achievements, credits, dashboard) · Dimension: competitor-gap · Severity: major
Daily check-in streaks are a core retention mechanic across the category — Duolingo popularized it and Skool, Circle, and most LMSs (Teachable/Thinkific learner streaks) now ship a 'come back N days in a row' loop with escalating rewards and a visible flame/counter. It manufactures a daily habit and a loss-aversion reason to return ('don't break your 12-day streak'). We have every primitive needed — login_count, last_login_at, UserCredit::earn, the notification table — but no streak counter, no escalating reward, and no streak surface on the dashboard or profile.
Evidence
grep for login_streak|daily.*reward|check.?in|consecutive.*day|streak.*reward|daily.*bonus across src/ returns no engagement loop. The only 'streak' logic is a one-off 7-consecutive-days posting check inside Achievement::checkAndGrant (src/Models/Achievement.php:299-306, 'week_streak') and a read-only longest-streak stat on /stats (StatsController.php:299-311). users table has login_count + last_login_at (used in StatsController.php:182-188 'prolificVisitors') but nothing rewards returning daily. UserCredit::earn exists and is already used for achievements (Achievement.php:414) so the reward rail is present and unused for this.
Suggested fix. Add a user_login_streaks table (current_streak, longest_streak, last_checkin_date), increment on first authenticated request per UTC/tenant-day in middleware, award escalating credits via UserCredit::earn, and surface a flame counter on the dashboard/profile. Make it a gateable feature flag.
Filed by the automated tenant-app audit and adversarially evidence-verified. Status: verified. Open — not yet actioned.
Patrick Bass
@mobieus