2Slides Logo
Proposte di Vendita Personalizzate su Larga Scala: Google Sheets + API (2026)
2Slides Team
18 min read

Proposte di Vendita Personalizzate su Larga Scala: Google Sheets + API (2026)

Per produrre proposte di vendita personalizzate su larga scala, tieni i prospect in un Google Sheet (o in un export CRM), trasforma ogni riga in un prompt strutturato e invialo all’endpoint Fast PPT di 2Slides POST /api/v1/slides/generate con un themeId fisso in modo che ogni presentazione condivida lo stesso design. Ogni proposta di 10 pagine costa 100 crediti, circa 0,25 $, arriva come PPTX nativo modificabile in circa 30 secondi e può essere inviata automaticamente via email al rappresentante. Questa ricetta è pensata per responsabili RevOps e sales ops, e founder che gestiscono outbound.

Punti chiave

  • Una chiamata POST /api/v1/slides/generate trasforma una riga del foglio in una proposta PPTX progettata e modificabile per 10 crediti a pagina.
  • Un themeId fisso ottenuto da GET /api/v1/themes/search?query=pitch deck mantiene 200 proposte visivamente identiche, così i rappresentanti modificano solo il contenuto.
  • responseLanguage accetta il nome di una lingua per riga ("Spanish", "Portuguese"), così gli account LATAM e EMEA ricevono presentazioni nella loro lingua nativa dallo stesso foglio.
  • L’endpoint generate consente 6 richieste al minuto per chiave; una coda Python che fa pause tra i batch completa 200 proposte in circa 70 minuti.
  • 500 crediti gratuiti all’iscrizione coprono 5 proposte di test; 500 proposte di produzione al mese costano circa 102,50 $ in crediti.

A chi è rivolto

Sei responsabile RevOps o sales ops, oppure sei un founder che fa outbound in prima persona. I rappresentanti impiegano 45 minuti a costruire manualmente una presentazione di proposta che è per l’80% identica alla precedente, quindi metà dei prospect qualificati non riceve mai una proposta personalizzata. I dati dei prospect sono già in un Google Sheet o in un export CRM con azienda, settore, punti dolenti, livello di prezzo e nome del contatto.

Non usare questa ricetta se ogni proposta richiede elementi visivi personalizzati o video narrati. Quello è un lavoro per la pipeline di design con immagini descritta più avanti. Se il tuo team di vendita usa HubSpot e vuoi che le proposte si attivino in base agli stadi dei deal, leggi invece il modello nativo CRM in HubSpot AI presentation and sales deck automation.

Il flusso di lavoro a colpo d’occhio

PassoStrumentoCosa succedeEndpoint 2Slides / crediti
1Google Sheets o export CRMUna riga per prospect: azienda, settore, punti dolenti, livello di prezzo, contatto, linguanessuno
22Slides Templates Hub o APIScegli un template pitch-deck e registra il suo themeIdGET /api/v1/themes/search, gratuito
3Zapier Code step o PythonCostruisci un prompt userInput strutturato dalla riganessuno
4Webhooks by Zapier o requestsInvia il job di proposta con mode: "async"POST /api/v1/slides/generate, 10 crediti/pagina
5Delay 60 s, poi GETPoll fino a che status è successGET /api/v1/jobs/{jobId}, gratuito
6Step Gmail o SMTPInvia via email il PPTX modificabile downloadUrl al rappresentantenessuno
7Aggiornamento Google SheetsScrivi jobId e downloadUrl nella riga per auditnessuno

Passo 1: Struttura il foglio prospect

La qualità della proposta dipende dalle colonne che fornisci. Un foglio semplice con una riga per prospect e queste colonne è sufficiente:

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

Due regole rendono affidabile il prompt a valle. Primo, scrivi pain_points come brevi frasi separate da punto e virgola, non paragrafi, così il modello ha tre problemi chiari da affrontare. Secondo, usa la colonna language per indicare il nome della lingua esattamente come l’API lo aspetta ("Spanish", non "es"). Una colonna status permette all’automazione di saltare le righe già processate.

Se esporti da un CRM, mappa gli stessi campi. La Google Sheets API può anche leggere direttamente il foglio se preferisci non usare export CSV nella versione Python qui sotto.

Passo 2: Scegli un themeId fisso così ogni proposta condivide un design

La coerenza è il punto di un sistema di proposte. Se ogni presentazione usa un template diverso, il tuo brand sembra dieci aziende diverse. Cerca nella libreria template una volta, scegli un template pitch-deck o proposta e codifica il suo themeId nell’automazione.

Naviga visivamente prima su 2slides.com/templates, filtra per Pitch Deck e annota il nome del template.

