Une PME qui répond aux marchés publics consacre 3 à 10 jours par dossier. Taux de transformation moyen : 15 à 20%. Sur 10 dossiers, 8 ne mènent nulle part — et la moitié auraient pu être écartés dès la lecture du cahier des charges.

Ce guide détaille un système complet pour détecter automatiquement les appels d'offres pertinents, analyser les dossiers par IA, et produire un score Go/No-Go en quelques minutes. Avec les outils, les prompts, et le code.

Tout est faisable en interne.


Ce que fait le système

Cinq étapes, du BOAMP à la décision :

  1. Veille automatique — Chaque matin, l'API BOAMP remonte les marchés correspondant à vos critères
  2. Dépôt du DCE — Le commercial télécharge le dossier (un clic, 30 secondes) et le dépose dans un Drive partagé
  3. Analyse IA — Claude ou GPT-4 extrait une fiche structurée : synthèse, critères d'attribution, exigences, alertes
  4. Scoring Go/No-Go — Le système compare les exigences avec votre profil entreprise → score sur 100
  5. Notification — Le responsable commercial reçoit la fiche + le score sur Slack ou par email

Temps humain par AO : 3 minutes (lecture de la fiche + décision). Contre 3 à 4 heures aujourd'hui.


Les outils

Brique Option mainstream Option open source Coût
Veille marchés API BOAMP (Open Data DILA) Idem Gratuit
Orchestration Make (ex-Integromat) ou Zapier n8n auto-hébergé 0-30 €/mois
Analyse IA Claude API (Anthropic) ou GPT-4 (OpenAI) Idem ~0,25 €/doc
Base de données Google Sheets ou Airtable NocoDB auto-hébergé 0-20 €/mois
Stockage DCE Google Drive ou OneDrive Nextcloud 0-10 €/mois
Notifications Slack, Teams ou Gmail Mattermost, email SMTP Gratuit
Total 50-110 €/mois

La stack mainstream (Make + Google Sheets + Drive + Slack) est plus rapide à mettre en place. La stack open source (n8n + NocoDB + Nextcloud) est plus flexible et vous appartient. Les deux font le même job.

Le reste de ce guide est agnostique : les concepts et le code s'adaptent aux deux approches.


Étape 1 — La base de données

Créez un tableur « Appels d'offres » (Google Sheets, Airtable, ou NocoDB) avec deux onglets.

Onglet « Marchés »

Colonne Type Rôle
id_boamp Texte (clé unique) Identifiant BOAMP
objet Texte long Objet du marché
acheteur Texte Organisme acheteur
date_limite Date Deadline remise des offres
budget_estime Nombre Budget en € HT
codes_cpv Texte Codes CPV (classification européenne)
departement Texte Lieu d'exécution
lien_avis URL Lien BOAMP
statut Sélection À analyser / Analysé / Go / No-Go / En cours / Archivé
score_global Nombre Score Go/No-Go (0-100)

Onglet « Référentiel Entreprise »

C'est votre profil. Le scoring compare les exigences de chaque AO à ce référentiel. Une ligne par élément :

Colonne Type Exemple
categorie Sélection certification / reference / zone_geo / competence
intitule Texte ISO 9001 / Maintenance CVC Mairie de Marseille / PACA
detail Texte long Certifié AFNOR, audit 2024. Montant : 450K€ sur 3 ans.
montant Nombre 450000 (pour les références)
date_expiration Date 2027-03-15
actif Case à cocher Oui

Renseignez vos certifications, vos 10-15 meilleures références, vos zones géographiques, et vos compétences clés. C'est le socle du scoring — sans ça, le système ne sait pas quoi comparer.

Ajoutez aussi un onglet « Historique » pour enregistrer chaque décision Go/No-Go avec le résultat final (gagné/perdu). C'est ce qui permet de calibrer le scoring dans le temps.


Étape 2 — La veille BOAMP

L'API

Le BOAMP publie ses données via l'API Open Data de la DILA. Gratuite, sans clé, Licence Ouverte v2.0.

GET https://boamp-datadila.opendatasoft.com/api/explore/v2.1/catalog/datasets/boamp/records

Paramètres :
  where=typeavis='Avis de marché'
    AND descripteur_code LIKE 'CPV_72%'
    AND (resume LIKE '%maintenance%' OR resume LIKE '%exploitation%')
    AND departement IN ('13','83','84','06')
  limit=100
  order_by=dateparution DESC

Adaptez les codes CPV, les mots-clés et les départements à votre secteur. La nomenclature CPV complète est sur simap.ted.europa.eu.

