2Slides Logo
Propostas de Vendas Personalizadas em Escala: Google Sheets + API (2026)
2Slides Team
18 min read

Propostas de Vendas Personalizadas em Escala: Google Sheets + API (2026)

Para produzir propostas de vendas personalizadas em escala, mantenha os prospects em uma planilha do Google Sheets (ou uma exportação de CRM), transforme cada linha em um prompt estruturado e envie para o endpoint Fast PPT do 2Slides POST /api/v1/slides/generate com um themeId fixo para que todos os decks compartilhem o mesmo design. Cada proposta de 10 páginas custa 100 créditos, cerca de US$ 0,25, chega como um PPTX nativo editável em aproximadamente 30 segundos e pode ser enviada automaticamente por e-mail para o representante. Esta receita é para líderes de RevOps e sales ops, e fundadores que fazem outbound.

Principais pontos

  • Uma chamada POST /api/v1/slides/generate transforma uma linha da planilha em uma proposta PPTX editável e desenhada por 10 créditos por página.
  • Um themeId fixo obtido via GET /api/v1/themes/search?query=pitch deck mantém 200 propostas visualmente idênticas, para que os representantes mexam apenas no conteúdo.
  • responseLanguage aceita o nome do idioma por linha ("Spanish", "Portuguese"), assim contas LATAM e EMEA recebem decks no idioma nativo a partir da mesma planilha.
  • O endpoint generate permite 6 requisições por minuto por chave; uma fila Python que pausa entre lotes processa 200 propostas em cerca de 70 minutos.
  • 500 créditos grátis no cadastro cobrem 5 propostas de teste; 500 propostas de produção por mês custam cerca de US$ 102,50 em créditos.

Para quem é este conteúdo

Você gerencia RevOps ou sales ops, ou é um fundador fazendo outbound por conta própria. Os representantes gastam 45 minutos montando manualmente um deck de proposta que é 80% idêntico ao anterior, então metade dos prospects qualificados nunca recebe uma proposta personalizada. Seus dados de prospect já estão em uma planilha Google Sheets ou exportação de CRM com empresa, setor, pontos de dor, faixa de preço e nome do contato.

Não use esta receita quando cada proposta precisar de visuais personalizados ou vídeo narrado. Esse é um trabalho para o pipeline de design por imagem abordado depois. Se sua equipe de vendas usa HubSpot e você quer propostas disparadas por estágio de negócio, leia o padrão nativo de CRM em Automação de apresentação e deck de vendas com IA no HubSpot.

Fluxo de trabalho resumido

PassoFerramentaO que aconteceEndpoint 2Slides / créditos
1Google Sheets ou exportação CRMUma linha por prospect: empresa, setor, pontos de dor, faixa de preço, contato, idiomanenhum
22Slides Templates Hub ou APIEscolha um template de pitch deck e registre seu themeIdGET /api/v1/themes/search, grátis
3Zapier Code step ou PythonMonte um prompt estruturado userInput a partir da linhanenhum
4Webhooks by Zapier ou requestsEnvie o job da proposta com mode: "async"POST /api/v1/slides/generate, 10 créditos/página
5Delay 60 s, depois GETPoll até status ser successGET /api/v1/jobs/{jobId}, grátis
6Passo Gmail ou SMTPEnvie o PPTX editável downloadUrl por e-mail para o representantenenhum
7Atualização Google SheetsEscreva jobId e downloadUrl de volta na linha para auditorianenhum

Passo 1: Estruture a planilha de prospects

A qualidade da proposta depende das colunas que você fornece. Uma planilha simples com uma linha por prospect e estas colunas é suficiente:

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

Duas regras tornam o prompt confiável. Primeiro, escreva pain_points como frases curtas separadas por ponto e vírgula, não parágrafos, para que o modelo receba três problemas claros a resolver. Segundo, use a coluna language para conter o nome do idioma exatamente como a API espera ("Spanish", não "es"). Uma coluna status permite que a automação pule linhas já processadas.

Se exportar do CRM, mapeie os mesmos campos. A Google Sheets API também pode ler a planilha diretamente se preferir não usar exportação CSV na versão Python abaixo.

Passo 2: Escolha um themeId fixo para que todas as propostas compartilhem o design

