BudgetPilot : étude de cas d'une app de gestion budgétaire pour indépendants français
28 février 202618 min de lecture
JL
Jérémy Lagouardille
Développeur web freelance, PilotOne
BudgetPilot est une application web et mobile de gestion budgétaire que je construis et fais évoluer en parallèle de mon activité Safran et de PilotOne. C'est un projet personnel devenu utile à d'autres indépendants français confrontés aux mêmes contraintes que moi : suivre simultanément des comptes personnels et professionnels, calculer ses charges URSSAF, intégrer des investissements ETF ou crypto, gérer un budget en couple, le tout sans dépendre d'un tableur Excel ou d'une app étrangère qui ignore les spécificités françaises.
Cet article documente les choix techniques, les compromis assumés, et la façon dont l'exigence d'une app financière nourrit la qualité que j'applique ensuite aux projets clients chez PilotOne.
Le contexte : la France championne d'Europe de l'épargne
Selon l'INSEE, sur l'année 2025 le taux d'épargne des ménages français s'est établi à 18,3 % du revenu disponible brut en moyenne annuelle, en légère hausse par rapport à 2024 et bien au-dessus du niveau d'avant la crise sanitaire (Insee, Informations rapides n° 51, 2026). Au quatrième trimestre 2025, ce taux était de 17,9 %, contre 18,4 % au troisième et 18,7 % au deuxième. Pour comparaison, la moyenne historique française d'avant crise tournait autour de 14-15 %.
Cette épargne abondante coexiste avec un paradoxe : la majorité des ménages n'ont aucune visibilité claire sur leur patrimoine global, leur taux d'épargne réel mois après mois, ou la performance de leurs placements. Les chiffres macro ne se lisent pas dans les comptes de la cuisine. Et pour les travailleurs indépendants en micro-entreprise, qui doivent en plus gérer mécaniquement le calcul de leurs charges URSSAF et la séparation entre flux personnels et professionnels, le besoin d'un outil dédié est encore plus fort.
Pourquoi les apps existantes ne couvrent pas ce besoin
Avant de coder BudgetPilot, j'ai testé pendant des mois la plupart des alternatives connues du marché français.
Bankin' et Linxo: très bien pour agréger ses comptes bancaires via Open Banking et catégoriser les dépenses. Mais pas de gestion d'investissements ETF ou crypto, pas de calcul URSSAF, pas de mode couple avec règles de partage. Pour un auto-entrepreneur, ce sont des produits partiels.
Yomoni, Trade Republic, Boursobank Bourse: excellents pour suivre un portefeuille d'investissement, mais aveugles sur le quotidien. Aucun lien avec les comptes courants, aucune catégorisation budgétaire.
Excel ou Google Sheets: flexibles, mais pas mobiles, pas sécurisés, et l'import bancaire CSV est manuel à chaque mois. Sur six mois, on abandonne.
Notion templates et autres apps anglo-saxonnes (YNAB, Monarch Money) : pensées pour la fiscalité américaine, sans connexion aux banques françaises, sans logique URSSAF, sans Livret A ni PEA.
La spécificité française combinée (Open Banking DSP2, plafonds URSSAF en micro-entreprise, fiscalité PEA / assurance-vie, mode couple avec ou sans pacs) n'est sérieusement traitée par aucun produit existant. C'est l'intersection que BudgetPilot adresse.
Un projet en tête ?
Discutons de vos besoins. Premier échange gratuit et sans engagement.
La stack technique et la rationale derrière chaque choix
BudgetPilot tourne sur une stack moderne, choisie pour la rapidité de développement, la sécurité, et la conformité RGPD.
Frontend : React 18 + Vite + TypeScript
React parce que c'est l'écosystème le plus mature pour une app riche en interactions et en formulaires (pour situer, Stack Overflow Developer Survey 2025 le confirme comme premier framework front choisi par les développeurs). Vite plutôt que Next.js parce que BudgetPilot est une SPA derrière une authentification : pas besoin de SSR ni de SEO sur les écrans utilisateur. Vite donne un dev server quasi instantané et un build de production très optimisé. TypeScript en strict mode parce que sur des calculs financiers, l'erreur silencieuse n'est pas une option.
Supabase remplace ce qui aurait demandé un backend Express + PostgreSQL + Auth maison + REST manuels. La couche Auth gère email + magic link + OAuth, la base PostgreSQL avec Row Level Security (RLS) garantit qu'un utilisateur ne peut jamais lire les lignes d'un autre même en cas de bug applicatif, et les Edge Functions tournent sur Deno côté serveur pour les traitements sensibles (chiffrement, appels Tink, opérations financières atomiques). Supabase héberge en Frankfurt pour la conformité RGPD.
Open Banking : Tink (Visa)
Pour la connexion aux banques françaises, BudgetPilot utilise Tink, une plateforme suédoise rachetée par Visa en 2022 pour 1,8 milliard d'euros. Tink est licencié sous la directive européenne PSD2 et agréé AISP (Account Information Service Provider, accès lecture aux comptes) et PISP (Payment Initiation Service Provider) dans toute l'Union européenne (Tink official site). En France, l'activité AISP est supervisée par l'ACPR (Autorité de Contrôle Prudentiel et de Résolution). Tink couvre plus de 6 000 institutions bancaires européennes via une API unique, ce qui m'évite d'avoir à intégrer chaque banque française individuellement (Crédit Agricole, BNP Paribas, Société Générale, Banque Populaire, Boursorama, Fortuneo, etc.).
Côté architecture, BudgetPilot expose une interface BankingAdapter avec deux implémentations : TinkAdapter en production, EnableBankingAdapter pour les environnements de test. Changer de fournisseur Open Banking demanderait une seule ligne dans la factory, ce qui me protège d'une dépendance forte à un seul provider.
Mobile natif : Capacitor 8 (iOS + Android)
BudgetPilot existe en application web installable (PWA) et en applications natives iOS et Android via Capacitor 8 (le successeur de Cordova maintenu par Ionic). Capacitor permet de packager le bundle React dans un wrapper natif qui peut accéder aux API plateforme : biométrie Face ID / Touch ID / empreinte Android, stockage chiffré, notifications push. C'est le bon compromis quand on veut une app mobile sans maintenir trois codebases (web + iOS Swift + Android Kotlin).
Graphiques et tableaux : Recharts + TanStack
Recharts pour tous les graphiques (évolution patrimoine, répartition catégories, performance investissements). TanStack Query pour la gestion du cache et de l'état serveur, TanStack Virtual pour afficher des listes de transactions de plusieurs milliers de lignes sans dégrader la performance.
Monitoring et qualité : Sentry, Vitest, Zod
Sentry capture les erreurs en production avec opt-in utilisateur et données anonymisées (jamais le contenu des transactions). Vitest pour les tests unitaires sur les calculs financiers critiques (taux d'épargne, performance Modified Dietz, charges URSSAF). Zod pour la validation au runtime des données qui entrent dans le système, en complément de TypeScript qui ne couvre que le compile-time.
Sécurité et conformité : ce qui n'est pas négociable sur une app financière
Une app qui touche à des données bancaires doit dépasser de très loin le standard d'un site vitrine. Voici les choix structurels appliqués dès la première version.
Row Level Security activée sur 100 % des tables
Toute table dans la base PostgreSQL Supabase a une policy RLS qui filtre les lignes par user_id = auth.uid(). Cela veut dire qu'un bug applicatif qui oublierait de filtrer côté code n'exposerait quand même rien : la base elle-même refuse de servir les lignes d'un autre utilisateur. C'est une défense en profondeur, pas une option.
Chiffrement AES-256-GCM des données sensibles
Les tokens d'accès Tink, les clés API d'exchanges crypto, les IBAN et tous les éléments à risque sont chiffrés en AES-256-GCM par les Edge Functions côté serveur avant stockage. La clé de chiffrement n'est jamais accessible depuis le client. Si la base de données fuitait en intégralité, les données sensibles resteraient inutilisables sans la clé serveur.
Authentification biométrique sur mobile
Sur iOS, Face ID ou Touch ID. Sur Android, l'empreinte digitale ou le déverrouillage du téléphone. Implémenté via les API Capacitor natives, avec fallback PIN à 6 chiffres si la biométrie est désactivée ou indisponible. La session se verrouille automatiquement après une période d'inactivité configurable.
Hébergement Frankfurt et conformité RGPD
Toute l'infrastructure tourne en Allemagne (Supabase Frankfurt, Render Frankfurt). Les sous-traitants (Supabase, Tink, Sentry, Render) ont des DPA (Data Processing Agreements) signés et sont conformes RGPD. Aucun tracker publicitaire tiers, aucun cookie marketing. Sentry est en opt-in et n'envoie jamais le contenu des transactions, uniquement la trace technique de l'erreur.
Spécificités auto-entrepreneur français : ce que les apps étrangères ne savent pas faire
Pour un auto-entrepreneur en micro-entreprise, gérer ses finances ne se résume pas à un budget. Il faut anticiper les charges URSSAF, suivre son chiffre d'affaires par rapport aux plafonds annuels, séparer flux pro et perso pour la TVA et les déductions, et provisionner l'impôt si on a opté pour le versement libératoire.
BudgetPilot intègre nativement le calcul des charges URSSAF selon le régime de l'activité (prestations de services BNC, prestations BIC, vente de marchandises) et applique automatiquement les exonérations (ACRE en début d'activité, par exemple). Le suivi du chiffre d'affaires se compare aux plafonds officiels de la micro-entreprise (rappelés par Service-Public.fr), ce qui permet d'anticiper le moment où il faudra basculer vers un autre régime.
La catégorisation des transactions est entraînée sur 170 patterns de libellés bancaires français (URSSAF, Pôle Emploi devenu France Travail, EDF, Engie, Orange, SFREE, Carrefour, Intermarché, etc.) plus un mécanisme d'apprentissage utilisateur : si je requalifie « XYZ SARL » en « Restaurant », l'app proposera la même catégorie pour les futures transactions identiques.
Spécificités couple : règles de partage explicites
La gestion d'un budget en couple est rarement bien traitée par les apps existantes. BudgetPilot propose un mode couple où chaque conjoint conserve ses comptes individuels et où des règles de partage sont définies pour les dépenses communes :
Partage 50/50 classique pour les couples qui veulent une symétrie stricte.
Partage proportionnel aux revenus pour ceux dont les écarts de salaire justifient une contribution proportionnelle.
Compte commun virtuel ou réel, avec ventilation automatique des dépenses entre les deux soldes individuels.
Aucun jugement moral sur les arrangements : l'app fournit l'infrastructure, les utilisateurs choisissent. Mais le calcul est fait correctement à chaque transaction, ce qui évite les disputes mensuelles sur « qui doit combien à qui ».
Investissements : Modified Dietz et patrimoine net
Pour les comptes-titres, PEA, comptes crypto, BudgetPilot calcule la performance via la méthode Modified Dietz, standard utilisé par les gestionnaires de patrimoine professionnels. Cette méthode pondère les flux (apports et retraits) par leur durée pour donner une performance comparable quelle que soit la fréquence des opérations. Une simple division (valeur_actuelle - valeur_initiale) / valeur_initiale, qui est ce que font beaucoup d'apps grand public, donne des chiffres trompeurs dès qu'on fait des versements réguliers.
Côté crypto, l'app intègre les principales bourses (Binance, Kraken, Coinbase, Bitget) en lecture seule via clés API utilisateur. Les clés sont chiffrées en AES-256-GCM côté serveur, et les permissions demandées sont strictement limitées à la lecture des soldes : aucune capacité de trading ou de retrait depuis BudgetPilot.
Le résultat consolidé est un calcul de patrimoine net en temps réel : comptes courants + livrets + assurance-vie + PEA + crypto, moins les éventuels crédits en cours. Une vue que ni Bankin' ni Yomoni ne savent produire seules.
Architecture en pratique : l'adapter pattern et 7 parsers CSV
Trois choix d'architecture qui méritent d'être mentionnés.
Adapter pattern pour l'Open Banking
L'interface BankingAdapter définit un contrat commun (lister les comptes, lister les transactions, rafraîchir, déconnecter). Les implémentations TinkAdapter et EnableBankingAdapter respectent ce contrat. Le code applicatif n'importe jamais directement Tink ou Enable Banking, il importe l'interface et reçoit l'implémentation via une factory configurée par variable d'environnement. Bénéfice direct : si Tink change ses tarifs, augmente ses limites, ou si une nouvelle alternative plus adaptée émerge, je peux migrer en quelques jours sans toucher au reste de l'application.
7 parsers CSV multi-banques pour les utilisateurs sans Open Banking
Tous les utilisateurs n'activent pas l'Open Banking, soit par méfiance, soit parce que leur banque n'est pas encore couverte. Pour eux, BudgetPilot accepte les exports CSV ou OFX des principales banques françaises : Crédit Agricole, BNP Paribas, Société Générale, Boursorama, Fortuneo, La Banque Postale, et un parser générique. Chaque banque a son format propre (encodage, séparateur, ordre des colonnes, format des dates, signe des montants), et un parser dédié évite les erreurs silencieuses.
State management TanStack Query + Context
TanStack React Query gère tout l'état serveur (synchro Supabase, cache, revalidation). Les Contexts React sont réservés à l'état purement local UI (thème, langue, ouverture de modales). Pas de Redux : la complexité ne se justifie pas pour une app de cette taille, et React Query couvre 90 % des besoins typiquement attribués à un store global.
UX et expérience utilisateur
BudgetPilot vise une UX claire pour des utilisateurs qui ne sont pas des geeks de la finance.
Dashboard principal: KPIs essentiels en haut (solde global, taux d'épargne du mois, charges URSSAF à provisionner, dépenses en cours de mois), suivis des graphiques d'évolution et des alertes budget.
Page transactions : table virtualisée, filtres multi-critères (date, catégorie, compte, montant), sélection multiple pour les actions en masse (recatégoriser, marquer comme remboursée, exporter).
Page investissements : performance par actif et globale, répartition par classe (actions, ETF, obligations, crypto), comparaison à un benchmark indiciel.
Page analyse : tendances mensuelles, comparaison année sur année, top catégories.
Page fiscalité : provision impôt sur le revenu (selon régime choisi), provision URSSAF, récapitulatif annuel pour la déclaration.
Mode sombre par défaut, parce que personne ne consulte ses comptes en plein soleil et parce que l'OLED des smartphones modernes consomme moins en sombre.
Internationalisation FR / ENdès le départ, pour ne pas avoir à refondre l'app en cas d'ouverture à des utilisateurs européens non francophones.
Apprentissages techniques tirés de ce projet
La précision financière n'est pas une option
Sur un calcul de solde mensuel, une erreur de centime sur une transaction isolée n'est pas grave. Mais une erreur d'arrondi systématique sur plusieurs centaines de transactions accumule visible. Tous les calculs internes utilisent une représentation entière des montants en centimes (jamais de flottants pour les sommes), et les arrondis ne sont appliqués qu'à l'affichage. C'est une discipline qui se traduit en code TypeScript rigoureux et en tests Vitest qui couvrent les edge cases (transactions à 0,005 €, conversions de devises, déductions URSSAF avec abattements).
La performance d'une SPA financière est une bataille distincte
Quand un utilisateur a 10 000 transactions sur 5 ans et veut filtrer puis exporter, le rendu naïf d'une table en JSX ramerait. TanStack Virtual ne rend que les lignes visibles à l'écran (windowing), ce qui maintient une UI fluide même sur des volumes importants. Côté requêtes, TanStack Query évite les allers-retours redondants à Supabase grâce à son cache typé.
Les migrations Supabase doivent être versionnées comme du code applicatif
Chaque modification de schéma (ajout de colonne, nouvelle policy RLS, index) fait l'objet d'un fichier SQL daté dans supabase/migrations/, versionné dans git, applicable en local et en prod via la CLI Supabase. Aucune modification de schéma ne se fait à la main dans le dashboard production. C'est ce qui permet de maintenir un historique reproductible et de revenir en arrière si une migration casse quelque chose.
Apprentissages côté solo founder
La confiance se gagne par la transparence technique
Beaucoup d'utilisateurs hésitent légitimement à connecter leurs comptes bancaires à une app inconnue. La page « Confidentialité et sécurité » de BudgetPilot décrit en clair les mesures concrètes (RLS, AES-256-GCM, hébergement Frankfurt, agrément Tink, DPA Sentry), pas juste « vos données sont en sécurité ». Cette transparence rassure les utilisateurs avertis et oblige à tenir réellement le standard annoncé.
Build in public, mais sans s'épuiser
Je publie régulièrement les avancées techniques de BudgetPilot sur les réseaux sociaux (LinkedIn, X) parce que c'est utile à la fois pour la pédagogie (montrer comment on gère telle ou telle subtilité) et pour la crédibilité (prospects PilotOne qui voient que je code vraiment, pas que je communique).
L'app est un produit, pas un démonstrateur
Je n'ai jamais voulu que BudgetPilot soit un simple jouet à montrer aux prospects PilotOne pour prouver que je sais coder. C'est un produit que j'utilise moi-même au quotidien et qui doit servir d'autres indépendants ayant les mêmes contraintes. Cette exigence remonte mécaniquement le niveau de qualité : on ne livre pas un bug à soi-même.
Roadmap honnête : ce qui reste à faire
BudgetPilot est en phase de mise en production progressive. Les chantiers identifiés à court et moyen terme :
Activation complète de Tink en production avec montée en charge des banques françaises supportées.
Multi-devises élargi (au-delà du couple EUR / USD actuel pour gérer un portefeuille crypto international).
Export comptable au format compatible avec les logiciels de comptabilité français (FEC, ce qui simplifie la transmission au comptable).
Ouverture progressive à de nouveaux utilisateurs en mode invitation, en recueillant leurs retours pour ajuster les manques.
Mode famille (au-delà du couple) pour les ménages avec enfants ou proches à charge.
Ce que cette exigence apporte aux clients PilotOne
Construire une app financière oblige à appliquer des standards qu'on ne relâche plus ensuite. Quand je conçois ensuite un site vitrine pour un artisan, un cabinet libéral ou une PME béarnaise, les réflexes restent : Row Level Security activée par défaut sur toute nouvelle table Supabase, hébergement EU, chiffrement des secrets serveur, tests automatisés sur les calculs sensibles, migrations versionnées, monitoring Sentry, performance mobile mesurée. Ce sont des standards que peu de prestataires régionaux appliquent par défaut, et qui font la différence quand un client se fait pirater ou perd des données.
Si vous voulez creuser un cas concret de ce que cette approche donne en projet client, j'ai détaillé la création de l'app BandPilot(gestion de groupe musical, autre architecture) et l'exigence Factur-X(lecture XML EN16931 conforme à la réforme française). Pour discuter d'un projet sur-mesure, ma page contact est ouverte.