Note unifiée moyenne
—/100
—
Avis analysés
—
—
Répartition du sentiment
Note unifiée — tendance

Répartition des notes (/5)

Derniers avis

Détail des avis

Date Logement Plateforme Modération Note avis Note avis d'origine Sentiment Thèmes Résumé Note logement Note Airbnb logement Note Booking logement

Appartements

Rapport d'analyse

Tâches

Par appartement : les tâches M.G.B (page « Planning » de M.G.B, lecture seule), les tickets déjà affectés à un prestataire (en cours d'exécution et réalisés) et les plages libres pour planifier une visite. Les tâches M.G.B sont aussi des tickets « Préparation à distribution » dans Tickets.

🛏 voyageur dans le logement▢ jour de départ📋 tâche M.G.B🔧 ticket affecté🚶 visiteUne couleur par séjour · clique une carte pour ouvrir la fiche logement

Visites

Planifie une visite sur place pour compléter la fiche M.G.B avant qu'un ticket ne soit affecté à un prestataire. Tous les logements sont listés (« Ce qui est déjà enregistré » détaille chaque rubrique et l'équipement pièce par pièce), du plus susceptible d'être incomplet (rouge) au plus complet (vert). Jamais Moret ni Bastille (déjà bien suivis autrement / pas de vraie activité Guesty).

Diagnostic par logement

Problèmes les plus fréquents

Classement des logements

Résolutions de problématiques

Communications téléphoniques

Appels entrants du standard Zadarma (30 derniers jours) : qui a décroché, durée, appels manqués, écoute et transcription des appels enregistrés. « Actualiser » va chercher les nouveaux appels chez Zadarma (2 à 4 minutes) ; « Recharger » relit seulement la liste. Données en quarantaine : elles ne sont pas encore reliées aux avis, aux tickets ni aux rapports.
Par agent
AgentAppels décrochésDurée moyenneEnregistrésPart des appels décrochés
Appels
DateHeureClientAgentDuréeStatutConversation

Échanges

Historique des vrais messages échangés avec les clients sur les fils Guesty (Airbnb, Booking...). Données en quarantaine : elles ne sont pas encore reliées aux rapports.
Dernier messageLogementClientMessagesAperçu

Client mystère

SIMULATION uniquement — aucun message n'est envoyé à un vrai client. Choisis un logement, écris comme si tu étais un client, et vois ce que le chatbot répondrait. Continue la conversation pour tester plusieurs échanges à la suite.
Chargement…
Chargement…
Chargement…
Chargement…

Fake tickets

