NeXuS uses a tier-based plan system to gate features in the frontend. The PlanProvider context manages the current user’s plan and exposes helpers for conditional rendering.
| Tier | Name | Price | Key Features |
|---|---|---|---|
| Basic | NeXuS Basic | $19/mo | Dashboard, container monitoring, service health, basic alerts |
| Pro | NeXuS PRO | $39/mo | + DNS management, MCP integration, Grafana embed, container actions, log search, advanced metrics, webhooks |
| Enterprise | NeXuS Enterprise | $89/mo | + SSO/SAML, audit logging, multi-region, custom alerts, dedicated support, on-call escalation, quarterly reviews |
dashboardcontainer-monitoringservice-healthbasic-alertsdns-managementmcp-integrationgrafana-embedcontainer-actionslog-searchadvanced-metricspriority-supportwebhookscustom-grafanasso-samlaudit-loggingmulti-regioncustom-alertsdedicated-supporton-call-escalationquarterly-reviewsWrap your app with PlanProvider (inside AuthProvider):
<AuthProvider>
<PlanProvider>
{children}
</PlanProvider>
</AuthProvider>
The provider fetches the user’s plan from GET /user/plan on mount.
import { usePlan } from '@/lib/plan'
function MyComponent() {
const { plan, hasFeature, isAtLeast, tierLabel } = usePlan()
// Check if user has a specific feature
if (hasFeature('dns-management')) {
// Show DNS UI
}
// Check if user is at least Pro tier
if (isAtLeast('pro')) {
// Show Pro content
}
// Get upgrade badge text (null if user has access)
const badge = tierLabel('enterprise') // Returns "ENTERPRISE" or null
}
| Method | Returns | Description |
|---|---|---|
plan |
PlanInfo |
Current plan object (tier, name, price, features, trialEnds) |
loading |
boolean |
True while fetching plan |
hasFeature(feature) |
boolean |
Whether the current plan includes this feature |
isAtLeast(tier) |
boolean |
Whether the current plan is at least the given tier |
tierLabel(minTier) |
string \| null |
Returns "PRO" or "ENTERPRISE" badge text if user needs to upgrade, or null if they have access |