Module 7 - Monétisation et stratégies business
Transformez votre WikiJS en business rentable avec des stratégies de monétisation éprouvées
Module 7Introduction à la monétisation WikiJS
Ce module explore les différentes stratégies pour générer des revenus avec votre plateforme WikiJS. De l'abonnement freemium aux certificats payants, découvrez comment transformer votre expertise en business profitable et durable.
Opportunités de monétisation avec WikiJS
- Cours en ligne : Formation structurée et progressive
- Documentation premium : Contenu exclusif payant
- Consulting : Services personnalisés
- Certifications : Validation des compétences
- Communautés privées : Accès exclusif
- Templates : Ressources téléchargeables
- Support premium : Assistance prioritaire
- Licences entreprise : Solutions sur mesure
Funnel de conversion typique
Modèles de monétisation
La clé du succès réside dans la diversification des sources de revenus. Combinez plusieurs modèles pour maximiser votre rentabilité et réduire les risques.
Calcul de la rentabilité par modèle
Revenus récurrents (MRR)
- 100 clients Premium (29€) = 2 900€/mois
- 10 clients Enterprise (99€) = 990€/mois
- Total MRR = 3 890€/mois
Revenus ponctuels
- Consulting (20h/mois) = 3 000€
- Formations entreprise = 1 500€/mois
- Certifications = 600€/mois
Intégration des systèmes de paiement
Intégrez des solutions de paiement robustes et sécurisées pour automatiser vos ventes et offrir une expérience utilisateur fluide.
Intégration Stripe pour WikiJS
Configuration du compte Stripe
Créez votre compte Stripe et récupérez vos clés API. Configurez les webhooks pour la synchronisation automatique.
Installation du module de paiement
Installez et configurez le plugin WikiJS-Stripe pour gérer les abonnements et paiements ponctuels.
Configuration des produits
Définissez vos plans d'abonnement, prix et fonctionnalités dans le tableau de bord Stripe.
Intégration avec les rôles utilisateurs
Synchronisez automatiquement les statuts de paiement avec les permissions WikiJS.
# Configuration du module de paiement
payment:
stripe:
enabled: true
publishableKey: "pk_live_..."
secretKey: "sk_live_..."
webhookSecret: "whsec_..."
# Plans d'abonnement
plans:
premium:
priceId: "price_premium_monthly"
name: "Premium Monthly"
price: 29
currency: "eur"
interval: "month"
features:
- "unlimited_content"
- "premium_support"
- "certificates"
enterprise:
priceId: "price_enterprise_monthly"
name: "Enterprise Monthly"
price: 99
currency: "eur"
interval: "month"
features:
- "all_premium_features"
- "custom_sso"
- "dedicated_support"
# Configuration des webhooks
webhooks:
- "invoice.payment_succeeded"
- "invoice.payment_failed"
- "customer.subscription.updated"
- "customer.subscription.deleted"
# Essais gratuits
trialDays: 14
# Gestion des échecs de paiement
dunningSettings:
maxRetries: 3
retryInterval: 7 # jours
// Middleware pour vérifier l'abonnement actif
class SubscriptionMiddleware {
constructor(stripeService, userService) {
this.stripe = stripeService;
this.userService = userService;
}
requireActiveSubscription(plans = []) {
return async (req, res, next) => {
try {
const user = req.user;
if (!user) {
return res.status(401).json({ error: 'Authentication required' });
}
// Vérifier l'abonnement actif
const subscription = await this.getUserSubscription(user.id);
if (!subscription || subscription.status !== 'active') {
return res.status(402).json({
error: 'Active subscription required',
redirect: '/pricing'
});
}
// Vérifier le plan si spécifié
if (plans.length > 0 && !plans.includes(subscription.plan)) {
return res.status(403).json({
error: 'Upgrade required',
currentPlan: subscription.plan,
requiredPlans: plans
});
}
req.subscription = subscription;
next();
} catch (error) {
console.error('Subscription check failed:', error);
res.status(500).json({ error: 'Subscription verification failed' });
}
};
}
async getUserSubscription(userId) {
const user = await this.userService.findById(userId);
if (!user.stripeCustomerId) {
return null;
}
const subscriptions = await this.stripe.subscriptions.list({
customer: user.stripeCustomerId,
status: 'active'
});
return subscriptions.data.length > 0 ? {
id: subscriptions.data[0].id,
status: subscriptions.data[0].status,
plan: subscriptions.data[0].items.data[0].price.lookup_key,
currentPeriodEnd: new Date(subscriptions.data[0].current_period_end * 1000)
} : null;
}
// Webhook pour traiter les événements Stripe
async handleWebhook(req, res) {
const signature = req.headers['stripe-signature'];
try {
const event = this.stripe.webhooks.constructEvent(
req.body,
signature,
process.env.STRIPE_WEBHOOK_SECRET
);
switch (event.type) {
case 'invoice.payment_succeeded':
await this.handlePaymentSucceeded(event.data.object);
break;
case 'invoice.payment_failed':
await this.handlePaymentFailed(event.data.object);
break;
case 'customer.subscription.updated':
await this.handleSubscriptionUpdated(event.data.object);
break;
case 'customer.subscription.deleted':
await this.handleSubscriptionCanceled(event.data.object);
break;
}
res.json({ received: true });
} catch (error) {
console.error('Webhook error:', error);
res.status(400).send(`Webhook Error: ${error.message}`);
}
}
async handlePaymentSucceeded(invoice) {
const subscription = await this.stripe.subscriptions.retrieve(
invoice.subscription
);
const customer = await this.stripe.customers.retrieve(invoice.customer);
const user = await this.userService.findByEmail(customer.email);
if (user) {
await this.userService.updateSubscriptionStatus(user.id, {
status: 'active',
plan: subscription.items.data[0].price.lookup_key,
stripeSubscriptionId: subscription.id,
currentPeriodEnd: new Date(subscription.current_period_end * 1000)
});
}
}
}
Intégration PayPal
Avantages PayPal
- Reconnaissance mondiale : Accepté dans 200+ pays
- Trust factor : Les utilisateurs font confiance à PayPal
- Checkout express : Paiement en un clic
- Protection acheteur : Réduction des litiges
# Configuration PayPal
payment:
paypal:
enabled: true
clientId: "your-paypal-client-id"
clientSecret: "your-paypal-client-secret"
environment: "production" # ou "sandbox"
# Webhooks PayPal
webhookId: "your-webhook-id"
# Plans de facturation
billingPlans:
premium:
name: "Premium Monthly"
description: "Accès premium mensuel"
price: 29
currency: "EUR"
interval: "month"
# Configuration du checkout
checkout:
returnUrl: "https://votresite.com/payment/success"
cancelUrl: "https://votresite.com/payment/cancel"
# Gestion des abonnements
subscriptions:
autoRenewal: true
gracePeriod: 3 # jours après échec de paiement
Architecture de paiement personnalisée
Considérations importantes
- Conformité PCI DSS : Obligatoire pour traiter les cartes
- Sécurité renforcée : Chiffrement et tokenisation
- Réglementations locales : Conformité RGPD, lois locales
- Complexité technique : Expertise requise
# docker-compose.yml pour stack paiement
version: '3.8'
services:
payment-service:
build: ./payment-service
environment:
- DATABASE_URL=postgresql://user:pass@postgres:5432/payments
- REDIS_URL=redis://redis:6379
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
- PAYPAL_CLIENT_ID=${PAYPAL_CLIENT_ID}
depends_on:
- postgres
- redis
ports:
- "3001:3000"
subscription-service:
build: ./subscription-service
environment:
- DATABASE_URL=postgresql://user:pass@postgres:5432/subscriptions
- PAYMENT_SERVICE_URL=http://payment-service:3000
depends_on:
- postgres
- payment-service
ports:
- "3002:3000"
notification-service:
build: ./notification-service
environment:
- REDIS_URL=redis://redis:6379
- EMAIL_SERVICE_API_KEY=${EMAIL_API_KEY}
depends_on:
- redis
ports:
- "3003:3000"
postgres:
image: postgres:15
environment:
- POSTGRES_DB=payments
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data: