Emacs en CRM

Utiliser emacs comme CRM

Il existe une multitude d’outils et méthodes pour gérer son quotidien, professionnel ou personnel.

Un CRM, n’est qu’un logiciel orienté client. Souvent, ils sont en ligne, utilisent des BDD, revendiquent des KANBAN pour faciliter la vue et le suivi, certains poussent le vice à ajouter des boutons pour appeler directement le contact etc… avec en plus des tableaux de bord orienté CA ou mesure de la performance. Chose que l’on fait bien mieux avec des outils adaptés à générer des graphiques, des alertes comme grafana.

A force d’utiliser emacs et org-roam en particulier pour gérer mes notes, j’ai fini par mettre au point un wokflow et une configuration de travail qui me permet :

  • d’avoir une fiche complète de mes clients et prospects;
  • d’avoir un suivi de ce que j’ai à faire;
  • d’avoir une vue sur ce que j’ai fais la semaine précédente;
  • de filtrer les actions à faire ou en cours relativent à un client ou un prospect ou même personnel.

L’an passé, j’avais fait un premier article sur mon workflow.

Depuis j’ai apporté pas mal de modifications, et j’ai appris beaucoup de choses.

Il était donc temps pour moi d’affiner certaines pratiques, et de coucher dans un nouvel article mes nouvelles habitudes de travail.

Les tags

Les tags sont au centre de ma configuration actuelle.

Vous pouvez définir des tags qui s’excluent et des tags qui peuvent fonctionner ensemble.

Par exemple avoir un tag prospect et un tag réunion, c’est cumulable.

Avoir un tag client1 et un tag client2 non cumulable.

Les tags vous permettront de filtrer les en cours ou les choses à faire, planifiées ou non.

La liste des tags n’a pas besoins d’être figée, elle va vivre tout au long de vos activités.

Exemple de déclaration de tags :

1
2
3
4
5
6
7
setq org-tag-alist '(
                      (:startgroup . nil)
                      ("@CLIENT1" . ?n)
                      ("@CLIENT2" . ?a)                   
                      (:endgroup . nil)
                      ;; TYPE
                      ("DEVIS" . ?d) ("TACHE" . ?t) ("COPIL" . ?C) ("CLIENT" . ?c)("PROSPECT" . ?o) ("PERSO" . ?z))

org-roam

org-roam est un mode emacs qui vient “compléter” org-mode.

Il enregistre la référence à chaque fiche dans une base sqlite, ce qui permet de faire des liens entre les fiches.

Une fiche peut-être un fichier seul ou à l’intérieur d’un fichier avec d’autres fiches.

Un des gros avantages, c’est la commande org-roam-node-find qui permet de retrouver une fiche ou de la créer si elle existe pas.

J’utilise org-roam depuis deux ans, j’ai donc tout un tas de notes existantes.

L’autre avantage, c’est que lors de la création d’une nouvelle fiche, on peut sélectionner le template à utiliser.

J’ai ainsi créé un template type pour un nouveau client.

template org-roam

Lorsque l’on utilise org-roam-capture-templates si on fait un seul template, c’est le nouveau template par defaut qui sera appliqué à chaque fois.

J’ai donc créé 2 template, un template standard et un template pour les nouveaux clients.

1
2
3
4
5
6
7
8
9
(org-roam-capture-templates
    '(("d" "default" plain "%?"
       :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
       :unnarrowed t)
      ("c" "Nouveau client" plain "%?"
       :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n* Client :CLIENT:\n** Synthèse\n** Facturation\n** COPIL :COPIL:\n** Taches :TACHE:\n")
       :unnarrowed t)
	  )
)

Dans le block ci-dessus, le template default recrée le template habituel de création d’une nouvelle note.

Le second template Nouveau client créer une fiche type pour un nouveau client, en fonction de ce que je souhaite avoir comme suivi.

J’ai intégré les tags COPIL et TACHE car je vais en avoir besoins pour le filtrage des activités à suivre.

Vous l’aurez donc compris ici, il est relativement facile de se créer des templates adaptés à vos besoins.

Envoyer un compte rendu par mail

Lorsque je débute une réunion, j’ouvre la fiche client. Dans la section COPIL je mets toutes mes réunions, ça donne ça :

1
2
3
** COPIL                                         :COPIL:
*** COPIL du [2025-02-06 jeu.] ...
*** COPIL du [2025-03-03 jeu.] ...

Quand je préside une nouvelle réunion, je crée un nouveau subtree en date du jour, et je fais mon compte rendu.

En fin de réunion, j’ai plus qu’à envoyer mon compte rendu par mail.

J’utilise pour ça org-mime

1
2
(use-package org-mime
  :ensure t)

et pour la partie smtp :

