2Slides Logo
Propuestas de Ventas Personalizadas a Gran Escala: Google Sheets + API (2026)
2Slides Team
18 min read

Propuestas de Ventas Personalizadas a Gran Escala: Google Sheets + API (2026)

Para producir propuestas de ventas personalizadas a gran escala, mantén a los prospectos en una hoja de Google Sheets (o una exportación de CRM), convierte cada fila en un prompt estructurado y envíalo al endpoint Fast PPT de 2Slides POST /api/v1/slides/generate con un themeId fijo para que cada presentación comparta un diseño. Cada propuesta de 10 páginas cuesta 100 créditos, aproximadamente $0.25, llega como un PPTX nativo editable en unos 30 segundos y puede enviarse automáticamente por correo al representante. Esta receta es para líderes de RevOps y operaciones de ventas, y fundadores que hacen outbound.

Puntos clave

  • Una llamada POST /api/v1/slides/generate convierte una fila de la hoja en una propuesta PPTX diseñada y editable por 10 créditos por página.
  • Un themeId fijo obtenido con GET /api/v1/themes/search?query=pitch deck mantiene 200 propuestas visualmente idénticas, para que los reps solo modifiquen contenido.
  • responseLanguage acepta un nombre de idioma por fila ("Spanish", "Portuguese"), así cuentas LATAM y EMEA reciben presentaciones en su idioma nativo desde la misma hoja.
  • El endpoint generate permite 6 solicitudes por minuto por clave; una cola en Python que duerme entre lotes procesa 200 propuestas en unos 70 minutos.
  • 500 créditos gratis al registrarse cubren 5 propuestas de prueba; 500 propuestas de producción al mes cuestan unos $102.50 en créditos.

Para quién es esto

Diriges RevOps o operaciones de ventas, o eres un fundador haciendo outbound por tu cuenta. Los reps pasan 45 minutos construyendo manualmente una presentación que es 80% idéntica a la anterior, por lo que la mitad de tus prospectos calificados nunca recibe una propuesta personalizada. Los datos de tus prospectos ya están en una hoja de Google Sheets o una exportación de CRM con empresa, industria, puntos de dolor, nivel de precios y nombre de contacto.

No uses esta receta cuando cada propuesta requiera visuales personalizados o video narrado. Eso es trabajo para la pipeline de diseño con imágenes que se cubre más adelante. Si tu equipo de ventas usa HubSpot y quieres que las propuestas se disparen desde etapas de negocio, lee el patrón nativo de CRM en Automatización de presentaciones y decks de ventas con IA en HubSpot.

Flujo de trabajo a grandes rasgos

PasoHerramientaQué sucedeEndpoint 2Slides / créditos
1Google Sheets o exportación CRMUna fila por prospecto: empresa, industria, puntos de dolor, nivel de precios, contacto, idiomaninguno
22Slides Templates Hub o APIElige una plantilla de pitch deck y registra su themeIdGET /api/v1/themes/search, gratis
3Zapier Code step o PythonConstruye un prompt estructurado userInput desde la filaninguno
4Webhooks by Zapier o requestsEnvía el trabajo de propuesta con mode: "async"POST /api/v1/slides/generate, 10 créditos/página
5Espera 60 s, luego GETConsulta hasta que status sea successGET /api/v1/jobs/{jobId}, gratis
6Paso Gmail o SMTPEnvía el PPTX editable downloadUrl al representanteninguno
7Actualización Google SheetsEscribe jobId y downloadUrl en la fila para auditoríaninguno

Paso 1: Estructura la hoja de prospectos

La calidad de la propuesta depende de las columnas que alimentes. Una hoja plana con una fila por prospecto y estas columnas es 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

Dos reglas hacen que el prompt posterior sea confiable. Primero, escribe pain_points como frases cortas separadas por punto y coma, no párrafos, para que el modelo reciba tres problemas claros a abordar. Segundo, usa la columna language para poner el nombre del idioma exactamente como la API lo espera ("Spanish", no "es"). Una columna status permite que la automatización omita filas ya procesadas.

Si exportas desde un CRM, mapea los mismos campos. La Google Sheets API también puede leer la hoja directamente si prefieres no usar exportaciones CSV en la versión Python abajo.

Paso 2: Elige un themeId para que todas las propuestas compartan diseño

