feat(pricing): migrate to Mana Quelle S-XXL subscription tiers with new Stripe products

Replace old 3-tier model (Plus/Pro/Ultra) with 5 size-based tiers (S/M/L/XL/XXL).
New naming: "Mana Quelle" for subscriptions, "Mana Trank" for one-time purchases.
Create new Stripe products and prices, archive old ones, update all UI and seed data.

Subscription tiers: S (500 Mana, 4.99€), M (1000, 9.99€), L (2000, 19.99€),
XL (4000, 39.99€), XXL (10000, 99.99€). Yearly: 20% discount.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-27 11:43:43 +01:00
parent 17df7b32f5
commit 2624e5a6b7
14 changed files with 831 additions and 437 deletions

View file

@ -69,25 +69,35 @@ RATE_LIMIT_MAX=100
# Stripe Configuration # Stripe Configuration
# Get your keys from https://dashboard.stripe.com/apikeys # Get your keys from https://dashboard.stripe.com/apikeys
STRIPE_SECRET_KEY=sk_test_YOUR_KEY STRIPE_SECRET_KEY=sk_live_YOUR_STRIPE_SECRET_KEY
STRIPE_PUBLISHABLE_KEY=pk_test_YOUR_KEY STRIPE_PUBLISHABLE_KEY=pk_test_YOUR_KEY
STRIPE_WEBHOOK_SECRET=whsec_103705b73101b783a91305a9ec272834df6a096ffb2c2566b1c899318a156b03 STRIPE_WEBHOOK_SECRET=whsec_YOUR_WEBHOOK_SECRET
# Stripe Product & Price IDs (ManaCore Unified Plans - Live) # Stripe Product & Price IDs - Mana Quellen (Subscriptions, Live)
# Plus: 1.00€/month, 9.60€/year - 100 credits (1 Mana = 1 Cent) # S: 4.99€/month, 47.90€/year - 500 Mana
STRIPE_PLUS_PRODUCT_ID=prod_TzNUGcq9qx9rRT STRIPE_S_PRODUCT_ID=prod_UDzZl1uKIHplam
STRIPE_PLUS_PRICE_MONTHLY=price_1TEt04AZjQCYS0ZJUuUWt3yg STRIPE_S_PRICE_MONTHLY=price_1TFXaKAZjQCYS0ZJGQFSxm8v
STRIPE_PLUS_PRICE_YEARLY=price_1TEt05AZjQCYS0ZJYPqiqQMm STRIPE_S_PRICE_YEARLY=price_1TFXaLAZjQCYS0ZJwFnGP29S
# Pro: 5.00€/month, 48.00€/year - 500 credits (1 Mana = 1 Cent) # M: 9.99€/month, 95.90€/year - 1000 Mana
STRIPE_PRO_PRODUCT_ID=prod_TzNUgWeBjT35qn STRIPE_M_PRODUCT_ID=prod_UDzZXZxEVoyQMF
STRIPE_PRO_PRICE_MONTHLY=price_1TEt05AZjQCYS0ZJjmjsUdkJ STRIPE_M_PRICE_MONTHLY=price_1TFXaMAZjQCYS0ZJMRmTgQvb
STRIPE_PRO_PRICE_YEARLY=price_1TEt05AZjQCYS0ZJtaT4UGsA STRIPE_M_PRICE_YEARLY=price_1TFXaNAZjQCYS0ZJ6AS1vRkx
# Ultra: 20.00€/month, 192.00€/year - 2000 credits (1 Mana = 1 Cent) # L: 19.99€/month, 191.90€/year - 2000 Mana
STRIPE_ULTRA_PRODUCT_ID=prod_TzNUE5pTbTDdbp STRIPE_L_PRODUCT_ID=prod_UDzZcDxsDS3q1T
STRIPE_ULTRA_PRICE_MONTHLY=price_1TEt06AZjQCYS0ZJdyTDjfUk STRIPE_L_PRICE_MONTHLY=price_1TFXaNAZjQCYS0ZJaqXjJ0HC
STRIPE_ULTRA_PRICE_YEARLY=price_1TEt06AZjQCYS0ZJ6Wq3gNpM STRIPE_L_PRICE_YEARLY=price_1TFXaOAZjQCYS0ZJVndo98Pf
# XL: 39.99€/month, 383.90€/year - 4000 Mana
STRIPE_XL_PRODUCT_ID=prod_UDzZum6MMQkc0b
STRIPE_XL_PRICE_MONTHLY=price_1TFXaPAZjQCYS0ZJ0q7OysMg
STRIPE_XL_PRICE_YEARLY=price_1TFXaQAZjQCYS0ZJ6rDqh2FU
# XXL: 99.99€/month, 959.90€/year - 10000 Mana
STRIPE_XXL_PRODUCT_ID=prod_UDzZreFcbGxdJj
STRIPE_XXL_PRICE_MONTHLY=price_1TFXaQAZjQCYS0ZJ3A6QB2sv
STRIPE_XXL_PRICE_YEARLY=price_1TFXaRAZjQCYS0ZJCuYSesCA
# Mana Tränke (One-time purchases, 1 Mana = 1.4 Cent) # Mana Tränke (One-time purchases, 1 Mana = 1.4 Cent)
STRIPE_POTION_SMALL_PRODUCT_ID=prod_UDKn8rXX0Crz0T STRIPE_POTION_SMALL_PRODUCT_ID=prod_UDKn8rXX0Crz0T

View file