Consistência é o objetivo de um sistema de propostas. Se cada deck usar um template diferente, sua marca parecerá dez empresas. Busque na biblioteca de templates uma vez, escolha um template de pitch deck ou proposta e fixe seu themeId na automação.

Navegue visualmente primeiro em 2slides.com/templates, filtre por Pitch Deck e anote o nome do template.

2Slides Templates Hub com temas de slides curados e filtro Pitch Deck
Figura 1: O Templates Hub, filtrado para Pitch Deck. Escolha um template aqui e depois obtenha seu themeId via endpoint de busca.

Depois resolva o mesmo template para um ID via API. O endpoint de busca é gratuito e limitado a 6 requisições por minuto, o que é irrelevante aqui pois você chama só uma vez.

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

A resposta lista templates correspondentes com seu themeId e metadados. Copie o ID para uma variável de ambiente (PROPOSAL_THEME_ID) para que o passo Zapier e o script Python leiam o mesmo valor. Troque o template uma vez por ano, não por negócio.

A API usa o mesmo motor do Fast PPT web: cole conteúdo, escolha um template, obtenha um PPTX. O endpoint simplesmente faz isso sem interface para cada linha da sua planilha.

Interface do 2Slides Fast PPT com caixa de conteúdo e galeria de templates
Figura 2: Fast PPT no navegador. O endpoint generate executa exatamente esse fluxo sem UI, o que torna possível a automação Google Sheets para PowerPoint.

Passo 3: Monte o prompt e chame a API de automação de proposta de vendas

Um prompt de proposta deve ser estruturado, não conversacional. Diga ao modelo quem é o prospect, quais são as dores, o que você recomenda e quais seções produzir em que ordem. Mantenha o preço em um slide próprio para que os representantes possam editar sem atrapalhar o restante do deck.

Aqui está a chamada exata para a primeira linha da planilha acima. Note que responseLanguage vem da linha e mode é "async" para que a chamada retorne imediatamente com um ID de job.

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

Toda resposta do 2Slides vem embrulhada no mesmo envelope, o que importa para mapear campos no Zapier:

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

Faça polling do job a cada 5 a 10 segundos. Decks Fast PPT geralmente terminam em cerca de 30 segundos.

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

Parâmetros do POST /api/v1/slides/generate: themeId, userInput, responseLanguage, mode
Figura 3: Os quatro parâmetros do endpoint generate. themeId e userInput são obrigatórios; responseLanguage padrão é Auto e mode padrão é sync.

Se você omitir mode, o endpoint roda de forma síncrona e retorna downloadUrl na mesma resposta. Isso é mais simples para chamadas únicas, mas async é mais seguro quando uma plataforma como Zapier tem timeout HTTP curto, e é a escolha certa para lotes.

Passo 4: Geração de PowerPoint no Zapier a partir de uma nova linha na planilha

Para times sem engenheiro disponível, Zapier coloca uma proposta na caixa de entrada do representante em até dois minutos após a linha ser marcada como pronta. O app Webhooks by Zapier faz as duas chamadas API; o resto são passos padrão.

  • Trigger: Google Sheets, linha nova ou atualizada. Adicione um filtro para que só linhas com status igual a ready continuem.
  • Code by Zapier (JavaScript) ou Formatter: monte userInput a partir das colunas da linha (trecho abaixo).
  • Webhooks by Zapier, POST para https://2slides.com/api/v1/slides/generate. Header Authorization: Bearer <sua chave>, corpo JSON com userInput, themeId, responseLanguage, mode: "async". Mapeie data.jobId da resposta.
  • Delay by Zapier, aguarde 60 segundos.
  • Webhooks by Zapier, GET https://2slides.com/api/v1/jobs/{{jobId}} com o mesmo header. Mapeie data.status e data.downloadUrl.
  • Filter: continue só se data.status for success. Para o raro job ainda processando, um segundo Delay + GET cobre.
  • Gmail: Enviar Email para rep_email com o nome do prospect no assunto e downloadUrl no corpo ou campo de anexo.
  • Google Sheets: Atualizar Linha, escreva jobId, downloadUrl e defina status para done.

O passo Code mantém a lógica do prompt num só lugar, para que um gerente de vendas possa mudar a estrutura da proposta sem mexer no webhook:

// Code by Zapier (JavaScript). Campos inputData são mapeados da linha da planilha. 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" };