La consistencia es el objetivo de un sistema de propuestas. Si cada presentación usa una plantilla diferente, tu marca parece diez empresas distintas. Busca en la biblioteca de plantillas una vez, elige una plantilla de pitch deck o propuesta, y fija su themeId en la automatización.

Navega visualmente primero en 2slides.com/templates, filtra por Pitch Deck y anota el nombre de la plantilla.

2Slides Templates Hub con temas de diapositivas curados y filtro Pitch Deck
Figura 1: El Templates Hub, filtrado a Pitch Deck. Elige una plantilla aquí y luego obtén su themeId vía el endpoint de búsqueda.

Luego resuelve la misma plantilla a un ID desde la API. El endpoint de búsqueda es gratuito y limitado a 6 solicitudes por minuto, irrelevante aquí porque solo lo llamas una vez.

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

La respuesta lista plantillas coincidentes con su themeId y metadatos. Copia el ID en una variable de entorno (PROPOSAL_THEME_ID) para que el paso Zapier y el script Python lean el mismo valor. Cambia la plantilla una vez al año, no por negocio.

La API usa el mismo motor que la herramienta web Fast PPT: pega contenido, elige plantilla, obtén un PPTX. El endpoint simplemente hace eso sin interfaz para cada fila en tu hoja.

Interfaz Fast PPT de 2Slides con caja de contenido y galería de plantillas
Figura 2: Fast PPT en el navegador. El endpoint generate ejecuta exactamente este flujo sin UI, lo que hace posible la automatización de Google Sheets a PowerPoint.

Paso 3: Construye el prompt y llama a la API de automatización de propuestas de ventas

Un prompt para propuesta debe ser estructurado, no conversacional. Indica quién es el prospecto, qué problemas tiene, qué recomiendas y qué secciones producir en qué orden. Mantén el precio en su propia diapositiva para que los reps puedan editarlo sin afectar el resto.

Aquí está la llamada exacta para la primera fila de la hoja arriba. Nota que responseLanguage viene de la fila y mode es "async" para que la llamada regrese inmediatamente con 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" }'

Cada respuesta de 2Slides está envuelta en el mismo sobre, importante para mapear campos en Zapier:

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

Consulta el trabajo cada 5 a 10 segundos. Los decks Fast PPT suelen terminar en unos 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 POST /api/v1/slides/generate: themeId, userInput, responseLanguage, mode
Figura 3: Los cuatro parámetros del endpoint generate. themeId y userInput son obligatorios; responseLanguage por defecto es Auto y mode por defecto es sync.

Si omites mode, el endpoint corre síncronamente y devuelve downloadUrl en la misma respuesta. Eso es más simple para llamadas puntuales, pero async es más seguro cuando una plataforma como Zapier tiene un timeout HTTP corto, y es la opción correcta para lotes.

Paso 4: Generación de PowerPoint con Zapier desde una fila nueva en la hoja

Para equipos sin ingeniero disponible, Zapier pone una propuesta en el inbox del rep en dos minutos tras marcar una fila como lista. La app Webhooks by Zapier hace las dos llamadas API; todo lo demás son pasos estándar.

  • Disparador: Google Sheets, fila nueva o actualizada. Añade un paso Filter para que solo continúen filas con status igual a ready.
  • Code by Zapier (JavaScript) o Formatter: arma userInput desde las columnas de la fila (snippet abajo).
  • Webhooks by Zapier, POST a https://2slides.com/api/v1/slides/generate. Header Authorization: Bearer <tu clave>, cuerpo JSON con userInput, themeId, responseLanguage, mode: "async". Mapea data.jobId de la respuesta.
  • Delay by Zapier, espera 60 segundos.
  • Webhooks by Zapier, GET https://2slides.com/api/v1/jobs/{{jobId}} con el mismo header. Mapea data.status y data.downloadUrl.
  • Filter: continúa solo si data.status es success. Para el raro job aún en proceso, un segundo Delay + GET lo cubre.
  • Gmail: Send Email a rep_email con el nombre del prospecto en el asunto y downloadUrl en el cuerpo o campo de adjunto.
  • Google Sheets: Update Row, escribe jobId, downloadUrl y cambia status a done.

El paso Code mantiene la lógica del prompt en un solo lugar, para que un gerente de ventas pueda cambiar la estructura sin tocar el webhook:

// Code by Zapier (JavaScript). Los campos inputData se mapean desde la fila. 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" };