2Slides Templates Hub con temi slide curati e filtro Pitch Deck
Figura 1: Il Templates Hub, filtrato su Pitch Deck. Scegli un template qui, poi recupera il suo themeId tramite l’endpoint di ricerca.

Poi risolvi lo stesso template in un ID dall’API. L’endpoint di ricerca è gratuito e limitato a 6 richieste al minuto, irrilevante qui perché lo chiami una sola volta.

curl -s "https://2slides.com/api/v1/themes/search?query=pitch%20deck&limit=5" \ -H "Authorization: Bearer $SLIDES_API_KEY"

La risposta elenca i template corrispondenti con il loro themeId e metadati. Copia l’ID in una variabile d’ambiente (PROPOSAL_THEME_ID) così lo step Zapier e lo script Python leggono lo stesso valore. Cambia il template una volta all’anno, non per ogni deal.

L’API guida lo stesso motore dello strumento web Fast PPT: incolla contenuti, scegli un template, ottieni un PPTX. L’endpoint fa semplicemente questo in modalità headless per ogni riga del foglio.

Interfaccia 2Slides Fast PPT con box contenuti e galleria template
Figura 2: Fast PPT nel browser. L’endpoint generate esegue esattamente questo flusso senza UI, che rende possibile l’automazione da Google Sheets a PowerPoint.

Passo 3: Costruisci il prompt e chiama l’API di automazione proposta di vendita

Un prompt per proposta deve essere strutturato, non conversazionale. Spiega al modello chi è il prospect, quali sono i problemi, cosa consigli e quali sezioni produrre in che ordine. Tieni il prezzo su una slide a parte così i rappresentanti possono modificarlo senza disturbare il resto della presentazione.

Ecco la chiamata esatta per la prima riga del foglio sopra. Nota che responseLanguage viene dalla riga, e mode è "async" così la chiamata ritorna subito un job ID.

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" }'

Ogni risposta 2Slides è incapsulata nello stesso involucro, importante per mappare i campi in Zapier:

{ "success": true, "data": { "jobId": "a1b2c3d4", "status": "pending" } }

Fai polling sul job ogni 5-10 secondi. Le presentazioni Fast PPT di solito finiscono in circa 30 secondi.

curl -s https://2slides.com/api/v1/jobs/a1b2c3d4 \ -H "Authorization: Bearer $SLIDES_API_KEY" # { "success": true, "data": { "jobId": "a1b2c3d4", "status": "success", "downloadUrl": "https://..." } }

Parametri POST /api/v1/slides/generate: themeId, userInput, responseLanguage, mode
Figura 3: I quattro parametri dell’endpoint generate. themeId e userInput sono obbligatori; responseLanguage di default è Auto e mode di default è sync.

Se ometti mode, l’endpoint gira in modo sincrono e ritorna downloadUrl nella stessa risposta. È più semplice per chiamate singole, ma async è più sicuro quando una piattaforma come Zapier ha un timeout HTTP breve, ed è la scelta giusta per batch.

Passo 4: Generazione PowerPoint con Zapier da una nuova riga del foglio

Per team senza un ingegnere disponibile, Zapier porta una proposta nella casella del rappresentante entro due minuti da quando una riga è marcata ready. L’app Webhooks by Zapier fa le due chiamate API; tutto il resto sono passaggi standard.

  • Trigger: Google Sheets, nuova o aggiornata riga. Aggiungi un filtro per far continuare solo le righe con status uguale a ready.
  • Code by Zapier (JavaScript) o Formatter: costruisci userInput dalle colonne della riga (snippet sotto).
  • Webhooks by Zapier, POST a https://2slides.com/api/v1/slides/generate. Header Authorization: Bearer <your key>, corpo JSON con userInput, themeId, responseLanguage, mode: "async". Mappa data.jobId dalla risposta.
  • Delay by Zapier, attendi 60 secondi.
  • Webhooks by Zapier, GET https://2slides.com/api/v1/jobs/{{jobId}} con lo stesso header. Mappa data.status e data.downloadUrl.
  • Filtro: continua solo se data.status è success. Per i rari job ancora in elaborazione, un secondo Delay più GET lo copre.
  • Gmail: Invia Email a rep_email con il nome del prospect nel soggetto e downloadUrl nel corpo o come allegato.
  • Google Sheets: Aggiorna Riga, scrivi jobId, downloadUrl e imposta status a done.

Lo step Code mantiene la logica del prompt in un solo posto, così un sales manager può cambiare la struttura della proposta senza toccare il webhook:

// Code by Zapier (JavaScript). I campi inputData sono mappati dalla riga del foglio. 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" };

