Module 7 - Monétisation et stratégies business

Transformez votre WikiJS en business rentable avec des stratégies de monétisation éprouvées

Module 7

Introduction à 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.

5-7x
ROI moyen
+85% vs formation présentielle
92%
Marge bénéficiaire
Après coûts d'hébergement
24/7
Revenus passifs
Ventes automatisées
10K€
Revenu mensuel moyen
Après 6 mois
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
Visiteurs
1000
Lecteurs engagement
850
Inscription gratuite
450
Essai premium
250
Clients payants
150

Modèles de monétisation

Stratégies de revenus diversifiées

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.

Freemium
0
Toujours gratuit
Documentation de base
5 pages maximum
Communauté publique
Support communautaire
Pas de certification
Enterprise
99
par mois
Tout Premium inclus
SSO personnalisé
Branding complet
Support dédié
Formation équipe
SLA garantie
Consulting
150
par heure
Audit personnalisé
Implémentation sur mesure
Formation équipe
Support 1-to-1
Garantie résultats
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
Revenu total mensuel estimé : 8 990€ (après 12 mois d'activité)

Intégration des systèmes de paiement

Passerelles de paiement modernes

Intégrez des solutions de paiement robustes et sécurisées pour automatiser vos ventes et offrir une expérience utilisateur fluide.

Stripe
PayPal
Solution custom
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 Stripe dans 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 de vérification des abonnements
// 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
# 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
Architecture microservices paiement
# 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: