Aller au contenu principal
Retour au blog
Outils

Stripe Billing pour SaaS B2B : le guide complet 2026

Stripe Billing est devenu le standard de fait pour les SaaS B2B. Plans, trials, prorata, dunning, factures auto : tout ce qu'il faut savoir pour intégrer proprement, par une agence qui en code 2-3 par an.

16 min918 mots

Si vous lancez un SaaS B2B en 2026, vous allez utiliser Stripe Billing. C'est devenu le standard de fait pour la facturation récurrente : Notion, Linear, Vercel, Resend, Plausible — tous l'utilisent. Cet article couvre tout ce qu'il faut savoir pour intégrer proprement Stripe Billing dans votre SaaS, après plusieurs intégrations clients chez Krealabs. Code, webhooks, gestion des cas limites, dunning, factures conformes. Long et technique mais c'est pour ne plus chercher 20 articles sur Stack Overflow.

01Stripe Billing : qu'est-ce qu'on obtient (et ne pas)

Stripe Billing = brique facturation récurrente au-dessus de Stripe Payments. Ce que vous obtenez : création de plans tarifaires (Products + Prices), gestion d'abonnements (Subscriptions), trials, upgrades/downgrades avec prorata automatique, dunning (relance automatique en cas d'échec de paiement), Customer Portal hébergé par Stripe pour gérer son abonnement, factures HTML/PDF générées automatiquement avec mentions légales FR. Ce que vous N'obtenez PAS : pas de gestion de l'usage metering complexe (chargement à la consommation = à coder soi-même), pas de gestion fine des coupons inter-pays, pas de comptabilité analytique avancée.

02Setup initial : Products, Prices, et leur structure

La hiérarchie Stripe Billing : un Product est un plan tarifaire (ex: "Starter", "Pro", "Enterprise"), un Price est une variante de prix attachée à un Product (mensuel vs annuel, par utilisateur vs flat). On définit tout dans le Dashboard Stripe OU via l'API. Notre recommandation pour les SaaS naissants : 3 Products max (Free / Pro / Business), 2 Prices chacun (mensuel / annuel avec ~17% de remise). Au-delà de 3 plans, vous compliquez l'UX d'inscription pour rien. Utiliser `lookup_key` sur les Prices pour pouvoir les récupérer programmatiquement sans hardcoder les IDs (`price_xxx`) dans le code.

// Récupérer un Price par lookup_key (plus stable qu'un ID hardcodé)
const prices = await stripe.prices.list({
  lookup_keys: ['pro_monthly', 'pro_yearly'],
  expand: ['data.product'],
});

03Checkout flow : Stripe Checkout vs Embedded

Deux options pour l'inscription payante : (1) **Stripe Checkout** : redirection vers une page hébergée par Stripe, ultra-simple à intégrer (3 lignes de code), gère 3D Secure / Apple Pay / Google Pay nativement, hautement convertissant. Notre choix par défaut pour 80% des SaaS. (2) **Embedded Checkout** ou **Payment Element** : formulaire intégré dans votre interface, contrôle UX total. À utiliser quand vous voulez une expérience 100% sur votre domaine ou des champs custom (entreprise, SIRET pour facturation FR). Compter +3-5 jours de dev en plus.

// Stripe Checkout - flow le plus simple
const session = await stripe.checkout.sessions.create({
  mode: 'subscription',
  payment_method_types: ['card'],
  line_items: [{ price: priceId, quantity: 1 }],
  customer_email: user.email,
  success_url: `${origin}/dashboard?welcome=true`,
  cancel_url: `${origin}/pricing`,
  // Pour les SaaS FR : capturer adresse pour factures
  customer_creation: 'always',
  billing_address_collection: 'required',
});
return Response.redirect(session.url, 303);

04Webhooks : la partie qu'on ne peut pas brûler

Stripe envoie des webhooks à votre app pour chaque événement (`customer.subscription.created`, `invoice.payment_failed`, `subscription.deleted`...). Sans webhook handler, votre base de données ne sait pas qu'un user a payé, annulé, ou été dunné. Les événements critiques à gérer : `checkout.session.completed` (création abonnement post-paiement), `invoice.payment_succeeded` (renouvellement OK, prolonger l'accès), `invoice.payment_failed` (paiement échoué, downgrade graceful), `customer.subscription.deleted` (annulation, supprimer accès). Sécuriser le webhook avec la signature HMAC envoyée par Stripe — sinon n'importe qui peut spoofer.