Mantenha a chave API no header do webhook Webhooks, nunca na planilha. Se vários representantes marcarem linhas como prontas ao mesmo tempo, Zapier pode disparar mais de 6 chamadas generate por minuto; as chamadas extras recebem erro de limite de taxa e o replay embutido do Zapier as trata. Para volume mais constante, use o batch Python abaixo. O mesmo padrão Zapier é usado para decks recorrentes em automatizando slides de relatório semanal com Zapier e 2Slides.

Passo 5: Lote de 200 propostas personalizadas em escala com Python

Quando uma campanha precisa de 200 propostas até segunda-feira, rode um script em vez de disparar 200 Zaps. O script abaixo lê uma exportação CSV da planilha (Arquivo, Download, CSV), envia jobs em lotes de 6 para respeitar o limite de 6 requisições por minuto no generate, faz polling de cada job com intervalo de 6 segundos para ficar abaixo do limite de 10 requisições por minuto no jobs, baixa cada PPTX e escreve resultados num segundo CSV que seu merge Gmail ou importação CRM pode consumir.

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"}) # Nunca mais que 6 chamadas generate em qualquer janela de 60 segundos. 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()

Tempo: cada lote de 6 leva cerca de 60 a 120 segundos incluindo polling, então 200 propostas (34 lotes) terminam em cerca de 70 minutos com uma chave. O script é idempotente por status, então se parar na linha 140 você roda de novo e só as 60 linhas ready restantes são enviadas. Para execuções maiores e padrões de fila mais complexos, veja como gerar apresentações em lote com uma API de IA.

Passo 6: Entregue aos representantes um PPTX editável, não um PDF

A saída do generate é um arquivo PowerPoint nativo: caixas de texto reais, tabelas reais, slides mestre do template. Essa é a razão para usar Fast PPT para propostas em vez de um deck renderizado em imagem.

Os representantes alteram propostas depois de geradas. Um desconto é aprovado, o número de assentos muda na ligação, o jurídico quer uma cláusula no slide de termos, o logo do prospect precisa ir na capa. Com um PPTX editável o representante abre o arquivo, edita o slide de preço e envia. Com PDF ou deck de imagens renderizadas, cada uma dessas mudanças significa regenerar e revisar o deck inteiro.

O passo Gmail (ou a ferramenta de e-mail do seu CRM) deve enviar o próprio PPTX, não um link para visualizador, e o assunto deve conter o nome do prospect para facilitar a busca depois. Se quiser um material polido para deixar com o prospect, os representantes podem exportar para PDF do PowerPoint após as edições.

Como é um deck de proposta forte

Antes de escrever a estrutura do prompt no Passo 3, ajuda olhar decks reais. A Galeria 2Slides hospeda decks de referência que você pode estudar para estrutura, ou passar como referenceImageUrl para o endpoint create-like-this se usar o caminho de design por imagem. São decks de referência, não saída das chamadas API acima.

Pitch deck Perplexity ads da Galeria 2Slides, referência para estrutura de proposta
Figura 4: Slide de capa de um pitch deck na Galeria 2Slides. Uma capa de proposta deve nomear o prospect, o contato e a data.

Pitch deck Perplexity ads da Galeria 2Slides, referência para estrutura de proposta
Figura 5: Slide posterior do mesmo deck da Galeria. Note a densidade de uma ideia por slide; reflita isso no seu prompt com seções numeradas.

Três padrões de propostas fortes se aplicam ao seu prompt: abra com a situação do prospect nas próprias palavras dele (coluna pain_points), mapeie cada ponto da solução para um ponto de dor, e isole o preço em um slide único. Para um olhar mais profundo sobre o que vai em cada seção, veja como criar um deck de habilitação de vendas com IA.

Quanto custa

Fast PPT é cobrado a 10 créditos por página, e uma proposta típica tem 10 páginas. Busca de tema e polling de jobs são grátis.

VolumePáginasCréditosPacotes de créditosUSDPor proposta
20 propostas/mês2002.0001 × $5 (2.000)$5,00$0,25
500 propostas/mês5.00050.0001 × $80 (40.000) + 1 × $22,50 (10.000)$102,50$0,21

Os 500 créditos grátis no cadastro cobrem 5 propostas completas para teste. Créditos são pay-as-you-go sem exigência de assento, então uma chave compartilhada pode servir uma equipe de vendas de 12 pessoas.