Tieni la chiave API nell’header dello step Webhooks, mai nel foglio. Se più rappresentanti marcano righe ready contemporaneamente, Zapier può inviare più di 6 chiamate generate al minuto; le chiamate extra ricevono un errore di rate-limit e la riproduzione integrata di Zapier le gestisce. Per volumi più stabili, usa il batch Python sotto. Lo stesso schema Zapier è usato per deck ricorrenti in automating weekly report slides with Zapier and 2Slides.

Passo 5: Batch di 200 proposte di vendita personalizzate su larga scala con Python

Quando una campagna richiede 200 proposte entro lunedì, esegui uno script invece di lanciare 200 Zaps. Lo script sotto legge un export CSV del foglio (File, Download, CSV), invia i job in batch da 6 per rispettare il limite di 6 richieste al minuto su generate, fa polling su ogni job con un intervallo di 6 secondi per stare sotto il limite di 10 richieste al minuto su jobs, scarica ogni PPTX e scrive i risultati in un secondo CSV che il tuo merge Gmail o import CRM può usare.

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"] # da GET /themes/search?query=pitch deck BATCH = 6 # generate: 6 richieste/min per chiave POLL_GAP = 6 # jobs: 10 richieste/min -> un poll ogni 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"}) # Mai più di 6 chiamate generate in una finestra di 60 secondi. 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()

Tempi: ogni batch da 6 richiede circa 60-120 secondi inclusi i polling, quindi 200 proposte (34 batch) finiscono in circa 70 minuti con una sola chiave. Lo script è idempotente per status, quindi se si interrompe alla riga 140 puoi rilanciarlo e invierà solo le restanti 60 righe ready. Per esecuzioni più grandi e modelli di coda più complessi, vedi come generare presentazioni in batch con un’API AI.

Passo 6: Fornisci ai rappresentanti un PPTX modificabile, non un PDF

L’output di generate è un file PowerPoint nativo: caselle di testo reali, tabelle reali, master slide del template. Questo è il motivo per cui usare Fast PPT per le proposte è preferibile a una presentazione renderizzata come immagine.

I rappresentanti modificano le proposte dopo la generazione. Uno sconto viene approvato, il numero di posti cambia durante la chiamata, il legale vuole una clausola nella slide dei termini, il logo del prospect va sulla copertina. Con un PPTX modificabile il rappresentante apre il file, modifica la slide dei prezzi e lo invia. Con un PDF o un deck di immagini renderizzate, ogni modifica richiede di rigenerare e rivedere tutta la presentazione.

Lo step Gmail (o lo strumento email del tuo CRM) dovrebbe quindi inviare il PPTX stesso, non un link di visualizzazione, e l’oggetto dovrebbe contenere il nome del prospect così i rappresentanti lo trovano facilmente. Se vuoi anche un leave-behind rifinito, i rappresentanti possono esportare in PDF da PowerPoint dopo le modifiche.

Come dovrebbe essere una proposta forte

Prima di scrivere la struttura del prompt nel Passo 3, è utile guardare presentazioni reali. La 2Slides Gallery ospita deck di riferimento che puoi studiare per la struttura, o passare come referenceImageUrl all’endpoint create-like-this se scegli la via del design con immagini. Questi sono deck di riferimento, non output dalle chiamate API sopra.

Pitch deck Perplexity ads dalla 2Slides Gallery, riferimento per la struttura della proposta
Figura 4: Slide di copertina di un pitch deck nella 2Slides Gallery. Una copertina di proposta dovrebbe indicare il prospect, il contatto e la data.

Pitch deck Perplexity ads dalla 2Slides Gallery, riferimento per la struttura della proposta
Figura 5: Una slide successiva dello stesso deck Gallery. Nota la densità di un’idea per slide; rispecchia questo nel tuo prompt con sezioni numerate.

Tre modelli da proposte efficaci si trasferiscono nel tuo prompt: apri con la situazione del prospect nelle sue parole (colonna pain_points), associa ogni punto di soluzione a un punto dolente, isola il prezzo in una slide singola. Per un approfondimento su cosa includere in ogni sezione, vedi come creare un sales enablement deck con AI.

Quanto costa

Fast PPT si paga 10 crediti a pagina, e una proposta tipica ha 10 pagine. La ricerca tema e il polling job sono gratuiti.

VolumePagineCreditiPacchetti creditiUSDPer proposta
20 proposte/mese2002.0001 × $5 (2.000)$5,00$0,25
500 proposte/mese5.00050.0001 × $80 (40.000) + 1 × $22,50 (10.000)$102,50$0,21

