Connecter Moodle à CertLister
Temps de lecture : 10 minutes
Forfait requis : Pro (les chemins A et B utilisent les intégrations API & Webhooks) · Tous les forfaits pour le chemin C
Moodle est l'une des plateformes d'apprentissage (LMS) les plus utilisées au monde — et l'une des questions qu'on nous pose le plus souvent est : « CertLister peut-il émettre une attestation automatiquement quand un apprenant termine un cours Moodle ? »
Oui. Moodle n'envoie pas de webhooks nativement, mais il existe trois façons fiables de le connecter à CertLister. Ce guide les présente toutes les trois, de la plus automatique à la plus manuelle.
Quel chemin choisir ?
| Chemin A — Plugin Event Trigger | Chemin B — Script d'interrogation | Chemin C — Export CSV | |
|---|---|---|---|
| Émission en temps réel | ✅ Instantanée | ⚠️ Quasi temps réel (intervalle d'interrogation) | ❌ Manuelle |
| Code requis | ❌ Aucun | ✅ Un petit script | ❌ Aucun |
| Plugin Moodle requis | ✅ Oui (Event Trigger) | ❌ Non | ❌ Non |
| Compatible MoodleCloud | ❌ Non (installation de plugins impossible) | ✅ Oui | ✅ Oui |
| Accès Moodle nécessaire | Administrateur du site | Administrateur du site (configuration des services web) | Enseignant/gestionnaire |
| Forfait CertLister | Pro | Pro | Tous |
Notre recommandation : si vous hébergez votre propre Moodle (ou si votre hébergeur peut installer des plugins), utilisez le chemin A — temps réel, sans code, environ 20 minutes de configuration. Si vous êtes sur MoodleCloud ou ne pouvez pas installer de plugins, utilisez le chemin B si vous disposez d'un développeur, ou le chemin C sinon.
Chemin A — Plugin Event Trigger + Webhook entrant (recommandé)
Dans cette configuration, le plugin gratuit Event Trigger (tool_trigger, maintenu par Catalyst IT) surveille l'événement Cours terminé dans Moodle et envoie une requête HTTP POST vers un webhook entrant CertLister. CertLister crée l'attestation — et peut l'envoyer par courriel à l'apprenant — dès que le cours est terminé.
Cours Moodle terminé → Workflow Event Trigger → HTTP POST → Webhook CertLister → Attestation émise → Courriel envoyé
Étape 1 — Créer le webhook entrant dans CertLister
- Dans CertLister, allez dans Intégrations → onglet Webhooks
- Cliquez sur Créer un webhook
- Remplissez :
- Nom — p. ex. « Complétions de cours Moodle »
- Mode — Créer (crée automatiquement une attestation à partir des données reçues)
- Catégorie — la catégorie dans laquelle classer les nouvelles attestations
- Design — choisissez éventuellement un design enregistré pour appliquer votre modèle
- Envoyer le courriel — activez pour envoyer automatiquement son attestation à chaque apprenant
- Configurez les correspondances de champs — associez les champs JSON envoyés par Moodle aux champs de l'attestation :
| Champ de l'attestation | Chemin JSON |
|---|---|
recipient_name | recipient_name |
recipient_email | recipient_email |
title | title |
(Ces champs correspondent au corps JSON que vous construirez dans Moodle à l'étape 3. Vous pouvez ajouter d'autres correspondances pour des attributs personnalisés — voir Ajouter plus de données ci-dessous.)
- Cliquez sur Créer, puis copiez l'URL du webhook. Elle ressemble à :
https://app.certlister.com/api/v1/hooks/votre-jeton-de-point-de-terminaison
Gardez cette URL secrète. Le jeton contenu dans l'URL est ce qui autorise les requêtes. Toute personne disposant de l'URL peut créer des attestations dans votre compte — traitez-la comme un mot de passe, et régénérez-la depuis la carte du point de terminaison en cas de fuite.
Étape 2 — Installer le plugin Event Trigger dans Moodle
- Dans Moodle, allez dans Administration du site → Plugins → Installer des plugins
- Recherchez Event Trigger (
tool_trigger) dans le répertoire de plugins, ou téléversez le ZIP depuis la page du plugin - Terminez l'installation et la mise à niveau
Remarque : l'installation de plugins nécessite un accès administrateur du site et n'est pas possible sur MoodleCloud. Dans ce cas, passez au chemin B ou au chemin C.
Étape 3 — Créer le workflow dans Moodle
- Allez dans Administration du site → Serveur → Event Trigger
- Cliquez sur Ajouter un workflow et remplissez :
- Nom — p. ex. « Envoyer les complétions à CertLister »
- Événement — recherchez et sélectionnez Cours terminé (
\core\event\course_completed) - Actif — laissez désactivé pour l'instant ; vous l'activerez après le test
- Ajoutez les étapes du workflow, dans cet ordre :
Étape 3a — Recherche d'utilisateur (User lookup). L'événement brut ne contient que l'identifiant numérique userid de l'apprenant. Ajoutez une étape User lookup (lisant le champ relateduserid — pour les complétions de cours, c'est l'apprenant) afin que le workflow dispose de champs comme {user_fullname} et {user_email}.
Étape 3b — Recherche de cours (Course lookup). Même principe pour le cours : ajoutez une étape Course lookup lisant le champ courseid, ce qui ajoute {course_fullname} et {course_shortname}.
Étape 3c — Action HTTP POST. Ajoutez une étape d'action HTTP POST :
- URL — l'URL de votre webhook CertLister de l'étape 1
- En-têtes HTTP :
Content-Type: application/json
- Paramètres HTTP (corps) :
{
"recipient_name": "{user_fullname}",
"recipient_email": "{user_email}",
"title": "{course_fullname}"
}
Les {placeholders} sont remplacés par les vraies valeurs issues des étapes de recherche au déclenchement du workflow.
- Enregistrez le workflow.
Astuce — Mode apprentissage : si vous ne savez pas quels champs de données sont disponibles, activez le Learning mode du workflow, terminez un cours de test une fois, et Event Trigger enregistrera l'événement en vous montrant tous les champs utilisables comme placeholders.
Étape 4 — Tester de bout en bout
- Dans Moodle, inscrivez un utilisateur de test à un cours dont les critères d'achèvement sont configurés (Cours → paramètres d'Achèvement de cours — l'achèvement doit être activé, sinon l'événement ne se déclenche jamais)
- Terminez le cours avec l'utilisateur de test (ou marquez-le comme terminé manuellement en tant qu'enseignant)
- Moodle déclenche l'événement en une minute ou deux (les workflows s'exécutent via le cron de Moodle — vérifiez que le cron tourne)
- Dans CertLister, allez dans Intégrations → Webhooks et ouvrez les journaux du point de terminaison — vous devriez voir la requête, sa charge utile et le résultat
- Vérifiez votre page Attestations : la nouvelle attestation doit s'y trouver, et si Envoyer le courriel est activé, l'apprenant l'a reçue
Une fois le test réussi, passez le workflow Moodle en Actif. Chaque complétion de cours émet désormais une attestation automatiquement.
Ajouter plus de données depuis Moodle
Vous voulez le nom court du cours ou d'autres champs sur l'attestation ? Ajoutez-les au corps JSON dans Moodle :
{
"recipient_name": "{user_fullname}",
"recipient_email": "{user_email}",
"title": "{course_fullname}",
"course_code": "{course_shortname}"
}
Puis associez course_code à un attribut personnalisé dans les correspondances de champs CertLister. Les attributs personnalisés peuvent être imprimés sur le design de l'attestation et affichés sur la page de vérification — voir Attributs personnalisés.
Vous pouvez laisser issue_date sans correspondance — CertLister date l'attestation au moment de sa création, ce qui, pour un webhook en temps réel, correspond à la date de complétion.
Un cours, un type d'attestation
Un point de terminaison webhook a une seule catégorie et un seul design. Si différents cours Moodle doivent émettre des attestations différentes :
- Créez un webhook CertLister par cours (ou par type d'attestation), chacun avec sa catégorie et son design
- Dans Moodle, créez un workflow par cours, en ajoutant une étape de filtre sur
courseidpour que chaque workflow ne se déclenche que pour son cours, et pointez chacun vers l'URL de webhook correspondante
Pour quelques cours, c'est rapide ; pour de grands catalogues, préférez le chemin B, où un script peut router dynamiquement.
Chemin B — Script d'interrogation via les services web Moodle
Si vous ne pouvez pas installer de plugins Moodle (p. ex. MoodleCloud), un petit script peut interroger l'API de services web intégrée de Moodle pour détecter les complétions et créer les attestations via l'API REST de CertLister. C'est du quasi temps réel — aussi frais que votre intervalle d'interrogation.
Cron/planificateur → Services web Moodle (complétions) → API REST CertLister → Attestation émise
Étape 1 — Activer les services web dans Moodle
Dans Moodle, en tant qu'administrateur du site :
- Administration du site → Général → Fonctions avancées → activez Services web
- Administration du site → Serveur → Services web → Gérer les protocoles → activez REST
- Services web → Services externes → ajoutez un service personnalisé et ajoutez-y ces fonctions :
core_enrol_get_enrolled_users— lister les apprenants d'un courscore_completion_get_course_completion_status— vérifier la complétion d'un apprenant
- Créez un utilisateur Moodle dédié à l'intégration, donnez-lui un rôle avec uniquement les capacités requises par ces fonctions, et autorisez-le pour votre service
- Services web → Gérer les jetons → créez un jeton pour cet utilisateur
La documentation des services web de Moodle détaille chaque écran.
Étape 2 — Créer une clé API CertLister
- Dans CertLister, allez dans Intégrations → onglet Clés API
- Cliquez sur Créer une clé API, nommez-la (p. ex. « Synchro Moodle ») et donnez-lui les portées
credentials:readetcredentials:write - Copiez la clé (
cl_live_...) — elle n'est affichée qu'une seule fois
Étape 3 — Exécuter un script d'interrogation
Le script ci-dessous vérifie un cours Moodle et émet une attestation à toute personne l'ayant terminé et n'en ayant pas encore. Exécutez-le sur un planificateur (cron, GitHub Actions, Cloud Scheduler — toutes les 15 minutes fonctionne bien).
// moodle-sync.js — Node.js 18+
const MOODLE_URL = "https://votre-site-moodle.example.com";
const MOODLE_TOKEN = "votre-jeton-services-web";
const COURSE_ID = 42; // identifiant du cours Moodle
const COURSE_NAME = "Formation Sécurité au travail";
const CERTLISTER_KEY = "cl_live_votre_cle_api";
const CERTLISTER_API = "https://app.certlister.com/api/v1/external";
async function moodle(wsfunction, params) {
const query = new URLSearchParams({
wstoken: MOODLE_TOKEN,
wsfunction,
moodlewsrestformat: "json",
...params,
});
const res = await fetch(`${MOODLE_URL}/webservice/rest/server.php?${query}`);
return res.json();
}
async function certlister(path, options = {}) {
const res = await fetch(`${CERTLISTER_API}${path}`, {
...options,
headers: {
Authorization: `Bearer ${CERTLISTER_KEY}`,
"Content-Type": "application/json",
...options.headers,
},
});
return res.json();
}
async function main() {
const users = await moodle("core_enrol_get_enrolled_users", {
courseid: COURSE_ID,
});
for (const user of users) {
const status = await moodle("core_completion_get_course_completion_status", {
courseid: COURSE_ID,
userid: user.id,
});
if (!status.completionstatus?.completed) continue;
// Ignorer les apprenants qui ont déjà cette attestation
const existing = await certlister(
`/credentials?search=${encodeURIComponent(user.email)}`
);
const alreadyIssued = (existing.data || []).some(
(c) => c.title === COURSE_NAME && c.recipient_email === user.email
);
if (alreadyIssued) continue;
await certlister("/credentials", {
method: "POST",
body: JSON.stringify({
recipient_name: user.fullname,
recipient_email: user.email,
title: COURSE_NAME,
send_email: true,
}),
});
console.log(`Attestation émise pour ${user.fullname}`);
}
}
main();
Adaptez selon vos besoins : bouclez sur plusieurs cours, définissez category_id et design_id par cours (listez-les via GET /external/categories et GET /external/designs), ou ajoutez des custom_attributes. La référence complète des points de terminaison se trouve dans Intégrations API & Webhooks.
Chemin C — Export CSV + Import en masse
Sans plugin, sans code, fonctionne partout — y compris sur MoodleCloud. Idéal pour émettre les attestations à la fin d'une session de cours plutôt qu'en continu.
- Dans Moodle, ouvrez le cours et allez dans le rapport d'achèvement de cours (Rapports → Achèvement de cours) — ou le carnet de notes — et téléchargez le rapport en CSV
- Dans un tableur, conservez les colonnes utiles : nom de l'apprenant, courriel et date d'achèvement
- Dans CertLister, allez dans Attestations → Importer et téléversez le CSV, en associant les colonnes aux champs des attestations
- Vérifiez et confirmez — CertLister crée les attestations et peut les envoyer par courriel en masse
Guide complet : Import en masse d'attestations.
Bon à savoir
Limites de débit. Les webhooks entrants acceptent 30 requêtes par minute par point de terminaison, et l'API REST autorise 100 requêtes par minute par clé. Les complétions de cours normales n'approchent jamais ces limites — mais si vous marquez en masse une grande cohorte comme terminée dans Moodle, Event Trigger peut déclencher des centaines de webhooks d'un coup et certains seront rejetés avec un code 429. Pour les grosses opérations par lots, préférez le chemin B (le script se régule) ou le chemin C.
Protection contre les doublons. En mode « Créer », le webhook crée une attestation pour chaque requête reçue. Moodle ne déclenche Cours terminé qu'une fois par apprenant et par cours, donc les doublons sont rares en pratique — mais si vous rejouez des complétions (p. ex. en réinitialisant puis re-terminant un cours), vérifiez les journaux du webhook et votre liste d'attestations.
L'achèvement doit être configuré. L'événement Cours terminé ne se déclenche que pour les cours dont les critères d'achèvement sont activés dans Moodle (Cours → paramètres d'achèvement de cours). Si aucun webhook n'arrive, c'est la première chose à vérifier — puis confirmez que le cron de Moodle tourne, car les workflows Event Trigger s'exécutent via le cron.
Vérification des attestations. Chaque attestation émise depuis Moodle bénéficie de la même page de vérification, du même code QR et du même accès au portail des titulaires que toute autre attestation CertLister — voir Portail des titulaires.
Dépannage
| Symptôme | Cause probable | Solution |
|---|---|---|
| Rien n'arrive dans CertLister | Achèvement de cours non activé, ou cron Moodle arrêté | Activez les critères d'achèvement ; vérifiez Administration du site → Serveur → Tâches |
Le journal du webhook affiche une erreur de correspondance 400 | Les champs du corps JSON ne correspondent pas à vos correspondances de champs | Comparez la charge utile journalisée aux correspondances ; les fautes de frappe dans les placeholders comme {user_fullname } (espace parasite) sont fréquentes |
Le journal du webhook affiche 401 | Jeton de point de terminaison erroné ou régénéré dans l'URL | Copiez l'URL actuelle du webhook depuis la carte du point de terminaison dans le workflow Moodle |
| Attestation créée mais aucun courriel | Bascule Envoyer le courriel désactivée, ou apprenant sans courriel dans Moodle | Activez la bascule ; confirmez que {user_email} est résolu (vérifiez le profil Moodle) |
Erreurs 429 lors de complétions en masse | Limite de débit (30/min par point de terminaison) | Espacez le marquage en masse, ou utilisez le chemin B/C pour les lots |
Le service web Moodle renvoie invalidtoken | Jeton expiré ou service non autorisé pour l'utilisateur | Recréez le jeton dans Gérer les jetons ; confirmez que l'utilisateur est autorisé pour le service |
Articles connexes
- Intégrations API & Webhooks — référence complète de l'API REST et des webhooks
- Automatisations de workflow — déclenchez des courriels et des actions à l'émission d'attestations
- Import en masse d'attestations — le pipeline d'import CSV utilisé au chemin C
- Attributs personnalisés — imprimez les données de cours Moodle sur vos attestations