Quoi logger dans ton SaaS
Un guide de terrain pour les events que chaque SaaS finit par logger : auth, facturation, actions admin, demandes de données. Une page par action avec un payload concret et une recommandation de rétention.
Authentification
user.signupÉmets un event `user.signup` à chaque création de compte. Stocke la source, le referrer et les metadata de campagne pour faire remonter les clients payants jusqu'à la campagne qui les a amenés.
user.loginÉmets un event `user.login` à chaque connexion réussie. Stocke l'acteur, l'IP, le user agent et la méthode MFA utilisée. Alimente tes dashboards de sécurité, les timelines utilisateur et les exports d'audit entreprise.
user.login.failedÉmets un event `user.login.failed` à chaque connexion échouée, que l'email existe ou non. L'IP et la raison permettent d'agréger sur une fenêtre et repérer les attaques distribuées avant qu'elles n'aboutissent.
user.password.changedÉmets un event `user.password.changed` à chaque fois qu'un utilisateur met à jour son propre mot de passe, distingué de `user.password.reset` (déclenché par le flow mot de passe oublié).
user.password.resetÉmets un event `user.password.reset` quand un user complète le flow mot de passe oublié et qu'un nouveau mot de passe est posé via un token email. Distinct d'un changement normal.
user.mfa.enabledÉmets un event `user.mfa.enabled` à la première vérification réussie d'un second facteur, TOTP, WebAuthn, SMS. Les contrats entreprise exigent souvent un reporting d'adoption MFA.
user.session.revokedÉmets un event `user.session.revoked` quand tu termines une session, que ce soit un 'déconnecter partout', une détection d'activité suspecte ou une révocation admin.
Facturation
invoice.paidÉmets un event `invoice.paid` depuis ton handler webhook Stripe (ou autre provider). Stocke le montant, la devise, l'ID event provider et l'organisation du client.
invoice.payment_failedÉmets un event `invoice.payment_failed` à chaque tentative de prélèvement échouée, capture initiale, retry, ou après mise à jour de carte.
invoice.refundedÉmets un event `invoice.refunded` à chaque remboursement partiel ou total. Inclut la raison, demande client, prélèvement accidentel, chargeback.
subscription.upgradedÉmets un event `subscription.upgraded` à chaque passage à un plan supérieur. Garde les slugs from/to dans les metadata pour l'analyse de cohortes.
subscription.cancelledÉmets un event `subscription.cancelled` dès qu'un client demande à annuler, même avant la fin de période. Stocke la raison issue de ton flow d'annulation si tu en as un.
Admin et conformité
admin.user.suspendedÉmets un event `admin.user.suspended` quand un membre du staff suspend un client depuis ton back-office. Attache toujours une raison, c'est la première chose que le légal demandera.
admin.role.changedÉmets un event `admin.role.changed` chaque fois qu'un membre du staff modifie le rôle d'un user ou d'un membre d'équipe. Garde les noms de rôle from/to en metadata.
admin.impersonation.startedÉmets un event `admin.impersonation.started` quand un membre du staff se fait passer pour un client (debug, support). Émets `admin.impersonation.ended` à la fermeture de session.
data.export.requestedÉmets un event `data.export.requested` à chaque export de données personnelles. L'Article 15 RGPD donne un droit d'accès, émets l'event au moment où l'export est mis en queue.
user.account.deletedÉmets un event `user.account.deleted` quand tu traites une demande de suppression. Associe-le à un appel `DELETE /v1/actors/:id` pour anonymiser le reste du trail.
Contenu et stockage
file.uploadedÉmets un event `file.uploaded` après qu'un fichier soit committé dans ton object storage. Stocke filename, size et mime type pour répondre à 'qui a uploadé ce PDF la semaine dernière'.
file.deletedÉmets un event `file.deleted` à chaque suppression d'un fichier de ton stockage, par un user ou par un job de rétention.
document.sharedÉmets un event `document.shared` chaque fois qu'un user génère un lien de partage, invite un destinataire ou change la visibilité d'un document.
Agents IA
agent.tool_calledÉmets un event `agent.tool_called` au moment où ton agent IA décide d'invoquer un tool, avant son exécution. Capture l'identité de l'agent, le nom du tool, les arguments et l'utilisateur qui a déclenché la conversation. À utiliser avec `agent.tool_returned` pour une traçabilité complète.
agent.tool_returnedÉmets un event `agent.tool_returned` juste après qu'un tool termine, avant de rendre la main au modèle. Stocke le statut (success ou failure), la durée et toute erreur. Crucial pour diagnostiquer les tools lents ou flaky qui font dérailler un agent.
agent.action_takenÉmets un event de domaine avec `actor.type` à 'agent' pour le changement effectif que ton agent a opéré (file.deleted, invoice.refunded, project.archived). C'est l'enregistrement de niveau audit que les clients et auditeurs regarderont en premier en cas de litige.