Openstatus
www.openstatus.dev
1import { AVAILABLE_REGIONS, FREE_FLY_REGIONS } from "@openstatus/regions";
2import type { WorkspacePlan } from "../workspaces/validation";
3import type { Addons, PlanLimits, Price } from "./schema";
4
5type PlanConfig = {
6 title: "Hobby" | "Starter" | "Pro";
7 id: WorkspacePlan;
8 description: string;
9 price: Price;
10 addons: Partial<{
11 [K in keyof Addons]: {
12 title: string;
13 description: string;
14 price: Price;
15 };
16 }>;
17 limits: PlanLimits;
18};
19
20// TODO: rename to `planConfig`
21export const allPlans: Record<WorkspacePlan, PlanConfig> = {
22 free: {
23 title: "Hobby",
24 id: "free",
25 description: "Perfect for personal projects",
26 price: {
27 USD: 0,
28 EUR: 0,
29 INR: 0,
30 },
31 addons: {},
32 limits: {
33 version: undefined,
34 monitors: 1,
35 "synthetic-checks": 30,
36 periodicity: ["10m", "30m", "1h"],
37 "multi-region": true,
38 "max-regions": 6,
39 "data-retention": "14 days",
40 "status-pages": 1,
41 "page-components": 3,
42 maintenance: true,
43 "monitor-values-visibility": true,
44 "response-logs": false,
45 screenshots: false,
46 otel: false,
47 "status-subscribers": false,
48 "custom-domain": false,
49 "password-protection": false,
50 "email-domain-protection": false,
51 "white-label": false,
52 notifications: true,
53 sms: false,
54 "sms-limit": 0,
55 pagerduty: false,
56 opsgenie: false,
57 whatsapp: false,
58 "notification-channels": 1,
59 members: 1,
60 "audit-log": false,
61 regions: [...FREE_FLY_REGIONS],
62 "private-locations": false,
63 },
64 },
65 starter: {
66 title: "Starter",
67 id: "starter",
68 description: "Perfect for uptime monitoring",
69 price: {
70 USD: 30,
71 EUR: 30,
72 INR: 3000,
73 },
74 addons: {
75 "email-domain-protection": {
76 title: "Magic Link (Auth)",
77 description:
78 "Only allow user with a given email domain to access the status page.",
79 price: {
80 USD: 100,
81 EUR: 100,
82 INR: 10_000,
83 },
84 },
85 "white-label": {
86 title: "White Label",
87 description:
88 "Remove the 'powered by openstatus.dev' footer from your status pages.",
89 price: {
90 USD: 300,
91 EUR: 300,
92 INR: 30_000,
93 },
94 },
95 "status-pages": {
96 title: "Status Pages",
97 description: "Create and manage status pages for your workspace.",
98 price: {
99 USD: 20,
100 EUR: 20,
101 INR: 2_000,
102 },
103 },
104 },
105 limits: {
106 version: undefined,
107 monitors: 20,
108 "synthetic-checks": 100,
109 periodicity: ["1m", "5m", "10m", "30m", "1h"],
110 "multi-region": true,
111 "max-regions": 6,
112 "data-retention": "3 months",
113 "status-pages": 1,
114 "page-components": 20,
115 maintenance: true,
116 "monitor-values-visibility": true,
117 "response-logs": true,
118 screenshots: true,
119 otel: false,
120 "status-subscribers": true,
121 "custom-domain": true,
122 "password-protection": true,
123 "email-domain-protection": false,
124 "white-label": false,
125 notifications: true,
126 pagerduty: true,
127 opsgenie: true,
128 whatsapp: true,
129 sms: true,
130 "sms-limit": 50,
131 "notification-channels": 10,
132 members: "Unlimited",
133 "audit-log": false,
134 regions: [...AVAILABLE_REGIONS],
135 "private-locations": false,
136 },
137 },
138 team: {
139 title: "Pro",
140 id: "team",
141 description: "Perfect for global synthetic monitoring",
142 price: {
143 USD: 100,
144 EUR: 100,
145 INR: 10_000,
146 },
147 addons: {
148 "email-domain-protection": {
149 title: "Magic Link (Auth)",
150 description:
151 "Only allow user with a given email domain to access the status page.",
152 price: {
153 USD: 100,
154 EUR: 100,
155 INR: 10_000,
156 },
157 },
158 "white-label": {
159 title: "White Label",
160 description:
161 "Remove the 'powered by openstatus.dev' footer from your status pages.",
162 price: {
163 USD: 300,
164 EUR: 300,
165 INR: 30_000,
166 },
167 },
168 "status-pages": {
169 title: "Status Pages",
170 description: "Create and manage status pages for your workspace.",
171 price: {
172 USD: 20,
173 EUR: 20,
174 INR: 2_000,
175 },
176 },
177 },
178 limits: {
179 version: undefined,
180 monitors: 50,
181 "synthetic-checks": 300,
182 periodicity: ["30s", "1m", "5m", "10m", "30m", "1h"],
183 "multi-region": true,
184 "max-regions": AVAILABLE_REGIONS.length,
185 "data-retention": "12 months",
186 "status-pages": 5,
187 "page-components": 50,
188 maintenance: true,
189 "monitor-values-visibility": true,
190 "response-logs": true,
191 screenshots: true,
192 otel: true,
193 "status-subscribers": true,
194 "custom-domain": true,
195 "password-protection": true,
196 "email-domain-protection": false,
197 "white-label": false,
198 notifications: true,
199 sms: true,
200 "sms-limit": 100,
201 pagerduty: true,
202 opsgenie: true,
203 whatsapp: true,
204 "notification-channels": 20,
205 members: "Unlimited",
206 "audit-log": true,
207 regions: [...AVAILABLE_REGIONS],
208 "private-locations": true,
209 },
210 },
211};