Fast PPT ou slides desenhados por imagem para este caso?

NecessidadeUsePor quê
Propostas editáveis que representantes modificarãogenerate (Fast PPT), 10 créditos/páginaPPTX nativo, ~30 s, template consistente
Decks visualmente personalizados para poucos clientes enterprisecreate-pdf-slides, 10 + 100 créditos/página em 2KLayouts desenhados por imagem a partir de prompt de estilo
Combinar visual de deck de marca existentecreate-like-this com referenceImageUrl, mesmo custoDeriva sistema de design de uma imagem de referência
Vídeo narrado de proposta para venda assíncronacreate-pdf-slides ou create-like-this, depois generate-narration a 210 créditos/páginaJobs Fast PPT não podem ser narrados

Para o fluxo de volume baseado em planilha deste artigo, Fast PPT é o padrão correto. Reserve o pipeline de imagem para os 5% dos negócios onde design é diferencial.

Armadilhas comuns

  • Ultrapassar 6 requisições por minuto. Vinte linhas marcadas como prontas ao mesmo tempo geram 20 POSTs em segundos. Enfileire: o script Python envia 6 e espera a janela de 60 segundos; no Zapier, confie no replay ou distribua com Delay.
  • Chave API na planilha ou script cliente. Mantenha a chave no header do webhook Zapier ou variável de ambiente do servidor. Qualquer um com a planilha gastaria seus créditos.
  • Códigos de idioma em vez de nomes. responseLanguage quer "Spanish" ou "Portuguese", não "es" ou "pt-BR". Valide a coluna com dropdown no Sheets.
  • Esperar narração ou MP4 do Fast PPT. O endpoint generate-narration só aceita jobs de create-pdf-slides ou create-like-this. Propostas de generate são só PPTX.
  • Jogar uma transcrição de 4.000 palavras da call em userInput. Resuma antes. Três pontos de dor separados por ponto e vírgula superam um muro de notas, e o slide de preço fica limpo.
  • Mapear campo errado da resposta. O ID do job está em data.jobId, não no topo. O mesmo envelope { success, data: { ... } } vale para a resposta do polling.

Perguntas Frequentes

Posso gerar decks de vendas a partir de dados CRM sem Google Sheets?

Sim. A API só precisa de uma string userInput e um themeId, então qualquer fonte funciona: workflow HubSpot, exportação Salesforce ou query Postgres. Google Sheets é conveniente porque representantes podem editar linhas e marcar prontas sem ajuda de engenharia. Para gatilho nativo de CRM em mudança de estágio, veja o padrão HubSpot citado antes neste artigo.

Quanto tempo leva para gerar uma proposta?

Cerca de 30 segundos para um deck Fast PPT após o job começar. No Zapier, um único Delay de 60 segundos antes do polling é suficiente na quase totalidade dos casos. No batch Python, seis propostas são enviadas em um minuto e normalmente todas terminam no minuto seguinte, então 200 propostas terminam em cerca de 70 minutos com uma chave API.

Toda proposta vai parecer igual?

O design sim, e isso é intencional. Porque todo job usa o mesmo themeId, cores, fontes e layouts são idênticos no lote, e só o conteúdo muda por prospect. Se quiser dois visuais, por exemplo um para enterprise e outro para SMB, adicione uma coluna theme na planilha e mapeie para dois valores diferentes de themeId.

Outras APIs de apresentação suportam esse tipo de automação?

Sim. A API da Gamma em developers.gamma.app oferece automação similar, embora chaves lá exijam plano Pro. Chaves 2Slides funcionam em qualquer conta, inclusive grátis com 500 créditos, e a saída Fast PPT é um PPTX nativo em vez de página hospedada, o que torna prático para representantes editarem slides de preço.

Representantes podem editar o slide de preço após a geração?

Sim, essa é a principal razão para usar o caminho Fast PPT. O arquivo é um PPTX padrão com caixas de texto e tabelas editáveis, então o representante pode mudar contagem de assentos, aplicar desconto aprovado ou adicionar cláusula legal no PowerPoint ou Google Slides. Não precisa regenerar, e o resto do deck fica intacto.

Próximos passos

Propostas de vendas personalizadas em escala se resumem a três partes: uma planilha limpa, um template fixo e uma fila que respeita 6 requisições por minuto.

About 2Slides

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

Try For Free