2Slides Logo
Персонализированные коммерческие предложения в масштабе: Google Sheets + API (2026)
2Slides Team
16 min read

Персонализированные коммерческие предложения в масштабе: Google Sheets + API (2026)

Чтобы создавать персонализированные коммерческие предложения в большом объеме, храните данные потенциальных клиентов в Google Sheets (или экспорт из CRM), превращайте каждую строку в структурированный запрос и отправляйте его на endpoint 2Slides Fast PPT POST /api/v1/slides/generate с одним фиксированным themeId, чтобы все презентации имели одинаковый дизайн. Каждое предложение на 10 страниц стоит 100 кредитов, примерно $0.25, приходит в виде нативного редактируемого PPTX примерно за 30 секунд и может автоматически отправляться менеджеру по продажам. Этот рецепт предназначен для руководителей RevOps и sales ops, а также основателей, занимающихся исходящими продажами.

Основные выводы

  • Один вызов POST /api/v1/slides/generate превращает строку таблицы в оформленное, редактируемое PPTX предложение за 10 кредитов за страницу.
  • Фиксированный themeId из GET /api/v1/themes/search?query=pitch deck обеспечивает визуальную идентичность 200 предложений, чтобы менеджеры меняли только содержимое.
  • Параметр responseLanguage принимает название языка из строки ("Spanish", "Portuguese"), так что аккаунты LATAM и EMEA получают презентации на родном языке из одной таблицы.
  • Endpoint generate допускает 6 запросов в минуту на ключ; Python-очередь с паузами между партиями обрабатывает 200 предложений примерно за 70 минут.
  • 500 бесплатных кредитов при регистрации покрывают 5 тестовых предложений; 500 производственных предложений в месяц стоят около $102.50 в кредитах.

Для кого это

Вы руководите RevOps или sales ops, либо вы основатель, который сам занимается исходящими продажами. Менеджеры тратят 45 минут на ручное создание презентации, которая на 80% идентична предыдущей, поэтому половина квалифицированных клиентов вообще не получает персонализированное предложение. Данные о клиентах уже хранятся в Google Sheets или экспортированы из CRM с информацией о компании, отрасли, болевых точках, ценовом уровне и имени контакта.

Не используйте этот рецепт, если для каждого предложения нужны уникальные визуальные элементы или озвученное видео. Для этого есть pipeline с дизайном изображений, описанный далее. Если ваша команда работает в HubSpot и вы хотите запускать предложения по стадиям сделки, смотрите нативный CRM-паттерн в HubSpot AI presentation and sales deck automation.

Обзор рабочего процесса

ШагИнструментЧто происходитEndpoint 2Slides / кредиты
1Google Sheets или экспорт из CRMОдна строка на клиента: компания, отрасль, болевые точки, ценовой уровень, контакт, языкнет
22Slides Templates Hub или APIВыберите шаблон pitch deck и запишите его themeIdGET /api/v1/themes/search, бесплатно
3Zapier Code step или PythonСоберите структурированный запрос userInput из строкинет
4Webhooks by Zapier или requestsОтправьте задачу на генерацию с mode: "async"POST /api/v1/slides/generate, 10 кредитов/страница
5Задержка 60 с, затем GETОпросите статус до successGET /api/v1/jobs/{jobId}, бесплатно
6Gmail или SMTPОтправьте редактируемый PPTX по email менеджерунет
7Обновление Google SheetsЗапишите jobId и downloadUrl обратно в строку для аудитанет

Шаг 1: Структурируйте таблицу с клиентами

Качество предложения зависит от колонок, которые вы используете. Достаточно простой таблицы с одной строкой на клиента и такими колонками:

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

Две рекомендации для надежности запроса. Во-первых, pain_points пишите короткими фразами, разделёнными точкой с запятой, а не абзацами, чтобы модель получила три чёткие проблемы. Во-вторых, в колонке language указывайте название языка так, как ожидает API ("Spanish", а не "es"). Колонка status позволяет автоматизации пропускать уже обработанные строки.

Если экспортируете из CRM, сопоставьте те же поля. Google Sheets API может читать таблицу напрямую, если не хотите использовать CSV в Python-версии ниже.

Шаг 2: Выберите один themeId, чтобы все предложения были в одном стиле

