# 📊 PostHog Analytics - Guide d'Utilisation

## 🎯 Vue d'ensemble

PostHog est configuré pour tracker automatiquement les événements utilisateurs dans l'application Odentas Espace Paie.

## ✅ Configuration actuelle

### Installation
- **Package** : `posthog-js` (client) + `posthog-node` (serveur)
- **Région** : EU (https://eu.i.posthog.com)
- **Variables d'environnement** :
  - `NEXT_PUBLIC_POSTHOG_KEY` : Clé API publique
  - `NEXT_PUBLIC_POSTHOG_HOST` : URL du serveur PostHog

### Composants créés
1. **PostHogProvider** (`components/PostHogProvider.tsx`)
   - Initialise PostHog au chargement de l'application
   - Active le mode debug en développement
   - Expose `window.posthog` pour les tests console en dev
   - **Important** : Utilise `person_profiles: 'identified_only'` - les utilisateurs ne sont créés dans PostHog que lorsqu'ils sont explicitement identifiés

2. **PostHogPageView** (`components/PostHogPageView.tsx`)
   - Track automatiquement chaque changement de page
   - Capture l'URL complète avec query params

3. **PostHogIdentifier** (`components/PostHogIdentifier.tsx`)
   - **Composant clé pour l'identification des utilisateurs** ⭐
   - Identifie automatiquement les utilisateurs connectés via l'API `/api/me`
   - Associe les propriétés utilisateur (email, nom, company, etc.)
   - Réinitialise l'identité lors de la déconnexion
   - **Note** : Si vous ne voyez pas les utilisateurs identifiés dans PostHog, vérifiez que ce composant est bien présent dans votre layout

## 🔍 Pourquoi les utilisateurs sont anonymes ?

Si vous voyez tous les utilisateurs anonymisés dans PostHog, c'est probablement parce que :

1. ❌ **Le composant `PostHogIdentifier` n'est pas présent** dans le layout
2. ❌ **L'API `/api/me` ne retourne pas les bonnes données** (vérifiez la structure JSON)
3. ❌ **L'utilisateur n'est pas authentifié** au moment où PostHog charge
4. ❌ **Les variables d'environnement PostHog sont manquantes**

### Solution :
- Vérifiez que `<PostHogIdentifier />` est bien dans `app/layout.tsx`
- Ouvrez la console du navigateur et regardez les logs : vous devriez voir `👤 PostHog: Utilisateur identifié: email@example.com`
- Si vous voyez une erreur, vérifiez que l'API `/api/me` fonctionne correctement

## 📈 Événements trackés automatiquement

### Événements système
- `$pageview` : Chaque changement de page
- `$pageleave` : Quand l'utilisateur quitte une page
- `$autocapture` : Clics et interactions (si activé)

### Propriétés utilisateur trackées
Lors de l'identification (connexion) :
- `email` : Email de l'utilisateur
- `first_name` : Prénom
- `display_name` : Nom d'affichage complet
- `company_name` : Nom de la société active (active_org_name)
- `company_id` : ID de la société active (active_org_id)
- `is_staff` : Membre du staff ou non

## 🔧 Utilisation avancée

### Tracker un événement personnalisé

```tsx
'use client';
import { usePostHog } from 'posthog-js/react';

function MonComposant() {
  const posthog = usePostHog();

  const handleAction = () => {
    posthog.capture('nom_evenement', {
      propriete1: 'valeur',
      propriete2: 123,
      timestamp: new Date().toISOString()
    });
  };

  return <button onClick={handleAction}>Action</button>;
}
```

**Exemple concret : Tracking de création de contrat** ✨

```tsx
// Après création réussie d'un contrat
posthog?.capture('contract_created', {
  contract_type: 'CDDU',
  regime: 'CDDU_MONO',
  categorie_professionnelle: 'Artiste',
  contract_id: contractId,
  validation_immediate: true,
});
```

> 💡 **Voir le guide complet** : `POSTHOG_SURVEY_CONTRATS.md` pour la mise en place d'un survey de satisfaction après création de contrats.

### Identifier un utilisateur manuellement

```typescript
posthog.identify('user_id_unique', {
  email: 'user@example.com',
  name: 'Nom Utilisateur',
  plan: 'premium'
});
```

### Tracker une propriété super (persistante)

```typescript
// Sera ajoutée à tous les événements futurs
posthog.register({
  app_version: '1.0.0',
  environment: 'production'
});
```

### Réinitialiser l'identité

```typescript
// À la déconnexion (déjà fait dans LogoutButton)
posthog.reset();
```

## 🧪 Tests en développement

### Console du navigateur

En mode développement, PostHog est accessible via `window.posthog` :

```javascript
// Tester un événement
window.posthog.capture('test_event', { message: 'Hello' });

// Voir l'utilisateur actuel
window.posthog.get_distinct_id();

// Voir les propriétés
window.posthog.get_property('email');
```

### Vérifier les requêtes réseau

1. Ouvrez DevTools (F12)
2. Onglet Network
3. Filtrez par "batch" ou "posthog"
4. Les requêtes vers `eu.i.posthog.com/batch/` doivent être en status 200

### Logs console

Avec le mode debug activé, vous verrez :
```
[PostHog.js] "capture" {event: "$pageview", properties: {...}}
[PostHog.js] "identify" {distinctId: "user_id", properties: {...}}
```

## 📊 Dashboard PostHog

### Accès
https://eu.posthog.com/

### Vues utiles

1. **Activity / Live Events** : Voir les événements en temps réel
2. **Persons** : Liste des utilisateurs identifiés
3. **Insights** : Créer des graphiques et analyses
4. **Funnels** : Analyser les parcours utilisateurs
5. **Session Recordings** : Voir les replays de sessions (si activé)

### Filtres utiles

- Exclure dev : `$current_url does not contain localhost`
- Voir uniquement staff : `is_staff = true`
- Par société : `company_name = X`

## 🎯 Cas d'usage recommandés

### 1. Tracker les actions importantes

```typescript
// Création d'un contrat
posthog.capture('contrat_created', {
  contrat_id: contratId,
  type: typeContrat,
  montant: montant
});

// Signature d'un document
posthog.capture('document_signed', {
  document_type: 'contrat',
  document_id: docId
});

// Téléchargement de fiche de paie
posthog.capture('payslip_downloaded', {
  month: '2025-10',
  employee_id: employeeId
});
```

### 2. Groupes (pour analytics par société)

```typescript
posthog.group('company', companyId, {
  company_name: 'Société X',
  plan: 'premium',
  employees_count: 50
});
```

### 3. Feature Flags (A/B testing)

```typescript
const showNewFeature = posthog.isFeatureEnabled('new_ui_design');

if (showNewFeature) {
  // Afficher la nouvelle interface
}
```

## 🔒 Confidentialité & RGPD

### Données collectées
- Événements de navigation et interactions
- Propriétés utilisateur (email, nom, société)
- Données techniques (navigateur, OS, résolution)

### Données NON collectées par défaut
- Mots de passe
- Données sensibles dans les formulaires
- Contenu des documents

### Respect du RGPD
- Hébergement EU (GDPR compliant)
- Possibilité d'anonymiser les IPs
- Droit à l'oubli via l'API PostHog

### Opt-out utilisateur

```typescript
// Si l'utilisateur refuse le tracking
posthog.opt_out_capturing();

// Pour réactiver
posthog.opt_in_capturing();
```

## 🚨 Troubleshooting

### Les événements n'arrivent pas

1. ✅ Vérifier que les variables `NEXT_PUBLIC_*` sont dans `.env.local`
2. ✅ Redémarrer le serveur après modification du `.env.local`
3. ✅ Vérifier la console : doit afficher "✅ PostHog initialisé"
4. ✅ Vérifier Network : requêtes `/batch/` en status 200
5. ✅ Vérifier la clé API dans le dashboard PostHog

### ❌ Les utilisateurs sont tous anonymes / non identifiés

**Symptôme** : Dans PostHog, vous voyez des utilisateurs avec des IDs anonymes (ex: `anon_xyz123`) au lieu des vrais utilisateurs.

**Cause** : Le composant `PostHogIdentifier` n'identifie pas correctement les utilisateurs.

**Solutions** :

1. **Vérifier la console du navigateur** :
   - Vous devriez voir : `👤 PostHog: Utilisateur identifié: email@example.com ID: user-uuid`
   - Si vous voyez une erreur, notez le message

2. **Vérifier que PostHogIdentifier est dans le layout** :
   - Ouvrir `app/layout.tsx`
   - Chercher `<PostHogIdentifier />`
   - Doit être à l'intérieur du `<Providers>` ou `<PostHogProvider>`

3. **Tester l'API /api/me** :
   ```bash
   # Dans la console du navigateur (quand vous êtes connecté)
   fetch('/api/me').then(r => r.json()).then(console.log)
   ```
   - Doit retourner : `{ user: { id: "...", email: "..." }, active_org_id: "...", ... }`
   - Si `user.id` est undefined, il y a un problème avec l'API

4. **Vérifier la configuration PostHog** :
   - Dans `PostHogProvider.tsx`, vous devez avoir : `person_profiles: 'identified_only'`
   - Cela signifie que PostHog ne crée des profils que pour les utilisateurs identifiés explicitement

5. **Forcer une réidentification** :
   ```javascript
   // Dans la console du navigateur
   window.posthog.reset(); // Efface l'identité actuelle
   window.location.reload(); // Recharge la page pour réidentifier
   ```

### Double initialisation

Si vous voyez "You have already initialized PostHog!", c'est normal en dev (React Strict Mode). En production, cela n'arrive pas.

### Événements en retard

PostHog batch les événements pour optimiser les performances. Ils peuvent apparaître avec 5-30s de délai dans le dashboard.

## 📚 Ressources

- [Documentation PostHog](https://posthog.com/docs)
- [API JavaScript](https://posthog.com/docs/libraries/js)
- [React Integration](https://posthog.com/docs/libraries/react)
- [Feature Flags](https://posthog.com/docs/feature-flags)

---

**Dernière mise à jour** : 13 octobre 2025
