358 lines
12 KiB
Markdown
358 lines
12 KiB
Markdown
# 📊 Tracking PostHog du Simulateur de Paie
|
||
|
||
## Vue d'ensemble
|
||
|
||
Le simulateur de paie envoie maintenant un événement PostHog à chaque fois qu'un utilisateur clique sur le bouton "Calculer". Cet événement permet de déclencher des surveys et d'analyser l'utilisation du simulateur.
|
||
|
||
## Architecture
|
||
|
||
### Communication iframe → parent
|
||
Le simulateur est intégré via une iframe (`/simulateur-embed.html`). Pour envoyer des événements PostHog :
|
||
|
||
1. **L'iframe** envoie un message via `postMessage` au clic sur "Calculer"
|
||
2. **La page parent** (`app/(app)/simulateur/page.tsx`) écoute ce message
|
||
3. **La page parent** envoie l'événement à PostHog avec le hook `usePostHog`
|
||
|
||
### Schéma
|
||
```
|
||
simulateur-embed.html (iframe)
|
||
│
|
||
│ postMessage({ type: 'simulateur_calculation', data: {...} })
|
||
│
|
||
▼
|
||
simulateur/page.tsx (parent)
|
||
│
|
||
│ window.addEventListener('message', ...)
|
||
│
|
||
▼
|
||
PostHog
|
||
```
|
||
|
||
## Événement envoyé
|
||
|
||
### Nom de l'événement
|
||
`simulateur_calculation`
|
||
|
||
### Propriétés complètes
|
||
| Propriété | Type | Description | Exemple |
|
||
|-----------|------|-------------|---------|
|
||
| **Paramètres du formulaire** ||||
|
||
| `ccn_id` | string | ID de la CCN sélectionnée | `"1285"` |
|
||
| `ccn_nom` | string | Nom complet de la CCN | `"1285 – Entreprises Artistiques & Culturelles (CCNEAC)"` |
|
||
| `categorie` | string | Catégorie du salarié | `"artiste"` ou `"technicien"` |
|
||
| `statut` | string | Statut professionnel | `"non-cadre"` ou `"cadre"` |
|
||
| `abattement_active` | boolean | Abattement pour frais pro activé | `true` ou `false` |
|
||
| `abattement_profession` | string | Type de profession (si abattement) | `"drama"`, `"musique"` ou `""` |
|
||
| **Cachets, heures et dates** ||||
|
||
| `cachets` | number | Nombre de cachets | `10` |
|
||
| `heures` | number | Nombre d'heures | `35` |
|
||
| `dates_travail` | array | Liste des dates de travail | `["2025-10-15", "2025-10-16"]` |
|
||
| `nombre_jours` | number | Nombre de jours travaillés | `2` |
|
||
| **Montant et type de calcul** ||||
|
||
| `montant_saisi` | number | Montant saisi par l'utilisateur | `2000` |
|
||
| `type_calcul` | string | Type de calcul effectué | `"brut"`, `"net"` ou `"cost"` |
|
||
| **Résultats calculés** ||||
|
||
| `resultat_brut` | number | Salaire brut calculé | `2000.00` |
|
||
| `resultat_net` | number | Salaire net avant PAS calculé | `1580.50` |
|
||
| `resultat_cost` | number | Coût total employeur calculé | `2456.80` |
|
||
| **Métadonnées** ||||
|
||
| `plafond_urssaf` | number | Plafond URSSAF appliqué | `3864` |
|
||
| `timestamp` | string | Date/heure de la simulation | `"2025-10-16T14:30:00.000Z"` |
|
||
|
||
### Exemple d'événement complet
|
||
```javascript
|
||
{
|
||
event: 'simulateur_calculation',
|
||
properties: {
|
||
// Paramètres du formulaire
|
||
ccn_id: '1285',
|
||
ccn_nom: '1285 – Entreprises Artistiques & Culturelles (CCNEAC)',
|
||
categorie: 'artiste',
|
||
statut: 'non-cadre',
|
||
abattement_active: true,
|
||
abattement_profession: 'drama',
|
||
|
||
// Cachets, heures et dates
|
||
cachets: 10,
|
||
heures: 35,
|
||
dates_travail: ['2025-10-15', '2025-10-16', '2025-10-17'],
|
||
nombre_jours: 3,
|
||
|
||
// Montant et type de calcul
|
||
montant_saisi: 2000,
|
||
type_calcul: 'brut',
|
||
|
||
// Résultats calculés
|
||
resultat_brut: 2000.00,
|
||
resultat_net: 1580.50,
|
||
resultat_cost: 2456.80,
|
||
|
||
// Métadonnées
|
||
plafond_urssaf: 3864,
|
||
timestamp: '2025-10-16T14:30:00.000Z'
|
||
}
|
||
}
|
||
```
|
||
|
||
## Fichiers modifiés
|
||
|
||
### 1. `/public/simulateur-embed.html`
|
||
**Ligne 1326+** : Ajout de l'envoi du message enrichi via `postMessage` dans le gestionnaire du bouton "Calculer"
|
||
|
||
```javascript
|
||
// 📊 Envoyer un événement PostHog enrichi via postMessage au parent
|
||
try {
|
||
// Récupération de toutes les données du formulaire
|
||
const ccnElement = document.getElementById('conventionSelect');
|
||
const ccnValue = ccnElement?.value || '';
|
||
const ccnText = ccnElement?.options[ccnElement.selectedIndex]?.text || '';
|
||
|
||
const categorieValue = isTechnicien() ? 'technicien' : 'artiste';
|
||
const statutValue = document.getElementById('statutSelect')?.value || 'non-cadre';
|
||
|
||
// Abattement
|
||
const abattementChecked = document.querySelector('input[name="abattement"]:checked')?.value || 'non';
|
||
const professionValue = document.getElementById('professionSelect')?.value || '';
|
||
|
||
// Dates
|
||
const datesInput = document.getElementById('datesInput')?.value || '';
|
||
const datesArray = datesInput ? datesInput.split(',').map(d => d.trim()).filter(Boolean) : [];
|
||
|
||
window.parent.postMessage({
|
||
type: 'simulateur_calculation',
|
||
data: {
|
||
// Paramètres du formulaire
|
||
ccn_id: ccnValue,
|
||
ccn_nom: ccnText,
|
||
categorie: categorieValue,
|
||
statut: statutValue,
|
||
abattement_active: abattementChecked === 'oui',
|
||
abattement_profession: professionValue,
|
||
|
||
// Cachets, heures, dates
|
||
cachets: cachets,
|
||
heures: heures,
|
||
dates_travail: datesArray,
|
||
nombre_jours: datesArray.length,
|
||
|
||
// Montant saisi et type
|
||
montant_saisi: montant,
|
||
type_calcul: type,
|
||
|
||
// Résultats calculés
|
||
resultat_brut: parseFloat(brut.toFixed(2)),
|
||
resultat_net: parseFloat(net.toFixed(2)),
|
||
resultat_cost: parseFloat(costEmployer.toFixed(2)),
|
||
|
||
// Métadonnées
|
||
plafond_urssaf: plafondUrssaf,
|
||
timestamp: new Date().toISOString()
|
||
}
|
||
}, '*');
|
||
} catch (e) {
|
||
console.error('Erreur lors de l\'envoi de l\'événement PostHog:', e);
|
||
}
|
||
```
|
||
|
||
### 2. `/app/(app)/simulateur/page.tsx`
|
||
**Lignes 12-50** : Mise à jour du hook PostHog pour capturer toutes les propriétés enrichies
|
||
|
||
```typescript
|
||
useEffect(() => {
|
||
const handleMessage = (event: MessageEvent) => {
|
||
if (event.data?.type === 'simulateur_calculation') {
|
||
const data = event.data.data;
|
||
|
||
posthog?.capture('simulateur_calculation', {
|
||
// Paramètres du formulaire
|
||
ccn_id: data.ccn_id,
|
||
ccn_nom: data.ccn_nom,
|
||
categorie: data.categorie,
|
||
statut: data.statut,
|
||
abattement_active: data.abattement_active,
|
||
abattement_profession: data.abattement_profession,
|
||
|
||
// Cachets, heures, dates
|
||
cachets: data.cachets,
|
||
heures: data.heures,
|
||
dates_travail: data.dates_travail,
|
||
nombre_jours: data.nombre_jours,
|
||
|
||
// Montant saisi et type
|
||
montant_saisi: data.montant_saisi,
|
||
type_calcul: data.type_calcul,
|
||
|
||
// Résultats calculés
|
||
resultat_brut: data.resultat_brut,
|
||
resultat_net: data.resultat_net,
|
||
resultat_cost: data.resultat_cost,
|
||
|
||
// Métadonnées
|
||
plafond_urssaf: data.plafond_urssaf,
|
||
timestamp: data.timestamp
|
||
});
|
||
}
|
||
};
|
||
|
||
window.addEventListener('message', handleMessage);
|
||
return () => window.removeEventListener('message', handleMessage);
|
||
}, [posthog]);
|
||
```
|
||
|
||
window.addEventListener('message', handleMessage);
|
||
return () => window.removeEventListener('message', handleMessage);
|
||
}, [posthog]);
|
||
|
||
// ... reste du composant
|
||
}
|
||
```
|
||
|
||
## Utilisation pour les surveys
|
||
|
||
### Créer un survey dans PostHog
|
||
|
||
1. **Se connecter à PostHog** : https://eu.posthog.com/
|
||
2. **Aller dans Surveys** → **New Survey**
|
||
3. **Configurer le targeting** :
|
||
- Type : Popover
|
||
- Trigger : `simulateur_calculation` (l'événement que nous envoyons)
|
||
- Display conditions : Par exemple après 1 calcul, ou après 3 calculs, etc.
|
||
|
||
### Exemple de configuration
|
||
```
|
||
Targeting:
|
||
- Show when: simulateur_calculation event occurs
|
||
- Frequency: Once per user / Every time
|
||
- Wait period: 0 seconds (ou délai souhaité)
|
||
```
|
||
|
||
### Questions suggérées
|
||
- "Le simulateur vous a-t-il été utile ?"
|
||
- "Quelle fonctionnalité aimeriez-vous voir ajoutée ?"
|
||
- "Avez-vous trouvé les résultats clairs ?"
|
||
|
||
## Vérification
|
||
|
||
### Dans la console du navigateur
|
||
Lors d'un clic sur "Calculer", vous devriez voir :
|
||
```
|
||
📊 PostHog: Événement simulateur_calculation enrichi envoyé {
|
||
categorie: 'artiste',
|
||
ccn: '1285 – Entreprises Artistiques & Culturelles (CCNEAC)',
|
||
type_calcul: 'brut',
|
||
montant_saisi: 2000,
|
||
resultats: {
|
||
brut: 2000,
|
||
net: 1580.5,
|
||
cost: 2456.8
|
||
}
|
||
}
|
||
```
|
||
|
||
### Dans PostHog
|
||
1. Aller dans **Activity** → **Live Events**
|
||
2. Filtrer par événement : `simulateur_calculation`
|
||
3. Vérifier que les propriétés sont correctes
|
||
|
||
## Dépannage
|
||
|
||
### L'événement n'apparaît pas dans PostHog
|
||
1. Vérifier que PostHog est bien initialisé dans l'app
|
||
2. Vérifier les variables d'environnement :
|
||
```bash
|
||
NEXT_PUBLIC_POSTHOG_KEY=phc_...
|
||
NEXT_PUBLIC_POSTHOG_HOST=https://eu.i.posthog.com
|
||
```
|
||
3. Activer le mode debug de PostHog dans la console :
|
||
```javascript
|
||
window.posthog.debug(true)
|
||
```
|
||
|
||
### Le message postMessage n'arrive pas
|
||
1. Vérifier que l'iframe est bien chargée
|
||
2. Vérifier dans la console qu'il n'y a pas d'erreur CORS
|
||
3. Tester en console :
|
||
```javascript
|
||
window.addEventListener('message', (e) => console.log('Message reçu:', e.data));
|
||
```
|
||
|
||
## Évolutions futures
|
||
|
||
### Analyses possibles avec les données enrichies
|
||
Avec toutes ces propriétés, vous pouvez maintenant analyser :
|
||
|
||
- **Par CCN** : Quelle convention collective est la plus utilisée ?
|
||
- **Par catégorie** : Artiste vs Technicien - ratio d'utilisation
|
||
- **Par type de calcul** : Les utilisateurs partent-ils plutôt du brut, net ou coût ?
|
||
- **Abattement** : Combien d'utilisateurs utilisent l'abattement pour frais professionnels ?
|
||
- **Montants moyens** : Salaire brut moyen, net moyen, coût moyen par CCN
|
||
- **Heures et cachets** : Patterns d'utilisation (nombre moyen de cachets, heures par simulation)
|
||
- **Périodes** : Analyse temporelle des simulations (jours, semaines, mois)
|
||
|
||
### Exemples de requêtes PostHog
|
||
|
||
**Salaire brut moyen par CCN** :
|
||
```sql
|
||
SELECT
|
||
ccn_nom,
|
||
AVG(resultat_brut) as brut_moyen,
|
||
COUNT(*) as nb_simulations
|
||
FROM events
|
||
WHERE event = 'simulateur_calculation'
|
||
GROUP BY ccn_nom
|
||
ORDER BY nb_simulations DESC
|
||
```
|
||
|
||
**Répartition Artiste vs Technicien** :
|
||
```sql
|
||
SELECT
|
||
categorie,
|
||
COUNT(*) as total,
|
||
AVG(resultat_brut) as brut_moyen
|
||
FROM events
|
||
WHERE event = 'simulateur_calculation'
|
||
GROUP BY categorie
|
||
```
|
||
|
||
**Taux d'utilisation de l'abattement** :
|
||
```sql
|
||
SELECT
|
||
abattement_active,
|
||
COUNT(*) as total,
|
||
(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER ()) as pourcentage
|
||
FROM events
|
||
WHERE event = 'simulateur_calculation'
|
||
AND categorie = 'artiste'
|
||
GROUP BY abattement_active
|
||
```
|
||
|
||
### Idées d'améliorations futures
|
||
- Tracker les exports PDF (si fonctionnalité ajoutée)
|
||
- Ajouter le temps passé sur le simulateur
|
||
- Tracker les erreurs de validation
|
||
- Capturer le device type (mobile/desktop)
|
||
- Ajouter des événements pour les modifications de paramètres sans calcul
|
||
|
||
## Notes techniques
|
||
|
||
- ✅ Le simulateur est maintenant actif dans la sidebar
|
||
- ✅ Les événements PostHog sont trackés avec **toutes les données de simulation**
|
||
- ✅ Compatible avec les surveys PostHog
|
||
- ✅ Aucune dépendance externe supplémentaire requise
|
||
- ✅ Fonctionne en mode production et développement
|
||
- ✅ **Données enrichies** : CCN, catégorie, statut, abattement, cachets, heures, dates, montants et résultats complets
|
||
|
||
## Données capturées (résumé)
|
||
| Catégorie | Données |
|
||
|-----------|---------|
|
||
| **CCN** | ID et nom complet de la convention |
|
||
| **Profil** | Catégorie (artiste/technicien), statut (cadre/non-cadre) |
|
||
| **Abattement** | Activation et type de profession |
|
||
| **Volumes** | Cachets, heures, dates de travail, nombre de jours |
|
||
| **Calcul** | Montant saisi, type de calcul (brut/net/cost) |
|
||
| **Résultats** | Brut, Net avant PAS, Coût Total Employeur |
|
||
| **Contexte** | Plafond URSSAF, timestamp |
|
||
|
||
## Date de mise en place
|
||
- **Première version** : 15 octobre 2025 (tracking basique)
|
||
- **Version enrichie** : 16 octobre 2025 (toutes les données)
|