Autres blogs
J'ai donc construit ce petit SaaS appelé GrandpaCAD. L'idée est simple : mon grand-père adore l'impression 3D mais déteste les logiciels de modélisation complexes. Avec GrandpaCAD, tu décris simplement ce que tu veux, et une IA génère un modèle 3D. Simple.
Pour facturer ça, j'avais besoin d'abonnements plus une facturation à l'usage pour les crédits AI. Facile, non ? Faux.
Tout le monde me pose cette question. Écoute, je viens de Slovénie. Ici, chaque facture doit être "vérifiée fiscalement". Ça veut dire s'intégrer avec une API gouvernementale documentée dans un PDF de 119 pages. Non, je rigole pas. C'est un cauchemar bureaucratique de certificats, de signatures personnalisées, et de douleur.
Pour éviter cette galère, j'avais besoin d'un "Merchant of Record" (MoR). Ils gèrent toutes les conneries de taxes et de facturation pour toi. Paddle est le grand nom dont j'ai entendu parler pendant des années, donc j'ai commencé par là.
Je vais accorder ça à Paddle : leur documentation est fantastique. Leur "Setup checklist" et "Go-live checklist" sont vraiment utiles. J'avais l'impression d'être entre de bonnes mains.
Mais ensuite j'ai essayé d'implémenter la facturation à l'usage.
J'ai passé 4-5 jours à me battre avec leur système, et je n'ai simplement pas pu le faire fonctionner de manière raisonnable. Les webhooks étaient un bordel complexe. Mais le vrai problème était bien pire.
Voilà le problème : quand un utilisateur annule son abonnement, Paddle... pardonne simplement toute l'utilisation qu'il a accumulée. Pouf. Disparu.
Leur doc suggère une "solution" : quand un utilisateur clique sur ton bouton "annuler", tu déclenches d'abord une facturation immédiate pour son utilisation, et ensuite tu annules l'abonnement.
D'accord, mais qu'en est-il du portail client ? Paddle donne aux clients un portail accessible par email pour gérer leur abonnement. S'ils annulent là-bas, t'as aucun contrôle. Tu peux pas injecter ta logique "facture-les d'abord".
Donc, n'importe quel utilisateur pourrait :
C'est pas un petit bug ; c'est une faille qui attend de détruire ton business. Pour un SaaS AI où l'utilisation coûte vraiment de l'argent, c'était inacceptable.
Frustré et à court de temps, j'ai cherché des alternatives et je suis tombé sur polar.sh. C'est un acteur plus récent, et j'étais un peu sceptique. Mais putain, quelle différence.
Voici un aperçu rapide de mon expérience :
onSubscriptionUpdated. C'était propre et simple. Paddle donnait l'impression de nécessiter toute une constellation de webhooks pour faire la même chose.better-auth, et ils avaient une bibliothèque helper pour ça qui rendait les choses encore plus faciles.C'est pas tout rose. On voit que polar.sh est le nouveau sur le marché. J'ai rencontré quelques bugs bizarres.
La bonne nouvelle ? Leur équipe est incroyablement réactive sur Discord. La mauvaise nouvelle ? Leur équipe est incroyablement réactive sur Discord. Ça veut dire que quand j'ai googlé mes bugs, j'ai rien trouvé. Les solutions étaient enfouies dans des conversations Discord. Je préférerais largement trouver les réponses dans des docs publiques plutôt que de devoir demander sur un serveur de chat, mais bon, au moins j'ai eu mes réponses rapidement.
Au cours des derniers mois, j'ai rencontré plus de problèmes que j'aimerais souligner :
Après avoir perdu une semaine avec Paddle, j'ai intégré et fait fonctionner Polar.sh en un jour.
Paddle est peut-être une plateforme mature avec d'excellentes docs, mais pour mon cas d'usage - la facturation à l'usage pour un SaaS AI - il a un défaut fatal. Leur système permet aux utilisateurs d'éviter facilement de payer pour l'utilisation mesurée, ce qui est simplement inacceptable.
Polar.sh, malgré sa jeunesse et ses aspérités occasionnelles, fait bien les fondamentaux. Leur implémentation de la facturation à l'usage est solide, l'expérience développeur est meilleure, et c'est moins cher.
Si tu construis un SaaS avec facturation à l'usage, épargne-toi la migraine. Jette un œil sérieux à polar.sh. C'est pas parfait, mais ça marche là où ça compte.
Edit : Depuis, j'ai voulu mettre à jour l'intégration de tarification et j'ai tellement galéré que j'ai dû la mettre en pause jusqu'à ce que leur équipe résolve certains problèmes. L'un d'eux est documenté dans cette issue github