12 Commits
Author SHA1 Message Date
Krystie cac10769b5 [grade=A] Welcome email for first purchases: order-independent classification + premium walkthrough
- invoice.paid classified welcome-vs-renewal via emailDeliveredAt (durable,
  webhook-order independent) through new classifySubscriptionEmail() - the old
  isNewLicense/row-existence signal broke under Stripe's real event order
  (subscription.created pre-creates the row before the first invoice).
- renderLicenseEmail() extracted pure; first purchases now get 'Welcome to
  DashCaddy Premium' with unlocks panel (SSO/Recipes/Swarm/auto-renew) and
  3-step getting-started; renewal copy byte-identical (test-pinned).
- 9 new tests (37 total): behavioral classifier coverage, rendered-content
  assertions both variants, store flag regression, mkdtemp-sandboxed.
- Codex judge: A, zero blockers (r5; prior rounds D-D-D-C drove the fixes).
  Verdict: run output 'A' with empty Blockers (direct codex exec, 2026-09-22).
2026-09-21 17:08:41 -07:00
Krystie 2bfb8ea2b5 [grade=B] Make website billing production-ready 2026-08-22 18:16:12 -07:00
Sami 06d8062a5a Add email delivery for license keys (SMTP) 2026-08-19 12:49:44 -07:00
Krystie b7dab4c0b2 Exclude node_modules from git 2026-08-19 12:45:16 -07:00
Krystie ff722aa4d8 Add subscription support + license extension on renewal 2026-08-19 12:45:06 -07:00
Krystie 14d0eaa2b3 Add deployment env contract for license server 2026-04-17 21:29:35 -07:00
Krystie 9bea006426 Implement initial subscription-backed license flow 2026-04-17 21:19:52 -07:00
Krystie 37ec04ee44 Scaffold Stripe-backed DashCaddy license server 2026-04-17 20:35:23 -07:00
Krystie 4b2711953f Remove free-trial assumption from billing plan 2026-04-17 20:19:35 -07:00
Krystie 6543c617a1 Add billing and license integration plan 2026-04-17 20:04:29 -07:00
Krystie d7fd41ccd6 Lock initial DashCaddy billing plan 2026-04-17 19:58:34 -07:00
Krystie c19b20afcf Initialize DashCaddy license server 2026-04-17 17:58:50 -07:00