@ -142,10 +142,10 @@ const { class: className } = Astro.props;
const classicPricePerUser = 19.99; const classicPricePerUser = 19.99;
const manacorePlans = { const manacorePlans = {
light: { name: 'Mana Fluss', price: 5.99, users: 3 }, light: { name: 'Mana Quelle S', price: 4.99, users: 3 },
medium: { name: 'Mana Strom', price: 14.99, users: 5 }, medium: { name: 'Mana Quelle M', price: 9.99, users: 5 },
heavy: { name: 'Mana See', price: 29.99, users: 10 }, heavy: { name: 'Mana Quelle L', price: 19.99, users: 10 },
power: { name: 'Mana Meer', price: 49.99, users: 15 }, power: { name: 'Mana Quelle XL', price: 39.99, users: 15 },
}; };
function calculateCosts() { function calculateCosts() {

View file

@ -67,11 +67,12 @@ Der Mana-Verbrauch bei Memoro ist transparent und fix: **1 Mana = 1 Cent**
**Monatlich (Abo):** **Monatlich (Abo):**
- **Mana Tropfen**: 0€ - 150 Mana/Monat (kostenlos) - **Mana Quelle Free**: 0€ - 50 Mana/Monat (kostenlos)
- **Kleiner Stream**: 5,99€ - 600 Mana/Monat - **Mana Quelle S**: 4,99€ - 500 Mana/Monat
- **Mittlerer Stream**: 14,99€ - 1.500 Mana/Monat - **Mana Quelle M**: 9,99€ - 1.000 Mana/Monat
- **Großer Stream**: 29,99€ - 3.000 Mana/Monat - **Mana Quelle L**: 19,99€ - 2.000 Mana/Monat
- **Riesiger Stream**: 49,99€ - 5.000 Mana/Monat - **Mana Quelle XL**: 39,99€ - 4.000 Mana/Monat
- **Mana Quelle XXL**: 99,99€ - 10.000 Mana/Monat
**Einmalig (Trank):** **Einmalig (Trank):**
@ -82,7 +83,7 @@ Der Mana-Verbrauch bei Memoro ist transparent und fix: **1 Mana = 1 Cent**
### Flexibilität von Mana ### Flexibilität von Mana
Mit Mana zahlst du nur für die tatsächliche Nutzung. Brauchst du einen Monat mehr? Buche ein größeres Paket oder einen einmaligen Trank. Brauchst du weniger? Nutze einfach den kostenlosen Mana Tropfen. Perfekt für schwankenden Bedarf! Mit Mana zahlst du nur für die tatsächliche Nutzung. Brauchst du einen Monat mehr? Buche ein größeres Paket oder einen einmaligen Trank. Brauchst du weniger? Nutze einfach die kostenlose Mana Quelle Free. Perfekt für schwankenden Bedarf!
## Anwendungsfälle ## Anwendungsfälle

View file

@ -51,27 +51,29 @@ Das Mana-System kombiniert die Vorteile von Abonnements mit der Fairness verbrau
### Monatliche Abonnements mit Mana-Regeneration ### Monatliche Abonnements mit Mana-Regeneration
| Abo-Stufe | Preis/Monat | Start-Mana | Tägliche Regeneration | Speicherlimit | Entspricht ca. | | Abo-Stufe | Preis/Monat | Mana/Monat | Tägliche Regeneration | Entspricht ca. |
| ---------------- | ----------- | ---------- | --------------------- | ------------- | -------------- | | -------------------- | ----------- | ---------- | --------------------- | -------------- |
| **Mana Tropfen** | Kostenlos | 150 | 5 | 150 | 1,25 Stunden | | **Mana Quelle Free** | Kostenlos | 50 | 2 | 25 Minuten |
| **Mana Fluss** | 5,99€ | 600 | 20 | 1.200 | 10 Stunden | | **Mana Quelle S** | 4,99€ | 500 | 17 | 4 Stunden |
| **Mana Strom** | 14,99€ | 1.500 | 50 | 3.000 | 25 Stunden | | **Mana Quelle M** | 9,99€ | 1.000 | 33 | 8 Stunden |
| **Mana See** | 29,99€ | 3.000 | 100 | 6.000 | 50 Stunden | | **Mana Quelle L** | 19,99€ | 2.000 | 67 | 17 Stunden |
| **Mana Meer** | 49,99€ | 5.000 | 200 | 10.000 | 83 Stunden | | **Mana Quelle XL** | 39,99€ | 4.000 | 133 | 33 Stunden |
| **Mana Quelle XXL** | 99,99€ | 10.000 | 333 | 83 Stunden |
### Jährliche Abonnements (bis zu 33% Ersparnis) ### Jährliche Abonnements (20% Ersparnis)
- **Mana Fluss**: 47,99€/Jahr (3,99€/Monat) - **Mana Quelle S**: 47,90€/Jahr (3,99€/Monat)
- **Mana Strom**: 119,99€/Jahr (9,99€/Monat) - **Mana Quelle M**: 95,90€/Jahr (7,99€/Monat)
- **Mana See**: 239,99€/Jahr (19,99€/Monat) - **Mana Quelle L**: 191,90€/Jahr (15,99€/Monat)
- **Mana Meer**: 399,99€/Jahr (33,33€/Monat) - **Mana Quelle XL**: 383,90€/Jahr (31,99€/Monat)
- **Mana Quelle XXL**: 959,90€/Jahr (79,99€/Monat)
### Einmalkäufe (Mana-Tränke) ### Einmalkäufe (Mana-Tränke)
- **Kleiner Trank**: 4,99€ für 350 Mana - **Kleiner Mana Trank**: 4,90€ für 350 Mana
- **Mittlerer Trank**: 9,99€ für 700 Mana - **Mittlerer Mana Trank**: 9,80€ für 700 Mana
- **Großer Trank**: 19,99€ für 1.400 Mana - **Großer Mana Trank**: 19,60€ für 1.400 Mana
- **Riesiger Trank**: 39,99€ für 2.800 Mana - **Riesiger Mana Trank**: 39,20€ für 2.800 Mana
## Vorteile gegenüber klassischen Lizenzmodellen ## Vorteile gegenüber klassischen Lizenzmodellen
@ -79,15 +81,15 @@ Das Mana-System kombiniert die Vorteile von Abonnements mit der Fairness verbrau
**Unternehmen mit 50 Mitarbeitern:** **Unternehmen mit 50 Mitarbeitern:**
- **Manacore**: 2x Mana Meer = 99,98€/Monat - **Manacore**: 1x Mana Quelle XXL = 99,99€/Monat
- **Klassische Lizenzen**: 50 × 19,99€ = 999,50€/Monat - **Klassische Lizenzen**: 50 × 19,99€ = 999,50€/Monat
- **Ersparnis**: 90% - **Ersparnis**: 90%
**Universitäres Forschungsprojekt (15 Forscher, 1 Jahr):** **Universitäres Forschungsprojekt (15 Forscher, 1 Jahr):**
- **Manacore**: 1x Mana See Jahresabo = 239,99 - **Manacore**: 1x Mana Quelle L Jahresabo = 191,90
- **Klassische Lizenzen**: 15 × 9,99€ × 12 Monate = 1.798,20€ - **Klassische Lizenzen**: 15 × 9,99€ × 12 Monate = 1.798,20€
- **Ersparnis**: 87% - **Ersparnis**: 89%
### Weitere Vorteile ### Weitere Vorteile

View file

@ -183,33 +183,34 @@ Im Gegensatz dazu bietet das Mana-System:
Das Regenerationssystem ist das Herzstück des Mana-Modells: Das Regenerationssystem ist das Herzstück des Mana-Modells:
- **Tägliche Gutschrift**: Jeden Tag um 0:00 Uhr werden neue Mana-Credits automatisch gutgeschrieben - **Tägliche Gutschrift**: Jeden Tag um 0:00 Uhr werden neue Mana-Credits automatisch gutgeschrieben
- **Abo-abhängig**: Die Menge hängt von der gewählten Abo-Stufe ab (5 bis 200 Mana täglich) - **Abo-abhängig**: Die Menge hängt von der gewählten Abo-Stufe ab (2 bis 333 Mana täglich)
- **Automatisch**: Keine manuelle Aktivierung erforderlich - **Automatisch**: Keine manuelle Aktivierung erforderlich
- **Zuverlässig**: Regeneration erfolgt auch bei Nicht-Nutzung - **Zuverlässig**: Regeneration erfolgt auch bei Nicht-Nutzung
**Beispiel**: Mit einem Mana See Abo erhalten Sie täglich 100 neue Mana. Das entspricht etwa 50 Minuten Transkription pro Tag - oder Sie sparen für größere Projekte. **Beispiel**: Mit einer Mana Quelle L erhalten Sie täglich 67 neue Mana. Das entspricht etwa 33 Minuten Transkription pro Tag - oder Sie sparen für größere Projekte.
### Der Mana-Speicher erklärt ### Der Mana-Speicher erklärt
Jede Abo-Stufe hat ein Speicherlimit, das verhindert, dass Credits ins Unendliche anwachsen: Jede Abo-Stufe hat ein Speicherlimit, das verhindert, dass Credits ins Unendliche anwachsen:
- **Mana Tropfen**: 150 Mana Speicher (ca. 1,25 Stunden) - **Mana Quelle Free**: 50 Mana Speicher (ca. 25 Minuten)
- **Mana Fluss**: 1.200 Mana Speicher (ca. 10 Stunden) - **Mana Quelle S**: 500 Mana Speicher (ca. 4 Stunden)
- **Mana Strom**: 3.000 Mana Speicher (ca. 25 Stunden) - **Mana Quelle M**: 1.000 Mana Speicher (ca. 8 Stunden)
- **Mana See**: 6.000 Mana Speicher (ca. 50 Stunden) - **Mana Quelle L**: 2.000 Mana Speicher (ca. 17 Stunden)
- **Mana Meer**: 10.000 Mana Speicher (ca. 83 Stunden) - **Mana Quelle XL**: 4.000 Mana Speicher (ca. 33 Stunden)
- **Mana Quelle XXL**: 10.000 Mana Speicher (ca. 83 Stunden)
**Wichtig**: Erreicht Ihr Speicher das Limit, verfallen neue Regenerations-Credits. Nutzen Sie daher regelmäßig Ihre Mana, verschenken es, spenden es oder wählen Sie eine höhere Abo-Stufe. **Wichtig**: Erreicht Ihr Speicher das Limit, verfallen neue Regenerations-Credits. Nutzen Sie daher regelmäßig Ihre Mana, verschenken es, spenden es oder wählen Sie eine höhere Abo-Stufe.
### Praktisches Beispiel ### Praktisches Beispiel
Ein Forscher mit **Mana Strom** Abo: Ein Forscher mit **Mana Quelle L** Abo:
- Tag 1: 1.500 Start-Mana - Tag 1: 2.000 Start-Mana
- Tag 2-10: +50 Mana täglich = 1.950 Mana - Tag 2-10: +67 Mana täglich = 2.603 Mana (max. 2.000 Speicher)
- Führt 5 Interviews à 2 Stunden = -1.200 Mana - Führt 5 Interviews à 2 Stunden = -1.200 Mana
- Verbleibend: 750 Mana - Verbleibend: 800 Mana
- Nach 30 Tagen ohne Nutzung: Speicher voll bei 3.000 Mana - Nach 30 Tagen ohne Nutzung: Speicher voll bei 2.000 Mana
### Kombination mit Mana-Tränken ### Kombination mit Mana-Tränken
@ -277,34 +278,37 @@ Besonders geeignet für:
Memoro bietet verschiedene Abo-Modelle mit täglicher Mana-Regeneration: Memoro bietet verschiedene Abo-Modelle mit täglicher Mana-Regeneration:
- **Mana Tropfen**: Kostenlos - **Mana Quelle Free**: Kostenlos
- 150 Start-Mana, 5 Mana/Tag Regeneration, 150 Mana Speicher - 50 Mana/Monat, 2 Mana/Tag Regeneration
- **Mana Fluss**: 5,99€/Monat - **Mana Quelle S**: 4,99€/Monat
- 600 Start-Mana, 20 Mana/Tag Regeneration, 1.200 Mana Speicher - 500 Mana/Monat, 17 Mana/Tag Regeneration
- **Mana Strom**: 14,99€/Monat - **Mana Quelle M**: 9,99€/Monat
- 1.500 Start-Mana, 50 Mana/Tag Regeneration, 3.000 Mana Speicher - 1.000 Mana/Monat, 33 Mana/Tag Regeneration
- **Mana See**: 29,99€/Monat - **Mana Quelle L**: 19,99€/Monat
- 3.000 Start-Mana, 100 Mana/Tag Regeneration, 6.000 Mana Speicher - 2.000 Mana/Monat, 67 Mana/Tag Regeneration
- **Mana Meer**: 49,99€/Monat - **Mana Quelle XL**: 39,99€/Monat
- 5.000 Start-Mana, 200 Mana/Tag Regeneration, 10.000 Mana Speicher - 4.000 Mana/Monat, 133 Mana/Tag Regeneration
- **Mana Quelle XXL**: 99,99€/Monat
- 10.000 Mana/Monat, 333 Mana/Tag Regeneration
### Jährliche Abonnements (mit Ersparnis) ### Jährliche Abonnements (20% Ersparnis)
Bei jährlicher Zahlung sparen Nutzer bis zu 33%: Bei jährlicher Zahlung sparen Nutzer 20%:
- **Mana Fluss**: 47,99€/Jahr (3,99€/Monat) - **Mana Quelle S**: 47,90€/Jahr (3,99€/Monat)
- **Mana Strom**: 119,99€/Jahr (9,99€/Monat) - **Mana Quelle M**: 95,90€/Jahr (7,99€/Monat)
- **Mana See**: 239,99€/Jahr (19,99€/Monat) - **Mana Quelle L**: 191,90€/Jahr (15,99€/Monat)
- **Mana Meer**: 399,99€/Jahr (33,33€/Monat) - **Mana Quelle XL**: 383,90€/Jahr (31,99€/Monat)
- **Mana Quelle XXL**: 959,90€/Jahr (79,99€/Monat)
### Einmalkäufe (Mana-Tränke) ### Einmalkäufe (Mana-Tränke)
Für zusätzlichen Bedarf ohne Abo: Für zusätzlichen Bedarf ohne Abo:
- **Kleiner Mana Trank**: 4,99€ für 350 Mana (1,43 Cent/Mana) - **Kleiner Mana Trank**: 4,90€ für 350 Mana (1,4 Cent/Mana)
- **Mittlerer Mana Trank**: 9,99€ für 700 Mana (1,43 Cent/Mana) - **Mittlerer Mana Trank**: 9,80€ für 700 Mana (1,4 Cent/Mana)
- **Großer Mana Trank**: 19,99€ für 1.400 Mana (1,43 Cent/Mana) - **Großer Mana Trank**: 19,60€ für 1.400 Mana (1,4 Cent/Mana)
- **Riesiger Mana Trank**: 39,99€ für 2.800 Mana (1,43 Cent/Mana) - **Riesiger Mana Trank**: 39,20€ für 2.800 Mana (1,4 Cent/Mana)
## Technische Integration ## Technische Integration
@ -337,8 +341,8 @@ Spätere Features:
**Mana-Modell (50 Mitarbeiter)**: **Mana-Modell (50 Mitarbeiter)**:
1. 2x Mana Meer Abonnements (99,98€/Monat) 1. 1x Mana Quelle XXL (99,99€/Monat)
2. 10.000 Start-Mana + 400 Mana tägliche Regeneration 2. 10.000 Mana/Monat + 333 Mana tägliche Regeneration
3. Credits werden auf alle 50 Mitarbeiter verteilt 3. Credits werden auf alle 50 Mitarbeiter verteilt
4. Bei intensiven Phasen: Zusätzliche Mana-Tränke 4. Bei intensiven Phasen: Zusätzliche Mana-Tränke
@ -352,14 +356,14 @@ Spätere Features:
**Mana-Modell (15 Forscher, 1 Jahr)**: **Mana-Modell (15 Forscher, 1 Jahr)**:
1. 1x Mana See Jahresabo (239,99€) 1. 1x Mana Quelle L Jahresabo (191,90€)
2. 3.000 Start-Mana + 100 Mana täglich 2. 2.000 Mana/Monat + 67 Mana täglich
3. Alle 15 Forscher teilen sich die Credits 3. Alle 15 Forscher teilen sich die Credits
4. Perfekt für unregelmäßige Interview-Phasen 4. Perfekt für unregelmäßige Interview-Phasen
**Klassisches Lizenzmodell zum Vergleich**: **Klassisches Lizenzmodell zum Vergleich**:
- 15 Lizenzen à 9,99€/Monat = 1798,20€ für 1 Jahr - 15 Lizenzen à 9,99€/Monat = 1.798,20€ für 1 Jahr
- Viele Lizenzen bleiben ungenutzt (nicht alle forschen gleichzeitig) - Viele Lizenzen bleiben ungenutzt (nicht alle forschen gleichzeitig)
- Keine Übertragbarkeit zwischen Teammitgliedern - Keine Übertragbarkeit zwischen Teammitgliedern
@ -367,8 +371,8 @@ Spätere Features:
**Mana-Modell (20 Berater)**: **Mana-Modell (20 Berater)**:
1. 1x Mana Meer + 1x Mana See (79,98€/Monat) 1. 1x Mana Quelle XL + 1x Mana Quelle M (49,98€/Monat)
2. 8.000 Start-Mana + 300 Mana täglich 2. 5.000 Mana/Monat + 166 Mana täglich
3. Flexibel auf alle Berater verteilbar 3. Flexibel auf alle Berater verteilbar
4. Anpassbar an Projektphasen 4. Anpassbar an Projektphasen
@ -380,9 +384,9 @@ Spätere Features:
## Zusammenfassung ## Zusammenfassung
Das Mana-Creditsystem in Memoro bietet erhebliche Vorteile gegenüber klassischen Lizenzmodellen: Das Mana-Creditsystem bietet erhebliche Vorteile gegenüber klassischen Lizenzmodellen:
**Kostenersparnis**: Die Beispiele zeigen Einsparungen von 70-90% gegenüber traditionellen Seat-Lizenzen. Ein Unternehmen mit 50 Mitarbeitern zahlt nur 99,98€ statt 999,50€ monatlich. **Kostenersparnis**: Die Beispiele zeigen Einsparungen von 70-90% gegenüber traditionellen Seat-Lizenzen. Ein Unternehmen mit 50 Mitarbeitern zahlt nur 99,99€ statt 999,50€ monatlich.
**Flexibilität**: Credits können beliebig zwischen Nutzern verteilt werden - ideal für Teams mit wechselnder Zusammensetzung oder unterschiedlichen Nutzungsintensitäten. **Flexibilität**: Credits können beliebig zwischen Nutzern verteilt werden - ideal für Teams mit wechselnder Zusammensetzung oder unterschiedlichen Nutzungsintensitäten.

View file

@ -1,159 +1,195 @@
export const pricingPlans = { export const pricingPlans = {
monthly: [ monthly: [
{ {
id: 'tropfen', id: 'free',
name: 'Mana Tropfen', name: 'Mana Quelle Free',
price: 0, price: 0,
priceText: 'Kostenlos', priceText: 'Kostenlos',
startMana: 150, startMana: 50,
regeneration: 5, regeneration: 2,
storage: 150, storage: 50,
icon: '💧', icon: '💧',
popular: false, popular: false,
features: ['150 Start-Mana', '5 Mana täglich', '150 Mana Speicher', 'Basis KI-Tools'], features: ['50 Mana pro Monat', '2 Mana täglich', 'Zugang zu allen Apps', 'Basis KI-Tools'],
}, },
{ {
id: 'kleiner-stream', id: 'quelle-s',
name: 'Kleiner Stream', name: 'Mana Quelle S',
price: 5.99, price: 4.99,
priceText: '5,99€', priceText: '4,99€',
startMana: 600, startMana: 500,
regeneration: 20, regeneration: 17,
storage: 600, storage: 500,
icon: '🌊', icon: '🌊',
popular: false, popular: false,
features: ['600 Start-Mana', '20 Mana täglich', '600 Mana Speicher', 'Alle Apps verfügbar'], features: ['500 Mana pro Monat', '17 Mana täglich', 'Alle Apps verfügbar', 'E-Mail Support'],
}, },
{ {
id: 'mittlerer-stream', id: 'quelle-m',
name: 'Mittlerer Stream', name: 'Mana Quelle M',
price: 14.99, price: 9.99,
priceText: '14,99€', priceText: '9,99€',
startMana: 1500, startMana: 1000,
regeneration: 50, regeneration: 33,
storage: 1500, storage: 1000,
icon: '💫', icon: '💫',
popular: true, popular: true,
features: ['1.500 Start-Mana', '50 Mana täglich', '1.500 Mana Speicher', 'Priority Support'], features: ['1.000 Mana pro Monat', '33 Mana täglich', 'Alle AI-Modelle', 'Priority Support'],
}, },
{ {
id: 'grosser-stream', id: 'quelle-l',
name: 'Großer Stream', name: 'Mana Quelle L',
price: 29.99, price: 19.99,
priceText: '29,99€', priceText: '19,99€',
startMana: 3000, startMana: 2000,
regeneration: 100, regeneration: 67,
storage: 3000, storage: 2000,
icon: '⭐', icon: '⭐',
popular: false, popular: false,
features: ['3.000 Start-Mana', '100 Mana täglich', '3.000 Mana Speicher', 'Premium Support'], features: ['2.000 Mana pro Monat', '67 Mana täglich', 'Premium AI-Modelle', 'API-Zugang'],
}, },
{ {
id: 'riesiger-stream', id: 'quelle-xl',
name: 'Riesiger Stream', name: 'Mana Quelle XL',
price: 49.99, price: 39.99,
priceText: '49,99€', priceText: '39,99€',
startMana: 5000, startMana: 4000,
regeneration: 167, regeneration: 133,
storage: 5000, storage: 4000,
icon: '🌟', icon: '🌟',
popular: false, popular: false,
features: [ features: [
'5.000 Start-Mana', '4.000 Mana pro Monat',
'167 Mana täglich', '133 Mana täglich',
'5.000 Mana Speicher', 'Team-Features',
'Dedizierter Support',
],
},
{
id: 'quelle-xxl',
name: 'Mana Quelle XXL',
price: 99.99,
priceText: '99,99€',
startMana: 10000,
regeneration: 333,
storage: 10000,
icon: '✨',
popular: false,
features: [
'10.000 Mana pro Monat',
'333 Mana täglich',
'Enterprise Features', 'Enterprise Features',
'Custom Integrationen',
], ],
}, },
], ],
yearly: [ yearly: [
{ {
id: 'tropfen', id: 'free',
name: 'Mana Tropfen', name: 'Mana Quelle Free',
price: 0, price: 0,
priceText: 'Kostenlos', priceText: 'Kostenlos',
monthlyEquivalent: 0, monthlyEquivalent: 0,
startMana: 150, startMana: 50,
regeneration: 5, regeneration: 2,
storage: 150, storage: 50,
icon: '💧', icon: '💧',
popular: false, popular: false,
features: ['150 Start-Mana', '5 Mana täglich', '150 Mana Speicher', 'Basis KI-Tools'], features: ['50 Mana pro Monat', '2 Mana täglich', 'Zugang zu allen Apps', 'Basis KI-Tools'],
}, },
{ {
id: 'kleiner-stream', id: 'quelle-s',
name: 'Kleiner Stream', name: 'Mana Quelle S',
price: 59.9, price: 47.9,
priceText: '59,90€', priceText: '47,90€',
monthlyEquivalent: 4.99, monthlyEquivalent: 3.99,
startMana: 600, startMana: 500,
regeneration: 20, regeneration: 17,
storage: 600, storage: 500,
icon: '🌊', icon: '🌊',
popular: false, popular: false,
features: [ features: [
'600 Start-Mana', '500 Mana pro Monat',
'20 Mana täglich', '17 Mana täglich',
'600 Mana Speicher',
'Alle Apps verfügbar', 'Alle Apps verfügbar',
'✨ 2 Monate gespart', 'E-Mail Support',
'20% gespart',
], ],
}, },
{ {
id: 'mittlerer-stream', id: 'quelle-m',
name: 'Mittlerer Stream', name: 'Mana Quelle M',
price: 149.9, price: 95.9,
priceText: '149,90€', priceText: '95,90€',
monthlyEquivalent: 12.49, monthlyEquivalent: 7.99,
startMana: 1500, startMana: 1000,
regeneration: 50, regeneration: 33,
storage: 1500, storage: 1000,
icon: '💫', icon: '💫',
popular: true, popular: true,
features: [ features: [
'1.500 Start-Mana', '1.000 Mana pro Monat',
'50 Mana täglich', '33 Mana täglich',
'1.500 Mana Speicher', 'Alle AI-Modelle',
'Priority Support', 'Priority Support',
'✨ 2 Monate gespart', '20% gespart',
], ],
}, },
{ {
id: 'grosser-stream', id: 'quelle-l',
name: 'Großer Stream', name: 'Mana Quelle L',
price: 299.9, price: 191.9,
priceText: '299,90€', priceText: '191,90€',
monthlyEquivalent: 24.99, monthlyEquivalent: 15.99,
startMana: 3000, startMana: 2000,
regeneration: 100, regeneration: 67,
storage: 3000, storage: 2000,
icon: '⭐', icon: '⭐',
popular: false, popular: false,
features: [ features: [
'3.000 Start-Mana', '2.000 Mana pro Monat',
'100 Mana täglich', '67 Mana täglich',
'3.000 Mana Speicher', 'Premium AI-Modelle',
'Premium Support', 'API-Zugang',
'✨ 2 Monate gespart', '20% gespart',
], ],
}, },
{ {
id: 'riesiger-stream', id: 'quelle-xl',
name: 'Riesiger Stream', name: 'Mana Quelle XL',
price: 499.9, price: 383.9,
priceText: '499,90€', priceText: '383,90€',
monthlyEquivalent: 41.66, monthlyEquivalent: 31.99,
startMana: 5000, startMana: 4000,
regeneration: 167, regeneration: 133,
storage: 5000, storage: 4000,
icon: '🌟', icon: '🌟',
popular: false, popular: false,
features: [ features: [
'5.000 Start-Mana', '4.000 Mana pro Monat',
'167 Mana täglich', '133 Mana täglich',
'5.000 Mana Speicher', 'Team-Features',
'Dedizierter Support',
'20% gespart',
],
},
{
id: 'quelle-xxl',
name: 'Mana Quelle XXL',
price: 959.9,
priceText: '959,90€',
monthlyEquivalent: 79.99,
startMana: 10000,
regeneration: 333,
storage: 10000,
icon: '✨',
popular: false,
features: [
'10.000 Mana pro Monat',
'333 Mana täglich',
'Enterprise Features', 'Enterprise Features',
'✨ 2 Monate gespart', 'Custom Integrationen',
'20% gespart',
], ],
}, },
], ],
@ -161,38 +197,38 @@ export const pricingPlans = {
{ {
id: 'small', id: 'small',
name: 'Kleiner Mana Trank', name: 'Kleiner Mana Trank',
price: 4.99, price: 4.9,
priceText: '4,99€', priceText: '4,90€',
mana: 350, mana: 350,
icon: '🧪', icon: '🧪',
pricePerMana: 0.0143, pricePerMana: 0.014,
}, },
{ {
id: 'medium', id: 'medium',
name: 'Mittlerer Mana Trank', name: 'Mittlerer Mana Trank',
price: 9.99, price: 9.8,
priceText: '9,99€', priceText: '9,80€',
mana: 700, mana: 700,
icon: '⚗️', icon: '⚗️',
pricePerMana: 0.0143, pricePerMana: 0.014,
}, },
{ {
id: 'large', id: 'large',
name: 'Großer Mana Trank', name: 'Großer Mana Trank',
price: 19.99, price: 19.6,
priceText: '19,99€', priceText: '19,60€',
mana: 1400, mana: 1400,
icon: '🏺', icon: '🏺',
pricePerMana: 0.0143, pricePerMana: 0.014,
}, },
{ {
id: 'huge', id: 'huge',
name: 'Riesiger Mana Trank', name: 'Riesiger Mana Trank',
price: 39.99, price: 39.2,
priceText: '39,99€', priceText: '39,20€',
mana: 2800, mana: 2800,
icon: '🏛️', icon: '🏛️',
pricePerMana: 0.0143, pricePerMana: 0.014,
}, },
], ],
}; };

View file

@ -236,9 +236,9 @@ const trustBadges = [
</div> </div>
<div class="comparison-arrow">→</div> <div class="comparison-arrow">→</div>
<div class="comparison-card mana"> <div class="comparison-card mana">
<div class="comparison-label">Mana Stream</div> <div class="comparison-label">Mana Quelle M</div>
<div class="comparison-price">14,99€<span>/Monat</span></div> <div class="comparison-price">9,99€<span>/Monat</span></div>
<div class="comparison-note">750 Min (1.500 Mana)</div> <div class="comparison-note">500 Min (1.000 Mana)</div>
</div> </div>
</div> </div>
<div class="comparison-note-text"> <div class="comparison-note-text">

View file

@ -46,8 +46,8 @@ export function getManaFAQs(locale: string): FAQItem[] {
id: 'faq-mana-get', id: 'faq-mana-get',
question: isDE ? 'Wie bekomme ich Mana?' : 'How do I get Mana?', question: isDE ? 'Wie bekomme ich Mana?' : 'How do I get Mana?',
answer: isDE answer: isDE
? '<p>Es gibt drei Wege, Mana zu erhalten:</p><ul><li><strong>Free-Tier</strong>: Jeder Nutzer erhält <strong>150 Mana/Monat</strong> kostenlos</li><li><strong>Mana Stream</strong> (Abo): Monatliche Mana-Pakete von 600 bis 5.000 Mana (ab 6€/Monat, 20% Jahresrabatt)</li><li><strong>Mana Trank</strong> (Einmalkauf): Sofort-Pakete von 350 bis 2.800 Mana (ab 4,90€)</li></ul><p>Abonnenten können außerdem Mana an andere Nutzer <strong>verschenken</strong>.</p>' ? '<p>Es gibt drei Wege, Mana zu erhalten:</p><ul><li><strong>Free-Tier</strong>: Jeder Nutzer erhält <strong>50 Mana/Monat</strong> kostenlos</li><li><strong>Mana Quelle</strong> (Abo): Monatliche Mana-Pakete von 500 bis 10.000 Mana (ab 4,99€/Monat, 20% Jahresrabatt)</li><li><strong>Mana Trank</strong> (Einmalkauf): Sofort-Pakete von 350 bis 2.800 Mana (ab 4,90€)</li></ul><p>Abonnenten können außerdem Mana an andere Nutzer <strong>verschenken</strong>.</p>'
: '<p>There are three ways to get Mana:</p><ul><li><strong>Free tier</strong>: Every user receives <strong>150 Mana/month</strong> for free</li><li><strong>Mana Stream</strong> (subscription): Monthly Mana packages from 600 to 5,000 Mana (from €6/month, 20% yearly discount)</li><li><strong>Mana Potion</strong> (one-time purchase): Instant packages from 350 to 2,800 Mana (from €4.90)</li></ul><p>Subscribers can also <strong>gift</strong> Mana to other users.</p>', : '<p>There are three ways to get Mana:</p><ul><li><strong>Free tier</strong>: Every user receives <strong>50 Mana/month</strong> for free</li><li><strong>Mana Source</strong> (subscription): Monthly Mana packages from 500 to 10,000 Mana (from €4.99/month, 20% yearly discount)</li><li><strong>Mana Potion</strong> (one-time purchase): Instant packages from 350 to 2,800 Mana (from €4.90)</li></ul><p>Subscribers can also <strong>gift</strong> Mana to other users.</p>',
category: 'billing', category: 'billing',
order: 91, order: 91,
language: isDE ? 'de' : 'en', language: isDE ? 'de' : 'en',

View file

@ -72,7 +72,7 @@ export const defaultPricingTranslations: PricingTranslations = {
'Wählen Sie zwischen monatlichen Abos mit täglicher Regeneration oder einmaligen Mana-Käufen. Keine versteckten Kosten, keine Mindestlaufzeiten.', 'Wählen Sie zwischen monatlichen Abos mit täglicher Regeneration oder einmaligen Mana-Käufen. Keine versteckten Kosten, keine Mindestlaufzeiten.',
monthly: 'Monatlich', monthly: 'Monatlich',
yearly: 'Jährlich', yearly: 'Jährlich',
yearlyDiscount: '2 Monate gratis', yearlyDiscount: '20% Rabatt',
startMana: 'Start-Mana', startMana: 'Start-Mana',
regeneration: 'Regeneration', regeneration: 'Regeneration',
maxStorage: 'Max. Speicher', maxStorage: 'Max. Speicher',
@ -105,7 +105,7 @@ export const englishPricingTranslations: PricingTranslations = {
'Choose between monthly subscriptions with daily regeneration or one-time Mana purchases. No hidden costs, no minimum terms.', 'Choose between monthly subscriptions with daily regeneration or one-time Mana purchases. No hidden costs, no minimum terms.',
monthly: 'Monthly', monthly: 'Monthly',
yearly: 'Yearly', yearly: 'Yearly',
yearlyDiscount: '2 months free', yearlyDiscount: '20% off',
startMana: 'Starting Mana', startMana: 'Starting Mana',
regeneration: 'Regeneration', regeneration: 'Regeneration',
maxStorage: 'Max. Storage', maxStorage: 'Max. Storage',
@ -134,159 +134,195 @@ export const englishPricingTranslations: PricingTranslations = {
export const pricingPlans = { export const pricingPlans = {
monthly: [ monthly: [
{ {
id: 'tropfen', id: 'free',
name: 'Mana Tropfen', name: 'Mana Quelle Free',
price: 0, price: 0,
priceText: 'Kostenlos', priceText: 'Kostenlos',
startMana: 150, startMana: 50,
regeneration: 5, regeneration: 2,
storage: 150, storage: 50,
icon: '💧', icon: '💧',
popular: false, popular: false,
features: ['150 Start-Mana', '5 Mana täglich', '150 Mana Speicher', 'Basis KI-Tools'], features: ['50 Mana pro Monat', '2 Mana täglich', 'Zugang zu allen Apps', 'Basis KI-Tools'],
}, },
{ {
id: 'kleiner-stream', id: 'quelle-s',
name: 'Kleiner Stream', name: 'Mana Quelle S',
price: 5.99, price: 4.99,
priceText: '5,99€', priceText: '4,99€',
startMana: 600, startMana: 500,
regeneration: 20, regeneration: 17,
storage: 600, storage: 500,
icon: '🌊', icon: '🌊',
popular: false, popular: false,
features: ['600 Start-Mana', '20 Mana täglich', '600 Mana Speicher', 'Alle Apps verfügbar'], features: ['500 Mana pro Monat', '17 Mana täglich', 'Alle Apps verfügbar', 'E-Mail Support'],
}, },
{ {
id: 'mittlerer-stream', id: 'quelle-m',
name: 'Mittlerer Stream', name: 'Mana Quelle M',
price: 14.99, price: 9.99,
priceText: '14,99€', priceText: '9,99€',
startMana: 1500, startMana: 1000,
regeneration: 50, regeneration: 33,
storage: 1500, storage: 1000,
icon: '💫', icon: '💫',
popular: true, popular: true,
features: ['1.500 Start-Mana', '50 Mana täglich', '1.500 Mana Speicher', 'Priority Support'], features: ['1.000 Mana pro Monat', '33 Mana täglich', 'Alle AI-Modelle', 'Priority Support'],
}, },
{ {
id: 'grosser-stream', id: 'quelle-l',
name: 'Großer Stream', name: 'Mana Quelle L',
price: 29.99, price: 19.99,
priceText: '29,99€', priceText: '19,99€',
startMana: 3000, startMana: 2000,
regeneration: 100, regeneration: 67,
storage: 3000, storage: 2000,
icon: '⭐', icon: '⭐',
popular: false, popular: false,
features: ['3.000 Start-Mana', '100 Mana täglich', '3.000 Mana Speicher', 'Premium Support'], features: ['2.000 Mana pro Monat', '67 Mana täglich', 'Premium AI-Modelle', 'API-Zugang'],
}, },
{ {
id: 'riesiger-stream', id: 'quelle-xl',
name: 'Riesiger Stream', name: 'Mana Quelle XL',
price: 49.99, price: 39.99,
priceText: '49,99€', priceText: '39,99€',
startMana: 5000, startMana: 4000,
regeneration: 167, regeneration: 133,
storage: 5000, storage: 4000,
icon: '🌟', icon: '🌟',
popular: false, popular: false,
features: [ features: [
'5.000 Start-Mana', '4.000 Mana pro Monat',
'167 Mana täglich', '133 Mana täglich',
'5.000 Mana Speicher', 'Team-Features',
'Dedizierter Support',
],
},
{
id: 'quelle-xxl',
name: 'Mana Quelle XXL',
price: 99.99,
priceText: '99,99€',
startMana: 10000,
regeneration: 333,
storage: 10000,
icon: '✨',
popular: false,
features: [
'10.000 Mana pro Monat',
'333 Mana täglich',
'Enterprise Features', 'Enterprise Features',
'Custom Integrationen',
], ],
}, },
] as SubscriptionPlan[], ] as SubscriptionPlan[],
yearly: [ yearly: [
{ {
id: 'tropfen', id: 'free',
name: 'Mana Tropfen', name: 'Mana Quelle Free',
price: 0, price: 0,
priceText: 'Kostenlos', priceText: 'Kostenlos',
monthlyEquivalent: 0, monthlyEquivalent: 0,
startMana: 150, startMana: 50,
regeneration: 5, regeneration: 2,
storage: 150, storage: 50,
icon: '💧', icon: '💧',
popular: false, popular: false,
features: ['150 Start-Mana', '5 Mana täglich', '150 Mana Speicher', 'Basis KI-Tools'], features: ['50 Mana pro Monat', '2 Mana täglich', 'Zugang zu allen Apps', 'Basis KI-Tools'],
}, },
{ {
id: 'kleiner-stream', id: 'quelle-s',
name: 'Kleiner Stream', name: 'Mana Quelle S',
price: 59.9, price: 47.9,
priceText: '59,90€', priceText: '47,90€',
monthlyEquivalent: 4.99, monthlyEquivalent: 3.99,
startMana: 600, startMana: 500,
regeneration: 20, regeneration: 17,
storage: 600, storage: 500,
icon: '🌊', icon: '🌊',
popular: false, popular: false,
features: [ features: [
'600 Start-Mana', '500 Mana pro Monat',
'20 Mana täglich', '17 Mana täglich',
'600 Mana Speicher',
'Alle Apps verfügbar', 'Alle Apps verfügbar',
'✨ 2 Monate gespart', 'E-Mail Support',
'20% gespart',
], ],
}, },
{ {
id: 'mittlerer-stream', id: 'quelle-m',
name: 'Mittlerer Stream', name: 'Mana Quelle M',
price: 149.9, price: 95.9,
priceText: '149,90€', priceText: '95,90€',
monthlyEquivalent: 12.49, monthlyEquivalent: 7.99,
startMana: 1500, startMana: 1000,
regeneration: 50, regeneration: 33,
storage: 1500, storage: 1000,
icon: '💫', icon: '💫',
popular: true, popular: true,
features: [ features: [
'1.500 Start-Mana', '1.000 Mana pro Monat',
'50 Mana täglich', '33 Mana täglich',
'1.500 Mana Speicher', 'Alle AI-Modelle',
'Priority Support', 'Priority Support',
'✨ 2 Monate gespart', '20% gespart',
], ],
}, },
{ {
id: 'grosser-stream', id: 'quelle-l',
name: 'Großer Stream', name: 'Mana Quelle L',
price: 299.9, price: 191.9,
priceText: '299,90€', priceText: '191,90€',
monthlyEquivalent: 24.99, monthlyEquivalent: 15.99,
startMana: 3000, startMana: 2000,
regeneration: 100, regeneration: 67,
storage: 3000, storage: 2000,
icon: '⭐', icon: '⭐',
popular: false, popular: false,
features: [ features: [
'3.000 Start-Mana', '2.000 Mana pro Monat',
'100 Mana täglich', '67 Mana täglich',
'3.000 Mana Speicher', 'Premium AI-Modelle',
'Premium Support', 'API-Zugang',
'✨ 2 Monate gespart', '20% gespart',
], ],
}, },
{ {
id: 'riesiger-stream', id: 'quelle-xl',
name: 'Riesiger Stream', name: 'Mana Quelle XL',
price: 499.9, price: 383.9,
priceText: '499,90€', priceText: '383,90€',
monthlyEquivalent: 41.66, monthlyEquivalent: 31.99,
startMana: 5000, startMana: 4000,
regeneration: 167, regeneration: 133,
storage: 5000, storage: 4000,
icon: '🌟', icon: '🌟',
popular: false, popular: false,
features: [ features: [
'5.000 Start-Mana', '4.000 Mana pro Monat',
'167 Mana täglich', '133 Mana täglich',
'5.000 Mana Speicher', 'Team-Features',
'Dedizierter Support',
'20% gespart',
],
},
{
id: 'quelle-xxl',
name: 'Mana Quelle XXL',
price: 959.9,
priceText: '959,90€',
monthlyEquivalent: 79.99,
startMana: 10000,
regeneration: 333,
storage: 10000,
icon: '✨',
popular: false,
features: [
'10.000 Mana pro Monat',
'333 Mana täglich',
'Enterprise Features', 'Enterprise Features',
'✨ 2 Monate gespart', 'Custom Integrationen',
'20% gespart',
], ],
}, },
] as SubscriptionPlan[], ] as SubscriptionPlan[],
@ -294,38 +330,38 @@ export const pricingPlans = {
{ {
id: 'small', id: 'small',
name: 'Kleiner Mana Trank', name: 'Kleiner Mana Trank',
price: 4.99, price: 4.9,
priceText: '4,99€', priceText: '4,90€',
mana: 350, mana: 350,
icon: '🧪', icon: '🧪',
pricePerMana: 0.0143, pricePerMana: 0.014,
}, },
{ {
id: 'medium', id: 'medium',
name: 'Mittlerer Mana Trank', name: 'Mittlerer Mana Trank',
price: 9.99, price: 9.8,
priceText: '9,99€', priceText: '9,80€',
mana: 700, mana: 700,
icon: '⚗️', icon: '⚗️',
pricePerMana: 0.0143, pricePerMana: 0.014,
}, },
{ {
id: 'large', id: 'large',
name: 'Großer Mana Trank', name: 'Großer Mana Trank',
price: 19.99, price: 19.6,
priceText: '19,99€', priceText: '19,60€',
mana: 1400, mana: 1400,
icon: '🏺', icon: '🏺',
pricePerMana: 0.0143, pricePerMana: 0.014,
}, },
{ {
id: 'huge', id: 'huge',
name: 'Riesiger Mana Trank', name: 'Riesiger Mana Trank',
price: 39.99, price: 39.2,
priceText: '39,99€', priceText: '39,20€',
mana: 2800, mana: 2800,
icon: '🏛️', icon: '🏛️',
pricePerMana: 0.0143, pricePerMana: 0.014,
}, },
] as ManaPackage[], ] as ManaPackage[],
}; };

View file

@ -2,39 +2,39 @@
"subscriptions": [ "subscriptions": [
{ {
"id": "free", "id": "free",
"name": "Mana Stream Free", "name": "Mana Quelle Free",
"nameEn": "Mana Stream Free", "nameEn": "Mana Source Free",
"nameIt": "Mana Stream Free", "nameIt": "Mana Fonte Free",
"price": 0, "price": 0,
"priceUnit": "", "priceUnit": "",
"monthlyMana": 150, "monthlyMana": 50,
"canGiftMana": false, "canGiftMana": false,
"popular": false, "popular": false,
"billingCycle": "monthly", "billingCycle": "monthly",
"available": true "available": true
}, },
{ {
"id": "Mana_Stream_Small_v1", "id": "Mana_Quelle_S_v1",
"name": "Kleiner Mana Stream", "name": "Mana Quelle S",
"nameEn": "Small Mana Stream", "nameEn": "Mana Source S",
"nameIt": "Piccolo Mana Stream", "nameIt": "Mana Fonte S",
"price": 5.99, "price": 4.99,
"priceUnit": "/ Monat", "priceUnit": "/ Monat",
"monthlyMana": 600, "monthlyMana": 500,
"canGiftMana": true, "canGiftMana": true,
"popular": false, "popular": false,
"billingCycle": "monthly", "billingCycle": "monthly",
"available": true "available": true
}, },
{ {
"id": "Mana_Stream_Small_Yearly_v1", "id": "Mana_Quelle_S_Yearly_v1",
"name": "Kleiner Mana Stream", "name": "Mana Quelle S",
"nameEn": "Small Mana Stream", "nameEn": "Mana Source S",
"nameIt": "Piccolo Mana Stream", "nameIt": "Mana Fonte S",
"price": 47.99, "price": 47.9,
"priceUnit": "/ Jahr", "priceUnit": "/ Jahr",
"priceBreakdown": "(entspricht 3,99€ / Monat, 33% Rabatt)", "priceBreakdown": "(entspricht 3,99€ / Monat, 20% Rabatt)",
"monthlyMana": 600, "monthlyMana": 500,
"canGiftMana": true, "canGiftMana": true,
"popular": false, "popular": false,
"billingCycle": "yearly", "billingCycle": "yearly",
@ -42,87 +42,115 @@
"available": true "available": true
}, },
{ {
"id": "Mana_Stream_Medium_v1", "id": "Mana_Quelle_M_v1",
"name": "Mittlerer Mana Stream", "name": "Mana Quelle M",
"nameEn": "Medium Mana Stream", "nameEn": "Mana Source M",
"nameIt": "Medio Mana Stream", "nameIt": "Mana Fonte M",
"price": 14.99, "price": 9.99,
"priceUnit": "/ Monat", "priceUnit": "/ Monat",
"monthlyMana": 1500, "monthlyMana": 1000,
"canGiftMana": true,
"popular": true,
"billingCycle": "monthly",
"available": true
},
{
"id": "Mana_Quelle_M_Yearly_v1",
"name": "Mana Quelle M",
"nameEn": "Mana Source M",
"nameIt": "Mana Fonte M",
"price": 95.9,
"priceUnit": "/ Jahr",
"priceBreakdown": "(entspricht 7,99€ / Monat, 20% Rabatt)",
"monthlyMana": 1000,
"canGiftMana": true,
"popular": true,
"billingCycle": "yearly",
"monthlyEquivalent": 7.99,
"available": true
},
{
"id": "Mana_Quelle_L_v1",
"name": "Mana Quelle L",
"nameEn": "Mana Source L",
"nameIt": "Mana Fonte L",
"price": 19.99,
"priceUnit": "/ Monat",
"monthlyMana": 2000,
"canGiftMana": true, "canGiftMana": true,
"popular": false, "popular": false,
"billingCycle": "monthly", "billingCycle": "monthly",
"available": true "available": true
}, },
{ {
"id": "Mana_Stream_Medium_Yearly_v1", "id": "Mana_Quelle_L_Yearly_v1",
"name": "Mittlerer Mana Stream", "name": "Mana Quelle L",
"nameEn": "Medium Mana Stream", "nameEn": "Mana Source L",
"nameIt": "Medio Mana Stream", "nameIt": "Mana Fonte L",
"price": 119.99, "price": 191.9,
"priceUnit": "/ Jahr", "priceUnit": "/ Jahr",
"priceBreakdown": "(entspricht 9,99€ / Monat, 33% Rabatt)", "priceBreakdown": "(entspricht 15,99€ / Monat, 20% Rabatt)",
"monthlyMana": 1500, "monthlyMana": 2000,
"canGiftMana": true, "canGiftMana": true,
"popular": false, "popular": false,
"billingCycle": "yearly", "billingCycle": "yearly",
"monthlyEquivalent": 9.99, "monthlyEquivalent": 15.99,
"available": true "available": true
}, },
{ {
"id": "Mana_Stream_Large_v1", "id": "Mana_Quelle_XL_v1",
"name": "Großer Mana Stream", "name": "Mana Quelle XL",
"nameEn": "Large Mana Stream", "nameEn": "Mana Source XL",
"nameIt": "Grande Mana Stream", "nameIt": "Mana Fonte XL",
"price": 29.99, "price": 39.99,
"priceUnit": "/ Monat", "priceUnit": "/ Monat",
"monthlyMana": 3000, "monthlyMana": 4000,
"canGiftMana": true, "canGiftMana": true,
"popular": false, "popular": false,
"billingCycle": "monthly", "billingCycle": "monthly",
"available": true "available": true
}, },
{ {
"id": "Mana_Stream_Large_Yearly_v1", "id": "Mana_Quelle_XL_Yearly_v1",
"name": "Großer Mana Stream", "name": "Mana Quelle XL",
"nameEn": "Large Mana Stream", "nameEn": "Mana Source XL",
"nameIt": "Grande Mana Stream", "nameIt": "Mana Fonte XL",
"price": 239.99, "price": 383.9,
"priceUnit": "/ Jahr", "priceUnit": "/ Jahr",
"priceBreakdown": "(entspricht 19,99€ / Monat, 33% Rabatt)", "priceBreakdown": "(entspricht 31,99€ / Monat, 20% Rabatt)",
"monthlyMana": 3000, "monthlyMana": 4000,
"canGiftMana": true, "canGiftMana": true,
"popular": false, "popular": false,
"billingCycle": "yearly", "billingCycle": "yearly",
"monthlyEquivalent": 19.99, "monthlyEquivalent": 31.99,
"available": true "available": true
}, },
{ {
"id": "Mana_Stream_Giant_v1", "id": "Mana_Quelle_XXL_v1",
"name": "Riesiger Mana Stream", "name": "Mana Quelle XXL",
"nameEn": "Giant Mana Stream", "nameEn": "Mana Source XXL",
"nameIt": "Gigante Mana Stream", "nameIt": "Mana Fonte XXL",
"price": 49.99, "price": 99.99,
"priceUnit": "/ Monat", "priceUnit": "/ Monat",
"monthlyMana": 5000, "monthlyMana": 10000,
"canGiftMana": true, "canGiftMana": true,
"popular": false, "popular": false,
"billingCycle": "monthly", "billingCycle": "monthly",
"available": true "available": true
}, },
{ {
"id": "Mana_Stream_Giant_Yearly_v1", "id": "Mana_Quelle_XXL_Yearly_v1",
"name": "Riesiger Mana Stream", "name": "Mana Quelle XXL",
"nameEn": "Giant Mana Stream", "nameEn": "Mana Source XXL",
"nameIt": "Gigante Mana Stream", "nameIt": "Mana Fonte XXL",
"price": 399.99, "price": 959.9,
"priceUnit": "/ Jahr", "priceUnit": "/ Jahr",
"priceBreakdown": "(entspricht 33,33€ / Monat, 33% Rabatt)", "priceBreakdown": "(entspricht 79,99€ / Monat, 20% Rabatt)",
"monthlyMana": 5000, "monthlyMana": 10000,
"canGiftMana": true, "canGiftMana": true,
"popular": false, "popular": false,
"billingCycle": "yearly", "billingCycle": "yearly",
"monthlyEquivalent": 33.33, "monthlyEquivalent": 79.99,
"available": true "available": true
} }
], ],
@ -133,7 +161,7 @@
"nameEn": "Small Mana Potion", "nameEn": "Small Mana Potion",
"nameIt": "Piccola Pozione di Mana", "nameIt": "Piccola Pozione di Mana",
"manaAmount": 350, "manaAmount": 350,
"price": 4.99, "price": 4.9,
"popular": false "popular": false
}, },
{ {
@ -142,7 +170,7 @@
"nameEn": "Medium Mana Potion", "nameEn": "Medium Mana Potion",
"nameIt": "Media Pozione di Mana", "nameIt": "Media Pozione di Mana",
"manaAmount": 700, "manaAmount": 700,
"price": 9.99, "price": 9.8,
"popular": false "popular": false
}, },
{ {
@ -151,7 +179,7 @@
"nameEn": "Large Mana Potion", "nameEn": "Large Mana Potion",
"nameIt": "Grande Pozione di Mana", "nameIt": "Grande Pozione di Mana",
"manaAmount": 1400, "manaAmount": 1400,
"price": 19.99, "price": 19.6,
"popular": false "popular": false
}, },
{ {
@ -160,7 +188,7 @@
"nameEn": "Giant Mana Potion", "nameEn": "Giant Mana Potion",
"nameIt": "Pozione di Mana Gigante", "nameIt": "Pozione di Mana Gigante",
"manaAmount": 2800, "manaAmount": 2800,
"price": 39.99, "price": 39.2,
"popular": false "popular": false
} }
] ]

View file

@ -0,0 +1,138 @@
-- =====================================================
-- RLS POLICIES FOR GUILD POOL TABLES
-- =====================================================
-- Uses helper functions from 03-organization-rls.sql:
-- auth.is_organization_member(org_id)
-- auth.is_organization_owner_or_admin(org_id)
-- auth.is_organization_owner(org_id)
-- Enable RLS
ALTER TABLE credits.guild_pools ENABLE ROW LEVEL SECURITY;
ALTER TABLE credits.guild_spending_limits ENABLE ROW LEVEL SECURITY;
ALTER TABLE credits.guild_transactions ENABLE ROW LEVEL SECURITY;
-- =====================================================
-- GUILD POOLS TABLE POLICIES
-- =====================================================
-- Members can view their guild's pool balance
CREATE POLICY "Members can view guild pool"
ON credits.guild_pools
FOR SELECT
USING (
auth.is_organization_member(organization_id)
OR auth.role() = 'admin'
);
-- Pool is created during guild creation (by owner or system)
CREATE POLICY "Owners can create guild pool"
ON credits.guild_pools
FOR INSERT
WITH CHECK (
auth.is_organization_owner(organization_id)
OR auth.role() = 'admin'
);
-- Owners and admins can update pool (funding, spending)
CREATE POLICY "Owners and admins can update guild pool"
ON credits.guild_pools
FOR UPDATE
USING (
auth.is_organization_owner_or_admin(organization_id)
OR auth.role() = 'admin'
)
WITH CHECK (
auth.is_organization_owner_or_admin(organization_id)
OR auth.role() = 'admin'
);
-- Only owners can delete pool (cascade from org deletion)
CREATE POLICY "Owners can delete guild pool"
ON credits.guild_pools
FOR DELETE
USING (
auth.is_organization_owner(organization_id)
OR auth.role() = 'admin'
);
-- =====================================================
-- GUILD SPENDING LIMITS TABLE POLICIES
-- =====================================================
-- Members can view their own limits; owners/admins can view all
CREATE POLICY "Users can view guild spending limits"
ON credits.guild_spending_limits
FOR SELECT
USING (
user_id = auth.uid()::text
OR auth.is_organization_owner_or_admin(organization_id)
OR auth.role() = 'admin'
);
-- Only owners and admins can set spending limits
CREATE POLICY "Owners and admins can create spending limits"
ON credits.guild_spending_limits
FOR INSERT
WITH CHECK (
auth.is_organization_owner_or_admin(organization_id)
OR auth.role() = 'admin'
);
-- Only owners and admins can update spending limits
CREATE POLICY "Owners and admins can update spending limits"
ON credits.guild_spending_limits
FOR UPDATE
USING (
auth.is_organization_owner_or_admin(organization_id)
OR auth.role() = 'admin'
)
WITH CHECK (
auth.is_organization_owner_or_admin(organization_id)
OR auth.role() = 'admin'
);
-- Only owners and admins can delete spending limits
CREATE POLICY "Owners and admins can delete spending limits"
ON credits.guild_spending_limits
FOR DELETE
USING (
auth.is_organization_owner_or_admin(organization_id)
OR auth.role() = 'admin'
);
-- =====================================================
-- GUILD TRANSACTIONS TABLE POLICIES
-- =====================================================
-- Members can view their own transactions; owners/admins see all
CREATE POLICY "Users can view guild transactions"
ON credits.guild_transactions
FOR SELECT
USING (
user_id = auth.uid()::text
OR auth.is_organization_owner_or_admin(organization_id)
OR auth.role() = 'admin'
);
-- Any member can create transactions (via guild credit usage)
CREATE POLICY "Members can create guild transactions"
ON credits.guild_transactions
FOR INSERT
WITH CHECK (
auth.is_organization_member(organization_id)
OR auth.role() = 'admin'
);
-- No updates to transactions (immutable audit trail)
-- No deletes to transactions (immutable audit trail)
-- =====================================================
-- COMMENTS
-- =====================================================
COMMENT ON POLICY "Members can view guild pool" ON credits.guild_pools IS 'Guild members can see the shared pool balance';
COMMENT ON POLICY "Owners can create guild pool" ON credits.guild_pools IS 'Pool created during guild setup by owner';
COMMENT ON POLICY "Owners and admins can update guild pool" ON credits.guild_pools IS 'Pool balance updated during funding and spending';
COMMENT ON POLICY "Users can view guild spending limits" ON credits.guild_spending_limits IS 'Members see own limits, owners/admins see all';
COMMENT ON POLICY "Users can view guild transactions" ON credits.guild_transactions IS 'Members see own transactions, owners/admins see all';
COMMENT ON POLICY "Members can create guild transactions" ON credits.guild_transactions IS 'Any guild member can create transactions via credit usage';

View file

@ -11,10 +11,12 @@
* 1. Stripe products and prices are already created via MCP * 1. Stripe products and prices are already created via MCP
* 2. Set STRIPE_* environment variables with the price IDs * 2. Set STRIPE_* environment variables with the price IDs
* *
* Stripe Products (Live): * Stripe Products (Live) - "Mana Quelle" subscriptions:
* - ManaCore Plus: prod_TzNUGcq9qx9rRT (4.99/month, 49.99/year, 100 credits) * - Mana Quelle S: prod_UDzZl1uKIHplam (4.99/month, 47.90/year, 500 credits)
* - ManaCore Pro: prod_TzNUgWeBjT35qn (11.99/month, 119.99/year, 500 credits) * - Mana Quelle M: prod_UDzZXZxEVoyQMF (9.99/month, 95.90/year, 1000 credits)
* - ManaCore Ultra: prod_TzNUE5pTbTDdbp (24.99/month, 249.99/year, 2000 credits) * - Mana Quelle L: prod_UDzZcDxsDS3q1T (19.99/month, 191.90/year, 2000 credits)
* - Mana Quelle XL: prod_UDzZum6MMQkc0b (39.99/month, 383.90/year, 4000 credits)
* - Mana Quelle XXL: prod_UDzZreFcbGxdJj (99.99/month, 959.90/year, 10000 credits)
*/ */
import 'dotenv/config'; import 'dotenv/config';
@ -32,20 +34,30 @@ const STRIPE_CONFIG = {
// Free plan (no Stripe price needed) // Free plan (no Stripe price needed)
FREE_PRODUCT_ID: process.env.STRIPE_FREE_PRODUCT_ID || '', FREE_PRODUCT_ID: process.env.STRIPE_FREE_PRODUCT_ID || '',
// ManaCore Plus plan // Mana Quelle S
PLUS_PRODUCT_ID: process.env.STRIPE_PLUS_PRODUCT_ID || 'prod_TzNUGcq9qx9rRT', S_PRODUCT_ID: process.env.STRIPE_S_PRODUCT_ID || 'prod_UDzZl1uKIHplam',
PLUS_PRICE_MONTHLY: process.env.STRIPE_PLUS_PRICE_MONTHLY || 'price_1T1OkKAZjQCYS0ZJ88m0shoN', S_PRICE_MONTHLY: process.env.STRIPE_S_PRICE_MONTHLY || 'price_1TFXaKAZjQCYS0ZJGQFSxm8v',
PLUS_PRICE_YEARLY: process.env.STRIPE_PLUS_PRICE_YEARLY || 'price_1T1OkLAZjQCYS0ZJ4IdMzVyJ', S_PRICE_YEARLY: process.env.STRIPE_S_PRICE_YEARLY || 'price_1TFXaLAZjQCYS0ZJwFnGP29S',
// ManaCore Pro plan // Mana Quelle M
PRO_PRODUCT_ID: process.env.STRIPE_PRO_PRODUCT_ID || 'prod_TzNUgWeBjT35qn', M_PRODUCT_ID: process.env.STRIPE_M_PRODUCT_ID || 'prod_UDzZXZxEVoyQMF',
PRO_PRICE_MONTHLY: process.env.STRIPE_PRO_PRICE_MONTHLY || 'price_1T1OkLAZjQCYS0ZJvyPM7Wop', M_PRICE_MONTHLY: process.env.STRIPE_M_PRICE_MONTHLY || 'price_1TFXaMAZjQCYS0ZJMRmTgQvb',
PRO_PRICE_YEARLY: process.env.STRIPE_PRO_PRICE_YEARLY || 'price_1T1OkLAZjQCYS0ZJDbZeuOOu', M_PRICE_YEARLY: process.env.STRIPE_M_PRICE_YEARLY || 'price_1TFXaNAZjQCYS0ZJ6AS1vRkx',
// ManaCore Ultra plan // Mana Quelle L
ULTRA_PRODUCT_ID: process.env.STRIPE_ULTRA_PRODUCT_ID || 'prod_TzNUE5pTbTDdbp', L_PRODUCT_ID: process.env.STRIPE_L_PRODUCT_ID || 'prod_UDzZcDxsDS3q1T',
ULTRA_PRICE_MONTHLY: process.env.STRIPE_ULTRA_PRICE_MONTHLY || 'price_1T1OkMAZjQCYS0ZJYCJNZtg8', L_PRICE_MONTHLY: process.env.STRIPE_L_PRICE_MONTHLY || 'price_1TFXaNAZjQCYS0ZJaqXjJ0HC',
ULTRA_PRICE_YEARLY: process.env.STRIPE_ULTRA_PRICE_YEARLY || 'price_1T1OkMAZjQCYS0ZJvCvR6Ve6', L_PRICE_YEARLY: process.env.STRIPE_L_PRICE_YEARLY || 'price_1TFXaOAZjQCYS0ZJVndo98Pf',
// Mana Quelle XL
XL_PRODUCT_ID: process.env.STRIPE_XL_PRODUCT_ID || 'prod_UDzZum6MMQkc0b',
XL_PRICE_MONTHLY: process.env.STRIPE_XL_PRICE_MONTHLY || 'price_1TFXaPAZjQCYS0ZJ0q7OysMg',
XL_PRICE_YEARLY: process.env.STRIPE_XL_PRICE_YEARLY || 'price_1TFXaQAZjQCYS0ZJ6rDqh2FU',
// Mana Quelle XXL
XXL_PRODUCT_ID: process.env.STRIPE_XXL_PRODUCT_ID || 'prod_UDzZreFcbGxdJj',
XXL_PRICE_MONTHLY: process.env.STRIPE_XXL_PRICE_MONTHLY || 'price_1TFXaQAZjQCYS0ZJ3A6QB2sv',
XXL_PRICE_YEARLY: process.env.STRIPE_XXL_PRICE_YEARLY || 'price_1TFXaRAZjQCYS0ZJCuYSesCA',
}; };
// Plan definitions // Plan definitions
@ -72,16 +84,16 @@ const PLANS = [
sortOrder: 0, sortOrder: 0,
}, },
{ {
name: 'Plus', name: 'Mana Quelle S',
description: 'Basis-Zugang zu allen ManaCore Apps mit AI-Credits', description: '500 Mana pro Monat Basis-Zugang zu allen ManaCore Apps',
monthlyCredits: 100, monthlyCredits: 500,
priceMonthlyEuroCents: 499, // 4.99 EUR priceMonthlyEuroCents: 499, // 4.99 EUR
priceYearlyEuroCents: 4999, // 49.99 EUR (~2 months free) priceYearlyEuroCents: 4790, // 47.90 EUR (20% Rabatt)
stripePriceIdMonthly: STRIPE_CONFIG.PLUS_PRICE_MONTHLY || null, stripePriceIdMonthly: STRIPE_CONFIG.S_PRICE_MONTHLY || null,
stripePriceIdYearly: STRIPE_CONFIG.PLUS_PRICE_YEARLY || null, stripePriceIdYearly: STRIPE_CONFIG.S_PRICE_YEARLY || null,
stripeProductId: STRIPE_CONFIG.PLUS_PRODUCT_ID || null, stripeProductId: STRIPE_CONFIG.S_PRODUCT_ID || null,
features: [ features: [
'100 AI-Credits pro Monat', '500 Mana pro Monat',
'Zugang zu allen Apps', 'Zugang zu allen Apps',
'Chat & Bildgenerierung', 'Chat & Bildgenerierung',
'E-Mail Support', 'E-Mail Support',
@ -93,38 +105,76 @@ const PLANS = [
sortOrder: 1, sortOrder: 1,
}, },
{ {
name: 'Pro', name: 'Mana Quelle M',
description: 'Erweiterter Zugang mit Premium-Modellen und Priority-Support', description: '1.000 Mana pro Monat Erweiterter Zugang mit mehr AI-Power',
monthlyCredits: 500, monthlyCredits: 1000,
priceMonthlyEuroCents: 1199, // 11.99 EUR priceMonthlyEuroCents: 999, // 9.99 EUR
priceYearlyEuroCents: 11999, // 119.99 EUR (~2 months free) priceYearlyEuroCents: 9590, // 95.90 EUR (20% Rabatt)
stripePriceIdMonthly: STRIPE_CONFIG.PRO_PRICE_MONTHLY || null, stripePriceIdMonthly: STRIPE_CONFIG.M_PRICE_MONTHLY || null,
stripePriceIdYearly: STRIPE_CONFIG.PRO_PRICE_YEARLY || null, stripePriceIdYearly: STRIPE_CONFIG.M_PRICE_YEARLY || null,
stripeProductId: STRIPE_CONFIG.PRO_PRODUCT_ID || null, stripeProductId: STRIPE_CONFIG.M_PRODUCT_ID || null,
features: [ features: ['1.000 Mana pro Monat', 'Alle AI-Modelle', 'Priority-Support', 'API-Zugang'],
'500 AI-Credits pro Monat', maxTeamMembers: 3,
'Premium AI-Modelle (GPT-4, Claude)', maxOrganizations: 2,
'Priority-Support',
'API-Zugang',
'Erweiterte Exportoptionen',
],
maxTeamMembers: 5,
maxOrganizations: 3,
isDefault: false, isDefault: false,
isEnterprise: false, isEnterprise: false,
sortOrder: 2, sortOrder: 2,
}, },
{ {
name: 'Ultra', name: 'Mana Quelle L',
description: 'Maximale Power für Power-User und Teams', description: '2.000 Mana pro Monat Premium-Zugang für Power-User',
monthlyCredits: 2000, monthlyCredits: 2000,
priceMonthlyEuroCents: 2499, // 24.99 EUR priceMonthlyEuroCents: 1999, // 19.99 EUR
priceYearlyEuroCents: 24999, // 249.99 EUR (~2 months free) priceYearlyEuroCents: 19190, // 191.90 EUR (20% Rabatt)
stripePriceIdMonthly: STRIPE_CONFIG.ULTRA_PRICE_MONTHLY || null, stripePriceIdMonthly: STRIPE_CONFIG.L_PRICE_MONTHLY || null,
stripePriceIdYearly: STRIPE_CONFIG.ULTRA_PRICE_YEARLY || null, stripePriceIdYearly: STRIPE_CONFIG.L_PRICE_YEARLY || null,
stripeProductId: STRIPE_CONFIG.ULTRA_PRODUCT_ID || null, stripeProductId: STRIPE_CONFIG.L_PRODUCT_ID || null,
features: [ features: [
'2.000 AI-Credits pro Monat', '2.000 Mana pro Monat',
'Alle Premium AI-Modelle',
'Priority-Support',
'Erweiterte Exportoptionen',
'API-Zugang',
],
maxTeamMembers: 5,
maxOrganizations: 3,
isDefault: false,
isEnterprise: false,
sortOrder: 3,
},
{
name: 'Mana Quelle XL',
description: '4.000 Mana pro Monat Maximale Power für Teams und Profis',
monthlyCredits: 4000,
priceMonthlyEuroCents: 3999, // 39.99 EUR
priceYearlyEuroCents: 38390, // 383.90 EUR (20% Rabatt)
stripePriceIdMonthly: STRIPE_CONFIG.XL_PRICE_MONTHLY || null,
stripePriceIdYearly: STRIPE_CONFIG.XL_PRICE_YEARLY || null,
stripeProductId: STRIPE_CONFIG.XL_PRODUCT_ID || null,
features: [
'4.000 Mana pro Monat',
'Alle Premium AI-Modelle',
'Dedizierter Support',
'Team-Features',
'Unlimitierte API-Calls',
],
maxTeamMembers: 10,
maxOrganizations: 5,
isDefault: false,
isEnterprise: false,
sortOrder: 4,
},
{
name: 'Mana Quelle XXL',
description: '10.000 Mana pro Monat Enterprise-Power ohne Limits',
monthlyCredits: 10000,
priceMonthlyEuroCents: 9999, // 99.99 EUR
priceYearlyEuroCents: 95990, // 959.90 EUR (20% Rabatt)
stripePriceIdMonthly: STRIPE_CONFIG.XXL_PRICE_MONTHLY || null,
stripePriceIdYearly: STRIPE_CONFIG.XXL_PRICE_YEARLY || null,
stripeProductId: STRIPE_CONFIG.XXL_PRODUCT_ID || null,
features: [
'10.000 Mana pro Monat',
'Alle Premium AI-Modelle', 'Alle Premium AI-Modelle',
'Dedizierter Support', 'Dedizierter Support',
'Unlimitierte API-Calls', 'Unlimitierte API-Calls',
@ -135,7 +185,7 @@ const PLANS = [
maxOrganizations: null, // Unlimited maxOrganizations: null, // Unlimited
isDefault: false, isDefault: false,
isEnterprise: true, isEnterprise: true,
sortOrder: 3, sortOrder: 5,
}, },
]; ];
@ -189,9 +239,11 @@ async function seedPlans() {
// Info about configured Stripe products // Info about configured Stripe products
console.log('\n📦 Stripe Products configured:'); console.log('\n📦 Stripe Products configured:');
console.log(' Plus: ', STRIPE_CONFIG.PLUS_PRODUCT_ID || '(not set)'); console.log(' S: ', STRIPE_CONFIG.S_PRODUCT_ID || '(not set)');
console.log(' Pro: ', STRIPE_CONFIG.PRO_PRODUCT_ID || '(not set)'); console.log(' M: ', STRIPE_CONFIG.M_PRODUCT_ID || '(not set)');
console.log(' Ultra: ', STRIPE_CONFIG.ULTRA_PRODUCT_ID || '(not set)'); console.log(' L: ', STRIPE_CONFIG.L_PRODUCT_ID || '(not set)');
console.log(' XL: ', STRIPE_CONFIG.XL_PRODUCT_ID || '(not set)');
console.log(' XXL: ', STRIPE_CONFIG.XXL_PRODUCT_ID || '(not set)');
} catch (error) { } catch (error) {
console.error('Error seeding plans:', error); console.error('Error seeding plans:', error);
process.exit(1); process.exit(1);

View file

@ -41,9 +41,13 @@ export class GuildsController {
@Post() @Post()
@ApiOperation({ summary: 'Create a new guild' }) @ApiOperation({ summary: 'Create a new guild' })
@ApiResponse({ status: 201, description: 'Guild created with pool initialized' }) @ApiResponse({ status: 201, description: 'Guild created with pool initialized' })
async createGuild(@Headers('authorization') authorization: string, @Body() dto: CreateGuildDto) { async createGuild(
@Headers('authorization') authorization: string,
@CurrentUser() user: CurrentUserData,
@Body() dto: CreateGuildDto
) {
const token = this.extractToken(authorization); const token = this.extractToken(authorization);
return this.guildsService.createGuild(token, dto); return this.guildsService.createGuild(token, user.userId, dto);
} }
@Get() @Get()
@ -101,10 +105,11 @@ export class GuildsController {
async inviteMember( async inviteMember(
@Param('id') guildId: string, @Param('id') guildId: string,
@Headers('authorization') authorization: string, @Headers('authorization') authorization: string,
@CurrentUser() user: CurrentUserData,
@Body() dto: InviteMemberDto @Body() dto: InviteMemberDto
) { ) {
const token = this.extractToken(authorization); const token = this.extractToken(authorization);
return this.guildsService.inviteMember(guildId, dto.email, dto.role, token); return this.guildsService.inviteMember(guildId, dto.email, dto.role, user.userId, token);
} }
@Post('accept-invitation') @Post('accept-invitation')

View file

@ -1,14 +1,12 @@
import { Injectable, ForbiddenException, Logger } from '@nestjs/common'; import { Injectable, BadRequestException, ForbiddenException, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { eq, and } from 'drizzle-orm'; import { eq, and, sql } from 'drizzle-orm';
import { getDb } from '../db/connection'; import { getDb } from '../db/connection';
import { members, organizations } from '../db/schema'; import { members, organizations } from '../db/schema';
import { subscriptions, plans } from '../db/schema/subscriptions.schema';
import { BetterAuthService } from '../auth/services/better-auth.service'; import { BetterAuthService } from '../auth/services/better-auth.service';
import { GuildPoolService } from '../credits/guild-pool.service'; import { GuildPoolService } from '../credits/guild-pool.service';
import { InviteEmployeeDto } from '../auth/dto/invite-employee.dto';
import { AcceptInvitationDto } from '../auth/dto/accept-invitation.dto';
import { UpdateOrganizationDto } from '../auth/dto/update-organization.dto'; import { UpdateOrganizationDto } from '../auth/dto/update-organization.dto';
import { UpdateMemberRoleDto } from '../auth/dto/update-member-role.dto';
export class CreateGuildDto { export class CreateGuildDto {
name: string; name: string;
@ -16,6 +14,12 @@ export class CreateGuildDto {
logo?: string; logo?: string;
} }
// Default limits for users without a subscription (free tier)
const FREE_TIER_LIMITS = {
maxOrganizations: 1,
maxTeamMembers: 1, // Just themselves
};
@Injectable() @Injectable()
export class GuildsService { export class GuildsService {
private readonly logger = new Logger(GuildsService.name); private readonly logger = new Logger(GuildsService.name);
@ -32,10 +36,71 @@ export class GuildsService {
} }
/** /**
* Create a new guild (organization + pool). * Get the user's subscription plan limits.
* Checks subscription limits for maxOrganizations. * Falls back to free tier defaults if no active subscription.
*/ */
async createGuild(token: string, dto: CreateGuildDto) { private async getUserPlanLimits(userId: string) {
const db = this.getDb();
const [sub] = await db
.select({
maxTeamMembers: plans.maxTeamMembers,
maxOrganizations: plans.maxOrganizations,
})
.from(subscriptions)
.innerJoin(plans, eq(subscriptions.planId, plans.id))
.where(and(eq(subscriptions.userId, userId), eq(subscriptions.status, 'active')))
.limit(1);
return {
maxOrganizations: sub?.maxOrganizations ?? FREE_TIER_LIMITS.maxOrganizations,
maxTeamMembers: sub?.maxTeamMembers ?? FREE_TIER_LIMITS.maxTeamMembers,
};
}
/**
* Count how many guilds/organizations the user owns.
*/
private async countUserOwnedGuilds(userId: string): Promise<number> {
const db = this.getDb();
const [result] = await db
.select({ count: sql<number>`count(*)` })
.from(members)
.where(and(eq(members.userId, userId), eq(members.role, 'owner')));
return Number(result.count);
}
/**
* Count current members of a guild.
*/
private async countGuildMembers(guildId: string): Promise<number> {
const db = this.getDb();
const [result] = await db
.select({ count: sql<number>`count(*)` })
.from(members)
.where(eq(members.organizationId, guildId));
return Number(result.count);
}
/**
* Create a new guild (organization + pool).
* Enforces subscription limit for maxOrganizations.
*/
async createGuild(token: string, userId: string, dto: CreateGuildDto) {
// Check subscription limit
const limits = await this.getUserPlanLimits(userId);
const ownedGuilds = await this.countUserOwnedGuilds(userId);
if (limits.maxOrganizations !== null && ownedGuilds >= limits.maxOrganizations) {
throw new BadRequestException(
`Guild limit reached. Your plan allows ${limits.maxOrganizations} guild(s). Upgrade to create more.`
);
}
// Create organization via Better Auth // Create organization via Better Auth
const result = await this.betterAuthService.createOrganizationDirect(token, { const result = await this.betterAuthService.createOrganizationDirect(token, {
name: dto.name, name: dto.name,
@ -70,11 +135,9 @@ export class GuildsService {
async listGuilds(token: string, userId: string) { async listGuilds(token: string, userId: string) {
const result = await this.betterAuthService.listOrganizations(token); const result = await this.betterAuthService.listOrganizations(token);
const db = this.getDb();
const guilds = []; const guilds = [];
for (const org of result.organizations || []) { for (const org of result.organizations || []) {
// Get pool balance for each guild
try { try {
const pool = await this.guildPoolService.getGuildPoolBalance(org.id, userId); const pool = await this.guildPoolService.getGuildPoolBalance(org.id, userId);
guilds.push({ guilds.push({
@ -89,7 +152,6 @@ export class GuildsService {
role: (org as any).role, role: (org as any).role,
}); });
} catch { } catch {
// Pool might not exist for legacy orgs
guilds.push({ guilds.push({
gilde: { gilde: {
id: org.id, id: org.id,
@ -150,8 +212,28 @@ export class GuildsService {
/** /**
* Invite a member to the guild. * Invite a member to the guild.
* Enforces subscription limit for maxTeamMembers.
*/ */
async inviteMember(guildId: string, email: string, role: string, token: string) { async inviteMember(guildId: string, email: string, role: string, inviterUserId: string, token: string) {
// Find guild owner to check their subscription limits
const db = this.getDb();
const [owner] = await db
.select()
.from(members)
.where(and(eq(members.organizationId, guildId), eq(members.role, 'owner')))
.limit(1);
if (owner) {
const limits = await this.getUserPlanLimits(owner.userId);
const memberCount = await this.countGuildMembers(guildId);
if (limits.maxTeamMembers !== null && memberCount >= limits.maxTeamMembers) {
throw new BadRequestException(
`Member limit reached. The guild owner's plan allows ${limits.maxTeamMembers} member(s). Upgrade to invite more.`
);
}
}
return this.betterAuthService.inviteEmployee({ return this.betterAuthService.inviteEmployee({
organizationId: guildId, organizationId: guildId,
employeeEmail: email, employeeEmail: email,