Mantén la clave API en el header del webhook de Zapier, nunca en la hoja. Si varios reps marcan filas listas simultáneamente, Zapier puede disparar más de 6 llamadas generate por minuto; las llamadas extra reciben error por límite de tasa y la reejecución automática de Zapier las maneja. Para volumen más estable, usa el lote Python abajo. El mismo patrón Zapier se usa para decks recurrentes en automatización de slides de reportes semanales con Zapier y 2Slides.

Paso 5: Lotea 200 propuestas de ventas personalizadas a gran escala con Python

Cuando una campaña necesita 200 propuestas para el lunes, ejecuta un script en lugar de disparar 200 Zaps. El script lee un CSV exportado de la hoja (Archivo, Descargar, CSV), envía trabajos en lotes de 6 para respetar el límite de 6 solicitudes por minuto en generate, consulta cada job con un gap de 6 segundos para no superar 10 solicitudes por minuto en jobs, descarga cada PPTX y escribe resultados en un segundo CSV que tu fusión de Gmail o importación CRM puede 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"}) # 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()

Tiempo: cada lote de 6 toma aproximadamente 60 a 120 segundos incluyendo consultas, así que 200 propuestas (34 lotes) terminan en unos 70 minutos con una sola clave. El script es idempotente por status, así que si muere en la fila 140 lo vuelves a correr y solo envía las 60 filas ready restantes. Para ejecuciones más grandes y patrones de cola, ve cómo generar presentaciones en lote con una API de IA.

Paso 6: Entrega a los reps un PPTX editable, no un PDF

La salida de generate es un archivo PowerPoint nativo: cajas de texto reales, tablas reales, las diapositivas maestras de la plantilla. Esta es la razón para usar Fast PPT para propuestas en lugar de un deck renderizado en imágenes.

Los reps modifican las propuestas tras generarlas. Se aprueba un descuento, cambia el número de asientos en la llamada, legal quiere una cláusula en la diapositiva de términos, el logo del prospecto debe ir en la portada. Con un PPTX editable el rep abre el archivo, edita la diapositiva de precios y lo envía. Con un PDF o un deck de imágenes renderizadas, cada cambio implica regenerar y revisar todo el deck.

El paso Gmail (o la herramienta de email de tu CRM) debe enviar el PPTX mismo, no un link de visor, y la línea de asunto debe llevar el nombre del prospecto para que los reps lo encuentren luego. Si también quieres un leave-behind pulido, los reps pueden exportar a PDF desde PowerPoint tras sus ediciones.

Cómo es un deck de propuesta fuerte

Antes de escribir la estructura del prompt en el Paso 3, ayuda ver decks reales. La Galería 2Slides aloja decks de referencia que puedes estudiar para estructura, o pasar como referenceImageUrl al endpoint create-like-this si usas la ruta de diseño con imágenes. Estos son decks de referencia, no salida de las llamadas API arriba.

Pitch deck de Perplexity ads de la Galería 2Slides, referencia para estructura de propuesta
Figura 4: Diapositiva de portada de un pitch deck en la Galería 2Slides. Una portada de propuesta debe nombrar al prospecto, el contacto y la fecha.

Pitch deck de Perplexity ads de la Galería 2Slides, referencia para estructura de propuesta
Figura 5: Diapositiva posterior del mismo deck de la Galería. Nota la densidad de una idea por diapositiva; refleja esto en tu prompt con secciones numeradas.

Tres patrones de propuestas fuertes se trasladan a tu prompt: abre con la situación del prospecto en sus palabras (columna pain_points), mapea cada punto de solución a un punto de dolor, y aísla el precio en una diapositiva única. Para un análisis más profundo de qué va en cada sección, ve cómo crear un deck de habilitación de ventas con IA.

Cuánto cuesta

Fast PPT se cobra a 10 créditos por página, y una propuesta típica tiene 10 páginas. La búsqueda de temas y la consulta de jobs son gratis.

VolumenPáginasCréditosPaquetes de créditosUSDPor propuesta
20 propuestas/mes2002,0001 × $5 (2,000)$5.00$0.25
500 propuestas/mes5,00050,0001 × $80 (40,000) + 1 × $22.50 (10,000)$102.50$0.21

Los 500 créditos gratis al registrarse cubren 5 propuestas completas para pruebas. Los créditos son pay-as-you-go sin requisito de asiento, así que una clave compartida puede servir a un equipo de ventas de 12 personas.

Fast PPT o slides diseñadas con imágenes para este caso

