Esc
 Naviguer  Ouvrir Esc Fermer
Aller au contenu

10.2 — Services spécialisés (composable backend)

🎯 Objectif : connaître les services tiers qu’on assemble pour construire un produit moderne, et savoir quels critères les choisir.

À l'issue de cet axe, tu sauras :

  • Connaître les solutions par catégorie : auth, paiement, email, search, analytics, IA, CMS
  • Choisir entre une solution complète (BaaS) et un assemblage de services
  • Évaluer un service : prix, vendor lock-in, support, sécurité
  • Mettre en place une intégration via webhook
  • Gérer les clés API et secrets correctement

Confirmé 10 min prérequis : axes 8-9 lus

Au lieu d’un BaaS unique (Firebase, Supabase) qui fait tout, tu assembles des services spécialisés. C’est la stratégie indie hacker 2026 :

Frontend (Next.js sur Vercel)
├── Auth ← Clerk
├── DB ← Supabase / Neon
├── Stripe (paiement)
├── Resend (email transactionnel)
├── PostHog (analytics produit)
├── Sentry (erreurs)
├── Algolia / Meilisearch (search)
└── OpenAI / Anthropic (IA)
  • Chaque service est best-in-class sur son domaine.
  • Free tiers cumulables → coût initial zéro.
  • Migrations partielles possibles (changer Stripe ne casse pas l’auth).
  • Multiplicité des intégrations à maintenir.
  • Webhooks qui prolifèrent.
  • Pannes : si Stripe tombe, ton paiement tombe (mais tes autres services tournent).
ServiceForces
ClerkDX excellente, UI prête, gestion organisations, standard 2026
Auth.js (NextAuth v5)Open source, multi-providers, hébergeable
Supabase AuthSi tu utilises déjà Supabase
Firebase AuthSi tu utilises déjà Firebase
WorkOSSSO enterprise (SAML), prix entreprise
StytchPasswordless, M2M
KeycloakSelf-host, Java, complexe mais open source enterprise
ServiceForces
StripeLe standard mondial — paiements, subscriptions, marketplaces, factures, fraud detection
Lemon SqueezyMerchant of Record (gère TVA mondiale pour toi) — idéal indie hackers
PaddleIdem MoR, alternative reconnue
MollieEuropéen, IBAN/Bancontact, conformité EU
AdyenEnterprise, gros volumes
ServiceForces
ResendDX excellente, MJML/JSX templates, standard 2026 pour les indies
PostmarkDélivrabilité top, prix raisonnable
SendGridVétéran, gros volumes
AWS SESSi tu es sur AWS, prix imbattable mais setup complexe
LoopsEmail marketing simple pour produits SaaS
Customer.ioEmail marketing avancé, segmentation, automation
ServiceForces
Meilisearch CloudOpen source, simple, typo-tolérant, recommandé
AlgoliaPremium, ultra-polish, cher
Typesense CloudConcurrent direct Meilisearch
OpenSearch / Elasticsearch managéSi tu as déjà Elasticsearch ou besoins avancés
ServiceForces
PostHogOpen source, complet (analytics + feature flags + A/B + replay), free tier généreux
MixpanelPremium, segmentation puissante
AmplitudeEnterprise, BI-niveau
ServiceForces
PlausibleOpen source, no-cookies, simple, recommandé 2026
FathomIdem, légèrement différent
UmamiOpen source self-host
GA4Gratuit mais usine à gaz, cookies, RGPD complexe
ServiceForces
SentryLe standard — backend + frontend, replay, performance
BugsnagConcurrent fonctionnel
HighlightPlus récent, replay-first
DatadogEnterprise observabilité complète
ServiceForces
PostHogInclus avec analytics, gratuit
LaunchDarklyPremium, enterprise
UnleashOpen source
StatsigConcurrent moderne
ServiceForces
LiveKitOpen source, self-hostable, le plus populaire
Daily.coAPI simple, intégration rapide
MuxVidéo on-demand + streaming
Zoom Video SDKAPI Zoom embarquable
ServiceForces
AnthropicClaude Sonnet/Opus — qualité et raisonnement
OpenAIGPT — large adoption
MistralEU, open source, plus economical
GroqInférence ultra-rapide
OllamaSelf-host local
ServiceForces
SanityDX top, structuré, queries GROQ
ContentfulEnterprise, mature
StrapiOpen source self-host, Node.js
PayloadOpen source moderne, TypeScript-first
DirectusOpen source, no-code admin
StoryblokVisual editor, marketing-friendly
ServiceForces
SvixOutbound webhooks managés, retry logic
HookdeckInbound, capture/replay

Beaucoup de services t’envoient des webhooks quand un événement se produit. Tu dois les recevoir et les traiter de façon fiable.

// Stripe webhook — Next.js Route Handler
import { headers } from 'next/headers';
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function POST(request: Request) {
const body = await request.text();
const signature = (await headers()).get('stripe-signature')!;
let event: Stripe.Event;
try {
event = stripe.webhooks.constructEvent(
body,
signature,
process.env.STRIPE_WEBHOOK_SECRET!
);
} catch (err) {
return Response.json({ error: 'Invalid signature' }, { status: 400 });
}
// ⚠ Traiter de façon IDEMPOTENTE — Stripe peut retry
switch (event.type) {
case 'checkout.session.completed':
await handleCheckoutComplete(event.data.object);
break;
case 'customer.subscription.updated':
await handleSubscriptionUpdate(event.data.object);
break;
}
return Response.json({ received: true });
}

Règles d’or des webhooks :

  1. Vérifier la signature (sinon n’importe qui peut t’envoyer des fake events).
  2. Idempotence : Stripe peut retry — utilise un event.id comme clé.
  3. Réponse rapide (< 5 s) : pousse en queue si traitement long, réponds 200 immédiatement.
  4. Logs : garde tous les events reçus pour le debug.

Une clé API n’a JAMAIS sa place dans ton repo Git.

.env (PAS dans Git)
.env.example (DANS Git, sans les vraies valeurs)
.gitignore : .env*.local, .env (sauf .env.example)
PlateformeOutil
Vercel / NetlifyVariables d’environnement dashboard
AWSSecrets Manager / Parameter Store
KubernetesSealed Secrets, External Secrets, Vault
Hashicorp VaultSelf-host enterprise
DopplerService tiers, sync vers tes envs
1Password Secrets AutomationSi tu utilises déjà 1Password

Distinguer clés publiques et secrètes :

CléPublic ?Exemple
Publishable / anon keyOui — ok dans le code clientSTRIPE_PUBLISHABLE_KEY=pk_..., SUPABASE_ANON_KEY
Secret / service keyNON — backend uniquementSTRIPE_SECRET_KEY=sk_..., SUPABASE_SERVICE_ROLE_KEY

Avec Next.js, le préfixe NEXT_PUBLIC_ expose au client. Sans préfixe, reste serveur.

Fenêtre de terminal
# Public (exposé au client)
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_...
NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
# Secret (jamais exposé au client)
STRIPE_SECRET_KEY=sk_...
SUPABASE_SERVICE_ROLE_KEY=eyJ...
RESEND_API_KEY=re_...
Tu intègres Stripe webhooks pour confirmer un paiement. Stripe envoie 'checkout.session.completed' deux fois (retry). Que se passe-t-il sans précaution ?
Tu commit `.env` dans Git par erreur, avec STRIPE_SECRET_KEY=sk_live_xxxx. Que faire ?
Tu vends un SaaS B2C dans 30 pays. Pour la TVA, quel service ?

Suite : 10.3 — Plateformes serverless / edge — Vercel, Cloudflare, Fly.io.