

大规模个性化销售提案:Google Sheets + API(2026)
要大规模生成个性化销售提案,将潜在客户信息保存在 Google 表格(或 CRM 导出文件)中,将每一行转换为结构化提示,并使用固定的 themeId 调用 2Slides Fast PPT 端点 POST /api/v1/slides/generate,确保所有演示文稿共享统一设计。每份 10 页的提案费用为 100 积分,约 0.25 美元,约 30 秒内生成可本地编辑的 PPTX 文件,并可自动发送邮件给销售代表。本方案适用于 RevOps 和销售运营负责人,以及负责外呼的创始人。
关键要点
- 一次
POST /api/v1/slides/generate调用即可将表格中的一行转成设计良好、可编辑的 PPTX 提案,每页收费 10 积分。 - 通过
GET /api/v1/themes/search?query=pitch deck获取固定的themeId,保证 200 份提案视觉一致,销售代表只需关注内容。 responseLanguage支持每行指定语言名称(如“Spanish”、“Portuguese”),使 LATAM 和 EMEA 账户能从同一表格生成本地语言的演示文稿。- 生成端点限制每个密钥每分钟 6 次请求;Python 队列在批次间休眠,约 70 分钟可完成 200 份提案。
- 注册即赠 500 免费积分,足够测试 5 份提案;每月 500 份生产提案积分费用约 102.50 美元。
适用人群
你是 RevOps 或销售运营负责人,或者是亲自负责外呼的创始人。销售代表花 45 分钟手动制作提案幻灯片,而其中 80% 内容与上一次相同,导致一半合格潜在客户根本没收到定制提案。你的潜在客户数据已经存储在 Google 表格或 CRM 导出文件中,包含公司、行业、痛点、定价等级和联系人姓名。
如果每份提案都需要定制视觉或带解说视频,请勿使用本方案。那种需求适合后文介绍的图像设计流程。如果你的销售团队使用 HubSpot,并希望根据交易阶段触发提案,请参考本文稍早提到的 HubSpot AI 演示和销售幻灯片自动化 中的 CRM 原生方案。
工作流程概览
| 步骤 | 工具 | 发生的事情 | 2Slides 端点 / 积分 |
|---|---|---|---|
| 1 | Google Sheets 或 CRM 导出 | 每行代表一个潜在客户:公司、行业、痛点、定价等级、联系人、语言 | 无 |
| 2 | 2Slides 模板中心或 API | 选择一个 pitch-deck 模板并记录其 themeId | GET /api/v1/themes/search,免费 |
| 3 | Zapier 代码步骤或 Python | 从行数据构建结构化 userInput 提示 | 无 |
| 4 | Zapier Webhooks 或 requests | 提交提案生成任务,mode: "async" | POST /api/v1/slides/generate,每页 10 积分 |
| 5 | 延迟 60 秒后 GET | 轮询直到 status 为 success | GET /api/v1/jobs/{jobId},免费 |
| 6 | Gmail 步骤或 SMTP | 将可编辑的 PPTX downloadUrl 邮件发送给销售代表 | 无 |
| 7 | Google Sheets 更新 | 将 jobId 和 downloadUrl 写回行,便于审计 | 无 |
第 1 步:结构化潜在客户表格
提案质量取决于你提供的列。一个扁平表格,每行一个潜在客户,包含以下列即可:
| company | industry | contact_name | contact_title | pain_points | pricing_tier | price | language | rep_email | status |
|---|---|---|---|---|---|---|---|---|---|
| Northwind Logistics | 货运与物流 | Mariana Ruiz | 运营副总裁 | 手动调度排班;空驶率 18%;无实时 ETA | Growth | USD 1,800/月 | Spanish | j.ortiz@yourco.com | ready |
| Contoso Clinics | 门诊医疗 | David Chen | 首席运营官 | 纸质接诊表;平均等待 22 分钟;缺席率 14% | Team | USD 950/月 | English | a.park@yourco.com | ready |
有两条规则保证后续提示可靠。第一,pain_points 用简短的分号分隔短语,不用段落,确保模型获得三个明确的问题点。第二,language 列填写 API 期望的语言名称(如“Spanish”,而非“es”)。status 列用于自动化跳过已处理的行。
如果从 CRM 导出,映射相同字段。Google Sheets API(文档)也能直接读取表格,适合不想用 CSV 导出的 Python 版本。
第 2 步:选择一个固定的 themeId,确保所有提案设计一致
提案系统的关键是统一。如果每份幻灯片用不同模板,品牌形象会显得杂乱。先搜索模板库,选一个 pitch-deck 或 proposal 模板,硬编码其 themeId 到自动化流程中。
先在 2slides.com/templates 浏览,筛选 Pitch Deck,记下模板名称。

然后通过 API 获取同一模板的 ID。搜索端点免费,每分钟限制 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。端点就是无界面地为表格中每行执行此流程。

