Comment limiter les débits d'API développeurs, restreindre les emplacements d'entreprises et concevoir un portail de gestion d'extensions clair et dynamique.
À mesure qu'une plateforme SaaS mûrit, la croissance du chiffre d'affaires s'oriente vers la monétisation à l'usage et les modules d'extension payants. Deux leviers majeurs de croissance pour les plateformes B2B sont :
1. Quotas et Limitation d'API Développeurs : Monétiser le débit des requêtes API et les intégrations tierces au-delà des quotas mensuels de base.
2. Emplacements d'Entreprises Multi-Locataires : Facturer la gestion de plusieurs entités juridiques ou filiales sous un tableau de bord d'administration unique.
Voici comment nous avons développé un middleware de régulation des requêtes API, un contrôle des quotas d'entreprises et un portail tarifaire interactif destiné tant aux visiteurs qu'aux abonnés.
Pour monétiser l'utilisation de l'API sans rompre les intégrations existantes, attribuez dynamiquement des limites de débit en fonction du forfait ou des options souscrites.
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// app/Http/Middleware/MonetizedApiThrottleMiddleware.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
class MonetizedApiThrottleMiddleware
{
public function handle(Request $request, Closure $next)
{
$user = $request->user();
$rateLimitKey = 'api-user:' . $user->id;
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// Détermine le nombre maximal de requêtes par minute selon le forfait
$maxAttempts = match ($user->plan_tier) {
'enterprise' => 500,
'pro' => 120,
default => 30, class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// Forfait Gratuit / Standard
};
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// Ajoute un quota supplémentaire si l'option "API Illimitée" a été souscrite
if ($user->hasAddon('api_boost')) {
$maxAttempts += 1000;
}
if (RateLimiter::tooManyAttempts($rateLimitKey, $maxAttempts)) {
return response()->json([
'error' => 'Quota d'API dépassé. Mettez à niveau votre abonnement ou ajoutez un pack de requêtes.',
'retry_after' => RateLimiter::availableIn($rateLimitKey)
], 429);
}
RateLimiter::hit($rateLimitKey);
return $next($request);
}
}La gestion de plusieurs entreprises exige de contrôler le nombre d'emplacements autorisés lors de la création d'une nouvelle entité.
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// app/Http/Controllers/CompanyController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class CompanyController extends Controller
{
public function store(Request $request)
{
$user = $request->user();
$currentCompanyCount = $user->companies()->count();
$allowedSlots = $user->purchased_company_slots ?? 1; class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// 1 entreprise par défaut
if ($currentCompanyCount >= $allowedSlots) {
return response()->json([
'error' => 'Limite d'entreprises atteinte. Mettez à niveau votre compte pour débloquer de nouveaux emplacements.',
'code' => 'UPGRADE_REQUIRED'
], 403);
}
class=class="text-emerald-500 dark:text-emerald-400 font-medium">"text-slate-500 italic">// Création de l'entreprise...
}
}Pour offrir une clarté maximale, concevez un composant tarifaire réactif s'adaptant à deux profils :
<!-- components/PricingAddonManager.vue (Vue 3 / Composition API) -->
<template>
<div class="bg-slate-900 text-white p-8 rounded-2xl border border-slate-800">
<h2 class="text-2xl font-bold mb-4">Gestion de l'Abonnement & des Options</h2>
<!-- Option Emplacements d'Entreprises -->
<div class="flex justify-between items-center py-4 border-b border-slate-800">
<div>
<h3 class="font-semibold text-sm">Entreprises Supplémentaires</h3>
<p class="text-xs text-slate-400">Gérez plusieurs structures sous un compte unique</p>
</div>
<div class="flex items-center gap-3">
<button @click="updateCompanySlots(-1)" class="w-8 h-8 rounded-lg bg-slate-800 font-bold">-</button>
<span class="font-mono text-sm font-bold">{{ companySlots }} emplacements (15€/mois unité)</span>
<button @click="updateCompanySlots(1)" class="w-8 h-8 rounded-lg bg-blue-600 font-bold">+</button>
</div>
</div>
<!-- Option Boost API -->
<div class="flex justify-between items-center py-4">
<div>
<h3 class="font-semibold text-sm">Boost Débit API (+1 000 req/min)</h3>
<p class="text-xs text-slate-400">Pour webhooks intensifs et intégrations CRM</p>
</div>
<button
@click="toggleApiBoost"
:class="hasApiBoost ? 'bg-emerald-600' : 'bg-slate-800'"
class="px-4 py-2 rounded-xl text-xs font-bold uppercase transition-colors"
>
{{ hasApiBoost ? 'Actif (29€/mois)' : 'Ajouter au forfait' }}
</button>
</div>
</div>
</template>Monétiser le débit d'API et les emplacements d'entreprises transforme une grille tarifaire fixe en un modèle économique souple et basé sur l'usage.