1
2
3
4
5
6
7
;; smtp
(setq smtpmail-smtp-server "smtp.mondomaine.fr"  ; Serveur SMTP (ex: smtp.gmail.com)
      smtpmail-smtp-service 587                ; Port (587 pour STARTTLS, 465 pour SSL)
      smtpmail-stream-type 'starttls           ; Type de chiffrement (starttls ou ssl)
      smtpmail-auth-credentials "~/.authinfo.gpg" ; Fichier d'authentification sécurisé
      send-mail-function 'smtpmail-send-it
      smtpmail-default-smtp-server "smtp.mondomaine.fr")

Pour envoyer le subtree par mail, il me suffit alors d’exécuter la commande org-mime-org-subtree-htmlize qui va transformer le subtree en une “page” indépendante à mon fichier org avec les items mails suivants :

1
2
3
To:
Subject: COPIL Firewall
From: Alexandre  <alexandre@mondomaine.fr>

Il me reste alors à ajouter les adresses des destinataires, éventuellement une ligne avec CC: et d’envoyer le tout via C-c C-c.

Tout le reste du texte qui était au format org-mode à été transformé en html.

Quid des actions immédiates à noter (appel téléphonique, idée Etc…) ?

Pour répondre à ce besoins, j’ai un fichier backlog.org et pour le compléter j’utilise org-capture

org-capture permet d’enregistrer rapidement une tache et d’y revenir plus tard.

Ainsi quand le téléphone sonne ou que démarre un point imprévu, ou que j’ai une nouvelle idée, j’appel org-capture je prends mes notes, j’enregistre et je retourne à mon travail.

En fin de journée, je fais une passe et je déplace éventuellements les notes dans la bonne fiche.

1
2
3
4
5
setq org-capture-templates
      '(("t" "TODO backlog.org" entry
         (file+headline "~/Nextcloud/notes/backlog.org" "A Faire")
         "* TODO [#B] %? \n:Created: %T\n"
         :empty-lines 0))

Pour déplacer une tache ainsi créée dans un autre fichier, j’utilise les commandes de bases d’emacs à savoir : C-c C-x C-w pour couper le subtree complet, j’ouvre la note de destination et je colle avec C-y

org-agenda : le suivis

J’ai donc des fiches, et différents tags. Pour assurer un suivis efficace, rien de mieux qu’org-agenda.

Lorsque j’appel org-agenda, outres les fonctionnalités habituelles (affichage des todo, des taches planifiées etc…) il y a la possibilité d’afficher/trier en fonction des tags, ou selon une date de référence.

J’ai donc :

  • Tâches terminées et en cours de la semaine précédente
  • Toutes les taches en status TODO et En cours
  • Toutes les taches en status TODO et En cours pour un prospect
  • Toutes les taches en status TODO et En cours pour un client en particulier (par exemple lors de grosses phases projets)
  • Les taches perso etc…

Exemple du code pour customiser l’agenda :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(setq org-agenda-custom-commands
      '(
        ;; Vue pour les tâches avec le tag PROSPECT
        ("p" "Taches avec le tag: PROSPECT"
         tags-todo "+PROSPECT"
         ((org-agenda-overriding-header "Taches avec le tag PROSPECT")))
        ("A" "Taches avec le tag: Client1"
         tags-todo "+@CLIENT1"
         ((org-agenda-overriding-header " Suivi des actions en cours pour Client1")
          (org-agenda-sorting-strategy '(priority-down))
          ))
        ("c" "Taches avec le tag: CLIENT"
         tags-todo "+CLIENT"
         ((org-agenda-overriding-header "Taches avec le tag CLIENT")))
        ("t" "Taches avec le tag: TACHE"
         tags-todo "+TACHE"
         ((org-agenda-overriding-header "Taches avec le tag TACHE")))
        ("z" "Taches avec le tag: PERSO"
         tags-todo "+PERSO"
         ((org-agenda-overriding-header "Taches avec le tag PERSO")))
        ("w" "Semaine précédente"
          ((agenda "" ((org-agenda-span 7)
                      (org-agenda-start-on-weekday 1)
                      (org-agenda-start-day "-7d")
                      (org-agenda-show-log t)
                      (org-agenda-log-mode-items '(closed state)))))
         ((org-agenda-overriding-header "Tâches terminées et en cours de la semaine précédente")))
          ))

Pour aller plus loin

Vous pouvez facilement ajouter les fonctionnalités org-clock pour mesurer le temps passer sur chaque client/tache et avoir un tableau de suivi des temps synthétique.

Au delà de org-mode, vous pouvez ajouter de l’IA (pour du contenu, de la correction ortho etc..)

Vous pouvez surtout adapter ce workflow très très facilement, car ça reste souple.

Généré avec Hugo
Thème Stack conçu par Jimmy