// Validation signature webhook (Next.js Route Handler)
export async function POST(req: Request) {
  const sig = req.headers.get('stripe-signature')!;
  const body = await req.text();
  let event: Stripe.Event;
  try {
    event = stripe.webhooks.constructEvent(body, sig, process.env.STRIPE_WEBHOOK_SECRET!);
  } catch (err) {
    return new Response('Bad signature', { status: 400 });
  }
  switch (event.type) {
    case 'checkout.session.completed':
      await handleCheckoutComplete(event.data.object);
      break;
    case 'invoice.payment_failed':
      await handlePaymentFailed(event.data.object);
      break;
    // ... autres handlers
  }
  return new Response(null, { status: 200 });
}

05Gestion des cas limites : trials, upgrades, prorata

**Trials** : créer la subscription avec `trial_period_days: 14`. Stripe ne charge pas pendant la période ; à J+14, premier paiement automatique. Si la carte fail → événement `invoice.payment_failed`. **Upgrades/downgrades** : avec `proration_behavior: 'create_prorations'`, Stripe calcule automatiquement le crédit/débit prorata. Le user en cours de mois qui upgrade Pro → Business paie immédiatement la différence prorata pour le reste du mois. **Annulation** : `cancel_at_period_end: true` (recommandé) laisse l'accès jusqu'à la fin du cycle payé. `cancel_at_period_end: false` coupe immédiatement et émet un remboursement prorata.

06Customer Portal : ne réinventez pas ce qui existe

Stripe propose un Customer Portal hébergé : page où vos clients gèrent leur abonnement (changer de plan, mettre à jour CB, télécharger factures, annuler). Vous n'avez QUE besoin de leur fournir un lien — Stripe gère tout, conformément aux régulations (RGPD, droit consommateur, conformité FR). Notre recommandation : 100% des SaaS Krealabs utilisent le Customer Portal au lieu de coder une UI custom. Configurer dans Dashboard Stripe : quels plans sont upgradeables, autoriser ou non l'annulation immédiate, mentions légales custom.

// Génère un lien Customer Portal pour un user connecté
const session = await stripe.billingPortal.sessions.create({
  customer: user.stripeCustomerId,
  return_url: `${origin}/dashboard/billing`,
});
return Response.redirect(session.url);

07Conformité FR : TVA, factures, mentions légales

Pour un SaaS facturant en France ou EU : (1) Activer **Stripe Tax** (0.5% sur les transactions taxées) qui calcule TVA automatiquement selon pays + type client (B2C, B2B avec VAT EU). Sans Stripe Tax, vous devez gérer la TVA manuellement — déconseillé au-delà de 50 clients. (2) Factures Stripe ont mentions légales auto-générées : votre raison sociale, SIRET, TVA intracom + celles du client. Activer dans Settings > Tax. (3) Pour B2B EU : `tax_id_data` sur le Customer pour qu'il rentre son VAT, Stripe applique le mécanisme d'autoliquidation automatiquement.

En résumé

Stripe Billing est devenu indispensable pour un SaaS B2B sérieux. Compter 3-5 jours de dev pour une intégration MVP propre (checkout + webhooks + Customer Portal + Stripe Tax), 1-2 semaines pour une intégration premium avec custom invoicing, multi-currency, et metering. Sur les SaaS Krealabs, c'est la première brique qu'on met en place après l'auth — sans monétisation, pas de SaaS. Pour intégrer Stripe Billing sur votre projet, contactez-nous. Voir aussi notre comparateur Stripe vs PayPal, notre lexique sur Stripe, et nos services développement web.

Stripe Billing
SaaS B2B
Abonnements
Paiement en ligne
Stripe
Facturation
Maxime Dubois

Écrit par

Maxime Dubois

Fondateur · Krealabs

Découvrir l'équipe

À propos de cet article

Rédigé par

Maxime Dubois

Fondateur · Krealabs

Méthodologie

Rédigé à partir de notre travail d'agence et de la documentation officielle des outils cités. Pas d'IA générative pour le fond éditorial.

Publié le
Parlons projet

Un sujet à creuser ensemble ?

Si cet article t'a parlé et que tu as un projet en cours (ou naissant), écris-nous — premier échange offert.