# Comment suivre les appels d’offres publics dans un Google Sheet ?

> Source: https://www.rodz.io/fr/guides/cas-usage/marches-publics-vers-google-sheets/
> Mis à jour le 2026-10-12 · Peter Cools · Recette · Marchés publics · Google Sheets

## En bref

Créez un signal Appels d'offres publics dans Rodz avec vos mots-clés, vos départements et vos types de marché, puis collez l'URL de votre Google Sheet dans l'onglet Intégrations du signal. Chaque avis BOAMP ou TED qui correspond ajoute une ligne : acheteur, objet, lien vers l'avis, type de marché, date limite de réponse et contact publié. Un appel d'offres coûte 7 crédits.

## Chiffres clés

- Un appel d'offres livré coûte **7 crédits**, plus 0,5 crédit par email trouvé si vous activez le ciblage par persona et l'option Trouver les e-mails.
- Deux sources officielles : le **BOAMP** pour la France et **TED** pour les avis européens (`sources`: `boamp`, `ted`).
- Chaque avis est livré **une seule fois**, dans la limite quotidienne du signal.
- Rodz identifie **400 000+ signaux par mois** (moyenne de juillet à septembre 2026).

Coût: 7 crédits par appel d'offres

## Avant de commencer

- Un compte Rodz avec des crédits (le compte de test en inclut 100).
- Un compte Google qui a les droits de modification sur le Google Sheet de destination.
- Vos mots-clés métier (par exemple « maintenance informatique », « nettoyage »), et si besoin vos départements, codes CPV et types de marché.

## Étapes

### 1. Connectez Google Sheets à Rodz

Dans le tableau de bord Rodz, ouvrez **Intégrations** et cliquez sur **Google Sheets**. Une fenêtre Google s'ouvre : choisissez le compte Google et autorisez l'accès. Cette connexion se fait une fois, dans le tableau de bord (OAuth) ; elle ne se fait pas par clé API.

### 2. Créez le signal Appels d’offres publics

Dans **Mes signaux**, cliquez sur **Activer un signal** et choisissez le signal **Appels d'offres publics** et réglez :

- les **sources** : `boamp` (avis français) et/ou `ted` (avis européens) ;
- les **mots-clés** cherchés dans l'objet du marché (`keywords`) et les mots-clés exclus (`keywordsExclude`) ;
- les **départements** (`departmentCodes`, par exemple `44`, `75`) pour le BOAMP, les **pays** (`countryCodes`) et **codes CPV** (`cpvCodes`) pour TED ;
- les **types de marché** (`marketTypes` : Services, Fournitures, Travaux) ;
- le **Délai minimum de réponse** (`minDaysUntilDeadline`), pour écarter les avis qui ferment trop tôt pour répondre.

`Configuration équivalente (POST /api/v1/signals/public-tenders)`

```json
{
  "name": "Appels d'offres maintenance informatique Ouest",
  "status": "draft",
  "dailyLeadLimit": 20,
  "config": {
    "sources": ["boamp"],
    "keywords": ["maintenance informatique", "infogérance"],
    "keywordsExclude": ["travaux"],
    "departmentCodes": ["44", "35", "49"],
    "marketTypes": ["Services"],
    "minDaysUntilDeadline": 10
  }
}
```

### 3. Collez l’URL du Google Sheet dans le signal

Créez un Google Sheet vide (ou un onglet dédié), copiez son URL, puis dans l'onglet **Intégrations** du signal, activez **Google Sheets** et collez l'URL. Par l'API, c'est un `PATCH` sur le signal avec la destination `googleSheets`.

Rodz écrit la ligne d'en-tête lui-même si la feuille est vide.

`Même réglage par l'API`

```bash
curl -X PATCH "https://api.rodz.io/api/v1/signals/$SIGNAL_ID" \
  -H "Authorization: Bearer $RODZ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"destinations": {"googleSheets": {"sheetUrl": "https://docs.google.com/spreadsheets/d/VOTRE_ID/edit"}}}'
```

### 4. Fixez la limite quotidienne et activez

Dans **Paramètres de base**, fixez la **Limite quotidienne de prospects** : elle plafonne le nombre d'avis livrés, donc la dépense. Passez le signal en **Actif**. Chaque nouvel avis correspondant ajoute une ligne à la feuille.

### 5. Triez et partagez la feuille

Ajoutez vos propres colonnes **à droite** des colonnes Rodz (statut, responsable, décision de répondre) : Rodz place chaque valeur sous l'en-tête du même nom et ne touche pas aux colonnes qu'il n'a pas créées. Triez sur **Response Deadline** pour voir d'abord les avis qui ferment bientôt.

## Exemple de payload

Ce que Rodz livre pour un appel d'offres (format du webhook et de `GET /api/v1/signals/{signal_id}/leads`, sans ciblage par persona). La feuille en reçoit les colonnes principales.