Согласованность — ключ к системе предложений. Если каждая презентация в разном шаблоне, бренд выглядит как десять разных компаний. Один раз найдите шаблон pitch deck, выберите его и зафиксируйте themeId в автоматизации.

Сначала визуально выберите шаблон на 2slides.com/templates, отфильтровав по Pitch Deck, и запомните название.

2Slides Templates Hub с отфильтрованными темами слайдов и фильтром Pitch Deck
Рисунок 1: Templates Hub с фильтром Pitch Deck. Выберите здесь шаблон, затем получите его themeId через endpoint поиска.

Затем получите ID шаблона через API. Endpoint поиска бесплатен и ограничен 6 запросами в минуту, что не критично, так как вызывается один раз.

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

В ответе список подходящих шаблонов с themeId и метаданными. Скопируйте ID в переменную окружения (PROPOSAL_THEME_ID), чтобы и Zapier, и Python-скрипт использовали одно значение. Меняйте шаблон раз в год, а не для каждой сделки.

API управляет тем же движком, что и веб-инструмент Fast PPT: вставляете контент, выбираете шаблон, получаете PPTX. Endpoint просто делает это без интерфейса для каждой строки таблицы.

Интерфейс 2Slides Fast PPT с полем контента и галереей шаблонов
Рисунок 2: Fast PPT в браузере. Endpoint generate выполняет точно этот процесс без UI, что и позволяет автоматизировать переход из Google Sheets в PowerPoint.

Шаг 3: Соберите запрос и вызовите API автоматизации коммерческих предложений

Запрос для предложения должен быть структурированным, а не разговорным. Расскажите модели, кто клиент, какие проблемы, что рекомендуете и какие разделы создать в каком порядке. Ценообразование выделите на отдельный слайд, чтобы менеджеры могли редактировать его без риска повредить остальную презентацию.

Пример точного вызова для первой строки таблицы выше. Обратите внимание, что responseLanguage берётся из строки, а mode"async", чтобы вызов возвращал сразу 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" }'

Каждый ответ 2Slides обёрнут в одинаковую структуру, что важно при маппинге полей в Zapier:

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

Опросите задачу каждые 5–10 секунд. Презентации Fast PPT обычно готовы примерно за 30 секунд.

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 параметры: themeId, userInput, responseLanguage, mode
Рисунок 3: Четыре параметра endpoint generate. themeId и userInput обязательны; responseLanguage по умолчанию Auto, mode по умолчанию sync.

Если не указывать mode, endpoint работает синхронно и сразу возвращает downloadUrl. Это проще для одиночных вызовов, но async безопаснее при коротком HTTP timeout, например, в Zapier, и подходит для пакетной обработки.

Шаг 4: Генерация PowerPoint в Zapier при добавлении новой строки

Для команд без инженера на связи Zapier доставляет предложение в почтовый ящик менеджера менее чем за две минуты после пометки строки как готовой. Приложение Webhooks by Zapier выполняет два API вызова; остальное — стандартные шаги.

  • Триггер: Google Sheets, новая или обновлённая строка. Добавьте фильтр, чтобы обрабатывать только строки со статусом ready.
  • Code by Zapier (JavaScript) или Formatter: соберите userInput из колонок строки (пример ниже).
  • Webhooks by Zapier, POST на https://2slides.com/api/v1/slides/generate. Заголовок Authorization: Bearer <ваш ключ>, JSON с userInput, themeId, responseLanguage, mode: "async". Сопоставьте data.jobId из ответа.
  • Delay by Zapier, задержка 60 секунд.
  • Webhooks by Zapier, GET https://2slides.com/api/v1/jobs/{{jobId}} с тем же заголовком. Сопоставьте data.status и data.downloadUrl.
  • Фильтр: продолжайте только если data.status равно success. Для редких случаев, когда задача ещё в обработке, добавьте второй Delay + GET.
  • Gmail: Отправить письмо на rep_email с именем клиента в теме и downloadUrl в теле или в поле вложения.
  • Google Sheets: Обновить строку, запишите jobId, downloadUrl и установите status в done.

Код-шаг держит логику запроса в одном месте, чтобы менеджер мог менять структуру предложения без правок webhook:

// Code by Zapier (JavaScript). inputData поля сопоставлены из строки таблицы. 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" };

