feat: opt-in Starter trial through Stripe Checkout (#2904) master
* feat: opt-in Starter trial through Stripe Checkout No trial starts at signup anymore. The owner of a free workspace who signed in with GitHub or Google starts a 14-day Starter trial from a Stripe Checkout page (no card required), from the billing page, the plan table or the upgrade dialog, with an optional "what do you want to test?" note. - getCheckoutSession({ trial, surface, intent }) runs the eligibility guards before creating a Stripe customer - sessionCompleted marks the trial: audit reason trial_started, customer metadata trialed, user.trialed_at, trial_started event - new user.trialed_at column; the trialEligibility query reads only the database, the Checkout mutation adds the Stripe guards - welcome email and marketing copy no longer promise an automatic trial * feat: trial marker on the workspace, eligibility on workspace.get, upgrade intent dialog - move trialed_at from user to workspace, next to trial_ends_at; the webhook sets it through markWorkspaceTrialed - workspace.get returns `trial` (eligibility without Stripe), checked against the workspace row first; drop stripeRouter.trialEligibility and its prefetch - after ?success or ?trial on billing, ask "What are you building?" once per user, stored as upgrade-intent feedback; feedback.hasSubmitted * style(dashboard): taller textarea and ghost skip in the upgrade intent dialog * feat: workspace.trialed_at migration, drop intent field from billing trial card The post-checkout "What are you building?" dialog asks instead. * fix: trial detection from checkout metadata, dedupe trial_started, upgrade_dialog surface - classify opt-in trials by subscription.metadata.source, not live status - track trial_started only when the workspace marker is first set - show the plan-table trial caption only when Starter is listed - index account.user_id for the provider lookup - no credit card needed hint in the billing card and nav banner * style(dashboard): ask what openstatus is used for in the upgrade intent dialog * ci: apply automated fixes * fix: share trial config, toast only once the trial is live - TRIAL_DAYS and TrialSurface move to an import-free trial-config module - the billing page polls workspace.get before the trial-started toast - tailor wording in the upgrade intent dialog - oxfmt * ci: apply automated fixes * fix(db): regenerate 0093 with account_user_id_idx * chore(db): drop trialedAt comment --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>