

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/generatetransforma uma linha da planilha em uma proposta PPTX editável e desenhada por 10 créditos por página. - Um
themeIdfixo obtido viaGET /api/v1/themes/search?query=pitch deckmantém 200 propostas visualmente idênticas, para que os representantes mexam apenas no conteúdo. responseLanguageaceita 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
| Passo | Ferramenta | O que acontece | Endpoint 2Slides / créditos |
|---|---|---|---|
| 1 | Google Sheets ou exportação CRM | Uma linha por prospect: empresa, setor, pontos de dor, faixa de preço, contato, idioma | nenhum |
| 2 | 2Slides Templates Hub ou API | Escolha um template de pitch deck e registre seu themeId | GET /api/v1/themes/search, grátis |
| 3 | Zapier Code step ou Python | Monte um prompt estruturado userInput a partir da linha | nenhum |
| 4 | Webhooks by Zapier ou requests | Envie o job da proposta com mode: "async" | POST /api/v1/slides/generate, 10 créditos/página |
| 5 | Delay 60 s, depois GET | Poll até status ser success | GET /api/v1/jobs/{jobId}, grátis |
| 6 | Passo Gmail ou SMTP | Envie o PPTX editável downloadUrl por e-mail para o representante | nenhum |
| 7 | Atualização Google Sheets | Escreva jobId e downloadUrl de volta na linha para auditoria | nenhum |
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:
| 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 |
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.

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.

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://..." } }
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
statusigual areadycontinuem. - Code by Zapier (JavaScript) ou Formatter: monte
userInputa partir das colunas da linha (trecho abaixo). - Webhooks by Zapier, POST para
https://2slides.com/api/v1/slides/generate. HeaderAuthorization: Bearer <sua chave>, corpo JSON comuserInput,themeId,responseLanguage,mode: "async". Mapeiedata.jobIdda resposta. - Delay by Zapier, aguarde 60 segundos.
- Webhooks by Zapier, GET
https://2slides.com/api/v1/jobs/{{jobId}}com o mesmo header. Mapeiedata.statusedata.downloadUrl. - Filter: continue só se
data.statusforsuccess. Para o raro job ainda processando, um segundo Delay + GET cobre. - Gmail: Enviar Email para
rep_emailcom o nome do prospect no assunto edownloadUrlno corpo ou campo de anexo. - Google Sheets: Atualizar Linha, escreva
jobId,downloadUrle definastatusparadone.
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.


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.
| Volume | Páginas | Créditos | Pacotes de créditos | USD | Por proposta |
|---|---|---|---|---|---|
| 20 propostas/mês | 200 | 2.000 | 1 × $5 (2.000) | $5,00 | $0,25 |
| 500 propostas/mês | 5.000 | 50.000 | 1 × $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?
| Necessidade | Use | Por quê |
|---|---|---|
| Propostas editáveis que representantes modificarão | generate (Fast PPT), 10 créditos/página | PPTX nativo, ~30 s, template consistente |
| Decks visualmente personalizados para poucos clientes enterprise | create-pdf-slides, 10 + 100 créditos/página em 2K | Layouts desenhados por imagem a partir de prompt de estilo |
| Combinar visual de deck de marca existente | create-like-this com referenceImageUrl, mesmo custo | Deriva sistema de design de uma imagem de referência |
| Vídeo narrado de proposta para venda assíncrona | create-pdf-slides ou create-like-this, depois generate-narration a 210 créditos/página | Jobs 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.
responseLanguagequer "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-narrationsó aceita jobs decreate-pdf-slidesoucreate-like-this. Propostas degeneratesã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.
- Obtenha uma chave API em 2slides.com/api. O cadastro inclui 500 créditos grátis, suficiente para 5 propostas de teste.
- Explore outras receitas para times no post do hub, Casos de uso da API de apresentação com IA por time.
- Aprofunde no lado de vendas com Automação de deck de vendas com IA no HubSpot e geração em lote de apresentações com API de IA.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free