Files
supabase/packages/shared-data/plans.ts
2024-07-19 15:39:11 +08:00

166 lines
4.6 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export interface PricingInformation {
id: string
name: string
nameBadge?: string
costUnit?: string
href: string
priceLabel?: string
priceMonthly: number | string
warning?: string
warningTooltip?: string
description: string
preface: string
features: { partners: string[]; features: (string | string[])[] }[]
footer?: { partners: string[]; footer: string }[]
cta: string
}
export const plans: PricingInformation[] = [
{
id: 'tier_free',
name: 'Free',
nameBadge: '',
costUnit: '/ month',
href: 'https://supabase.com/dashboard/new?plan=free',
priceLabel: '',
priceMonthly: 0,
description: 'Perfect for passion projects & simple websites.',
preface: 'Get started with:',
features: [
{
partners: [],
features: [
'Unlimited API requests',
'50,000 monthly active users',
['500MB database space', 'Shared CPU • 500MB RAM'],
'5GB bandwidth',
'1 GB file storage',
'Community support',
],
},
{
partners: ['fly'],
features: [
'Unlimited API requests',
'50,000 monthly active users',
['500MB database space', 'Shared CPU • 500 MB RAM'],
'5GB bandwidth',
'Community support',
],
},
],
footer: [
{
partners: [],
footer: 'Free projects are paused after 1 week of inactivity. Limit of 2 active projects.',
},
{
partners: ['fly'],
footer: 'Free projects are paused after 1 week of inactivity. Limit of 1 active project.',
},
],
cta: 'Start for Free',
},
{
id: 'tier_pro',
name: 'Pro',
nameBadge: 'Most Popular',
costUnit: '/ month',
href: 'https://supabase.com/dashboard/new?plan=pro',
priceLabel: 'From',
warning: '$10 in compute credits included',
priceMonthly: 25,
description: 'For production applications with the power to scale.',
features: [
{
partners: [],
features: [
['100,000 monthly active users', 'then $0.00325 per MAU'],
['8GB database space', 'then $0.125 per GB'],
['250GB bandwidth', 'then $0.09 per GB'],
['100GB file storage', 'then $0.021 per GB'],
'Email support',
'Daily backups stored for 7 days',
'7-day log retention',
],
},
{
partners: ['fly'],
features: [
['8GB database space', 'then $0.125 per GB'],
['250GB bandwidth', 'then $0.09 per GB'],
'Email support',
'Daily backups stored for 7 days',
'7-day log retention',
],
},
],
preface: 'Everything in the Free Plan, plus:',
cta: 'Get Started',
},
{
id: 'tier_team',
name: 'Team',
nameBadge: '',
costUnit: '/ month',
href: 'https://supabase.com/dashboard/new?plan=team',
priceLabel: 'From',
warning: '$10 in compute credits included',
priceMonthly: 599,
description: 'Add features such as SSO, control over backups, and industry certifications.',
features: [
{
partners: [],
features: [
'SOC2',
'HIPAA available as paid add-on',
'Read-only and Billing member roles',
'SSO for Supabase Dashboard',
'Priority email support & SLAs',
'Daily backups stored for 14 days',
'28-day log retention',
],
},
],
preface: 'Everything in the Pro Plan, plus:',
cta: 'Get Started',
},
{
id: 'tier_enterprise',
name: 'Enterprise',
href: 'https://forms.supabase.com/enterprise',
description: 'For large-scale applications running Internet scale workloads.',
features: [
{
partners: [],
features: [
'Designated Support manager',
'Uptime SLAs',
'On-premise support',
'24×7×365 premium enterprise support',
'Private Slack channel',
'Custom Security Questionnaires',
],
},
],
priceLabel: '',
priceMonthly: 'Custom',
preface: '',
cta: 'Contact Us',
},
]
export function pickFeatures(plan: PricingInformation, billingPartner: string = '') {
return (
plan.features.find((f) => f.partners.includes(billingPartner))?.features ||
plan.features.find((f) => f.partners.length === 0)!.features
)
}
export function pickFooter(plan: PricingInformation, billingPartner: string = '') {
return (
plan.footer?.find((f) => f.partners.includes(billingPartner))?.footer ||
plan.footer?.find((f) => f.partners.length === 0)!.footer
)
}