Replace all marketing placeholder content with real MYeasyCMS content
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 6m12s
Workflow / ⚫️ Test (push) Has been skipped

- Logo: Replace generic Makerkit SVG with MYeasyCMS branded logo (grid icon + styled text)
- Blog: Replace 3 SaaS placeholder posts with 5 real articles (Vereinsverwaltung, SEPA, Website, DSGVO, Mitglieder-Tipps)
- Changelog: Replace 6 generic entries with real feature announcements (Verbandsverwaltung, Fischerei, Dateien, Kurse, Einladungen, i18n)
- Documentation: Rewrite all 20 docs from Makerkit references to MYeasyCMS content
- FAQ: Replace 6 generic SaaS questions with 10 real MYeasyCMS questions
- Navigation: Replace Changelog link with Contact in main nav
- Footer: Reorganize into Product/Company/Legal sections
- Translations: Update all EN marketing strings to match real Com.BISS content
This commit is contained in:
Zaid Marzguioui
2026-04-01 21:09:06 +02:00
parent bbb33aa63d
commit a5bbf42901
49 changed files with 1320 additions and 4735 deletions

View File

@@ -1,15 +1,32 @@
---
title: "Billing & Payments"
description: "Learn how to set up billing and payment processing in your MakerKit application."
title: "Tarife und Preise"
description: "Faire Preise nach Vereinsgröße — alle Funktionen inklusive."
publishedAt: 2024-04-11
order: 5
status: "published"
---
MakerKit integrates with popular payment providers to handle subscriptions and billing.
MYeasyCMS bietet faire Preise, die sich an der Größe Ihres Vereins orientieren.
This section covers:
- Setting up payment providers
- Managing subscriptions
- Handling webhooks
- Pricing plans and tiers
## Preismodell
Die Preise richten sich nach der Anzahl der verwalteten Mitglieder. Alle Module und Funktionen sind in jedem Tarif enthalten — es gibt keine kostenpflichtigen Zusatzmodule.
## Was ist inklusive?
- **Alle Module** — Mitglieder, Finanzen, Kurse, Veranstaltungen, Newsletter, Dokumente, Site-Builder
- **Unbegrenzte Benutzer** — Keine Begrenzung der Benutzeranzahl
- **Persönliche Einrichtung** — Das Com.BISS-Team richtet Ihren Account ein
- **Support** — Direkter, persönlicher Support per Telefon und E-Mail
- **Updates** — Neue Funktionen und Verbesserungen automatisch
## Testzugang
Fordern Sie einen kostenlosen Testzugang an, um MYeasyCMS unverbindlich kennenzulernen. Das Team führt Sie persönlich durch die Plattform.
## Kontakt für Preisanfragen
Für ein individuelles Angebot wenden Sie sich an:
- **Telefon:** 09451 9499-09
- **E-Mail:** info@combiss.de

View File

