Paiement pour solo founder : Stripe, Paddle, Lemon Squeezy ou WeChat Pay ?

"Paddle : accorder l'accès et gérer l'état des abonnements avec les webhooks"
Avertissement : ce texte ne constitue pas un conseil fiscal, juridique, de création de société, de change ou d’éligibilité. Pour le Merchant of Record, la VAT/GST/sales tax, les structures nationales ou étrangères et les versements, consultez les conditions des services et des professionnels qualifiés.
Votre pricing.ts définit starter_monthly, pro_yearly, lifetime_license et wechat_one_time, mais la base ne possède qu’un champ is_paid. Le webhook checkout.session.completed arrive et le client revient par success_url, pourtant entitlements reste vide. Le problème ne vient pas du bouton de paiement : produits, commandes, abonnements et droits ne sont pas reliés.
Avant de choisir un service, il faut répondre à cinq questions : que vendre, comment facturer, à qui vendre, qui porte la transaction et les taxes de vente, et qui accorde l’accès après paiement ? Stripe, Paddle, Lemon Squeezy et WeChat Pay ne sont pas quatre boutons équivalents. Leurs responsabilités se situent à des niveaux différents.
Définir le modèle de vente avant le service de paiement
Un achat unique repose sur la commande et la livraison. Un abonnement SaaS implique tout le billing lifecycle. La facturation à l’usage exige aussi des données d’utilisation traçables. Modélisez d’abord ces choix dans products, prices et les tables locales.
| Modèle de vente | Points de départ à évaluer | Événements asynchrones clés | Tables locales principales |
|---|---|---|---|
| Produit numérique en achat unique | Stripe / Paddle / Lemon Squeezy | checkout.session.completed / transaction.completed / order_created | orders + entitlements |
| Abonnement SaaS | Stripe Billing / Paddle Billing / Lemon Squeezy | customer.subscription.* / subscription.* | subscriptions + entitlements + usage_events si nécessaire |
| Mixte, abonnement et achat unique | Stripe Billing / Paddle Billing | Plusieurs événements | orders + subscriptions + entitlements |
| Chine continentale ou écosystème WeChat | WeChat Pay (JSAPI/H5/Native) | Callback de paiement et résultat de requête | orders + wechat_prepay |
Trois points comptent :
- Un produit unique demande surtout commande, livraison, remboursement et renvoi, sans cycle d’abonnement complet.
- Un SaaS récurrent a besoin d’une table
subscriptionsaveccurrent_period_start/end,cancel_atetstatus. La consommation impose desusage_eventsauditables. - WeChat Pay est un moyen de paiement et un système marchand, pas un Merchant of Record mondial ni une plateforme de SaaS billing.
Les capacités de Stripe Billing, Paddle Billing et WeChat Pay évoluent. Avant l’intégration, revérifiez région du compte, mode produit, moyens de paiement, version d’API et conditions.
Un Merchant of Record ne supprime pas toutes les responsabilités
Le Merchant of Record, ou MoR, est le vendeur officiel d’une transaction. Paddle et Lemon Squeezy utilisent ce modèle pour les produits numériques éligibles et gèrent dans ce cadre paiement, taxes de vente, remboursements ou litiges. Cela réduit le travail fiscal et opérationnel mondial, sans supprimer les obligations relatives à l’impôt sur le revenu, à la structure, à la conformité produit, aux données et à la comptabilité.
Avec Stripe, le marchand reste généralement vendeur officiel. Stripe Tax aide à calculer sales tax, VAT et GST et propose des outils de surveillance et d’enregistrement, mais ne transforme pas automatiquement Stripe en Merchant of Record. Enregistrement, déclaration et responsabilité dépendent du territoire et de la transaction.
Ne choisissez pas un MoR selon un seuil de revenus fixe. Comparez plutôt ces dimensions :
| Dimension | Stack de paiement et billing gérée en interne | Merchant of Record |
|---|---|---|
| Personnalisation | Combiner Checkout, Billing, Tax, factures et processus internes | Respecter politique produit, checkout, contrat et règles de versement de la plateforme |
| Fiscalité et facturation | Le marchand confirme enregistrement, déclaration, factures, remboursements et litiges | Le MoR prend en charge taxes de vente, paiement et certaines tâches de conformité des transactions couvertes |
| Coût | Ajouter aux frais de paiement outils fiscaux, développement, finance et support | Examiner versements, remboursements, suppléments et limites, pas seulement le pourcentage |
| Cas adapté | Forte personnalisation, opérations existantes ou contrats particuliers | Réduire le travail de taxes mondiales et d’abonnements pour un produit éligible |
La limite contractuelle et fiscale dépend de la structure, du territoire, du produit et du client. Une page marketing présente un positionnement ; elle ne remplace ni les conditions ni un avis professionnel.
Choisir Stripe, Paddle, Lemon Squeezy ou WeChat Pay
Si vous voulez des abonnements et WeChat Pay, séparez d’abord les problèmes. Cycle d’abonnement, paiements mondiaux et paiement en Chine continentale peuvent utiliser des services différents. La présence d’un moyen de paiement ne garantit pas chaque région de compte, mode Checkout ou paiement récurrent.
| Service | Modèle de responsabilité | Abonnements et achats uniques | Paiements en Chine | Licence native | Bon point de départ |
|---|---|---|---|---|---|
| Stripe | Outils Payment, Billing et Tax ; généralement pas MoR | Checkout et Billing très personnalisables | Alipay/WeChat Pay selon région, devise et mode produit | Pas de License Key général | SaaS qui veut contrôler paiement, abonnement, outils fiscaux et processus internes |
| Paddle | Merchant of Record | Paddle Billing et Checkout | Vérifier Dashboard et documentation selon compte et région | L’application gère les droits | Logiciel qui veut réduire taxes mondiales et opérations d’abonnement |
| Lemon Squeezy | Merchant of Record | Produits numériques, abonnements simples et consommation | Alipay/WeChat Pay possibles en achat unique ; abonnement plus limité | License Keys | Produits numériques, licences et premiers abonnements |
| WeChat Pay | Moyen de paiement et système marchand | JSAPI/H5/Native ; cycle de billing à construire | Chine continentale et WeChat | Aucune | Achats uniques en RMB et paiement WeChat |
Les documents officiels confirmaient au 18 juillet 2026 :
- Stripe Checkout propose page hébergée, page intégrée et composants combinables. Les moyens disponibles dépendent de la région, de la devise et du mode Checkout.
- Les webhooks Paddle sont livrés au moins une fois. Sans réponse
200en cinq secondes, Paddle réessaie. Les événements peuvent être dupliqués ou désordonnés ; utilisezevent_idpour dédupliquer etoccurred_atpour l’ordre. - Lemon Squeezy liste Cards, PayPal, Apple Pay, Google Pay, Alipay, WeChat Pay, Cash App Pay et bank debits. Les abonnements n’acceptent actuellement que Cards, Apple Pay, Google Pay et PayPal.
- Le flux H5 de WeChat Pay exige création de commande côté serveur, callback et requête active de statut. Le retour navigateur n’est pas une preuve suffisante.
Frais, moyens, cycles de versement, pays et politiques évoluent. Pour le budget final, ouvrez les pages de prix et les contrats du jour plutôt que de recopier un ancien pourcentage.
Le webhook est la frontière de synchronisation des droits
Deux échecs fréquents :
checkout.session.completedarrive etsuccess_urlest visité, maisentitlementsn’est pas mis à jour et le client payant reste bloqué.- Le même événement entre deux fois dans
webhook_eventset le handler émet deux licences.
Ces erreurs viennent du fait qu’une requête HTTP ou une page de succès est traitée comme vérité métier finale. Les événements peuvent être dupliqués, retardés ou désordonnés. Certains états exigent aussi une requête ou un événement ultérieur.
Principes de conception d’un endpoint webhook
| Principe | Stripe | Paddle | Lemon Squeezy | WeChat Pay |
|---|---|---|---|---|
| HTTPS endpoint | Obligatoire | Obligatoire | Obligatoire | Obligatoire |
| Vérification de signature | Stripe-Signature | Paddle-Signature | X-Signature | Signature WeChat Pay API v3 |
| Clé d’idempotence | ID d’événement ou d’objet métier | event_id | Type d’événement + ID d’objet ou clé unique | out_trade_no et ID de transaction |
| Réponse | Vérifier et stocker, répondre vite, puis traiter en asynchrone | Retourner 200 en cinq secondes | Répondre avec succès puis traiter en asynchrone | Suivre le contrat API actuel |
| Compensation | Interroger paiement ou abonnement | Interroger les entités et réconcilier | Interroger commande ou abonnement | Interroger, rapprocher les relevés et réparer manuellement |
Les règles d’exploitation sont simples :
- Le webhook ou callback est l’entrée de synchronisation.
success_urlaffiche le traitement sans accorder les droits. - Vérifiez d’abord la signature, puis stockez l’événement brut ou les champs requis dans
webhook_events. Déplacez le travail complexe vers un job asynchrone. - Une contrainte unique assure l’idempotence. Enregistrez
event_id,source,occurred_at,processed_at,statusetpayload_hash. - Pour l’ordre, comparez heure de l’événement, mise à jour de l’objet ou version d’état, jamais uniquement l’heure d’arrivée.
- Exécutez régulièrement une reconciliation, interrogez commande ou abonnement et conservez une reprise manuelle.
Tables de commandes, abonnements, droits et événements
| Table | Champs principaux | Mapping Stripe | Mapping Paddle | Mapping Lemon Squeezy |
|---|---|---|---|---|
orders | provider_order_id, customer_id, amount, currency, status, created_at | Checkout Session / PaymentIntent | transaction | order |
subscriptions | provider_subscription_id, customer_id, status, current_period_end, cancel_at | subscription | subscription | subscription |
entitlements | user_id, product_id, feature_key, source, status, expires_at | Dérivé de order ou subscription | Dérivé de transaction ou subscription | Dérivé de order, subscription ou license |
webhook_events | provider, event_id, occurred_at, processed_at, status, payload_hash | Idempotence et audit | Idempotence et ordre | Idempotence et audit |
Ne copiez pas tous les objets d’une API dans les tables locales. Définissez les champs stables nécessaires au contrôle d’accès, puis conservez les ID fournisseur pour requêtes et reconciliation.
Stratégies de synchronisation des droits
| Stratégie | Usage | Mise en œuvre |
|---|---|---|
| Lean cache | La plupart des SaaS récurrents | Stocker seulement customer, subscription, status, price et product nécessaires à l’accès, puis mettre à jour par événement |
| State mirror | Vues de facturation hors ligne ou opérations complexes | Répliquer davantage de données, enregistrer l’heure de mise à jour et éviter les écarts par reconciliation |
| License key | Produit numérique unique ou logiciel desktop | Stocker l’instance ID après activation et vérifier store, product, variant et customer ; une clé n’est pas un système utilisateur complet |
La documentation officielle de provisioning Paddle recommande un lean cache pour la plupart des applications. Passez au state mirror seulement si des requêtes locales plus riches sont nécessaires. Les clés Lemon Squeezy exigent aussi de valider produit et client côté application et de relier l’instance au modèle de compte et d’appareil.
Points d’intégration propres à chaque service
Ces points définissent une première limite de mise en œuvre sans remplacer la documentation complète des services.
Intégrer Stripe
Un jeune SaaS peut commencer par Checkout hébergé et Customer Portal plutôt que maintenir un formulaire de carte. Stripe Billing gère abonnements, factures, facturation à l’usage et revenue recovery. Stripe Tax est un outil de calcul et de processus fiscal, pas un Merchant of Record.
Produits et prix doivent correspondre aux droits locaux : product_id représente le produit ou paquet d’accès, price_id le tarif mensuel, annuel, par seat ou usage. Ne laissez pas seulement is_paid sur users.
Le tutoriel Next.js de panier et paiement Stripe présente Checkout Session, endpoint webhook et traitement de commande.
Intégrer Paddle
Vérifiez qu’un tutoriel vise Paddle Billing et non Paddle Classic. Leurs API, webhooks, Paddle.js et modèles Product/Price diffèrent.
Paddle Checkout affiche la caisse, mais l’application reste responsable du provisioning. La plupart n’ont besoin que de customer, subscription, status, price, product et scheduled change pour décider l’accès. Créez un state mirror seulement si les opérations exigent les données complètes.
Dans les deux cas, mettez le cache à jour par webhook et lancez une reconciliation. Un Merchant of Record ne dit pas automatiquement à l’application qui peut utiliser quelle fonction.
Intégrer Lemon Squeezy
Lemon Squeezy est un point de départ pour produits numériques, licences et abonnements assez simples. Il fournit Merchant of Record, checkout, abonnements, usage-based billing, webhooks et License Keys. Vérifiez frais et portée dans le store plan et la documentation actuels.
Après activation, stockez l’instance ID et vérifiez store_id, product_id, variant_id et customer. Une clé d’un autre produit ou revendue ne doit pas donner directement le droit Pro.
Pour un abonnement WeChat Pay, vérifiez séparément les moyens récurrents. La documentation liste WeChat Pay et Alipay, mais les abonnements n’acceptent que Cards, Apple Pay, Google Pay et PayPal.
Limites de WeChat Pay
WeChat Pay convient aux paiements en Chine continentale et dans WeChat, mais n’est ni un Merchant of Record mondial ni un cycle de SaaS billing complet. Le marchand doit gérer état de commande, signature du callback, requêtes, remboursements, reconciliation, factures et droits.
H5, JSAPI, Mini Program et Native sont des scénarios de paiement, pas des systèmes d’abonnement. En H5, le backend crée la commande et transmet h5_url au frontend. Après le retour du navigateur, il interroge encore la commande et applique le callback à celle identifiée par out_trade_no.
Vérifiez droits produit, entité marchande, domaines, frais et paramètres API dans la documentation marchande WeChat Pay actuelle.
Étape suivante : transformer le bouton en machine à états testable
Après le choix des services, découpez l’intégration en tâches vérifiables :
- Créez
orders,subscriptions,entitlementsetwebhook_events, puisusage_eventspour la consommation. - Implémentez signature, idempotence, désordre, réponse rapide et reprise pour chaque webhook ou callback.
- Faites interroger l’état local par la page de succès au lieu d’écrire
is_paid=true. - Ajoutez des tests de requête, reconciliation, remboursement, renouvellement échoué et reprise manuelle.
- Dans la sandbox, renvoyez les événements et inversez les mises à jour. Les droits ne doivent être ni doublés ni annulés à tort.
Pour l’hébergement backend et la base de données, poursuivez avec le guide pratique Supabase Edge Functions et les articles backend et base de données de cette série. La fin n’est pas le retour réussi de la page de paiement : commandes, abonnements et droits doivent converger vers le bon état malgré doublons, retards, désordre et remboursements.
Choisir et mettre en œuvre une stack de paiement en solo
Partez du modèle de vente, des responsabilités et du marché cible pour choisir les services et construire une synchronisation des droits auditable.
⏱️ Estimated time: 45 min
- 1
Step 1: Définir le modèle de vente
Précisez achat unique, abonnement SaaS, facturation à l'usage ou modèle hybride, puis documentez remboursement, renouvellement, montée et baisse de gamme et fin d'accès. - 2
Step 2: Répartir les responsabilités fiscales et opérationnelles
Décidez de combiner vous-même paiement, billing et Tax ou de choisir un Merchant of Record. Vérifiez les questions de structure juridique et de fiscalité dans les conditions du service et auprès de professionnels. - 3
Step 3: Choisir les moyens de paiement par marché
Évaluez Stripe, Paddle et Lemon Squeezy pour les cartes et abonnements mondiaux. Étudiez WeChat Pay pour les achats uniques en Chine continentale ou dans WeChat, en vérifiant région du compte, catégorie de produit et éligibilité. - 4
Step 4: Créer le modèle d'état local
Créez orders, subscriptions, entitlements et webhook_events. Des identifiants d'événement ou de commande uniques garantissent idempotence et audit. - 5
Step 5: Tester la synchronisation asynchrone des droits
Testez signature, doublons, ordre inversé, délais, remboursements, échecs de renouvellement et reprise manuelle. La page de succès affiche l'état sans accorder l'accès.
FAQ
Quelle est la différence principale entre Stripe, Paddle et Lemon Squeezy ?
Faut-il commencer avec un Merchant of Record ou Stripe ?
Paddle ou Lemon Squeezy activent-ils automatiquement l'accès au SaaS ?
Le support de WeChat Pay par Lemon Squeezy permet-il un abonnement WeChat Pay ?
WeChat Pay peut-il remplacer Stripe pour un SaaS mondial ?
Comment traiter des webhooks en double, désordonnés ou manquants ?
Quelles tables faut-il pour un système de paiement minimal ?
11 min de lecture · Publié le: 21 oct. 2026
Guide de stack technique pour solo founder
Si vous arrivez depuis la recherche, le plus rapide est de passer à l’article précédent ou suivant de cette série.
Précédent
Choisir sa base de données en solo : D1, Postgres, R2, S3 ou SQLite
Classez données métier, événements, fichiers, caches et sauvegardes, puis choisissez D1, Postgres, R2, S3 ou SQLite selon les coûts et les signaux de migration.
Partie 8 sur 9
Suivant
C’est le dernier article publié dans cette série pour le moment.



Commentaires
Connectez-vous avec GitHub pour laisser un commentaire