Files
myeasycms-v2/apps/web/config/billing-plans.config.ts
2026-03-29 19:44:57 +02:00

98 lines
2.4 KiB
TypeScript

/**
* CMS Billing Plans — Stripe product configuration
* Phase 12: Three tiers for the SaaS product
*/
export const CMS_BILLING_PLANS = {
starter: {
name: 'Starter',
description: 'Für kleine Vereine und Organisationen',
limits: {
modules: 1,
records: 100,
members: 50,
storageGb: 1,
users: 3,
},
features: [
'Module Builder (1 Modul)',
'Mitgliederverwaltung (bis 50)',
'Basisfunktionen',
'Deutsche Oberfläche',
'E-Mail-Support',
],
pricing: {
monthly: { amount: 1900, currency: 'eur' }, // 19,00 €
yearly: { amount: 19000, currency: 'eur' }, // 190,00 € (2 Monate gratis)
},
},
professional: {
name: 'Professional',
description: 'Für aktive Vereine und Volkshochschulen',
limits: {
modules: -1, // unlimited
records: -1,
members: -1,
storageGb: 10,
users: 20,
},
features: [
'Unbegrenzte Module',
'Unbegrenzte Mitglieder',
'Kursverwaltung',
'SEPA-Lastschriften',
'Newsletter',
'Dokumentengenerierung',
'Import/Export',
'Prioritäts-Support',
],
pricing: {
monthly: { amount: 4900, currency: 'eur' }, // 49,00 €
yearly: { amount: 49000, currency: 'eur' }, // 490,00 €
},
},
enterprise: {
name: 'Enterprise',
description: 'Für große Organisationen mit individuellen Anforderungen',
limits: {
modules: -1,
records: -1,
members: -1,
storageGb: 100,
users: -1,
},
features: [
'Alles aus Professional',
'White-Label / eigenes Branding',
'REST-API Zugang',
'Multi-Mandanten-Verwaltung',
'Dedizierte Instanz (optional)',
'Individuelle Anpassungen',
'Persönlicher Ansprechpartner',
'SLA-Garantie',
],
pricing: {
monthly: { amount: 14900, currency: 'eur' }, // 149,00 €
yearly: { amount: 149000, currency: 'eur' }, // 1.490,00 €
},
},
} as const;
export type BillingPlanKey = keyof typeof CMS_BILLING_PLANS;
/**
* Check if a plan allows a given feature/limit.
*/
export function checkPlanLimit(
plan: BillingPlanKey,
limit: keyof typeof CMS_BILLING_PLANS.starter.limits,
currentUsage: number,
): boolean {
const planLimits = CMS_BILLING_PLANS[plan].limits;
const max = planLimits[limit];
if (max === -1) return true; // unlimited
return currentUsage < max;
}