Skip to content

feat(pricing): mark Team tier as Coming Soon#1

Merged
mastermanas805 merged 1 commit into
mainfrom
feat/team-coming-soon
May 11, 2026
Merged

feat(pricing): mark Team tier as Coming Soon#1
mastermanas805 merged 1 commit into
mainfrom
feat/team-coming-soon

Conversation

@mastermanas805

Copy link
Copy Markdown
Member

Summary

  • PricingPage: amber "soon" badge on Team column header; Team CTA replaced with disabled span; FAQ "envs" answer no longer promises Team multi-env.
  • MarketingPage: "Coming soon" flag on the Team plan card; CTA renders as a disabled <span> (cursor: not-allowed, 55% opacity); landing copy ("Self-serve at every tier. No sales call.") no longer name-drops Team as a shippable tier.

Team tier remains in plans.yaml + backend k8s code paths so growth/team sizing still resolves; only customer-facing upgrade flows are hidden until the multi-seat + RBAC + SSO surface ships.

Companion change (instant-api repo — already deployed v1.5.8)

Both /api/v1/billing/checkout and /api/v1/billing/change-plan return 400 tier_unavailable for target=team. Verified end-to-end against api.instanode.dev.

Test plan

  • Local build clean (`npm run build` succeeded)
  • Backend guard verified live: `curl POST /api/v1/billing/checkout {plan:team}` → 400 `tier_unavailable`
  • Visual: open https://instanode.dev/pricing after deploy, confirm Team column shows the soon badge and disabled CTA

Team tier remains in plans.yaml + backend k8s code paths so growth/team
sizing still resolves, but customer-facing surfaces hide upgrade paths
until the multi-seat + RBAC + SSO surface ships.

- PricingPage: amber "soon" badge on Team column; CTA replaced with
  disabled span; FAQ "envs" answer no longer promises Team multi-env.
- MarketingPage: "Coming soon" flag on the Team plan card; CTA renders
  as a disabled <span>; landing copy no longer name-drops Team as a
  shippable tier.

Backend guards (separate PR in instant-api repo): both /api/v1/billing/
checkout and change-plan return 400 tier_unavailable for target=team.
@mastermanas805
mastermanas805 merged commit 48f1e0b into main May 11, 2026
1 of 2 checks passed
@mastermanas805
mastermanas805 deleted the feat/team-coming-soon branch May 11, 2026 05:33
mastermanas805 added a commit that referenced this pull request Jun 5, 2026
…ause/resume-by-token (#192)

* test(e2e): Wave 2+3 — real-backend UI journeys + PR-smoke gate; fix pause/resume by token

Drive the ACTUAL dashboard in the browser against the real prod api with a
multi-tier minted cohort account, then reap (rule 24, no leak). Catches the
UI-against-real-backend breakage class (login-broke) that mocked Playwright +
tsc + vitest all miss.

Wave 3 — factory + named journeys (all proven green vs api.instanode.dev):
- e2e/factory.ts: thin wrapper over POST/DELETE /internal/e2e/account —
  mintUser({tier}), mintUserWithResources, mintAtDeployCap (hobby cap=1), reap;
  cohort-tagged + ledger-registered for the afterAll/out-of-process backstop.
- e2e/ui-helpers.ts: same-origin preview-proxy harness. The prod api CORS
  allowlist returns allow-origin ONLY for https://instanode.dev (AUTH-004), so a
  direct cross-origin fetch from the preview origin is CORS-blocked. The preview
  server proxies api paths to prod (vite.config.ts preview.proxy) and the SPA's
  api base is pinned same-origin → real backend, no CORS wall.
- e2e/live-ui-{auth,resources,deploy,team-vault}.spec.ts: journeys
  #1 auth round-trip (authed shell + /auth/me identity; magic-link form),
  #2 provision→view→metrics stream→creds reveal→delete,
  #3 deploy lifecycle + build-log SSE connect + make-permanent,
  #4 delete-when-exhausted→replace (hobby cap=1: #1 renders → #2 hits the 402
     wall → delete #1 → replacement succeeds) — the headline scenario,
  #5 pause/resume + 402 tier gate, #6 vault add→reveal→delete, #7 team invite.
- Manifest: live-ui.coverage.ts + done-bar wiring; add GET /deploy/:id/logs.

Wave 2 — PR-smoke gate:
- .github/workflows/e2e-pr-smoke.yml runs the @pr-smoke subset (#1/#2/#3) on
  every web PR via a minted+reaped account; no-ops cleanly on fork/secret-less
  PRs; full suite stays on the e2e-prod 30-min schedule.

REAL UI bug found + fixed (PauseResumeButton): pause/resume addressed the
resource by the UUID `id`, but the api resolves :id against the TOKEN column —
so every pause/resume 404'd ("Resource not found") through the dashboard. Now
uses resource.token (matches getResource/rotate/delete). Proven via journey #5.

Verified: all 10 live-ui tests green vs prod, ledger empty, reap 200; npm run
gate green (1129 tests).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test(e2e): drop unused mintUser import in live-ui-resources (code-quality)

All three resource journeys use mintUserWithResources; mintUser was imported but
never referenced. Flagged by github-code-quality on PR #192.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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