feat(dashboard): add trial-ended upgrade page - #5999
Conversation
|
|
Running ultrareview automatically — This PR changes authenticated trial-gating redirects and introduces a new upgrade path that can initiate Stripe PAYG checkout, while refactoring shared booking flows and telemetry across the dashboard.. I'll post findings when complete. |
d1bc719 to
ebdf5b1
Compare
|
Running ultrareview automatically — Adds a trial-ended upgrade flow with billing checkout hooks, trial-expiry redirects, and reusable booking calendar components — high risk if routing or checkout logic regresses.. I'll post findings when complete. |
There was a problem hiding this comment.
Ultrareview completed in 41m 7s
All reported issues were addressed across 17 files
Linked issue analysis
Linked issue: GRW-49: feat: create an end of trial page
| Status | Acceptance criteria | Notes |
|---|---|---|
| ✅ | Expired-trial organizations are redirected to /trial-ended. | AuthHandler uses the refreshed trial lifecycle and navigates expired trials to the new route. |
| ✅ | Users without an expired trial cannot remain on /trial-ended. | TrialEnded redirects non-expired or missing trials, while AuthHandler preserves the existing non-expired gate behavior. |
| ✅ | The page explains that the trial ended and workspace data remains available, with PAYG and sales choices initially unselected. | The page copy communicates continued workspace availability and controls the radio choice with an initial null value. |
| ✅ | PAYG activation starts the existing checkout flow with locking, safe URL validation, error handling, and telemetry. | The extracted checkout hook retains the mutation, organization lock, safe external URL validation, redirect, error state, and telemetry. |
| ✅ | Sales activation opens the reusable booking calendar modal with prefilled details, email contact, and booking telemetry. | The sales card opens BookingCalendarModal with gate defaults and an email footer; BookingCalendar retains account prefill and booking telemetry. |
| ✅ | Page views and each choice selection or switch are tracked. | The page captures a page-view event and records each choice with the previous selection. |
| ✅ | Arrow-key navigation changes selection without launching checkout or sales. | RadioCard only invokes onSelect for explicit activation, and the component tests cover arrow navigation without actions. |
| ✅ | Explicit card activation launches the action, including repeat activation of the selected card. | Surface clicks and Enter/Space activation invoke onSelect independently of selection state; tests cover repeat clicks and keyboard activation. |
| ✅ | Choice cards support keyboard interaction, visible focus, disabled behavior, and nested controls do not activate the card. | RadioGroupItem provides the focusable radio behavior, focus styling is defined on the card, and tests cover disabled cards and nested controls. |
| ✅ | Active-trial, never-trialed, and multi-organization routing behavior remains intact. | The existing multi-organization switch remains before lifecycle routing, while non-expired sessions continue through the existing gate paths. |
| ✅ | Generic RadioCard and RadioCardGroup components are provided with configurable indicators and orientation. | Reusable components expose group-level indicator configuration and vertical or horizontal orientation, with stories and tests. |
| The responsive layout works on mobile and desktop. | The page uses a horizontal card layout and responsive sizing for the booking calendar, but the diff does not provide clear mobile-specific layout coverage or tests. |
Requires human review: Auto-approval blocked because this review re-detected 1 unresolved issue already reported by Cubic.
Re-trigger cubic
ebdf5b1 to
a9bb02f
Compare
There was a problem hiding this comment.
All reported issues were addressed across 14 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Fix all with cubic | Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 1 file (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Fix all with cubic | Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 4 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Fix all with cubic | Re-trigger cubic
There was a problem hiding this comment.
All reported issues were addressed across 7 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Fix all with cubic | Re-trigger cubic
07d481a to
eceb059
Compare
GRW-49
Summary
/trial-endedexperience that routes expired trials to clear self-serve PAYG and sales-assisted upgrade paths while preserving active-trial, never-trialed, and multi-organization gating behavior./talk-to-us; trial-status and inference-cap sales actions now open the shared booking modal in place with context appropriate to each surface.RadioCardprimitives whose arrow-key selection is separate from explicit activation, including leading-icon, nested-control, focus, and keyboard behavior.Motivation
Expired trials previously fell into the same sales gate used by other account states, leaving no dedicated recovery path and no self-serve billing option. This change gives expired organizations a focused decision point, keeps sales booking available wherever it is needed without route changes, and consolidates checkout and calendar behavior so safety, accessibility, and telemetry remain consistent across dashboard surfaces.
Visual
Updated end of trial page
Modal Booking Calendar

New ui component Radio Card