@@ -1,186 +1,35 @@
---
title: "Pricing Plans"
description: "How to configure and customize pricing plans for your SaaS application."
title: "Tarifübersicht"
description: "Übersicht der verfügbaren Tarife für Vereine und Verbände."
publishedAt: 2024-04-11
order: 1
status: "published"
---
> **Note:** This is mock/placeholder content for demonstration purposes.
MYeasyCMS bietet drei Tarife, die sich an der Vereinsgröße orientieren.
Configure your pricing structure to match your business model.
## Tarife
## Plan Structure
### Basis
Each pricing plan consists of:
- **ID** - Unique identifier
- **Name** - Display name
- **Price** - Amount in your currency
- **Interval** - Billing frequency (month, year)
- **Features** - List of included features
- **Limits** - Usage constraints
Für kleine Vereine mit bis zu 200 Mitgliedern. Alle Kernmodule enthalten.
## Example Configuration
### Standard
```typescript
// config/billing.config.ts
export const billingConfig = {
provider: 'stripe', // or 'paddle'
currency: 'usd',
plans: [
{
id: 'free',
name: 'Free',
description: 'Perfect for getting started',
price: 0,
features: [
'5 projects',
'Basic analytics',
'Community support',
],
limits: {
projects: 5,
members: 1,
},
},
{
id: 'starter',
name: 'Starter',
description: 'For small teams',
price: 19,
interval: 'month',
features: [
'25 projects',
'Advanced analytics',
'Email support',
'API access',
],
limits: {
projects: 25,
members: 5,
},
},
{
id: 'pro',
name: 'Professional',
description: 'For growing businesses',
price: 49,
interval: 'month',
popular: true,
features: [
'Unlimited projects',
'Advanced analytics',
'Priority support',
'API access',
'Custom integrations',
],
limits: {
projects: -1, // unlimited
members: 20,
},
},
],
};
```
Für mittelgroße Vereine und Organisationen. Alle Module inklusive erweiterter Funktionen wie Fischereiverwaltung und Sitzungsprotokolle.
## Feature Gating
### Verband
Restrict features based on subscription plan:
Für Dachverbände und Kreisverbände mit Untergliedern. Enthält die Verbandsverwaltung mit Hierarchien, vereinsübergreifender Suche und konsolidierten Berichten.
```typescript
import { hasFeature } from '~/lib/billing/features';
## Gemeinsam für alle Tarife
async function createProject() {
const subscription = await getSubscription(accountId);
- Unbegrenzte Benutzeranzahl
- Persönliche Einrichtung durch das Com.BISS-Team
- Direkter Support per Telefon und E-Mail
- Automatische Updates und neue Funktionen
- Server in Deutschland, DSGVO-konform
if (!hasFeature(subscription, 'api_access')) {
throw new Error('API access requires Pro plan');
}
## Individuelle Angebote
// Create project
}
```
## Usage Limits
Enforce usage limits per plan:
```typescript
import { checkLimit } from '~/lib/billing/limits';
async function addTeamMember() {
const canAdd = await checkLimit(accountId, 'members');
if (!canAdd) {
throw new Error('Member limit reached. Upgrade to add more members.');
}
// Add member
}
```
## Annual Billing
Offer discounted annual plans:
```typescript
{
id: 'pro-annual',
name: 'Professional Annual',
price: 470, // ~20% discount
interval: 'year',
discount: '20% off',
features: [ /* same as monthly */ ],
}
```
## Trial Periods
Configure free trial periods:
```typescript
export const trialConfig = {
enabled: true,
duration: 14, // days
plans: ['starter', 'pro'], // plans eligible for trial
requirePaymentMethod: true,
};
```
## Customizing the Pricing Page
The pricing page automatically generates from your configuration:
```tsx
import { billingConfig } from '~/config/billing.config';
export default function PricingPage() {
return (
<PricingTable
plans={billingConfig.plans}
currency={billingConfig.currency}
/>
);
}
```
## Adding Custom Features
Extend plan features with custom attributes:
```typescript
{
id: 'enterprise',
name: 'Enterprise',
price: null, // Contact for pricing
custom: true,
features: [
'Everything in Pro',
'Dedicated support',
'Custom SLA',
'On-premise deployment',
],
ctaText: 'Contact Sales',
ctaUrl: '/contact',
}
```
Für Verbände mit vielen Untergliedern oder besondere Anforderungen erstellen wir individuelle Angebote. Sprechen Sie uns an.

View File