Phase de test uniquement : créés quand le chatbot répond en substance "je reviens vers vous avec l'info" (Client mystère ou test sur un fil d'Échanges). Jamais dans le vrai système de Tickets tant que ce comportement n'est pas validé.
DateOrigineLogementMessage clientRaisonStatut
Accès Melvane Review Management

Créer un compte

Lien de connexion

Crée un lien à envoyer à une personne : elle choisit elle-même son prénom, son email et son mot de passe, et n'accède qu'aux rubriques cochées ci-dessous. Le lien ne sert qu'une fois.

Liens en cours

Comptes existants

Prestataires

Prestataires

Les prestataires assignables aux tickets. Chacun peut avoir un compte "Mes tickets" (lien à usage unique : il choisit son email, son mot de passe et renseigne son téléphone pour recevoir le SMS d'affectation) qui ne montre QUE ses propres tickets et leurs codes d'accès — jamais les rubriques admin.

Prestataires existants

Informations techniques

Fiche de reprise en main : ce qu'il faut savoir pour continuer ce projet sans avoir tout redécouvert. Mise à jour manuelle (pas automatique) — pense à la tenir à jour quand l'architecture change.

Vue d'ensemble

Site statique (index.html, un seul fichier, pas de framework) + fonctions serveur Vercel (api/*.js) + base de données Supabase (Postgres/PostgREST + Auth + Storage). Le "pipeline" (pipeline/*.py et *.js) tourne sur GitHub Actions, jamais sur Vercel — c'est lui qui fait le gros travail (synchro Guesty, détection Gemini, classement...), déclenché par des workflows planifiés ou manuels.

⚠️ Branches : le piège main / v3

Tout le développement actif se fait sur la branche v3. La branche main contient une ancienne version (V1), structurellement différente, encore en production sur un autre déploiement Vercel. Ne jamais fusionner v3 dans main sans accord explicite — décision volontaire du propriétaire, le risque de casser la prod est réel (fichiers totalement différents). Le site v3 réel tourne via un déploiement "Preview" Vercel qui suit la branche v3 (URL du type review-git-v3-*.vercel.app), pas via l'environnement "Production".

Piège GitHub Actions : un workflow avec schedule ou workflow_dispatch n'apparaît dans l'onglet Actions QUE s'il existe sur la branche par défaut (main) — même si son job fait ensuite checkout ref: v3 pour exécuter le code v3. Les workflows de ce projet sont donc présents sur les deux branches (le fichier .yml seulement, jamais le code applicatif).

Base de données (Supabase)

Projet Supabase de MRM (id etztqbfoacmeiudiacze, organisation Melvane Pro). Tables principales :

  • reviews, reply_actions, action_resolutions — avis et réponses (cœur historique de l'app)
  • issues_v3 — une ligne par problème détecté (avis + échanges), status = nouveau/en_cours/resolu/ignore ; resolved_on_site = le client dit lui-même que c'est réglé (Gemini)
  • guest_messages — messages Guesty captés par webhook, processed_at = déjà analysés par Gemini ou pas
  • ticket_dispatch — annexe à issues_v3 (jamais de clé étrangère) : catégorie/bloc, intervenant choisi, sent_at/provider_token (affectation réelle), colonnes provider_* (ce que fait le prestataire sur sa fiche, dont provider_planned_slot_start/end = créneau choisi sur le calendrier de disponibilité), colonnes monday_* (confirmation Monday.com)
  • dispatch_providers / dispatch_assignments — liste des intervenants et règles d'affectation par bloc/logement
  • monday_sweepit_items — audit des interventions SweepIt lues sur Monday.com, rapprochées par Gemini
  • monday_snapshots — copie en lecture seule des tableaux Monday (facturation mensuelle, À faire, Prestataires, Réparations, Contacts sans mots de passe, Liens de paiement) pour Tickets > Monday
  • mgb_property_knowledge — cache (partiel, sans les photos) des fiches M.G.B, alimenté par pipeline/sync_mgb_v3.py
  • listing_addresses — adresses structurées par logement (depuis Guesty), utilisées pour les SMS, l'affichage et le calendrier de disponibilité
  • push_subscriptions — abonnements Web Push des comptes prestataires ("Mes tickets" installé + notifications activées), un par navigateur/appareil
  • user_roles — comptes : role (write=admin, read=reste), profile/permissions (droits par rubrique), provider_id (compte prestataire relié à dispatch_providers)
  • invitations — liens d'inscription à usage unique (créés dans Administration → Utilisateurs et codes)
  • guesty_token_cache, webhook_throttle — état technique interne (jetons, anti-rafale)

RLS activée partout ; la plupart des tables annexes n'ont AUCUNE policy — accessibles uniquement via la clé service, jamais depuis le navigateur. Les migrations sont des fichiers pipeline/migration_*.sql exécutés à la main dans l'éditeur SQL Supabase (pas d'outil de migration automatique).

Fonctions serveur (api/*.js)

Limite stricte de 12 fonctions sur le plan Vercel utilisé — ne jamais créer de nouveau fichier dans api/ sans vérifier qu'on est en dessous de la limite ; ajouter une action à une fonction existante à la place (ex. toutes les actions dispatch_* et provider_* vivent dans update-issue.js). Fonctions actuelles : update-issue.js (statuts, affectation, fiche prestataire), guesty-webhook.js (messages entrants), publish-reply.js, refresh-issues.js, trigger-sync.js, sync-status.js, check-reply-status.js, ticket-conversation.js, phone-calls.js, join.js (inscription par lien), admin-users.js, admin-invites.js.

Automatisations (GitHub Actions)

  • sync-reviews.yml — synchro quotidienne des avis (2 horaires, V1)
  • sync-monday-sweepit.yml — toutes les 20 min, rapproche Monday.com ↔ tickets via Gemini
  • backfill-historical-ratings-v3.yml — le "couteau suisse" : un seul workflow, des dizaines d'options via le menu déroulant check_only (détection de tickets, sondes de diagnostic temporaires, resynchronisations manuelles...). Déclenché aussi automatiquement par le webhook Guesty (option issues_messages) à chaque message client/équipe, avec un anti-rafale de 10 min (webhook_throttle).

Beaucoup de "sondes temporaires" (pipeline/probe_*.py) ont été créées pendant ce projet pour vérifier une hypothèse en lecture seule avant de coder — pattern à réutiliser plutôt que de deviner la forme d'une API.

Intégrations externes

  • Guesty (PMS) — OAuth client credentials, jeton mis en cache dans guesty_token_cache (jamais redemandé inutilement). Variables : GUESTY_CLIENT_ID, GUESTY_CLIENT_SECRET.
  • M.G.B (gestion-des-biens.vercel.app) — base de connaissance des logements (codes, clés, équipements, photos). API REST simple, clé MGB_API_KEY. Les photos vivent dans un tableau attachments à part, reliées par entityType/entityId aux clés/équipements — accès API étendu le 2026-09-29 (avant, seulement visible en scrappant la page web).
  • Gemini (Google) — détection des problématiques, classement, rapprochement Monday. Variable GEMINI_KEY. Modèles en rotation, sys.exit(3) volontaire si crédits épuisés (n'efface jamais les messages en attente, ils sont repris au run suivant).
  • Anthropic/Claude — secours du chatbot si Gemini échoue, et bancs d'essai. Variable ANTHROPIC_API_KEY. Chatbot jamais déployé en vrai sans la phrase exacte convenue avec le propriétaire.
  • Zadarma — téléphonie (appels) + SMS de secours aux prestataires (WhatsApp bloqué en attente de vérification Meta). Variables ZADARMA_KEY/ZADARMA_SECRET, SMS_TEST_RECIPIENT, MESSAGING_CHANNEL. Les SMS sont forcés vers un numéro de test sauf si un prestataire a un phone réel sur sa fiche (opt-in explicite, un seul cas en prod pour l'instant).
  • WhatsApp Business (Meta Cloud API) — prêt côté code, jamais activé (vérification d'entreprise Meta en attente).
  • Web Push (notifications navigateur, "Mes tickets") — EN PLUS du SMS, jamais à la place. Variables VAPID_PUBLIC_KEY/VAPID_PRIVATE_KEY/VAPID_SUBJECT (générées une seule fois : les régénérer invalide tous les abonnements existants). lib/push.js + service worker sw.js ; dépendance npm web-push (première du projet, voir package.json à la racine).
  • Monday.com — tableau interne de SweepIt, lu (jamais écrit) pour confirmer qu'une intervention a réellement eu lieu.

Système de tickets — les 3 couches

  1. issues_v3.status (nouveau/en_cours/resolu/ignore) — jamais touché par le reste, historique brut.
  2. État calculé (lib/ticket-state.js, pur, sans écriture) — nouveau/vu/intervention/terminé/écarté, calculé à la lecture à partir de issues_v3 + ticket_dispatch + Monday. Un ticket n'est "terminé" que sur preuve d'action réelle, jamais sur une simple réponse d'équipe.
  3. Affectation (ticket_dispatch) — catégorie, intervenant, envoi (réel ou simulé selon TD_DRY_TEST dans index.html), fiche prestataire (prestataire.html, lien à jeton unique par ticket) et tableau de bord compte (mes-tickets.html, un compte "prestataire" ne voit que ses propres tickets envoyés).

Comptes et accès

Deux rôles de base (write = tout, read = lecture). Au-dessus, un système de droits par rubrique (permissions jsonb) pour les comptes créés par lien d'invitation (Administration → Utilisateurs et codes → Lien de connexion), profils prédéfinis SweepIt/Direction/Personnalisé. Les comptes prestataires sont un profil à part (profile = 'prestataire') : jamais l'app admin, redirigés de force vers mes-tickets.html, ne voient que les tickets reliés à leur dispatch_providers.id.

Limites connues / travaux en cours

  • Pas de dédoublonnage entre plusieurs tickets décrivant le même problème (demandé, pas fait).
  • "Tickets bruts" à renommer en "Log tickets" (demandé, pas fait).
  • WhatsApp Business en attente de vérification Meta — SMS Zadarma en secours.
  • Pipeline Merci Germain (pipeline/merci_germain/) séparé, autonome, piloté en local (pas sur GitHub Actions) — automatise la fiche prestataire Merci Germain, pas branché au reste.
  • Le cache mgb_property_knowledge ne contient jamais les photos (l'API en direct oui, depuis le 2026-09-29) — la fiche prestataire appelle donc M.G.B en direct, pas ce cache, pour les photos.

Où trouver quoi

  • index.html — tout le front (une seule page, recherche par nom de fonction)
  • api/ — fonctions serveur Vercel
  • lib/ — logique pure partagée (testable sans réseau, voir test/)
  • pipeline/ — scripts Python/Node exécutés par GitHub Actions
  • pipeline/migration_*.sql — historique des évolutions de schéma (à exécuter à la main)
  • .github/workflows/ — définitions des automatisations
  • prestataire.html, mes-tickets.html, join.html — pages publiques autonomes (pas dans l'app principale)

Journal IA

Chaque ligne = une tâche IA terminée (analyse d'avis, brouillon de réponse, détection de tickets, rapport...), avec le modèle qui a réellement répondu (Gemini ou Claude, en dernier recours) et l'heure. Demande explicite de Roman : savoir quel modèle a traité quoi, sans avoir à regarder les logs GitHub Actions.
Heure (Paris) Script Tâche Fournisseur Modèle Résultat
⚠️ Publication réelle activée — valider un brouillon l'envoie pour de vrai sur Airbnb ou Booking.com.
Le brouillon est rédigé en anglais (ou en français si l'avis original est en français) — c'est ce texte qui est envoyé. Une traduction française est affichée juste en dessous à titre de contrôle quand la réponse est en anglais.

Réponses automatisées

Historique des réponses

Tickets

La liste se met à jour toute seule (toutes les 20 s) : nouveaux messages clients, réponses de l'équipe. « Actualiser » relance l'analyse complète des avis déjà synchronisés (environ 5 min). Pour importer d'abord les derniers avis de Guesty, utilise « Mettre à jour ».
Date Heure Logement Problématique Source Traité par Statut
Catégorie
Période
Aucune notification n'est envoyée à personne. Un ticket n'est « Terminé » que sur preuve d'une action (Monday, ou une simple réponse pour Ménage/Relation client) — voir la chronologie sur chaque fiche. Choisissez un intervenant et cliquez « Affecter » (ou cochez plusieurs fiches et utilisez « Affecter (N) » en haut) : possible sur n'importe quel ticket, même déjà traité. Les « Tickets bruts » ne sont pas modifiés.

Clos

Tickets clos : fermés à la main avec « Clore », réglés sur place, terminés dans M.G.B ou ignorés. Un ticket clos peut être rouvert : il revient dans À dispatcher.

En cours

Tickets affectés à un intervenant et pas encore clos, tous prestataires confondus, plus les demandes de facture en attente d'envoi. Dès qu'un ticket est clos, il passe dans Clos.

Logs email

Tous les e-mails envoyés par MRM : à qui, quand, par qui, de quel type et s'ils sont bien partis (échecs et tests compris). Les envois « Remontées Admin » d'avant la création du journal sont reconstitués depuis l'historique des tickets.