NecesidadUsarPor qué
Propuestas editables que los reps modificarángenerate (Fast PPT), 10 créditos/páginaPPTX nativo, ~30 s, plantilla consistente
Decks visualmente personalizados para pocas cuentas enterprisecreate-pdf-slides, 10 + 100 créditos/página a 2KLayouts diseñados con imágenes desde un prompt de estilo
Igualar el look de un deck de marca existentecreate-like-this con referenceImageUrl, mismo costoDeriva el sistema de diseño desde una imagen de referencia
Video narrado de propuesta para venta asincrónicacreate-pdf-slides o create-like-this, luego generate-narration a 210 créditos/páginaJobs Fast PPT no pueden ser narrados

Para el flujo de volumen basado en hoja de este artículo, Fast PPT es el default correcto. Reserva la pipeline de imágenes para el 5% de negocios donde el diseño es el diferenciador.

Errores comunes

  • Exceder 6 solicitudes por minuto. Veinte filas marcadas listas a la vez significa 20 POSTs en segundos. Ponlas en cola: el script Python hace lotes de 6 y espera la ventana de 60 segundos; en Zapier, confía en la reejecución o espacia con un paso Delay.
  • Clave API en la hoja o script cliente. Mantén la clave en el header del webhook Zapier o en variable de entorno del servidor. Cualquiera con la hoja gastaría tus créditos.
  • Códigos de idioma en lugar de nombres. responseLanguage quiere "Spanish" o "Portuguese", no "es" o "pt-BR". Valida la columna con un dropdown en Sheets.
  • Esperar narración o MP4 de Fast PPT. El endpoint generate-narration solo acepta jobs de create-pdf-slides o create-like-this. Propuestas de generate son solo PPTX.
  • Volcar una transcripción de llamada de descubrimiento de 4,000 palabras en userInput. Resume primero. Tres puntos de dolor separados por punto y coma superan un muro de notas, y la diapositiva de precios queda limpia.
  • Mapear el campo de respuesta incorrecto. El job ID está en data.jobId, no en el nivel superior. El mismo sobre { success, data: { ... } } aplica para la respuesta de consulta.

Preguntas Frecuentes

¿Puedo generar decks de ventas desde datos CRM sin Google Sheets?

Sí. La API solo necesita un string userInput y un themeId, así que cualquier fuente funciona: un workflow de HubSpot, una exportación de Salesforce o una consulta Postgres. Google Sheets es conveniente porque los reps pueden editar filas y marcarlas listas sin ayuda de ingeniería. Para un disparador nativo CRM en cambios de etapa, ve el patrón HubSpot enlazado antes en este artículo.

¿Cuánto tarda en generarse una propuesta?

Unos 30 segundos para un deck Fast PPT una vez que inicia el job. En Zapier, un solo Delay de 60 segundos antes de consultar es suficiente casi siempre. En el lote Python, seis propuestas se envían en un minuto y típicamente todas terminan en el siguiente minuto, así que 200 propuestas terminan en unos 70 minutos con una sola clave API.

¿Todas las propuestas se verán iguales?

El diseño sí, que es lo esperado. Porque cada job usa el mismo themeId, colores, fuentes y layouts son idénticos en el lote, y solo cambia el contenido por prospecto. Si quieres dos looks, por ejemplo uno para enterprise y otro para SMB, añade una columna theme en la hoja y mapea a dos valores themeId diferentes.

¿Otras APIs de presentación soportan esta automatización?

Sí. La API de Gamma en developers.gamma.app ofrece automatización similar, aunque las claves API allí requieren plan Pro. Las claves 2Slides funcionan en cualquier cuenta, incluso una gratis con 500 créditos, y la salida Fast PPT es un PPTX nativo en lugar de una página alojada, lo que hace prácticas las ediciones de reps en diapositivas de precios.

¿Los reps pueden editar la diapositiva de precios tras la generación?

Sí, esa es la razón principal para usar la ruta Fast PPT. El archivo es un PPTX estándar con cajas de texto y tablas editables, así que un rep puede cambiar conteos de asientos, aplicar un descuento aprobado o añadir una cláusula legal en PowerPoint o Google Slides. No se necesita regenerar y el resto del deck queda intacto.

Próximos pasos

Las propuestas de ventas personalizadas a escala se reducen a tres partes: una hoja limpia, una plantilla fija y una cola que respete 6 solicitudes por minuto.

About 2Slides

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

Try For Free