Skip to content

fix(dashboard): light up Hobby Plus across upgrade picker, deploy detail, overview (Wave FIX-A)#73

Merged
mastermanas805 merged 1 commit into
mainfrom
fix/wave-a-hobby-plus
May 14, 2026
Merged

fix(dashboard): light up Hobby Plus across upgrade picker, deploy detail, overview (Wave FIX-A)#73
mastermanas805 merged 1 commit into
mainfrom
fix/wave-a-hobby-plus

Conversation

@mastermanas805
Copy link
Copy Markdown
Member

Summary

Closes BugBash R9, R16, U11, U15, 190 (dashboard-side share of Wave FIX-A).

Hobby Plus has been a real plan in api/plans.yaml since W11 ($19/mo, custom_domains: true, 2 deployments, multi-env vault) but the dashboard kept treating it as a stub — hidden from the upgrade picker, custom-domain panel showed the upsell, overview storage bar fell through to the Pro fallback and lied about the limit. This PR lights it up everywhere.

  • ChangePlanModal (FIX-R9, FIX-190): SELECTABLE_TIERS now includes hobby_plus. Dropped growth — no real self-serve growth row exists in plans.yaml; surfacing it sent users into a 400 invalid_plan. The downgrade-via-support exit path is unchanged.
  • DeployDetailPage (FIX-U11, FIX-A6/Q23 mirror): CUSTOM_DOMAIN_TIERS and MULTI_ENV_TIERS now include hobby_plus. The api unlocks both for hobby_plus; the dashboard matches so users don't see upsells over features they paid for.
  • OverviewPage (FIX-U15): TIER_LIMIT_GB gained hobby_plus: 5 and growth: 10. A hobby_plus user previously hit the ?? 5 fallback (Pro's number) and the usage bar lied about the ceiling.
  • Tier type extension (src/api/types.ts): hobby_plus was already strolling through many response payloads as a string but the TS union was lagging. All Record<Tier, ...> sites updated: Common.tsx TIER_LABELS, TierChangeModal.tsx TIER_RANK, AdminCustomersPage tier filter, listAdminCustomers request shape.

Tests

  • ChangePlanModal.test.tsx — new tests for hobby_plus appearing as an upgrade target from hobby, growth staying hidden (FIX-190), and a hobby_plus user seeing only pro+team upgrades. 21 tests (was 19), 0 failures.
  • DeployDetailPage.tier-config.test.tsx (new) — pins that a hobby_plus user sees the custom-domain panel and no multi-env upsell.
  • OverviewPage.tier-limit.test.tsx (new) — renders the page for every plans.yaml tier (anonymousteam) and asserts no crash — locks in that TIER_LIMIT_GB covers every real tier the server can return.
$ npm test -- --run
Test Files  30 passed (30)
     Tests  564 passed | 3 skipped (567)

(was 555 passed — 9 net new tests.) TypeScript compile clean (npx tsc --noEmit).

Cross-ref

API PR for the server-side share (FIX-A6, R8, R16, Q23): https://github.com/InstaNode-dev/api/pull/102

Test plan

  • Manual: log in as a hobby_plus team, open the change-plan modal — see Pro + Team upgrade options (no Growth).
  • Manual: log in as a hobby team — see Hobby Plus + Pro + Team upgrade options.
  • Manual: log in as a hobby_plus team, open /deployments/:id — see the live custom-domain panel, NOT the upsell card.
  • Manual: log in as a hobby_plus team — overview storage bar uses 5 GB ceiling (not Pro's number via fallback).
  • Vitest + tsc gates already green in CI.

Closes BugBash R9, R16, U11, U15, 190.

🤖 Generated with Claude Code

…ail, overview (Wave FIX-A)

Closes BugBash R9, R16, U11, U15, 190 (dashboard-side share of the wave).

Hobby Plus shipped in api/plans.yaml at W11 ($19/mo, custom_domains: true,
2 deployments, vault_envs_allowed: [development, staging, production]) but
the dashboard kept treating it as a stub — hidden from the upgrade picker,
custom-domain panel showed the upsell instead of the live form, overview
storage bar fell through to the Pro fallback (lying about the limit). This
PR lights it up across every surface so a hobby_plus user sees the same
shape as any other paid customer.

Changes:
  - ChangePlanModal: SELECTABLE_TIERS now includes hobby_plus (it's real
    in plans.yaml). Dropped growth — no real self-serve growth row exists,
    surfacing it sent users into a 400 invalid_plan from the api. The
    downgrade-via-support exit path is unchanged.
  - DeployDetailPage: CUSTOM_DOMAIN_TIERS (FIX-U11) + MULTI_ENV_TIERS
    (FIX-A6/Q23, dashboard-side mirror of the api allowlist) now include
    hobby_plus. The api unlocks both for hobby_plus — the dashboard
    matches so users don't see the upsell over a feature they already
    paid for.
  - OverviewPage TIER_LIMIT_GB: added hobby_plus (5) + growth (10). A
    hobby_plus user previously hit the `?? 5` fallback (same as Pro);
    growth users similarly. The chart now renders the correct ceiling.
  - Tier type (src/api/types.ts) gained 'hobby_plus' — this was already
    accepted as a server-side string in many places (the api response
    carries it) but the TS union was lagging. All Record<Tier, ...>
    sites (Common.tsx TIER_LABELS, TierChangeModal.tsx TIER_RANK) +
    AdminCustomersPage tier filter were updated to match.

Tests:
  - ChangePlanModal.test.tsx: new tests for hobby_plus appearing as an
    upgrade target from hobby, growth being hidden (FIX-190), and a
    hobby_plus user seeing only pro+team upgrades. 21 tests total
    (was 19), 0 failures.
  - DeployDetailPage.tier-config.test.tsx: new file. Pins that a
    hobby_plus user sees the custom-domain panel and no multi-env
    upsell — i.e. the FIX-U11 + FIX-A6 dashboard-side unlocks land.
  - OverviewPage.tier-limit.test.tsx: new file. Renders the page for
    every plans.yaml tier (anonymous → team) and asserts it doesn't
    crash — locks in that the TIER_LIMIT_GB extension covered every
    real tier the server can return.

Full suite: 564 passed | 3 skipped (was 555 — 9 new tests). TypeScript
compile clean (npx tsc --noEmit).

Cross-ref: api PR for the server-side share — fix/wave-a-hobby-plus
on InstaNode-dev/api.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mastermanas805 mastermanas805 merged commit 125511d into main May 14, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant