

Propositions commerciales personnalisées à grande échelle : Google Sheets + API (2026)
Pour produire des propositions commerciales personnalisées à grande échelle, conservez les prospects dans une feuille Google Sheet (ou une exportation CRM), transformez chaque ligne en un prompt structuré, et envoyez-le au point de terminaison Fast PPT de 2Slides POST /api/v1/slides/generate avec un themeId fixe afin que chaque présentation partage un design commun. Chaque proposition de 10 pages coûte 100 crédits, soit environ 0,25 $, arrive sous forme de fichier PPTX natif et modifiable en environ 30 secondes, et peut être envoyée automatiquement par email au commercial. Cette recette s’adresse aux responsables RevOps et sales ops, ainsi qu’aux fondateurs qui font de l’outbound.
Points clés
- Un appel
POST /api/v1/slides/generatetransforme une ligne de tableur en une proposition PPTX conçue et modifiable pour 10 crédits par page. - Un
themeIdfixe issu deGET /api/v1/themes/search?query=pitch deckgarantit que 200 propositions sont visuellement identiques, les commerciaux ne modifiant que le contenu. responseLanguageaccepte un nom de langue par ligne ("Spanish", "Portuguese"), permettant aux comptes LATAM et EMEA d’obtenir des présentations dans leur langue natale à partir de la même feuille.- Le point de terminaison generate autorise 6 requêtes par minute par clé ; une file d’attente Python qui fait des pauses entre les lots traite 200 propositions en environ 70 minutes.
- 500 crédits gratuits à l’inscription couvrent 5 propositions de test ; 500 propositions en production par mois coûtent environ 102,50 $ en crédits.
À qui s’adresse cette solution
Vous êtes responsable RevOps ou sales ops, ou fondateur qui fait de l’outbound vous-même. Les commerciaux passent 45 minutes à construire manuellement une présentation qui est à 80 % identique à la précédente, donc la moitié de vos prospects qualifiés ne reçoivent jamais de proposition personnalisée. Vos données prospects résident déjà dans une Google Sheet ou une exportation CRM avec entreprise, secteur, points douloureux, niveau tarifaire et nom du contact.
N’utilisez pas cette recette si chaque proposition nécessite des visuels personnalisés ou une vidéo commentée. C’est le cas d’usage du pipeline image-design abordé plus loin. Si votre équipe commerciale travaille dans HubSpot et que vous souhaitez déclencher des propositions selon les étapes de deals, consultez plutôt le modèle natif CRM dans HubSpot AI presentation and sales deck automation.
Le workflow en un coup d’œil
| Étape | Outil | Ce qui se passe | Point de terminaison 2Slides / crédits |
|---|---|---|---|
| 1 | Google Sheets ou export CRM | Une ligne par prospect : entreprise, secteur, points douloureux, niveau tarifaire, contact, langue | aucun |
| 2 | 2Slides Templates Hub ou API | Choisir un modèle de pitch deck et noter son themeId | GET /api/v1/themes/search, gratuit |
| 3 | Étape Code Zapier ou Python | Construire un prompt structuré userInput à partir de la ligne | aucun |
| 4 | Webhooks by Zapier ou requests | Soumettre la tâche de proposition avec mode: "async" | POST /api/v1/slides/generate, 10 crédits/page |
| 5 | Pause 60 s, puis GET | Interroger jusqu’à ce que status soit success | GET /api/v1/jobs/{jobId}, gratuit |
| 6 | Étape Gmail ou SMTP | Envoyer par email le PPTX modifiable downloadUrl au commercial | aucun |
| 7 | Mise à jour Google Sheets | Écrire jobId et downloadUrl dans la ligne pour audit | aucun |
Étape 1 : Structurer la feuille prospects
La qualité de la proposition dépend des colonnes que vous fournissez. Une feuille plate avec une ligne par prospect et ces colonnes suffit :
| company | industry | contact_name | contact_title | pain_points | pricing_tier | price | language | rep_email | status |
|---|---|---|---|---|---|---|---|---|---|
| Northwind Logistics | Freight and logistics | Mariana Ruiz | VP Operations | Manual dispatch scheduling; 18% empty-mile rate; no live ETAs | Growth | USD 1,800/month | Spanish | j.ortiz@yourco.com | ready |
| Contoso Clinics | Outpatient healthcare | David Chen | COO | Paper intake forms; 22-minute average wait; no-show rate 14% | Team | USD 950/month | English | a.park@yourco.com | ready |
Deux règles rendent le prompt fiable en aval. D’abord, écrivez pain_points sous forme de courtes phrases séparées par des points-virgules, pas des paragraphes, pour que le modèle ait trois problèmes clairs à traiter. Ensuite, utilisez la colonne language avec le nom exact attendu par l’API ("Spanish", pas "es"). Une colonne status permet à l’automatisation d’ignorer les lignes déjà traitées.
Si vous exportez depuis un CRM, mappez les mêmes champs. L’API Google Sheets peut aussi lire directement la feuille si vous préférez éviter les exports CSV dans la version Python ci-dessous.
Étape 2 : Choisir un themeId fixe pour un design uniforme
La cohérence est l’objectif d’un système de propositions. Si chaque présentation utilise un modèle différent, votre marque ressemble à dix entreprises. Cherchez une fois dans la bibliothèque de modèles, choisissez un pitch deck ou un modèle de proposition, et codez en dur son themeId dans l’automatisation.
Parcourez visuellement d’abord sur 2slides.com/templates, filtrez par Pitch Deck, et notez le nom du modèle.