Держите API-ключ в заголовке Webhooks, не в таблице. Если несколько менеджеров одновременно пометят строки как готовые, Zapier может отправить более 6 generate вызовов в минуту; лишние получат ошибку ограничения, а встроенный механизм повторов Zapier их обработает. Для более стабильного объема используйте Python-скрипт ниже. Такой же паттерн Zapier применяется для регулярных презентаций в автоматизации еженедельных отчетов с Zapier и 2Slides.

Шаг 5: Пакетная генерация 200 персонализированных предложений с Python

Если нужна кампания из 200 предложений к понедельнику, лучше запустить скрипт, а не 200 Zaps. Скрипт читает CSV-экспорт таблицы (Файл, Скачать, CSV), отправляет задачи партиями по 6, чтобы не превышать лимит 6 запросов в минуту на generate, опрашивает каждую задачу с интервалом 6 секунд, чтобы не превышать 10 запросов в минуту на jobs, скачивает каждый PPTX и записывает результаты во второй CSV для слияния в Gmail или импорта в CRM.

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"] # из GET /themes/search?query=pitch deck BATCH = 6 # generate: 6 запросов/мин на ключ POLL_GAP = 6 # jobs: 10 запросов/мин -> опрос каждые 6 с 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"}) # Не более 6 generate вызовов в любом 60-секундном окне. 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()

Время: каждая партия из 6 занимает примерно 60–120 секунд с учётом опроса, так что 200 предложений (34 партии) готовы примерно за 70 минут на одном ключе. Скрипт идемпотентен по status, если он упадёт на 140-й строке, запустите снова — будут отправлены только оставшиеся 60 строк со статусом ready. Для больших запусков и других схем очередей смотрите как пакетно генерировать презентации с AI API.

Шаг 6: Дайте менеджерам редактируемый PPTX, а не PDF

Результат generate — нативный PowerPoint-файл: настоящие текстовые поля, таблицы, мастер-слайды шаблона. Это причина использовать Fast PPT для предложений, а не изображение.

Менеджеры редактируют предложения после генерации. Утверждённая скидка, изменение количества мест на звонке, юридический пункт на слайде условий, логотип клиента на обложке — с редактируемым PPTX менеджер открывает файл, меняет слайд с ценой и отправляет. С PDF или набором изображений каждое изменение требует регенерации и повторного просмотра всей презентации.

Шаг Gmail (или почтовый инструмент CRM) должен отправлять PPTX, а не ссылку на просмотр, а тема письма должна содержать имя клиента, чтобы менеджеры могли быстро найти файл. Если нужен красивый leave-behind, менеджеры могут экспортировать PDF из PowerPoint после правок.

Как выглядит сильная презентация предложения

Перед написанием структуры запроса в Шаге 3 полезно посмотреть реальные презентации. Галерея 2Slides содержит эталонные презентации для изучения структуры или передачи в referenceImageUrl для endpoint create-like-this, если вы выберете путь с дизайном изображений. Это эталонные презентации, а не результат API вызовов выше.

Презентация Perplexity ads из галереи 2Slides, эталон структуры предложения
Рисунок 4: Титульный слайд презентации из галереи 2Slides. Обложка предложения должна содержать имя клиента, контакт и дату.

Презентация Perplexity ads из галереи 2Slides, эталон структуры предложения
Рисунок 5: Один из слайдов из той же презентации. Обратите внимание на плотность — одна идея на слайд; отражайте это в запросе с нумерованными разделами.

Три паттерна из сильных предложений перенесите в запрос: начните с описания ситуации клиента его словами (колонка pain_points), сопоставьте каждое решение с одной проблемой, выделите ценообразование на отдельный слайд. Для подробностей о содержании каждого раздела смотрите как создать sales enablement deck с AI.

Стоимость

Fast PPT тарифицируется по 10 кредитов за страницу, типичное предложение — 10 страниц. Поиск темы и опрос задач бесплатны.

ОбъемСтраницыКредитыПакеты кредитовUSDЗа предложение
20 предложений/мес2002,0001 × $5 (2,000)$5.00$0.25
500 предложений/мес5,00050,0001 × $80 (40,000) + 1 × $22.50 (10,000)$102.50$0.21

500 бесплатных кредитов при регистрации покрывают 5 полных предложений для теста. Кредиты оплачиваются по факту, без требований по количеству пользователей, так что один общий ключ может обслуживать команду из 12 человек.