@@ -1,143 +1,33 @@
---
title: "Billing Overview"
description: "Learn how to manage subscriptions and billing in your application."
title: "Abrechnung"
description: "Wie die Abrechnung für MYeasyCMS funktioniert — Zahlungsmodalitäten und Rechnungen."
publishedAt: 2024-04-11
order: 0
status: "published"
---
> **Note:** This is mock/placeholder content for demonstration purposes.
Die Abrechnung für MYeasyCMS ist transparent und unkompliziert.
The billing system supports subscription-based pricing with multiple tiers and payment providers.
## Zahlungsrhythmus
## Supported Providers
MYeasyCMS wird jährlich abgerechnet. Sie erhalten eine Rechnung per E-Mail mit den üblichen Zahlungsfristen.
### Stripe
Industry-standard payment processing with comprehensive features:
- Credit card payments
- Subscription management
- Invoice generation
- Tax calculation
- Customer portal
## Zahlungsmethoden
### Paddle
Merchant of record solution that handles:
- Global tax compliance
- Payment processing
- Subscription billing
- Revenue recovery
- **Überweisung** — Die gängigste Zahlungsart für Vereine
- **SEPA-Lastschrift** — Bequem und automatisch
## Subscription Tiers
## Rechnungen
Define your subscription tiers in the billing configuration:
Rechnungen werden als PDF per E-Mail zugestellt. Sie enthalten alle relevanten Angaben für die Buchhaltung des Vereins.
```typescript
export const plans = [
{
id: 'free',
name: 'Free',
price: 0,
features: ['Feature 1', 'Feature 2'],
},
{
id: 'pro',
name: 'Professional',
price: 29,
interval: 'month',
features: ['All Free features', 'Feature 3', 'Feature 4'],
},
{
id: 'enterprise',
name: 'Enterprise',
price: 99,
interval: 'month',
features: ['All Pro features', 'Feature 5', 'Priority support'],
},
];
```
## Kündigung
## Subscription Lifecycle
Die Kündigung ist zum Ende des Vertragsjahres möglich. Ihre Daten bleiben nach Vertragsende noch für einen vereinbarten Zeitraum verfügbar, damit Sie sie exportieren können.
1. **Customer selects plan** - User chooses subscription tier
2. **Payment processed** - Provider handles payment collection
3. **Webhook received** - Your app receives confirmation
4. **Subscription activated** - User gains access to features
5. **Recurring billing** - Automatic renewal each period
6. **Cancellation** - User can cancel anytime
## Fragen zur Abrechnung
## Managing Subscriptions
Bei Fragen zur Abrechnung wenden Sie sich direkt an das Com.BISS-Team:
### Creating a Subscription
```typescript
import { createCheckoutSession } from '~/lib/billing/checkout';
const session = await createCheckoutSession({
accountId: user.accountId,
planId: 'pro',
returnUrl: '/dashboard',
});
// Redirect user to payment page
redirect(session.url);
```
### Checking Subscription Status
```typescript
import { getSubscription } from '~/lib/billing/subscription';
const subscription = await getSubscription(accountId);
if (subscription.status === 'active') {
// User has active subscription
}
```
### Canceling a Subscription
```typescript
import { cancelSubscription } from '~/lib/billing/subscription';
await cancelSubscription(subscriptionId);
```
## Webhook Handling
Webhooks notify your application of billing events:
```typescript
export async function POST(request: Request) {
const signature = request.headers.get('stripe-signature');
const payload = await request.text();
const event = stripe.webhooks.constructEvent(
payload,
signature,
process.env.STRIPE_WEBHOOK_SECRET
);
switch (event.type) {
case 'customer.subscription.created':
await handleSubscriptionCreated(event.data.object);
break;
case 'customer.subscription.updated':
await handleSubscriptionUpdated(event.data.object);
break;
case 'customer.subscription.deleted':
await handleSubscriptionCanceled(event.data.object);
break;
}
return new Response('OK');
}
```
## Testing
Use test mode credentials for development:
- Test card: 4242 4242 4242 4242
- Any future expiry date
- Any CVC
All test transactions will appear in your provider's test dashboard.
- **Telefon:** 09451 9499-09
- **E-Mail:** info@combiss.de

View File

