2Slides Logo
Propositions commerciales personnalisées à grande échelle : Google Sheets + API (2026)
2Slides Team
19 min read

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/generate transforme une ligne de tableur en une proposition PPTX conçue et modifiable pour 10 crédits par page.
  • Un themeId fixe issu de GET /api/v1/themes/search?query=pitch deck garantit que 200 propositions sont visuellement identiques, les commerciaux ne modifiant que le contenu.
  • responseLanguage accepte 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

ÉtapeOutilCe qui se passePoint de terminaison 2Slides / crédits
1Google Sheets ou export CRMUne ligne par prospect : entreprise, secteur, points douloureux, niveau tarifaire, contact, langueaucun
22Slides Templates Hub ou APIChoisir un modèle de pitch deck et noter son themeIdGET /api/v1/themes/search, gratuit
3Étape Code Zapier ou PythonConstruire un prompt structuré userInput à partir de la ligneaucun
4Webhooks by Zapier ou requestsSoumettre la tâche de proposition avec mode: "async"POST /api/v1/slides/generate, 10 crédits/page
5Pause 60 s, puis GETInterroger jusqu’à ce que status soit successGET /api/v1/jobs/{jobId}, gratuit
6Étape Gmail ou SMTPEnvoyer par email le PPTX modifiable downloadUrl au commercialaucun
7Mise à jour Google SheetsÉcrire jobId et downloadUrl dans la ligne pour auditaucun

É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 :

companyindustrycontact_namecontact_titlepain_pointspricing_tierpricelanguagerep_emailstatus
Northwind LogisticsFreight and logisticsMariana RuizVP OperationsManual dispatch scheduling; 18% empty-mile rate; no live ETAsGrowthUSD 1,800/monthSpanishj.ortiz@yourco.comready
Contoso ClinicsOutpatient healthcareDavid ChenCOOPaper intake forms; 22-minute average wait; no-show rate 14%TeamUSD 950/monthEnglisha.park@yourco.comready

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.

2Slides Templates Hub with curated slide themes and Pitch Deck filter
Figure 1 : Le Templates Hub, filtré sur Pitch Deck. Choisissez un modèle ici, puis récupérez son themeId via le point de terminaison de recherche.

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.

2Slides Fast PPT interface with content box and template gallery
Figure 2 : Fast PPT dans le navigateur. Le point de terminaison generate exécute exactement ce flux sans l’interface utilisateur, ce qui rend possible l’automatisation Google Sheets vers PowerPoint.

É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://..." } }

POST /api/v1/slides/generate parameters: themeId, userInput, responseLanguage, mode
Figure 3 : Les quatre paramètres du point de terminaison generate. themeId et userInput sont obligatoires ; responseLanguage par défaut à Auto et mode par défaut à sync.

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 status vaut ready.
  • 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ête Authorization: Bearer <votre clé>, corps JSON avec userInput, themeId, responseLanguage, mode: "async". Mappez data.jobId de 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. Mappez data.status et data.downloadUrl.
  • Filtre : continuez seulement si data.status vaut success. Pour les rares tâches encore en cours, une deuxième paire Delay + GET couvre le cas.
  • Gmail : Envoyer un email à rep_email avec le nom du prospect dans l’objet et downloadUrl dans le corps ou en pièce jointe.
  • Google Sheets : Mettre à jour la ligne, écrire jobId, downloadUrl et passer status à 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.

Perplexity ads pitch deck from the 2Slides Gallery, a reference for proposal structure
Figure 4 : Diapositive de couverture d’un pitch deck dans la galerie 2Slides. Une couverture de proposition doit nommer le prospect, le contact et la date.

Perplexity ads pitch deck from the 2Slides Gallery, a reference for proposal structure
Figure 5 : Une diapositive ultérieure du même deck. Notez la densité d’une idée par diapositive ; reflétez cela dans votre prompt avec des sections numérotées.

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.

VolumePagesCréditsPacks de créditsUSDPar proposition
20 propositions/mois2002 0001 × 5 $ (2 000)5,00 $0,25 $
500 propositions/mois5 00050 0001 × 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 ?

BesoinUtilisationPourquoi
Propositions modifiables par les commerciauxgenerate (Fast PPT), 10 crédits/pagePPTX natif, ~30 s, modèle cohérent
Decks visuellement sur-mesure pour quelques comptes enterprisecreate-pdf-slides, 10 + 100 crédits/page à 2KMises en page image-design à partir d’un prompt de style
Reproduire l’apparence d’un deck de marque existantcreate-like-this avec referenceImageUrl, même coûtDérive le système de design d’une image de référence
Vidéo de proposition commentée pour vente asynchronecreate-pdf-slides ou create-like-this, puis generate-narration à 210 crédits/pageLes 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. responseLanguage veut "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-narration n’accepte que les jobs issus de create-pdf-slides ou create-like-this. Les propositions de generate sont 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.

About 2Slides

Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.

Try For Free