第 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://..." } }
若省略 mode,端点同步执行,响应中直接返回 downloadUrl。单次调用更简单,但异步模式适合 Zapier 等平台避免 HTTP 超时,且适合批量处理。
第 4 步:Zapier 从新表格行生成 PowerPoint
无工程师支持的团队可用 Zapier 在行标记为 ready 后两分钟内将提案发送到销售代表邮箱。Webhooks by Zapier 应用完成两次 API 调用,其他为标准步骤。
- 触发器:Google Sheets,新行或更新行。加过滤器仅处理
status等于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时继续。若任务仍在处理中,可再加一次延迟和 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 次生成请求,超出部分会收到限流错误,Zapier 内置重试机制会处理。若请求量更稳定,推荐使用下文 Python 批处理。相同 Zapier 模式也用于 自动化周报幻灯片生成。
第 5 步:用 Python 批量生成 200 份个性化销售提案
当活动需要在周一前完成 200 份提案时,运行脚本比触发 200 个 Zap 更高效。以下脚本读取表格的 CSV 导出文件(文件 -> 下载 -> CSV),分批提交任务(每批 6 个,遵守每分钟 6 次生成请求限制),以 6 秒间隔轮询任务状态(遵守每分钟 10 次查询限制),下载 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"})
# 任何 60 秒窗口内最多 6 次生成调用。
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 生成提案而非图像渲染幻灯片的关键原因。
销售代表会在生成后修改提案。打折获批、座位数通话中变更、法务要求条款页加内容、客户 Logo 加封面……使用可编辑 PPTX,销售代表打开文件,修改定价页,直接发送。若是 PDF 或图像渲染的幻灯片,每次修改都需重新生成并审核。
Gmail 步骤(或 CRM 邮件工具)应发送 PPTX 文件本身,而非查看链接,邮件主题应包含潜在客户名,方便销售后续查找。若需精美留存,销售代表可在 PowerPoint 中编辑后导出 PDF。
优秀提案幻灯片示例
在编写第 3 步提示结构前,参考真实幻灯片有助于理解。2Slides Gallery 提供参考幻灯片,可学习结构,或在图像设计流程中作为 referenceImageUrl 传给 create-like-this 端点。以下为参考幻灯片,不是 API 生成结果。


强力提案的三个模式可借鉴到提示中:用潜在客户的语言(pain_points 列)开篇,针对每个痛点对应解决方案,定价单独一页。想深入了解各部分内容,请参见 如何用 AI 创建销售赋能幻灯片。
费用说明
Fast PPT 按每页 10 积分计费,典型提案约 10 页。主题搜索和任务轮询免费。
| 量级 | 页数 | 积分 | 积分包 | 美元 | 每份提案成本 |
|---|---|---|---|---|---|
| 每月 20 份提案 | 200 | 2,000 | 1 × $5(2,000 积分) | $5.00 | $0.25 |
| 每月 500 份提案 | 5,000 | 50,000 | 1 × $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 行为 ready 会瞬间发出 20 个 POST。请排队处理:Python 脚本分批 6 个,等待 60 秒窗口;Zapier 依赖重试或加延迟步骤错峰调用。
- API 密钥放在表格或客户端脚本。 密钥应放在 Zapier webhook 请求头或服务器环境变量。否则任何拿到表格的人都能消耗积分。
- 语言代码替代语言名称。
responseLanguage需要“Spanish”或“Portuguese”,不能用“es”或“pt-BR”。可在 Sheets 用下拉菜单校验。 - Fast PPT 不支持解说或 MP4。
generate-narration端点只接受create-pdf-slides或create-like-this任务。generate生成的是 PPTX。 - 将 4000 字的发现电话记录直接放入
userInput。 先做摘要。三个分号分隔的痛点优于一大段笔记,定价页保持简洁。 - 映射错误的响应字段。 任务 ID 在
data.jobId,不是顶层。轮询响应同样包裹在{ success, data: { ... } }中。
常见问题解答
可以不通过 Google Sheets,直接用 CRM 数据生成销售幻灯片吗?
可以。API 只需 userInput 字符串和 themeId,任何数据源都可用:HubSpot 工作流、Salesforce 导出、Postgres 查询等。Google Sheets 方便销售代表编辑行并标记 ready,无需工程师协助。若需基于交易阶段的 CRM 原生触发,请参考本文前文提及的 HubSpot 方案。
生成一份提案需要多长时间?
Fast PPT 任务启动后约 30 秒完成。Zapier 中单次 60 秒延迟后轮询即可满足大多数情况。Python 批处理中,6 份提案一分钟内提交,通常下一分钟内全部完成,单密钥约 70 分钟完成 200 份。
每份提案看起来都一样吗?
设计是统一的,这是预期效果。所有任务使用相同 themeId,颜色、字体和布局一致,只有内容因潜在客户不同而变化。若想要两套风格(如企业客户和中小企业),可在表格加 theme 列,映射到两个不同的 themeId。
其他演示 API 支持此类自动化吗?
支持。Gamma 的 API(developers.gamma.app)也提供类似自动化,但需要 Pro 计划的 API 密钥。2Slides API 密钥适用于所有账户,包括免费账户赠送的 500 积分,且 Fast PPT 输出为原生 PPTX,而非托管页面,方便销售代表直接修改定价页。
生成后销售代表能修改定价页吗?
能。这是使用 Fast PPT 路径的主要原因。文件是标准 PPTX,文本框和表格可编辑,销售代表可在 PowerPoint 或 Google Slides 中修改座位数、应用批准折扣或添加法律条款,无需重新生成,其他幻灯片保持不变。
后续步骤
大规模个性化销售提案归结为三部分:干净的表格、固定模板和遵守每分钟 6 次请求的队列。
- 在 2slides.com/api 获取 API 密钥。注册赠送 500 免费积分,足够测试 5 份提案。
- 浏览团队其他方案,见中心帖子 按团队划分的 AI 演示 API 用例。
- 深入销售端,参见 HubSpot AI 销售幻灯片自动化 和 用 AI API 批量生成演示文稿。
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free