Replace all marketing placeholder content with real MYeasyCMS content
- 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:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user