Puis résolvez ce même modèle en un ID via l’API. Le point de terminaison de recherche est gratuit et limité à 6 requêtes par minute, ce qui est sans importance ici car vous ne l’appelez qu’une fois.
curl -s "https://2slides.com/api/v1/themes/search?query=pitch%20deck&limit=5" \
-H "Authorization: Bearer $SLIDES_API_KEY"La réponse liste les modèles correspondants avec leur themeId et métadonnées. Copiez l’ID dans une variable d’environnement (PROPOSAL_THEME_ID) pour que l’étape Zapier et le script Python lisent la même valeur. Changez le modèle une fois par an, pas à chaque deal.
L’API pilote le même moteur que l’outil web Fast PPT : collez du contenu, choisissez un modèle, obtenez un PPTX. Le point de terminaison fait cela sans interface pour chaque ligne de votre feuille.

Étape 3 : Construire le prompt et appeler l’API d’automatisation de proposition commerciale
Un prompt de proposition doit être structuré, pas conversationnel. Indiquez qui est le prospect, ses douleurs, ce que vous recommandez, et quelles sections produire dans quel ordre. Gardez la tarification sur une diapositive dédiée pour que les commerciaux puissent la modifier sans perturber le reste.
Voici l’appel exact pour la première ligne de la feuille ci-dessus. Notez que responseLanguage vient de la ligne, et que mode est "async" pour que l’appel retourne immédiatement un ID de tâche.
curl -s -X POST https://2slides.com/api/v1/slides/generate \
-H "Authorization: Bearer $SLIDES_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"userInput": "Sales proposal for Northwind Logistics (freight and logistics). Prepared for Mariana Ruiz, VP Operations. Pain points: manual dispatch scheduling; 18% empty-mile rate; no live ETAs for customers. Recommended plan: Growth tier at USD 1,800/month for 25 dispatcher seats. Structure: 1) Our understanding of Northwind Logistics 2) Goals for the next 12 months 3) Proposed solution mapped to each pain point 4) 90-day rollout plan 5) Pricing (own slide) 6) Next steps. Consultative tone, no buzzwords.",
"themeId": "'"$PROPOSAL_THEME_ID"'",
"responseLanguage": "Spanish",
"mode": "async"
}'Chaque réponse 2Slides est enveloppée dans la même structure, ce qui importe pour le mapping dans Zapier :
{ "success": true, "data": { "jobId": "a1b2c3d4", "status": "pending" } }Interrogez la tâche toutes les 5 à 10 secondes. Les présentations Fast PPT se terminent généralement en environ 30 secondes.
curl -s https://2slides.com/api/v1/jobs/a1b2c3d4 \
-H "Authorization: Bearer $SLIDES_API_KEY"
# { "success": true, "data": { "jobId": "a1b2c3d4", "status": "success", "downloadUrl": "https://..." } }
Si vous omettez mode, le point de terminaison s’exécute de manière synchrone et retourne downloadUrl dans la même réponse. C’est plus simple pour des appels ponctuels, mais l’async est plus sûr quand une plateforme comme Zapier a un timeout HTTP court, et c’est le bon choix pour les lots.
Étape 4 : Génération PowerPoint avec Zapier à partir d’une nouvelle ligne
Pour les équipes sans ingénieur disponible, Zapier place une proposition dans la boîte mail du commercial en moins de deux minutes après qu’une ligne est marquée prête. L’application Webhooks by Zapier réalise les deux appels API ; tout le reste est des étapes standard.
- Déclencheur : Google Sheets, nouvelle ligne ou ligne mise à jour. Ajoutez un filtre pour ne continuer que si
statusvautready. - Code by Zapier (JavaScript) ou Formatter : assemblez
userInputà partir des colonnes de la ligne (extrait ci-dessous). - Webhooks by Zapier, POST vers
https://2slides.com/api/v1/slides/generate. En-têteAuthorization: Bearer <votre clé>, corps JSON avecuserInput,themeId,responseLanguage,mode: "async". Mappezdata.jobIdde la réponse. - Delay by Zapier, pause de 60 secondes.
- Webhooks by Zapier, GET
https://2slides.com/api/v1/jobs/{{jobId}}avec le même en-tête. Mappezdata.statusetdata.downloadUrl. - Filtre : continuez seulement si
data.statusvautsuccess. Pour les rares tâches encore en cours, une deuxième paire Delay + GET couvre le cas. - Gmail : Envoyer un email à
rep_emailavec le nom du prospect dans l’objet etdownloadUrldans le corps ou en pièce jointe. - Google Sheets : Mettre à jour la ligne, écrire
jobId,downloadUrlet passerstatusàdone.
L’étape Code centralise la logique du prompt, pour qu’un manager commercial puisse modifier la structure sans toucher au webhook :
// Code by Zapier (JavaScript). Les champs inputData sont mappés depuis la ligne.
const {
company, industry, contact_name, contact_title,
pain_points, pricing_tier, price, language,
} = inputData;
const userInput = [
`Sales proposal for ${company} (${industry}).`,
`Prepared for ${contact_name}, ${contact_title}.`,
`Pain points: ${pain_points}.`,
`Recommended plan: ${pricing_tier} tier at ${price}.`,
`Structure: 1) Our understanding of ${company} 2) Goals for the next 12 months`,
`3) Proposed solution mapped to each pain point 4) 90-day rollout plan`,
`5) Pricing (own slide) 6) Next steps. Consultative tone, no buzzwords.`,
].join(" ");
output = { userInput, responseLanguage: language || "English" };Gardez la clé API dans l’en-tête du webhook Zapier, jamais dans la feuille. Si plusieurs commerciaux marquent des lignes prêtes en même temps, Zapier peut lancer plus de 6 appels generate par minute ; les appels en trop reçoivent une erreur de limitation et la relecture intégrée de Zapier les gère. Pour un volume plus stable, utilisez le batch Python ci-dessous. Le même modèle Zapier sert pour des decks récurrents dans automating weekly report slides with Zapier and 2Slides.
Étape 5 : Batch de 200 propositions commerciales personnalisées à grande échelle avec Python
Quand une campagne nécessite 200 propositions pour lundi, lancez un script plutôt que 200 Zaps. Le script ci-dessous lit un export CSV de la feuille (Fichier, Télécharger, CSV), soumet les tâches par lots de 6 pour respecter la limite de 6 requêtes par minute sur generate, interroge chaque tâche avec un intervalle de 6 secondes pour rester sous la limite de 10 requêtes par minute sur jobs, télécharge chaque PPTX, et écrit les résultats dans un second CSV que votre fusion Gmail ou import CRM peut consommer.
import csv, os, time, requests
API = "https://2slides.com/api/v1"
HEADERS = {
"Authorization": f"Bearer {os.environ['SLIDES_API_KEY']}",
"Content-Type": "application/json",
}
THEME_ID = os.environ["PROPOSAL_THEME_ID"] # from GET /themes/search?query=pitch deck
BATCH = 6 # generate: 6 requests/min per key
POLL_GAP = 6 # jobs: 10 requests/min -> one poll every 6 s
OUT_DIR = "proposals"
def build_prompt(row):
return (
f"Sales proposal for {row['company']} ({row['industry']}). "
f"Prepared for {row['contact_name']}, {row['contact_title']}. "
f"Pain points: {row['pain_points']}. "
f"Recommended plan: {row['pricing_tier']} tier at {row['price']}. "
f"Structure: 1) Our understanding of {row['company']} 2) Goals for the next 12 months "
f"3) Proposed solution mapped to each pain point 4) 90-day rollout plan "
f"5) Pricing (own slide) 6) Next steps. Consultative tone, no buzzwords."
)
def submit(row):
r = requests.post(f"{API}/slides/generate", headers=HEADERS, timeout=60, json={
"userInput": build_prompt(row),
"themeId": THEME_ID,
"responseLanguage": row.get("language") or "English",
"mode": "async",
})
r.raise_for_status()
body = r.json() # { success, data: { jobId, status } }
if not body.get("success"):
raise RuntimeError(body)
return body["data"]["jobId"]
def poll(job_id):
r = requests.get(f"{API}/jobs/{job_id}", headers=HEADERS, timeout=30)
r.raise_for_status()
return r.json()["data"] # { jobId, status, progress, downloadUrl }
def download(url, path):
with requests.get(url, stream=True, timeout=120) as r:
r.raise_for_status()
with open(path, "wb") as f:
for chunk in r.iter_content(65536):
f.write(chunk)
def main():
os.makedirs(OUT_DIR, exist_ok=True)
with open("prospects.csv", newline="", encoding="utf-8") as f:
rows = [r for r in csv.DictReader(f) if r.get("status") == "ready"]
results = []
for i in range(0, len(rows), BATCH):
batch = rows[i:i + BATCH]
window_start = time.time()
pending = {submit(row): row for row in batch}
print(f"submitted {len(pending)} jobs, {i + len(batch)}/{len(rows)} total")
while pending:
for job_id in list(pending):
time.sleep(POLL_GAP)
data = poll(job_id)
if data["status"] == "success":
row = pending.pop(job_id)
safe = row["company"].replace(" ", "_")
path = os.path.join(OUT_DIR, f"{safe}_proposal.pptx")
download(data["downloadUrl"], path)
results.append({**row, "jobId": job_id,
"downloadUrl": data["downloadUrl"],
"file": path, "status": "done"})
elif data["status"] == "failed":
row = pending.pop(job_id)
results.append({**row, "jobId": job_id, "downloadUrl": "",
"file": "", "status": "failed"})
# Never more than 6 generate calls inside any 60-second window.
elapsed = time.time() - window_start
if elapsed < 60:
time.sleep(60 - elapsed)
with open("proposals_out.csv", "w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=list(results[0].keys()))
w.writeheader()
w.writerows(results)
if __name__ == "__main__":
main()Temps : chaque lot de 6 prend environ 60 à 120 secondes incluant l’interrogation, donc 200 propositions (34 lots) se terminent en environ 70 minutes avec une seule clé. Le script est idempotent grâce au status, donc s’il plante à la ligne 140, vous le relancez et seules les 60 lignes ready restantes sont soumises. Pour des volumes plus importants et des modèles de mise en file plus avancés, voir comment générer des présentations par lots avec une API IA.
Étape 6 : Fournir aux commerciaux un PPTX modifiable, pas un PDF
La sortie de generate est un fichier PowerPoint natif : vraies zones de texte, vrais tableaux, diapositives maîtresses du modèle. C’est la raison d’utiliser Fast PPT pour les propositions plutôt qu’un deck rendu en images.
Les commerciaux modifient les propositions après génération. Une remise est approuvée, un nombre de sièges change en appel, le service juridique veut une clause sur la diapositive des conditions, le logo du prospect doit apparaître sur la couverture. Avec un PPTX modifiable, le commercial ouvre le fichier, édite la diapositive des prix, et l’envoie. Avec un PDF ou un deck d’images rendues, chaque modification implique de régénérer et de revoir toute la présentation.
L’étape Gmail (ou l’outil email de votre CRM) doit donc envoyer le PPTX lui-même, pas un lien de visualisation, et l’objet doit contenir le nom du prospect pour que les commerciaux le retrouvent facilement. Si vous souhaitez aussi un document de qualité à laisser, les commerciaux peuvent exporter en PDF depuis PowerPoint après leurs modifications.
À quoi ressemble un bon deck de proposition
Avant d’écrire la structure du prompt à l’Étape 3, il est utile de regarder de vrais decks. La galerie 2Slides héberge des decks de référence que vous pouvez étudier pour la structure, ou passer en referenceImageUrl au point de terminaison create-like-this si vous optez pour la voie image-design. Ce sont des decks de référence, pas des sorties des appels API ci-dessus.


Trois schémas issus de propositions solides se retrouvent dans votre prompt : ouvrir avec la situation du prospect dans ses mots (colonne pain_points), associer chaque point de solution à un point douloureux, et isoler la tarification sur une diapositive unique. Pour un aperçu plus approfondi du contenu de chaque section, voir comment créer un deck d’aide à la vente avec l’IA.
Coût
Fast PPT est facturé 10 crédits par page, et une proposition typique fait 10 pages. La recherche de thème et l’interrogation des tâches sont gratuites.
| Volume | Pages | Crédits | Packs de crédits | USD | Par proposition |
|---|---|---|---|---|---|
| 20 propositions/mois | 200 | 2 000 | 1 × 5 $ (2 000) | 5,00 $ | 0,25 $ |
| 500 propositions/mois | 5 000 | 50 000 | 1 × 80 $ (40 000) + 1 × 22,50 $ (10 000) | 102,50 $ | 0,21 $ |
Les 500 crédits gratuits à l’inscription couvrent 5 propositions complètes pour les tests. Les crédits sont pay-as-you-go sans obligation de siège, donc une clé partagée peut servir une équipe commerciale de 12 personnes.
Fast PPT ou slides image-design pour ce cas d’usage ?
| Besoin | Utilisation | Pourquoi |
|---|---|---|
| Propositions modifiables par les commerciaux | generate (Fast PPT), 10 crédits/page | PPTX natif, ~30 s, modèle cohérent |
| Decks visuellement sur-mesure pour quelques comptes enterprise | create-pdf-slides, 10 + 100 crédits/page à 2K | Mises en page image-design à partir d’un prompt de style |
| Reproduire l’apparence d’un deck de marque existant | create-like-this avec referenceImageUrl, même coût | Dérive le système de design d’une image de référence |
| Vidéo de proposition commentée pour vente asynchrone | create-pdf-slides ou create-like-this, puis generate-narration à 210 crédits/page | Les jobs Fast PPT ne peuvent pas être narrés |
Pour le flux volumétrique piloté par feuille décrit ici, Fast PPT est le choix par défaut. Réservez le pipeline image pour les 5 % de deals où le design fait la différence.
Pièges courants
- Dépasser 6 requêtes par minute. Vingt lignes marquées prêtes en même temps génèrent 20 POST en quelques secondes. Mettez en file : le script Python batch par 6 attend la fenêtre de 60 secondes ; dans Zapier, comptez sur la relecture ou espacez avec une étape Delay.
- Clé API dans la feuille ou un script client. Gardez la clé dans l’en-tête webhook Zapier ou une variable d’environnement côté serveur. Sinon, toute personne avec la feuille dépense vos crédits.
- Codes langue au lieu de noms.
responseLanguageveut "Spanish" ou "Portuguese", pas "es" ou "pt-BR". Validez la colonne avec une liste déroulante dans Sheets. - S’attendre à une narration ou un MP4 depuis Fast PPT. Le point de terminaison
generate-narrationn’accepte que les jobs issus decreate-pdf-slidesoucreate-like-this. Les propositions degeneratesont uniquement PPTX. - Mettre un transcript de 4 000 mots d’un appel découverte dans
userInput. Résumez d’abord. Trois points douloureux séparés par des points-virgules surpassent un mur de notes, et la diapositive prix reste claire. - Mapper le mauvais champ de réponse. L’ID de tâche est dans
data.jobId, pas au niveau supérieur. La même enveloppe{ success, data: { ... } }s’applique à la réponse de polling.
Questions fréquemment posées
Puis-je générer des decks commerciaux à partir des données CRM sans Google Sheets ?
Oui. L’API a seulement besoin d’une chaîne userInput et d’un themeId, donc toute source fonctionne : un workflow HubSpot, une exportation Salesforce, ou une requête Postgres. Google Sheets est pratique car les commerciaux peuvent modifier les lignes et les marquer prêtes sans aide technique. Pour un déclencheur natif CRM sur changement d’étape de deal, voir le modèle HubSpot mentionné plus haut.
Combien de temps prend la génération d’une proposition ?
Environ 30 secondes pour un deck Fast PPT une fois la tâche lancée. Dans Zapier, une seule pause de 60 secondes avant interrogation suffit presque toujours. Dans le batch Python, six propositions sont soumises en une minute et terminent généralement dans la minute suivante, donc 200 propositions finissent en environ 70 minutes avec une seule clé API.
Chaque proposition aura-t-elle le même aspect ?
Le design oui, c’est voulu. Parce que chaque tâche utilise le même themeId, couleurs, polices et mises en page sont identiques dans le lot, seul le contenu change par prospect. Si vous voulez deux styles, par exemple un pour enterprise et un pour PME, ajoutez une colonne theme dans la feuille et mappez-la à deux valeurs themeId différentes.
D’autres API de présentation supportent-elles ce type d’automatisation ?
Oui. L’API Gamma sur developers.gamma.app offre une automatisation similaire, bien que les clés API nécessitent un plan Pro. Les clés 2Slides fonctionnent sur tout compte, y compris un compte gratuit avec 500 crédits, et la sortie Fast PPT est un PPTX natif plutôt qu’une page hébergée, ce qui rend les modifications côté commercial sur les diapositives prix pratiques.
Les commerciaux peuvent-ils modifier la diapositive prix après génération ?
Oui, c’est la raison principale d’utiliser la voie Fast PPT. Le fichier est un PPTX standard avec zones de texte et tableaux modifiables, donc un commercial peut changer les nombres de sièges, appliquer une remise approuvée, ou ajouter une clause juridique dans PowerPoint ou Google Slides. Pas besoin de régénérer, le reste du deck reste intact.
Étapes suivantes
Les propositions commerciales personnalisées à grande échelle reposent sur trois éléments : une feuille propre, un modèle fixe, et une file d’attente respectant 6 requêtes par minute.
- Obtenez une clé API sur 2slides.com/api. L’inscription inclut 500 crédits gratuits, suffisants pour 5 propositions de test.
- Parcourez les autres recettes d’équipe dans le billet hub, AI presentation API use cases by team.
- Approfondissez le côté commercial avec HubSpot AI sales deck automation et batch-generating presentations with an AI API.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free