Exécution commerciale
Garder la prochaine action à portée du contact.
Au départ…
Les conseillers passent des fiches contacts aux relances, rendez-vous et messages. À chaque changement d’outil, il faut parfois retrouver le même contexte.
Ce que nous avons construit
Un espace Airtable qui réunit contacts, tâches, agenda et outils de communication, avec un contexte par campus ou activité et des modèles partagés.
Entrez dans l’outil
Écran 1 sur 6Contexte de travail
Sélectionner le périmètre opérationnel utile.
Ce que nous voulons changer
Rendre la prochaine action plus facile à trouver et permettre à l’équipe de réutiliser ses modèles et son historique d’activité.
Comment c’est construitModèle de données, code, contrôles et autonomie des équipes
Parcours utilisateur
- 01
Choisir un contexte et retrouver le contact ou l’activité.
- 02
Ouvrir l’outil de tâche, rendez-vous ou communication utile.
- 03
Conserver configuration commune et historique auprès des données opérationnelles.
Structure de la base
| Entité / table | Champs clés | Relations |
|---|---|---|
| Contacts | Identité · coordonnées · contexte de formation | Les contacts sont reliés aux activités et relances |
| Actions | Date · type · destinataire · statut | Historique d’activité partagé |
| Modèles | Type de communication · contenu | Contenus de messages réutilisables |
| Configuration | Clé · valeur JSON | Sélections, profils et mappings sauvegardés |
Implémentation technique
- Les modules React et fenêtres se chargent à la demande ; la recherche temporisée limite les calculs pendant la frappe.
- Un service dédié normalise les numéros de téléphone.
- Configuration, filtrage et sélections sauvegardées disposent de fonctions et hooks distincts.
Décision d’ingénierie
Garder un espace volumineux réactif pendant son rendu
Adapté du rendu progressif du CRM. Une première tranche apparaît immédiatement ; les suivantes sont planifiées entre les images du navigateur, avec nettoyage au changement de vue. Cela réduit la charge de rendu, pas le transfert Airtable : useRecords charge encore la source. La tranche utilise les enregistrements courants et une progression propre à la vue.
import { useEffect, useState } from "react";import { useRecords } from "@airtable/blocks/interface/ui";export function useProgressiveRecords(view) { const records = useRecords(view); const [progress, setProgress] = useState({ viewId: view.id, count: 100 }); const count = progress.viewId === view.id ? progress.count : 100; useEffect(() => { let cancelled = false; let frame; let timer; let visible = Math.min(count, records.length); const advance = () => { timer = setTimeout(() => { frame = requestAnimationFrame(() => { if (cancelled) return; visible = Math.min(visible + 500, records.length); setProgress({ viewId: view.id, count: visible }); if (visible < records.length) advance(); }); }, 100); }; if (visible < records.length) advance(); return () => { cancelled = true; clearTimeout(timer); cancelAnimationFrame(frame); }; }, [view.id, records.length, count]); return { records: records.slice(0, count), complete: count >= records.length, total: records.length, };}Extrait adapté de l’implémentation
Contrôles et limites
- Les filtres campus et activité sont un contexte de navigation, pas une frontière d’autorisation.
- Les communications externes demandent une sélection maîtrisée des destinataires et un circuit d’envoi revu. Aucun message n’a été envoyé pendant cet examen.
Qui peut contribuer
- Conseillers : travailler dans les interfaces contacts, tâches et calendrier.
- Builders : entretenir modèles, profils et mappings de champs.
- Développeurs : faire évoluer modules et intégrations dans un dépôt versionné.
Ce qui documente ce cas
Le guide natif, le sélecteur de contexte et le bureau personnalisé ont été ouverts. Le dépôt décrit l’interface modulaire et sa configuration commune.