whisper-money/app/Enums
Víctor Falcón ce6bfc9c56
feat(drip): email users stuck on the paywall a day after onboarding (#562)
## What

Sends an automated follow-up email the day after a user finishes
onboarding but stays stuck on the paywall, asking why they didn't
continue and inviting a direct reply.

## Why

Users who connect a bank account during onboarding but never pick a plan
are permanently redirected to the paywall by `EnsureUserIsSubscribed` —
they finish onboarding and then can't access the app. This reaches out
to understand the friction and recover them.

## Who gets the email (the genuinely stuck cohort)

- `onboarded_at` is calendar-yesterday (`whereDate('onboarded_at',
today()->subDay())`)
- Has an active banking connection (`bankingConnections()->exists()`)
- No Pro plan (`hasProPlan()` is false)
- Hasn't already received this email (idempotent via `UserMailLog`)

Users **without** a bank connection are excluded: they fall through to
free access after seeing the paywall once, so they aren't stuck.

## How

- New `email:paywall-follow-up` command scans the cohort daily and
queues the job — scheduled `dailyAt('10:00')` Europe/Madrid in
`routes/console.php`.
- New `DripEmailType::PaywallFollowUp` (`paywall_follow_up`) +
idempotent send job following the existing drip pattern.
- Short, human Markdown email with an explicit `replyTo`
(`hi@whisper.money`) so replies reach a real inbox.
- Spanish copy added to `lang/es.json`.

## Tests

10 new tests (correct cohort matched; wrong day / no bank / Pro plan
excluded; no double-send; no-op when drip disabled). `pint` clean.

## Note

There was no existing user-scanning drip command (current drips dispatch
with `delay()` on `Registered`). Since "stuck on paywall" state isn't
known at registration time, a daily scanning command is the right fit.
2026-06-19 14:11:12 +00:00
..
AccountType.php feat(connections): manage which accounts a bank connection syncs (#558) 2026-06-18 16:22:49 +02:00
AnalysisMode.php feat(analysis): project-aware transaction analysis (#513) 2026-06-09 15:32:07 +02:00
BankingConnectionStatus.php feat: Integrate EnableBanking as open banking provider (#106) 2026-02-12 09:09:28 +01:00
BankingProvider.php refactor: centralize duplicated provider & locale keys into enums (#543) 2026-06-16 13:43:14 +00:00
BankingSyncLogStatus.php fix(banking): retry failed sync connections and log every sync attempt (#251) 2026-03-31 11:34:35 +01:00
BudgetPeriodType.php Add yearly budget period (#384) 2026-05-12 13:35:25 +02:00
CategoryCashflowDirection.php feat(cashflow): track transfer categories in trends (#236) 2026-03-18 14:02:47 +00:00
CategoryColor.php Add category type field support (#2) 2025-12-01 20:19:47 +01:00
CategoryDeletionStrategy.php feat: parent/child category tree (#474) 2026-06-03 19:30:12 +02:00
CategorySource.php feat(ai): auto-categorize transactions with AI (behind flag) (#535) 2026-06-15 16:35:20 +02:00
CategoryType.php feat(cashflow): add savings and period views (#424) 2026-05-25 16:41:00 +02:00
ChartColorScheme.php Add chart color scheme setting (#101) 2026-02-28 12:58:21 +01:00
DripEmailType.php feat(drip): email users stuck on the paywall a day after onboarding (#562) 2026-06-19 14:11:12 +00:00
IntegrationRequestStatus.php feat(integration-requests): markdown comments and in-progress status (#553) 2026-06-18 08:36:43 +00:00
LabelColor.php feat: add transaction labels feature (#24) 2025-12-13 13:02:19 +01:00
LeadCohort.php feat(leads): cohort-based launch invitations with per-user Stripe coupons (#333) 2026-04-30 15:10:28 +01:00
Locale.php refactor: centralize duplicated provider & locale keys into enums (#543) 2026-06-16 13:43:14 +00:00
PlanFeature.php feat(ai): suggest automation rules during onboarding (#523) 2026-06-13 22:51:15 +02:00
PropertyType.php feat(accounts): add real estate asset tracking (#241) 2026-03-24 10:21:32 +00:00
RolloverType.php Add Budgeting Feature to Track and Manage Spending (#36) 2026-01-21 15:25:50 +01:00
RuleOrigin.php feat(ai): auto-categorize transactions with AI (behind flag) (#535) 2026-06-15 16:35:20 +02:00
RuleSuggestionStatus.php feat(ai): suggest automation rules during onboarding (#523) 2026-06-13 22:51:15 +02:00
SuggestionRunStatus.php feat(ai): suggest automation rules during onboarding (#523) 2026-06-13 22:51:15 +02:00
TransactionSource.php feat: add Wise open banking integration with balance sync (#525) 2026-06-16 13:23:25 +00:00