diff --git a/apps/web/src/routes/_app/factures_.$id.tsx b/apps/web/src/routes/_app/factures_.$id.tsx index eba799e..65b42d9 100644 --- a/apps/web/src/routes/_app/factures_.$id.tsx +++ b/apps/web/src/routes/_app/factures_.$id.tsx @@ -62,8 +62,19 @@ function InvoiceDetailPage() { const markPaidMutation = useMutation({ mutationFn: () => api.post(`/api/v1/invoices/${id}/mark-paid`), - onSuccess: () => { + onSuccess: (paidInvoice) => { + // invoice_marked_paid : conservé pour les insights existants. + // payment_completed : nouvel event enrichi (montant + méthode) pour + // alimenter le funnel facture → paiement côté PostHog. En V1 la méthode + // est toujours "manual" (validation user) ; passera à "banking" quand + // la réconciliation auto Powens sera live. posthog.capture("invoice_marked_paid", { invoice_id: id }); + posthog.capture("payment_completed", { + invoice_id: id, + amount_cents: paidInvoice.amountTtcCents, + amount_eur: paidInvoice.amountTtcCents / 100, + payment_method: "manual", + }); void queryClient.invalidateQueries({ queryKey: queryKeys.invoices.all() }); void queryClient.invalidateQueries({ queryKey: queryKeys.dashboard.kpis() }); toast.success("Encaissée. + 1 rubis bien mérité."); diff --git a/apps/web/src/routes/_app/factures_.import.tsx b/apps/web/src/routes/_app/factures_.import.tsx index 0ba4860..11ff40c 100644 --- a/apps/web/src/routes/_app/factures_.import.tsx +++ b/apps/web/src/routes/_app/factures_.import.tsx @@ -22,7 +22,17 @@ function ImportLandingPage() { const upload = useMutation({ mutationFn: uploadInvoiceFiles, onSuccess: (batch) => { - posthog.capture("invoice_uploaded", { count: batch.drafts.length }); + // Un event par facture pour pouvoir lister les uploads individuellement + // dans PostHog. Pas de `amount` ici : l'OCR n'a pas encore extrait les + // montants à ce stade — ils seront connus à la validation du brouillon. + for (const draft of batch.drafts) { + posthog.capture("invoice_uploaded", { + invoice_id: draft.id, + filename: draft.filename, + batch_id: batch.id, + batch_size: batch.drafts.length, + }); + } toast.success( `${batch.drafts.length} facture${batch.drafts.length > 1 ? "s" : ""} extraite${ batch.drafts.length > 1 ? "s" : ""