Connecteurs Manifst
Reliez Manifst à vos outils de développement pour synchroniser automatiquement vos tickets avec votre activité Git et recevoir des notifications dans Slack.
Vue d'ensemble
Les connecteurs sont configurés par projet depuis Paramètres → Intégrations. Seuls les owners du projet peuvent créer ou modifier des connecteurs.
Qui a accès
Un abonnement ouvre des capacités au compte, jamais au projet. Être invité sur le projet d'un abonné payant n'ouvre donc aucun droit sur ses connecteurs : chaque membre est évalué sur son propre plan.
| Membre du projet | Ce qu'il peut faire |
|---|---|
| Plan Team ou supérieur | Voir les liens Git sur les fiches, déclencher une synchronisation Jira, analyser une réunion Meet. La configuration reste réservée aux owners du projet. |
| Plan Starter | Ne voit ni le bloc Développement, ni les pastilles de commits et de pull requests, et ne peut pas piloter les connecteurs — même si le projet en a d'actifs. |
En revanche, le travail de ce membre continue d'alimenter les connecteurs : ses commits sont rattachés aux tickets, ses modifications partent dans Jira, ses actions déclenchent les notifications. Le titulaire de l'abonnement a payé pour une vue complète de la livraison de son projet — la contribution d'un coéquipier n'en est pas retirée, elle lui reste simplement invisible.
| Connecteur | Direction | Usage principal |
|---|---|---|
| GitHub | GitHub → Manifst | Lier commits & PRs aux tickets, fermeture automatique sur merge |
| GitLab | GitLab → Manifst | Lier commits & merge requests aux tickets, fermeture automatique sur merge |
| Slack | Manifst → Slack | Notifications temps-réel sur les changements de statut, sprints, commentaires |
| Discord | Manifst → Discord | Notifications embed dans un canal Discord via Incoming Webhook |
| Power BI / API REST | Manifst → Power BI | Piloter et consolider vos données (EVM, coûts, backlog, roadmap) dans un rapport BI via l'API v1 |
GitHub
Liez automatiquement commits et pull requests à vos tickets via des références dans les messages.
Configuration
- Dans Manifst, ouvrez Paramètres → Intégrations → GitHub → Configurer.
- Copiez la clé secrète affichée (visible une seule fois).
- Dans GitHub, ouvrez votre dépôt → Settings → Webhooks → Add webhook.
- Payload URL : l'URL affichée dans Manifst après enregistrement
- Content type :
application/jsonobligatoire - Secret : la clé secrète copiée à l'étape 2
- Events : Pushes + Pull requests
- Cliquez Add webhook. GitHub envoie un événement
ping— Manifst répond{"ok":true}. - Content type :
application/json
Push — Lier un commit à une ticket
Incluez une référence #<PRÉFIXE>-<id> dans le message de commit pour lier automatiquement le commit à l'élément correspondant.
#<PRÉFIXE>-<id numérique>
Le préfixe est celui affiché devant l'élément dans Manifst. Tous les types de tickets du projet sont reconnus — pas seulement US — ainsi que les deux niveaux de la roadmap :
| Préfixe | Cible |
|---|---|
#US-42, #BG-7, … | Un ticket, selon les abréviations définies dans Paramètres → Types de tickets |
#EP-12 | Un Epic |
#SE-3 | Un Super Epic |
#US-42 ne rattache rien si l'élément 42 est un bug affiché BG-42. Les références non résolues sont visibles dans le journal des livraisons, elles ne sont pas rattachées au hasard.
git commit -m "fix: correction du formulaire de connexion #US-42"
git commit -m "feat: ajout pagination #US-17 #US-18"
git commit -m "fix: crash au démarrage #BG-7"
Plusieurs références dans le même commit sont supportées.
Nom de branche
Le nom de la branche est également analysé, sans croisillon : nul besoin de discipline sur les messages de commit si la convention de nommage porte déjà la référence.
git checkout -b feature/US-42-formulaire-connexion
git checkout -b hotfix/BG-7
La branche apparaît alors dans le bloc Développement de la fiche, aux côtés des commits et des pull requests.
| Champ enregistré | Source |
|---|---|
| SHA du commit | commit.id |
| Message | commit.message (500 car. max) |
| URL | commit.url |
| Auteur | commit.author.name |
| Branche | ref |
Pull Requests
Mentionnez un ou plusieurs éléments dans le titre ou la description de la PR, avec la même syntaxe que pour les commits. La branche source de la PR est analysée en plus : une PR issue de feature/US-42-… est rattachée même sans mention explicite.
Les verbes de fermeture de GitHub (fix, fixes, close, closes, resolve, resolves…) placés devant une référence sont reconnus et enregistrés comme intention de fermeture.
## Changements
Implémentation du formulaire de profil utilisateur.
Closes #US-15 #US-23
Le statut du lien dans Manifst est mis à jour à chaque changement d'état de la PR :
| Action GitHub | Statut Manifst |
|---|---|
opened, reopened, synchronize, edited | open (ou draft si la PR est en brouillon) |
converted_to_draft | draft |
ready_for_review | open |
closed (non mergée) | closed |
closed (mergée) | merged |
#US-42 de la description retire le lien correspondant. Un lien ayant déjà déclenché une fermeture automatique est conservé, pour ne pas effacer la trace de ce qui a changé le statut.
Auto-close des stories sur merge
Quand une PR est mergée, Manifst peut automatiquement déplacer les tickets liées vers une colonne "Done".
Pour activer cette fonctionnalité :
- Dans Paramètres → Intégrations → GitHub, activez Fermer automatiquement les stories à la merge.
- Sélectionnez la colonne de destination dans la liste déroulante (colonnes de type "done" de votre Kanban).
- Enregistrez. Toute PR mergée référençant un ticket déplacera les tickets concernés, quel que soit leur préfixe.
#EP- ou #SE- est bien rattaché à la PR, mais son statut n'est jamais modifié : ces deux niveaux ne sont pas pilotés par les colonnes du Kanban.
Une seule fois, au moment du merge
La fermeture se déclenche sur l'événement qui acte le merge, pas sur l'état « mergée ». Concrètement, si vous rouvrez un ticket à la main après coup, corriger ensuite le titre ou la description de la PR ne le refermera pas. Une décision humaine n'est jamais écrasée par une modification de texte sur GitHub.
Un ticket fermé automatiquement porte la mention « fermé automatiquement » sous le lien correspondant, dans le bloc Développement de sa fiche.
GitLab
Mêmes rattachements que GitHub, appliqués aux merge requests. Les deux connecteurs peuvent coexister sur un même projet.
Configuration
- Dans Manifst, ouvrez Paramètres → Intégrations → GitLab → Configurer.
- Copiez le jeton affiché (visible une seule fois).
- Dans GitLab, ouvrez votre projet → Settings → Webhooks → Add new webhook.
- URL : celle affichée dans Manifst après enregistrement.
- Secret token : le jeton copié à l'étape 2.
- Trigger : Push events + Merge request events.
- Laissez Enable SSL verification coché, puis Add webhook.
Références
La syntaxe est identique à GitHub : #<PRÉFIXE>-<id> dans un message de commit, le nom de la branche analysé sans croisillon, et les verbes de fermeture reconnus. Reportez-vous à la section GitHub pour le détail — le moteur d'analyse est le même code.
| GitHub | GitLab |
|---|---|
| Pull request | Merge request — numérotée !42 dans l'interface |
Événement pull_request | Merge request events |
En-tête X-Hub-Signature-256 | En-tête X-Gitlab-Token |
Content type: application/json à choisir | Toujours JSON, rien à régler |
iid, celui de l'URL et du !42), pas son identifiant interne à l'instance. Les liens pointent donc bien sur la MR que vous voyez.
Dépôts privés et instances auto-hébergées
Le connecteur est entrant : c'est GitLab qui appelle Manifst. Un dépôt privé fonctionne donc exactement comme un dépôt public — aucun jeton d'accès au dépôt n'est nécessaire, Manifst ne lit jamais votre code.
Une instance auto-hébergée fonctionne également, à une condition : qu'elle puisse joindre l'URL publique de Manifst. Une instance derrière un pare-feu d'entreprise peut émettre vers l'extérieur même si l'inverse est impossible — c'est le sens de circulation qui compte.
Seule nuance sur les liens : ceux enregistrés pointent vers votre dépôt. Sur un dépôt privé, un membre Manifst sans accès GitLab tombera sur une page de connexion. C'est le comportement attendu — les permissions du dépôt appartiennent à GitLab.
Slack
Recevez des notifications dans un canal Slack à chaque événement important de votre projet.
Configuration
- Dans Slack, créez une Incoming Webhook sur api.slack.com/apps → votre app → Incoming Webhooks → Add New Webhook to Workspace. Sélectionnez le canal cible.
- Copiez l'URL générée (format
https://hooks.slack.com/services/T…/B…/…). - Dans Manifst, ouvrez Paramètres → Intégrations → Slack → Configurer.
- Collez l'URL dans le champ Webhook URL.
- Cochez les événements souhaités.
- Cliquez Tester la connexion pour vérifier que le message arrive bien dans Slack, puis Enregistrer.
Événements disponibles
Format des messages
Les messages utilisent le format mrkdwn de Slack. Voici des exemples pour chaque événement :
🔄 *Statut modifié* — *Modifier le profil utilisateur*
Backlog → En cours
👤 *Story assignée* — *Ajouter la pagination*
Assignée à *Marie Dupont*
💬 *Nouveau commentaire* sur *Modifier le profil utilisateur*
Par *Jean Martin* : Le formulaire doit aussi gérer la photo de profil…
🚀 *Sprint démarré* — *Sprint 3 — Auth & Profil*
✅ *Sprint terminé* — *Sprint 3 — Auth & Profil*
Discord
Recevez des notifications embed dans un canal Discord à chaque événement important de votre projet.
Configuration
- Dans Discord, ouvrez le canal cible → Paramètres du canal → Intégrations → Webhooks → Nouveau Webhook.
- Donnez un nom au webhook (ex. Manifst), choisissez le canal, puis cliquez Copier l'URL du Webhook.
L'URL a la formehttps://discord.com/api/webhooks/<id>/<token>. - Dans Manifst, ouvrez Paramètres → Intégrations → Discord → Configurer.
- Collez l'URL dans le champ Webhook URL.
- Cochez les événements souhaités.
- Cliquez Tester pour vérifier qu'un message de test arrive dans le canal, puis Enregistrer.
Événements disponibles
Les événements sont identiques à ceux du connecteur Slack — un même événement peut déclencher les deux connecteurs simultanément si les deux sont actifs.
Format des embeds
Les messages Discord utilisent des embeds avec une couleur latérale par type d'événement. Le texte supporte le Markdown Discord (**gras**, *italique*, `code`).
| Événement | Couleur |
|---|---|
sprint_started | #57F287 — Vert |
sprint_ended | #FEE75C — Jaune |
new_comment | #EB459E — Rose |
story_status_changed, story_assigned | #5865F2 — Blurple |
pr_merged | #8B5CF6 — Violet |
Exemple de payload envoyé à Discord :
{
"embeds": [{
"description": "🔄 **Story mise à jour** — **Modifier le profil utilisateur**\nStatut : `Backlog` → `En cours`",
"color": 5793266
}]
}
HTTP 204 No Content en cas de succès (contrairement à Slack qui répond 200 ok). Le connecteur Manifst détecte tout code différent de 204 comme un échec.
Power BI / API REST
Connectez Power BI Desktop (ou tout outil BI) à l'API REST v1 pour construire vos propres rapports et consolider plusieurs équipes-projets : valeur acquise (EVM), coûts, backlog, roadmap.
Ce connecteur ne se configure pas dans Manifst : il s'agit de la consommation de l'API v1 depuis Power BI. La liste complète des endpoints est dans la Documentation API.
Clé & prérequis
- Un compte au plan Portefeuille (l'API REST y est incluse).
- Une clé API générée depuis Paramètres → Clés API, avec au minimum les scopes
finance:read(indicateurs EVM & portefeuille) etroadmap:read(dépendances & jalons). Ajouteztickets:read,time:read,team:readselon les données à remonter. - L'URL de base de l'API :
https://manifst.net/api/v1
Avant Power BI, validez la clé avec un simple appel (PowerShell) — si vous recevez du JSON {"data":[…]}, tout est prêt :
curl.exe -H "Authorization: Bearer mfst_live_VOTRE_CLE" https://manifst.net/api/v1/projects
Connexion depuis Power BI Desktop
L'API s'authentifie via un en-tête Authorization: Bearer. Le plus robuste est de le déclarer dans une requête M avec Web.Contents (compatible rafraîchissement planifié). Ouvrez Accueil → Transformer les données → Nouvelle source → Requête vide → Éditeur avancé et collez :
let
BaseUrl = "https://manifst.net/api/v1",
ApiKey = "mfst_live_VOTRE_CLE",
Source = Json.Document(
Web.Contents(BaseUrl, [
RelativePath = "finance",
Query = [ project = "UUID_DU_PROJET" ],
Headers = [ Authorization = "Bearer " & ApiKey ]
])
)
in
Source[data]
À l'invite d'authentification de Power BI, choisissez Anonyme : les identifiants sont déjà transmis via l'en-tête. L'UUID du projet se récupère via l'endpoint /projects.
Web.Contents(BaseUrl, [RelativePath=…, Headers=…]) plutôt que dans l'assistant graphique : c'est la forme qui évite l'erreur « source de données dynamique » au rafraîchissement planifié.
Consolidation portefeuille (multi-projets)
L'endpoint /portfolio/finance agrège l'EVM de tous les projets accessibles à la clé en une seule requête — idéal pour une vue programme. Il renvoie un bloc totals consolidé et le détail par projet.
let
BaseUrl = "https://manifst.net/api/v1",
ApiKey = "mfst_live_VOTRE_CLE",
Source = Json.Document(
Web.Contents(BaseUrl, [
RelativePath = "portfolio/finance",
Headers = [ Authorization = "Bearer " & ApiKey ]
])
),
Projets = Table.FromRecords(Source[data][projects])
in
Projets
Le bloc consolidé se lit via Source[data][totals] (Σ BAC, CPI/SPI portefeuille, VAC…). Pour cibler une équipe précise, ajoutez Query = [ projects = "uuid1,uuid2" ].
ac_all et engaged_all.
Rafraîchissement incrémental & pagination
Les listes volumineuses /tickets et /time-entries acceptent une pagination et un filtre de fraîcheur, à passer dans Query :
| Paramètre | Rôle |
|---|---|
updated_since | Ne renvoie que les éléments modifiés depuis cette date (YYYY-MM-DD) — base d'un refresh incrémental. |
page / per_page | Pagination (défaut 100, max 500 par page). Le bloc meta.total donne le total réel. |
RelativePath = "tickets",
Query = [ project = "UUID_DU_PROJET", updated_since = "2026-07-01", per_page = "500", page = "1" ],
Headers = [ Authorization = "Bearer " & ApiKey ]
X-RateLimit-Remaining-*. Espacez les rafraîchissements en conséquence.
Dépannage
| Symptôme | Cause & solution |
|---|---|
401 MISSING_API_KEY | L'en-tête Authorization n'est pas transmis. Utilisez la forme Web.Contents(BaseUrl, [Headers=…]) et non l'assistant graphique. |
401 INVALID_API_KEY | Clé erronée, révoquée ou expirée. Régénérez-en une dans Paramètres → Clés API. |
403 INSUFFICIENT_SCOPE | La clé n'a pas le scope requis (finance:read, roadmap:read…). Recréez-la avec les bons scopes. |
403 PLAN_REQUIRED | L'API REST est incluse à partir du plan Portefeuille : le compte propriétaire de la clé n'y est pas. |
429 RATE_LIMIT_EXCEEDED | Quota horaire/mensuel dépassé. Attendez la valeur du header Retry-After ou réduisez la fréquence. |
| La connexion marche en Desktop mais pas au refresh planifié | En-tête déclaré via l'assistant (source dynamique). Repassez à la requête M ci-dessus avec RelativePath + Headers. |
Sécurité
GitHub — Vérification HMAC
Chaque requête GitHub est vérifiée via une signature HMAC-SHA256 dans le header X-Hub-Signature-256. Toute requête avec une signature invalide est rejetée avec HTTP 401. Ne partagez jamais votre clé secrète.
Slack — Protection SSRF
Seules les URLs https://hooks.slack.com/services/… sont autorisées comme webhook Slack. Les URLs pointant vers des IP privées, localhost ou d'autres domaines sont systématiquement rejetées.
Discord — Protection SSRF
Seules les URLs https://discord.com/api/webhooks/<id>/<token> sont autorisées. Le token ne doit contenir que des caractères [A-Za-z0-9_-]. Toute autre URL est rejetée avec HTTP 422.
Rate limiting
Le bouton Tester (Slack et Discord) est limité à 5 appels par minute par utilisateur et par projet pour éviter les abus.
Circuit breaker Slack & Discord
En cas d'échecs répétés (5 livraisons consécutives en erreur), le connecteur est automatiquement désactivé pour éviter les erreurs silencieuses. Vous pouvez le réactiver depuis les paramètres une fois le webhook corrigé.
FAQ
Le webhook GitHub retourne ignored: invalid_json
Le Content type du webhook GitHub doit être application/json. Vérifiez ce réglage dans GitHub → Settings → Webhooks → votre webhook → Edit.
Le webhook retourne ignored: integration_not_configured
L'intégration GitHub n'est pas encore créée pour ce projet, ou elle a été supprimée. Configurez-la depuis Paramètres → Intégrations.
Les commits sont liés (refs_linked: 1) mais le statut ne change pas
Un push ne change jamais le statut — il crée seulement un lien informatif. Pour qu'une story se ferme automatiquement, utilisez une Pull Request mergée avec l'auto-close activé et une colonne de destination configurée.
Je ne reçois pas les notifications Slack
- Vérifiez que l'événement correspondant est coché dans la configuration du connecteur.
- Utilisez Tester la connexion pour valider que l'URL webhook est toujours active.
- Vérifiez que le connecteur n'a pas été désactivé par le circuit breaker (voir section Sécurité).
- Assurez-vous que l'app Slack est toujours installée dans votre workspace.
Puis-je connecter plusieurs dépôts GitHub ?
Non, un seul connecteur GitHub par projet est supporté. Pour multi-dépôts, configurez plusieurs webhooks GitHub pointant vers la même URL Manifst.
Un coéquipier ne voit pas le bloc « Développement »
Les connecteurs sont inclus à partir du plan Team, et la capacité s'évalue sur son abonnement, pas sur celui du propriétaire du projet ni sur le projet lui-même. Un membre au plan Starter ne voit donc ni le bloc, ni les pastilles de commits, même sur un projet dont le connecteur fonctionne. Ses propres commits, eux, restent bien rattachés et visibles des membres qui y ont droit.
La clé secrète GitHub n'est plus visible
Pour des raisons de sécurité, la clé secrète n'est affichée qu'une seule fois à la création. Si vous l'avez perdue, cliquez Régénérer le secret dans la configuration GitHub — cela invalide l'ancienne clé et en génère une nouvelle à copier dans GitHub.
Je ne reçois pas les notifications Discord
- Vérifiez que l'événement correspondant est coché dans la configuration du connecteur.
- Utilisez Tester pour vérifier que le webhook est toujours actif (Discord peut supprimer un webhook si le canal est supprimé ou si l'intégration est révoquée manuellement).
- Vérifiez que le connecteur n'a pas été désactivé par le circuit breaker (voir section Sécurité).
- Assurez-vous que le bot dispose bien des permissions d'écriture dans le canal cible.
Slack et Discord peuvent-ils être actifs en même temps ?
Oui. Les deux connecteurs sont indépendants. Si les deux sont configurés avec le même événement coché, Manifst envoie la notification aux deux simultanément.
Le token Discord dans l'URL est-il visible par les membres non-owner ?
Non. Pour les membres qui ne sont pas owners du projet, l'URL webhook Discord est masquée côté API — seuls les 4 premiers caractères du token sont visibles. Seul l'owner du projet voit l'URL complète.