Le workflow

Configurez un scénario dans Make (ou n8n, ou Zapier) :

Déclencheur → tous les jours à 7h00.

Appel API BOAMP → HTTP GET avec les filtres ci-dessus.

Filtrage → exclure les marchés dont la deadline est à moins de 10 jours (pas le temps de répondre) et ceux déjà présents dans votre tableur (dédoublonnage sur id_boamp).

Insertion → ajouter les nouveaux marchés dans l'onglet Marchés, statut « À analyser ».

Notification → message Slack ou email récapitulatif : « 3 nouveaux AO ce matin » avec la liste et les liens.

Limite à connaître : l'API BOAMP fournit les annonces, pas les documents du dossier (CCTP, CCAP, RC). Les DCE sont sur les plateformes des acheteurs (PLACE, achatpublic.com, AWS, Maximilien). Le téléchargement est gratuit mais reste un clic manuel — 30 secondes par dossier. C'est la seule étape non automatisée du système.

Étape 3 — L'analyse IA du DCE

Le commercial télécharge le DCE et dépose les PDF dans le Drive partagé. Le workflow détecte le nouveau fichier et lance l'analyse.

Extraction du texte

Avant d'envoyer le contenu à l'IA, il faut extraire le texte du PDF. Deux cas :

  • PDF natif (texte sélectionnable) : extraction directe avec pdftotext ou un module Make/n8n. Résultat excellent.
  • PDF scanné (image) : OCR avec Tesseract ou un service cloud (Google Document AI, AWS Textract). Résultat variable selon la qualité du scan.

Le workflow doit tester le premier cas et basculer automatiquement sur l'OCR si le texte extrait est trop court (signe d'un PDF image).

Le prompt d'extraction — version de base

C'est le cœur du système. Voici un prompt de départ, volontairement générique. On verra ensuite pourquoi et comment le calibrer.

Tu es un expert en analyse de marchés publics français.
Analyse ce DCE et produis un JSON structuré.

RÈGLES :
- Extrais UNIQUEMENT les infos présentes dans le document.
- Si une info est absente → null.
- Montants en euros HT sauf indication contraire.
- Identifie les alertes : délais courts, clauses atypiques,
  exigences pointant vers un marché pré-fléché.

Structure JSON attendue :

{
  "synthese": {
    "objet": "...",
    "acheteur": "...",
    "type_marche": "Services / Travaux / Fournitures",
    "procedure": "Ouverte / Adaptée / Restreinte",
    "budget_estime": 150000,
    "date_limite": "2025-03-15T12:00:00",
    "duree_marche": "36 mois",
    "lieu_execution": "Marseille (13)",
    "nombre_lots": 3
  },
  "lots": [
    { "numero": 1, "intitule": "...", "budget_estime": 80000 }
  ],
  "criteres_attribution": {
    "prix": { "poids": 40 },
    "valeur_technique": {
      "poids": 50,
      "sous_criteres": [
        { "intitule": "Méthodologie", "poids": 20 },
        { "intitule": "Moyens humains", "poids": 15 }
      ]
    }
  },
  "exigences": {
    "certifications": ["ISO 9001", "Qualibat 5412"],
    "references": {
      "nombre_minimum": 3,
      "montant_minimum": 50000,
      "domaine": "..."
    },
    "effectif_minimum": 10,
    "sous_traitance": "Autorisée à 30% max"
  },
  "clauses_financieres": {
    "penalites_retard": "1/1000 par jour",
    "delai_paiement": "30 jours",
    "retenue_garantie": "5%"
  },
  "alertes": [
    { "type": "delai_court", "detail": "...", "severite": "haute" }
  ]
}

Ce prompt fonctionne. Sur un CCTP standard, il extrait correctement 80 à 90% des informations dès la première tentative. Mais « 80 à 90% » n'est pas suffisant pour prendre une décision Go/No-Go.

Pourquoi le prompt de base ne suffit pas

Voici ce qui se passe quand vous testez ce prompt sur vos vrais CCTP :

Problème 1 — Le jargon métier. Le prompt générique ne connaît pas votre vocabulaire. Si vous êtes dans le CVC, il ne sait pas que « GTB » signifie Gestion Technique du Bâtiment, que « P1/P2/P3 » sont des niveaux de maintenance, ou que « Qualibat 5412 » concerne spécifiquement le génie climatique. Il va extraire le mot, mais pas comprendre ce qu'il implique pour votre scoring.

