Espace admin single-user intégré à mon portfolio : un CRM freelance qui remplace Notion, une conformité RGPD gérée dans le code et une base prête pour des agents IA. Next.js, PostgreSQL, login Google. En production.

Mon activité freelance est pilotée dans Notion via un CRM complet, alimenté par mes propres skills Claude Code. Je l'ai d'abord mis en place comme un POC et ça fonctionnait très bien, mais j'ai vite atteint ses limites : des queries pas assez rapides ni assez précises, une base de plus en plus lourde à gérer à mesure que les données s'accumulent. Sans compter la dépendance à un outil externe.
Côté site aussi, ça coinçait : le contenu vivait dans le code, donc chaque correction demandait un nouveau déploiement.
J'ai donc construit mon propre espace admin, directement dans l'application du portfolio. Il gère aujourd'hui le contenu du site et le CRM freelance. Il accueillera ensuite le suivi des missions, la compta, les finances et des agents IA.
Objectif : avoir un vrai outil professionnel, à mes propres exigences, au lieu de payer un service ou de bricoler.
Mon rôle : conception, développement et exploitation, seul.
Mes bases Notion étaient une première modélisation, avec pas mal d'approximations : des informations recopiées d'une base à l'autre, des notions qui n'avaient pas leur propre base. Sans oublier des valeurs que je tapais à la main alors qu'elles pouvaient se déduire.
Solutions : j'ai repris le modèle en base relationnelle, avec une règle simple : chaque donnée à un seul endroit. Les opportunités ont maintenant leur propre table, reliée à l'ESN et au client final. Une personne n'existe qu'une fois, qu'elle soit prospect ou contact. Une dizaine de valeurs, comme le premier contact ou les compteurs des revues hebdo, sont calculées automatiquement au lieu d'être saisies. Le CRM propose aussi un pipeline en kanban, un calendrier des actions, le suivi des entretiens et des signaux d'achat.

Prospecter veut dire stocker des données sur des personnes qui ne me les ont pas données elles-mêmes. Je voulais donc être en règle avant d'enregistrer le premier lead plutôt que de régulariser après coup.
Solutions : le traitement est déclaré dans mon registre et ma politique de confidentialité a été mise à jour en amont, avec des durées de conservation basées sur les recommandations de la CNIL. L'opposition et l'effacement sont deux actions séparées : une personne qui s'oppose n'est plus contactable, sa fiche garde seulement la trace de son refus, puis elle est supprimée au bout de 3 ans. Si vous pensez figurer dans mon CRM, vous pouvez vous y opposer à tout moment, sans justification, en suivant ma politique de confidentialité.
L'espace admin tourne dans la même application que le site public. La moindre erreur d'autorisation pourrait exposer des données privées à n'importe quel visiteur.
Solutions : la connexion passe uniquement par Google, avec une seule adresse autorisée et aucun mot de passe stocké. Les droits sont vérifiés à trois niveaux : à l'entrée de l'admin, sur chaque page et dans chaque action. J'ai vérifié en fin de chantier qu'une action appelée avec un faux cookie est bien refusée. Et aucune donnée admin n'arrive jusqu'au navigateur.
Je devais récupérer tout l'historique du CRM Notion une seule fois, sans perdre de données et sans risquer d'écraser la prod.
Solutions : une session Claude connectée à Notion prépare les données, puis un script les vérifie avec les mêmes règles que les formulaires de l'admin. Il tourne d'abord en simulation, puis écrit tout en une seule transaction. Il refuse aussi d'écrire si la base contient déjà des données. Et je fais une sauvegarde avant chaque étape.
Pour afficher le logo des entreprises, Logo.dev interdit de stocker les images en offre gratuite et coûte 150 $ par mois en offre Pro.
Solutions : l'app va chercher l'icône directement sur le site de l'entreprise, ou sur une archive Wayback si le site n'existe plus. Comme le serveur appelle une adresse saisie à la main, j'ai ajouté une protection SSRF : les adresses internes sont bloquées et la taille comme la durée des réponses sont limitées.
Les futurs agents IA devront agir sur l'app sans mettre en danger le site public. Ils devront aussi tourner sur mon abonnement Claude plutôt qu'à la consommation.
Solutions : toute la gestion des données reste dans l'app. Ce qui demande du jugement ou du temps de calcul partira dans des services séparés. J'ai aussi monté un prototype du moteur d'agents avant d'écrire la moindre ligne du vrai service : il lance Claude Code avec tout mon environnement de travail et me pose ses questions sur mon téléphone.
© 2026 Thibaud Geisler - SIRET 880 419 122 00036