@@ -1,194 +1,33 @@
---
title: "Webhook Integration"
description: "Setting up and handling payment provider webhooks for subscription events."
title: "Schnittstellen"
description: "Schnittstellen und Exportmöglichkeiten in MYeasyCMS."
publishedAt: 2024-04-11
order: 2
status: "published"
---
> **Note:** This is mock/placeholder content for demonstration purposes.
MYeasyCMS bietet verschiedene Schnittstellen für den Datenaustausch.
Webhooks notify your application when billing events occur, ensuring your app stays synchronized with your payment provider.
## SEPA-Export
## Why Webhooks?
Die wichtigste Schnittstelle für die meisten Vereine: der Export von SEPA-Sammellastschriften als XML-Datei (pain.008) für den Bankeinzug.
Webhooks are essential for:
- **Real-time updates** - Instant notification of payment events
- **Reliability** - Handles events even if users close their browser
- **Security** - Server-to-server communication
- **Automation** - Automatic subscription status updates
## Datenimport
## Webhook Endpoint
Importieren Sie Mitgliederdaten aus Excel- oder CSV-Dateien. Der Import-Assistent unterstützt die Zuordnung der Spalten und prüft die Daten auf Vollständigkeit.
Your webhook endpoint receives events from the payment provider:
## Datenexport
```typescript
// app/api/billing/webhook/route.ts
export async function POST(request: Request) {
const body = await request.text();
const signature = request.headers.get('stripe-signature');
Exportieren Sie Ihre Daten in verschiedenen Formaten:
// Verify webhook signature
const event = stripe.webhooks.constructEvent(
body,
signature,
process.env.STRIPE_WEBHOOK_SECRET
);
- Excel (.xlsx) für Tabellenkalkulationen
- CSV für den universellen Datenaustausch
- PDF für druckfertige Berichte
// Handle the event
await handleBillingEvent(event);
## E-Mail-Versand
return new Response('OK', { status: 200 });
}
```
MYeasyCMS versendet E-Mails für Newsletter, Einladungen und Benachrichtigungen. Der Versand erfolgt über die konfigurierte E-Mail-Infrastruktur.
## Common Events
## Mitgliederportal
### Subscription Created
```typescript
case 'customer.subscription.created':
await prisma.subscription.create({
data: {
id: event.data.object.id,
accountId: event.data.object.metadata.accountId,
status: 'active',
planId: event.data.object.items.data[0].price.id,
currentPeriodEnd: new Date(event.data.object.current_period_end * 1000),
},
});
break;
```
### Subscription Updated
```typescript
case 'customer.subscription.updated':
await prisma.subscription.update({
where: { id: event.data.object.id },
data: {
status: event.data.object.status,
planId: event.data.object.items.data[0].price.id,
currentPeriodEnd: new Date(event.data.object.current_period_end * 1000),
},
});
break;
```
### Subscription Deleted
```typescript
case 'customer.subscription.deleted':
await prisma.subscription.update({
where: { id: event.data.object.id },
data: {
status: 'canceled',
canceledAt: new Date(),
},
});
break;
```
### Payment Failed
```typescript
case 'invoice.payment_failed':
const subscription = await prisma.subscription.findUnique({
where: { id: event.data.object.subscription },
});
// Send payment failure notification
await sendPaymentFailureEmail(subscription.accountId);
break;
```
## Setting Up Webhooks
### Stripe
1. **Local Development** (using Stripe CLI):
```bash
stripe listen --forward-to localhost:3000/api/billing/webhook
```
2. **Production**:
- Go to Stripe Dashboard → Developers → Webhooks
- Add endpoint: `https://yourdomain.com/api/billing/webhook`
- Select events to listen to
- Copy webhook signing secret to your `.env`
### Paddle
1. **Configure webhook URL** in Paddle dashboard
2. **Add webhook secret** to environment variables
3. **Verify webhook signature**:
```typescript
const signature = request.headers.get('paddle-signature');
const verified = paddle.webhooks.verify(body, signature);
if (!verified) {
return new Response('Invalid signature', { status: 401 });
}
```
## Security Best Practices
1. **Always verify signatures** - Prevents unauthorized requests
2. **Use HTTPS** - Encrypts webhook data in transit
3. **Validate event data** - Check for required fields
4. **Handle idempotently** - Process duplicate events safely
5. **Return 200 quickly** - Acknowledge receipt, process async
## Error Handling
```typescript
async function handleBillingEvent(event: Event) {
try {
await processEvent(event);
} catch (error) {
// Log error for debugging
console.error('Webhook error:', error);
// Store failed event for retry
await prisma.failedWebhook.create({
data: {
eventId: event.id,
type: event.type,
payload: event,
error: error.message,
},
});
// Throw to trigger provider retry
throw error;
}
}
```
## Testing Webhooks
### Using Provider's CLI Tools
```bash
# Stripe
stripe trigger customer.subscription.created
# Test specific scenarios
stripe trigger payment_intent.payment_failed
```
### Manual Testing
```bash
curl -X POST https://your-app.com/api/billing/webhook \
-H "Content-Type: application/json" \
-H "stripe-signature: test_signature" \
-d @test-event.json
```
## Monitoring
Track webhook delivery:
- Response times
- Success/failure rates
- Event processing duration
- Failed events requiring manual intervention
Most providers offer webhook monitoring dashboards showing delivery attempts and failures.
Das Portal stellt eine Schnittstelle zwischen Vereinsverwaltung und Mitgliedern dar. Mitglieder können ihre Daten einsehen und aktualisieren, ohne dass der Vorstand eingreifen muss.