Problème 2 — Les exigences implicites. Les CCTP ne formulent pas toujours les exigences de manière explicite. « Le titulaire devra justifier d'une expérience significative dans des opérations similaires » — c'est une exigence de références, mais sans nombre ni montant. L'IA va mettre null là où un humain lirait « au moins 3 références sérieuses ».

Problème 3 — Les signaux faibles. Un délai de réponse de 12 jours est-il un signal d'alerte ? Ça dépend de votre capacité de mobilisation. Un budget estimé à 80K€ est-il cohérent ? Ça dépend de vos tarifs. Le prompt générique n'a pas ce contexte.

Problème 4 — La structure des CCTP. Un CCTP de collectivité territoriale et un CCTP d'hôpital ne sont pas structurés de la même façon. Les critères techniques d'un marché de services informatiques n'ont rien à voir avec ceux d'un marché de travaux. Le prompt doit savoir où chercher.

Le calibrage : comment passer de 85% à 98%

C'est un processus itératif. Voici comment le mener :

Itération 1 — Contextualisation métier. Ajoutez un bloc de contexte au début du prompt :

CONTEXTE MÉTIER :
Tu analyses des marchés pour une entreprise de [VOTRE SECTEUR].

Vocabulaire spécifique à connaître :
- GTB = Gestion Technique du Bâtiment (supervision des installations)
- P1 = conduite et surveillance, P2 = petit entretien,
  P3 = gros entretien / remplacement
- CTA = Centrale de Traitement d'Air
- Qualibat 5412 = qualification génie climatique
- RGE = Reconnu Garant de l'Environnement
- [AJOUTEZ VOS TERMES]

Certifications courantes dans ce secteur :
ISO 9001, ISO 14001, Qualibat 5412, Qualifelec E2,
MASE, RGE QualiPAC, [VOS CERTIFICATIONS]

Quand le CCTP mentionne "expérience significative" ou
"références similaires" sans précision, interprète comme :
minimum 3 références de montant comparable au budget du lot.

Itération 2 — Règles d'interprétation. Après avoir testé sur 5-10 AO réels, vous identifiez les cas où l'IA se trompe ou hésite. Ajoutez des règles spécifiques :

RÈGLES D'INTERPRÉTATION :
- Si le budget n'est pas mentionné mais qu'un DQE ou BPU est fourni,
  estime le budget en additionnant les postes principaux.
- Si la durée du marché inclut des reconductions, précise
  "durée ferme + reconductions" (ex: "12 mois + 2×12 mois").
- Les pénalités de retard standard (1/1000 ou 1/3000 par jour)
  ne sont pas des alertes. Au-delà de 1/500, c'est une alerte.
- Un délai de réponse < 15 jours est une alerte "haute".
  Entre 15 et 21 jours : alerte "moyenne". Au-delà : RAS.
- Si le CCTP exige une certification que tu ne reconnais pas,
  extrais-la quand même et ajoute une alerte "certification inconnue".

Itération 3 — Enrichissement du JSON. Vous réalisez que certaines informations manquent dans la structure de base. Ajoutez des champs selon votre métier :

Ajoute ces champs à la synthèse :
- "astreinte": true/false (le marché prévoit-il une astreinte ?)
- "niveaux_maintenance": ["P1","P2","P3"] (niveaux demandés)
- "sites": nombre de sites concernés
- "effectif_sur_site": nombre de personnes demandées en permanence
- "habilitations": ["H0","B1","BR"] (habilitations électriques requises)

Ajoute ce champ aux alertes :
- "marche_flèche": si les exigences sont anormalement spécifiques
  (marque imposée, référence très précise, délai très court combiné
  à des exigences élevées), ajoute une alerte de type "marche_flèche"
  avec le détail des indices.

Itération 4 — Gestion des cas limites. Ce sont les CCTP qui font planter l'extraction :

CAS PARTICULIERS :
- Accord-cadre à bons de commande : le "budget" est le montant
  maximum de l'accord-cadre, pas celui d'un bon de commande.
  Extrais mini ET maxi si disponibles.
- Marché alloti avec candidature unique : précise que le candidat
  peut répondre à un, plusieurs, ou tous les lots.
- CCTP très long (>80 pages) : concentre-toi sur les chapitres
  "Objet", "Conditions de participation", "Critères d'attribution",
  "Pénalités" et "Clauses financières". Ignore les annexes
  techniques détaillées sauf si elles contiennent des exigences
  de qualification.
- Si le document contient plusieurs pièces (RC + CCTP + CCAP),
  croise les informations. Les critères d'attribution sont dans
  le RC, les exigences techniques dans le CCTP, et les clauses
  financières dans le CCAP.