I 500 crediti gratuiti all’iscrizione coprono 5 proposte complete per test. I crediti sono pay-as-you-go senza requisiti di posti, quindi una chiave condivisa può servire un team di vendita da 12 persone.

Fast PPT o slide disegnate con immagini per questo caso?

NecessitàUsaPerché
Proposte modificabili dai rappresentantigenerate (Fast PPT), 10 crediti/paginaPPTX nativo, ~30 s, template coerente
Deck visivamente personalizzati per pochi account enterprisecreate-pdf-slides, 10 + 100 crediti/pagina a 2KLayout disegnati da prompt di stile
Abbinare l’aspetto di un deck brand esistentecreate-like-this con referenceImageUrl, stesso costoDeriva il design da un’immagine di riferimento
Video proposta narrato per vendita asincronacreate-pdf-slides o create-like-this, poi generate-narration a 210 crediti/paginaI job Fast PPT non possono essere narrati

Per il flusso volumetrico guidato da foglio in questo articolo, Fast PPT è la scelta giusta di default. Riserva la pipeline immagini per il 5% dei deal dove il design fa la differenza.

Errori comuni

  • Superare le 6 richieste al minuto. Venti righe marcate ready insieme significano 20 POST in pochi secondi. Metti in coda: lo script Python batcha 6 e aspetta la finestra di 60 secondi; in Zapier, affidati alla riproduzione o distribuisci con uno step Delay.
  • Chiave API nel foglio o in uno script client-side. Tieni la chiave nell’header webhook Zapier o in una variabile ambiente server-side. Chiunque abbia il foglio altrimenti consumerebbe i tuoi crediti.
  • Codici lingua invece di nomi. responseLanguage vuole "Spanish" o "Portuguese", non "es" o "pt-BR". Valida la colonna con un menu a tendina in Sheets.
  • Aspettarsi narrazione o MP4 da Fast PPT. L’endpoint generate-narration accetta solo job da create-pdf-slides o create-like-this. Le proposte da generate sono solo PPTX.
  • Inserire una trascrizione di 4.000 parole di una call in userInput. Riassumi prima. Tre punti dolenti separati da punto e virgola battono un muro di note, e la slide prezzi resta pulita.
  • Mappare il campo risposta sbagliato. L’ID job sta in data.jobId, non al livello superiore. Lo stesso involucro { success, data: { ... } } vale per la risposta del poll.

Domande Frequenti

Posso generare deck di vendita da dati CRM senza Google Sheets?

Sì. L’API ha bisogno solo di una stringa userInput e di un themeId, quindi qualsiasi fonte va bene: un workflow HubSpot, un export Salesforce o una query Postgres. Google Sheets è comodo perché i rappresentanti possono modificare righe e marcarle ready senza aiuto tecnico. Per un trigger nativo CRM su cambi di stadio deal, vedi il modello HubSpot linkato prima in questo articolo.

Quanto tempo ci mette a generare una proposta?

Circa 30 secondi per un deck Fast PPT una volta avviato il job. In Zapier, un singolo Delay di 60 secondi prima del polling è sufficiente quasi sempre. Nel batch Python, sei proposte si inviano in un minuto e di solito tutte completano nel minuto successivo, quindi 200 proposte finiscono in circa 70 minuti con una sola chiave API.

Ogni proposta avrà lo stesso aspetto?

Il design sì, ed è voluto. Perché ogni job usa lo stesso themeId, colori, font e layout sono identici nel batch, cambia solo il contenuto per prospect. Se vuoi due look, ad esempio uno per enterprise e uno per SMB, aggiungi una colonna theme nel foglio e mappala a due diversi valori themeId.

Altre API di presentazioni supportano questo tipo di automazione?

Sì. L’API di Gamma su developers.gamma.app offre automazione simile, anche se le chiavi API lì richiedono un piano Pro. Le chiavi 2Slides funzionano su qualsiasi account, incluso uno gratuito con 500 crediti, e l’output Fast PPT è un PPTX nativo anziché una pagina ospitata, il che rende pratiche le modifiche lato rappresentante alle slide prezzi.

I rappresentanti possono modificare la slide prezzi dopo la generazione?

Sì, è il motivo principale per usare il percorso Fast PPT. Il file è un PPTX standard con caselle di testo e tabelle modificabili, quindi un rappresentante può cambiare il numero di posti, applicare uno sconto approvato o aggiungere una clausola legale in PowerPoint o Google Slides. Non serve rigenerare, e il resto del deck resta intatto.

Prossimi passi

Le proposte di vendita personalizzate su larga scala si riducono a tre parti: un foglio pulito, un template fisso e una coda che rispetta 6 richieste al minuto.

About 2Slides

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

Try For Free