Fast PPT или слайды с дизайном изображений для этого кейса?

ПотребностьИспользоватьПочему
Редактируемые предложения, которые менеджеры будут менятьgenerate (Fast PPT), 10 кредитов/страницаНативный PPTX, ~30 с, единый шаблон
Визуально уникальные презентации для нескольких корпоративных клиентовcreate-pdf-slides, 10 + 100 кредитов/страница при 2KДизайн изображений по стилевому запросу
Совпадение с существующим бренд-шаблономcreate-like-this с referenceImageUrl, та же стоимостьДизайн системы по референсному изображению
Озвученное видео предложения для асинхронных продажcreate-pdf-slides или create-like-this, затем generate-narration за 210 кредитов/страницаFast PPT не поддерживает озвучку

Для объемного потока из таблицы в этой статье Fast PPT — правильный выбор по умолчанию. Пайплайн с изображениями оставьте для 5% сделок, где дизайн — ключевой фактор.

Частые ошибки

  • Превышение 6 запросов в минуту. Если 20 строк одновременно помечены как готовые, это 20 POST за секунды. Очередь: Python-скрипт обрабатывает партии по 6 и ждёт 60 секунд; в Zapier полагайтесь на повтор или добавьте задержку.
  • API-ключ в таблице или клиентском скрипте. Храните ключ в заголовке webhook Zapier или в серверной переменной окружения. Иначе любой с доступом к таблице потратит ваши кредиты.
  • Коды языков вместо названий. responseLanguage требует "Spanish" или "Portuguese", а не "es" или "pt-BR". Проверьте колонку через выпадающий список в Sheets.
  • Ожидание озвучки или MP4 от Fast PPT. Endpoint generate-narration принимает только задачи из create-pdf-slides или create-like-this. Предложения из generate — только PPTX.
  • Вброс 4000-словного транскрипта звонка в userInput. Сначала резюмируйте. Три болевые точки, разделённые точками с запятой, работают лучше, и слайд с ценой остаётся чистым.
  • Неправильное сопоставление поля ответа. ID задачи находится в data.jobId, а не на верхнем уровне. Та же структура { success, data: { ... } } для ответа опроса.

Часто задаваемые вопросы

Можно ли генерировать презентации из данных CRM без Google Sheets?

Да. API требует только строку userInput и themeId, так что источник может быть любым: workflow HubSpot, экспорт Salesforce или запрос Postgres. Google Sheets удобен тем, что менеджеры могут редактировать строки и помечать их готовыми без помощи инженера. Для нативного CRM-триггера по стадиям сделки смотрите паттерн HubSpot, упомянутый выше.

Сколько времени занимает генерация одного предложения?

Около 30 секунд для Fast PPT после старта задачи. В Zapier достаточно одной задержки в 60 секунд перед опросом в большинстве случаев. В Python-пакете шесть предложений отправляются за минуту и обычно все завершаются в следующую минуту, так что 200 предложений готовы примерно за 70 минут на одном ключе.

Все предложения будут выглядеть одинаково?

Дизайн будет одинаковым, это задумано. Поскольку все задачи используют один themeId, цвета, шрифты и макеты идентичны в партии, меняется только содержимое под каждого клиента. Если нужны два вида, например для корпоративных и SMB, добавьте колонку theme в таблицу и сопоставьте её с двумя разными themeId.

Поддерживают ли другие API презентаций такую автоматизацию?

Да. API Gamma на developers.gamma.app предлагает похожую автоматизацию, но ключи там требуют Pro-плана. Ключи 2Slides работают на любом аккаунте, включая бесплатный с 500 кредитами, а Fast PPT выдаёт нативный PPTX, а не хостинговую страницу, что делает редактирование слайдов с ценой удобным для менеджеров.

Могут ли менеджеры редактировать слайд с ценой после генерации?

Да, это главная причина использовать Fast PPT. Файл — стандартный PPTX с редактируемыми текстовыми полями и таблицами, менеджер может менять количество мест, применять одобренную скидку или добавлять юридический пункт в PowerPoint или Google Slides. Перегенерация не нужна, остальная презентация остаётся без изменений.

Следующие шаги

Персонализированные коммерческие предложения в масштабе сводятся к трём частям: чистая таблица, один фиксированный шаблон и очередь, соблюдающая 6 запросов в минуту.

About 2Slides

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

Try For Free