Le résultat après calibrage

Après ces 4 itérations (comptez 2 à 3 semaines de tests sur vos AO réels), le prompt passe de ~85% à ~98% de fiabilité. Le prompt final fait entre 80 et 150 lignes selon la complexité de votre secteur.

Le prompt calibré est spécifique à votre métier. Celui d'une entreprise de CVC ne ressemble pas à celui d'une ESN, qui ne ressemble pas à celui d'un bureau d'études. C'est la pièce la plus importante du système — et la plus longue à mettre au point.

L'appel API

Anthropic (Claude) — recommandé pour les documents longs (200K tokens de contexte) :

POST https://api.anthropic.com/v1/messages

Headers : x-api-key, anthropic-version: 2023-06-01
Body :
{
  "model": "claude-sonnet-4-20250514",
  "max_tokens": 4096,
  "temperature": 0,
  "system": "VOTRE PROMPT CALIBRÉ",
  "messages": [{ "role": "user", "content": "Voici le DCE :\n\n{{ texte }}" }]
}

OpenAI (GPT-4 Turbo) : même logique, endpoint /v1/chat/completions, avec response_format: { type: "json_object" }.

Coût moyen : 0,25 € pour un CCTP de 50 pages.


Étape 4 — Le scoring Go/No-Go

Le scoring compare les exigences extraites par l'IA avec votre référentiel entreprise.

La grille

Critère Poids 100 50 0
Cœur de métier 20% Objet = activité principale Connexe Hors périmètre
Références 20% Toutes détenues Partielles Aucune
Budget 15% Dans la fourchette Limite Incohérent
Certifications 15% Toutes valides Une manquante
Délai réponse 10% > 20 jours 10-20 jours < 10 jours
Zone géo 10% Zone habituelle Étendue Trop loin
Charge actuelle 10% Équipe dispo Tendu Surchargé

> 70 → GO. 50-70 → à valider en revue commerciale. < 50 → NO-GO.

Le code

Ce code s'exécute dans un node Make/n8n après l'analyse IA. Adaptez les mots-clés à votre métier.

const analyse = $('Node_Analyse_IA').first().json;
const ref = $('Node_Referentiel').all().map(i => i.json);

// Profil entreprise
const certifs = ref.filter(r => r.categorie === 'certification' && r.actif)
  .map(r => r.intitule.toUpperCase());
const refs = ref.filter(r => r.categorie === 'reference' && r.actif);
const zones = ref.filter(r => r.categorie === 'zone_geo' && r.actif)
  .map(r => r.intitule);

const s = {};

// Cœur de métier (20%) — ADAPTEZ ces mots-clés
const mots = ['maintenance', 'cvc', 'climatisation', 'chauffage'];
const objet = (analyse.synthese?.objet || '').toLowerCase();
const hits = mots.filter(m => objet.includes(m));
s.coeur_metier = hits.length >= 2 ? 100 : hits.length === 1 ? 50 : 0;

// Références (20%)
const nReq = analyse.exigences?.references?.nombre_minimum || 0;
const mMin = analyse.exigences?.references?.montant_minimum || 0;
const nOK = refs.filter(r => r.montant >= mMin * 0.7).length;
s.references = nOK >= nReq ? 100 : nOK >= nReq * 0.5 ? 50 : 0;

// Certifications (15%)
const reqCerts = analyse.exigences?.certifications || [];
const missing = reqCerts.filter(
  c => !certifs.some(mc => mc.includes(c.toUpperCase()))
);
s.certifications = missing.length === 0 ? 100 : 0;

// Délai (10%)
const jours = (new Date(analyse.synthese?.date_limite) - new Date()) / 86400000;
s.delai = jours > 20 ? 100 : jours > 10 ? 50 : 0;

// Zone géo (10%)
const lieu = analyse.synthese?.lieu_execution || '';
s.zone_geo = zones.some(
  z => lieu.toLowerCase().includes(z.toLowerCase())
) ? 100 : 30;

// Budget + charge (valeurs par défaut à affiner)
s.budget = 75;
s.charge = 75;

// Score global pondéré
const w = {
  coeur_metier: .20, references: .20, budget: .15,
  certifications: .15, delai: .10, zone_geo: .10, charge: .10
};
const score = Math.round(
  Object.entries(w).reduce((sum, [k, p]) => sum + (s[k]||0) * p, 0)
);

return [{
  json: {
    score_global: score,
    recommandation: score > 70 ? 'GO' : score >= 50 ? 'À VALIDER' : 'NO-GO',
    detail: s,
    certifications_manquantes: missing
  }
}];