```json
{
  "signal": {
    "id": "d4f5a6b7-c8d9-4e0f-a1b2-c3d4e5f6a7b8",
    "name": "Appels d'offres maintenance informatique Ouest",
    "type": "public_tenders",
    "last_signal": "Public Tender",
    "last_signal_date": "2026-10-08",
    "job_offer_title": "Maintenance du parc informatique des services municipaux",
    "job_offer_url": "https://www.boamp.fr/avis/detail/26-000000",
    "matched_keywords": "maintenance informatique",
    "tender_description": "Maintenance préventive et curative du parc informatique, 3 lots.",
    "tender_deadline": "2026-11-06T12:00:00+00:00",
    "tender_published_date": "2026-10-07T02:00:00+00:00",
    "tender_cpv_code": "50320000",
    "tender_market_type": "services",
    "tender_nature": "cn-standard",
    "tender_submission_url": "https://marches.example/dossier/123456",
    "tender_source": "boamp",
    "buyer_siren": "000000000",
    "buyer_city": "Nantes",
    "buyer_website": "https://ville.example",
    "buyer_contact_email": "commande.publique@ville.example",
    "buyer_contact_phone": "+33 2 00 00 00 00"
  },
  "company": {
    "name": "Ville Exemple",
    "website": "https://ville.example",
    "hq_country_code": "FR",
    "hq_city": "Nantes"
  }
}
```

## Colonnes de la feuille ← champs Rodz

| Colonne Google Sheets                    | Champ Rodz (payload)                                              |
| ---------------------------------------- | ----------------------------------------------------------------- |
| Company                                  | `company.name` (l'acheteur public)                                |
| Tender Subject                           | `signal.job_offer_title` (objet du marché)                        |
| Tender URL                               | `signal.job_offer_url` (lien vers l'avis)                         |
| Market Type                              | `signal.tender_market_type`                                       |
| Response Deadline                        | `signal.tender_deadline`                                          |
| Tender Description                       | `signal.tender_description`                                       |
| Published Date                           | `signal.tender_published_date`                                    |
| CPV Code                                 | `signal.tender_cpv_code`                                          |
| Notice Source                            | `signal.tender_source`                                            |
| Buyer SIREN, Buyer City, Buyer Website   | `signal.buyer_siren`, `signal.buyer_city`, `signal.buyer_website` |
| Buyer Contact Email, Buyer Contact Phone | `signal.buyer_contact_email`, `signal.buyer_contact_phone`        |
| Signal Name                              | `signal.name`                                                     |

## Bien régler ses mots-clés

Les mots-clés portent sur l'objet du marché. Quelques règles simples :

1. **Partez large, excluez ensuite** : trois ou quatre expressions métier, puis des exclusions (`keywordsExclude`) pour les faux positifs que vous voyez arriver.
2. **Utilisez `minDaysUntilDeadline`** : un avis qui ferme dans trois jours est rarement exploitable. Dix jours est un point de départ courant.
3. **Un signal par offre** : si vous répondez à des marchés de natures différentes, créez un signal et un onglet par offre, pour que chaque équipe ait sa feuille.

## Dépannage

- **Aucune ligne n'arrive** : vérifiez que Google Sheets est activé dans l'onglet Intégrations _du signal_, que le signal est Actif et que le compte Google connecté peut modifier la feuille.
- **Valeurs absentes dans une colonne** : l'avis publié ne contient pas l'information (par exemple pas de date limite ou pas de contact).
- **Colonne renommée** : Rodz place chaque valeur sous l'en-tête du même nom ; une colonne Rodz renommée n'est plus reconnue. Gardez les en-têtes d'origine.

## Questions fréquentes

### Quelles colonnes Rodz écrit-il dans la feuille ?

Notamment : Timestamp, Company (l'acheteur), Tender Subject, Tender URL, Market Type, Response Deadline, Tender Description, Published Date, CPV Code, Notice Source, Buyer SIREN, Buyer City, Buyer Website, Buyer Contact Email, Buyer Contact Phone et Signal Name.

### Puis-je recevoir les avis européens ?

Oui. Ajoutez `ted` dans les sources, puis filtrez avec `countryCodes` (codes pays ISO à 2 lettres) et `cpvCodes`. Les départements et les types de marché s'appliquent aux avis BOAMP.

### Un même avis peut-il arriver deux fois ?

Non : chaque appel d'offres est livré une seule fois par signal, dans la limite quotidienne.

### Puis-je obtenir un contact chez l'acheteur ?

La ligne contient déjà l'email et le téléphone publiés sur l'avis. Pour un décideur nommé, activez le ciblage par persona (`enablePersonaTargeting`, `targetPersonas`) : la personne trouvée est livrée comme contact.

### Combien cela coûte-t-il par mois ?

7 crédits par avis livré, plafonnés par la limite quotidienne. Avec une limite de 5 avis par jour, le maximum est de 35 crédits par jour. Le prix du crédit va de 0,10 € à 0,05 € HT selon le pack.

## Sources

- [BOAMP, Bulletin officiel des annonces des marchés publics](https://www.boamp.fr/)
- [TED, Tenders Electronic Daily (Journal officiel de l’Union européenne)](https://ted.europa.eu/)
- [Référence de l’API Rodz : signal Appels d’offres publics, destinations](https://api.rodz.io/docs)
- [Aide Google : partager des fichiers depuis Google Drive](https://support.google.com/docs/answer/2494822)

## Guides associés

- https://www.rodz.io/fr/guides/cas-usage/offres-emploi-vers-pipedrive/
- https://www.rodz.io/fr/guides/api/recuperer-les-leads-d-un-signal/
- https://www.rodz.io/fr/guides/api/recepteur-webhook-hmac/