Les seuils et pondérations se calibrent. Après 3 à 6 mois, exportez l'historique des décisions, croisez les scores avec les résultats réels (gagné/perdu), et ajustez. Les faux négatifs (No-Go sur un marché gagnable) et les faux positifs (Go sur un marché perdu systématiquement) vous indiquent quels critères sur- ou sous-pondérer.


Étape 5 — Notifications et actions

Ce qui part automatiquement

Chaque AO analysé déclenche une notification Slack (ou email) au commercial : fiche de synthèse, score détaillé par critère, alertes, lien vers le DCE dans le Drive. Un bouton « Valider Go » met à jour le statut dans le tableur.

Ce qui se passe après le Go

  1. Dossier Drive créé automatiquement avec sous-dossiers Administratif / Technique / Financier
  2. DC1/DC2 pré-remplis avec les infos entreprise + données extraites de l'AO
  3. Notification Slack à l'équipe technique : « Nouveau Go, deadline J-XX, [lien dossier] »
  4. Rappels automatiques à J-7 et J-3 avant la date limite
  5. Statut tableur mis à jour → « En cours de réponse »

Ce que ça donne en vrai

Avant Après
AO détectés par semaine 4-5 (veille manuelle) 30-40 (veille auto)
Temps d'analyse par AO 3-4 heures 3 minutes
Décision Go/No-Go Intuition + discussion Score objectif sur 100
Coût Temps salarié (~7 000 €/mois) 50-110 €/mois

Les limites

Le prompt n'est pas plug-and-play. C'est le point le plus important de ce guide. Le prompt de base fonctionne, mais le calibrage métier est un vrai travail : vocabulaire spécifique, règles d'interprétation, cas limites, enrichissement du JSON. Comptez 2 à 3 semaines d'itérations sur vos AO réels avant d'atteindre une fiabilité exploitable.

PDF scannés. L'OCR fonctionne sur les scans propres, moins sur les documents tamponnés ou en basse résolution. Vérifiez les fiches dont le score semble incohérent.

Téléchargement des DCE. Pas d'API unifiée sur les plateformes d'acheteurs. La veille est automatique, le téléchargement du dossier reste un clic manuel (30 sec). C'est la seule étape non automatisée.

Calibrage progressif. Le scoring est utile dès le départ mais devient vraiment fiable après 3-6 mois de retours sur les résultats réels.

Maintenance. Mise à jour des outils, suivi des logs, enrichissement du référentiel entreprise. Prévoir 1-2h/mois.


Troubleshooting

Problème Solution
API BOAMP ne retourne rien Testez l'URL sans filtre — filtres probablement trop restrictifs
Texte PDF vide PDF scanné → activer l'OCR
JSON invalide de l'IA Réduire le texte (CCTP seul), temperature à 0
Scoring trop permissif Augmenter le poids certifications + références
Scoring trop restrictif Baisser le seuil Go à 65, enrichir le référentiel
L'IA rate du jargon métier Ajouter le vocabulaire dans le bloc CONTEXTE MÉTIER du prompt
Exigences implicites ignorées Ajouter des RÈGLES D'INTERPRÉTATION spécifiques
Alertes manquantes Enrichir la section CAS PARTICULIERS du prompt

Le budget

Poste Coût
Orchestration (Make/Zapier ou n8n) 0-30 €/mois
API IA (20-30 analyses/mois) 30-80 €/mois
API BOAMP Gratuit
Tableur + Drive 0-20 €/mois
Total 50-110 €/mois

Tout est là

Ce guide contient l'architecture, les endpoints API, le prompt (avec la méthode de calibrage), le code de scoring, et le troubleshooting. Si vous avez quelqu'un en interne qui maîtrise les outils d'automatisation et le prompt engineering — lancez-vous.

Le point clé, c'est le prompt. C'est lui qui détermine si le système est un gadget ou un outil de décision fiable. Et c'est lui qui demande le plus de travail : comprendre votre métier, tester sur vos vrais AO, itérer jusqu'à ce que les fiches soient aussi bonnes que celles d'un chargé d'affaires expérimenté.

Si vous préférez gagner du temps : on teste le système sur vos 5 derniers appels d'offres, gratuitement. On calibre le prompt sur votre secteur, on vous envoie les fiches de synthèse et les scores. Vous comparez avec vos décisions réelles. Si ça colle, on déploie. Si ça ne colle pas, vous n'avez rien dépensé.

Demander le test gratuit


Marketing Robot — systèmes d'automatisation pour PME. Des process, des outils, des résultats mesurables.