2Slides Logo
대규모 맞춤형 영업 제안서: Google Sheets + API (2026)
2Slides Team
14 min read

대규모 맞춤형 영업 제안서: Google Sheets + API (2026)

대규모 맞춤형 영업 제안서를 제작하려면, 잠재 고객 정보를 Google Sheet(또는 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 Sheet 또는 CRM 내보내기에 회사명, 산업, 문제점, 가격 등급, 연락처 이름 등으로 저장되어 있습니다.

각 제안서에 맞춤형 시각 자료나 내레이션 비디오가 필요한 경우 이 레시피를 사용하지 마세요. 해당 작업은 이후 다룰 이미지 디자인 파이프라인용입니다. 영업팀이 HubSpot 내에서 활동하며 거래 단계별로 제안서를 자동 생성하려면 HubSpot AI 프레젠테이션 및 영업 데크 자동화 내 CRM 네이티브 패턴을 참고하세요.

전체 워크플로우 개요

단계도구수행 내용2Slides 엔드포인트 / 크레딧
1Google Sheets 또는 CRM 내보내기잠재 고객별 한 행: 회사, 산업, 문제점, 가격 등급, 연락처, 언어없음
22Slides Templates Hub 또는 API피치 데크 템플릿 하나 선택 후 themeId 기록GET /api/v1/themes/search, 무료
3Zapier 코드 단계 또는 Python행 데이터를 구조화된 userInput 프롬프트로 생성없음
4Zapier Webhooks 또는 requestsmode: "async"로 제안서 작업 제출POST /api/v1/slides/generate, 페이지당 10 크레딧
560초 대기 후 GET 호출statussuccess가 될 때까지 폴링GET /api/v1/jobs/{jobId}, 무료
6Gmail 단계 또는 SMTP편집 가능한 PPTX downloadUrl을 담당자에게 이메일 발송없음
7Google Sheets 업데이트감사용으로 jobIddownloadUrl을 행에 기록없음

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" 등)을 입력하세요. status 열은 이미 처리된 행을 자동화가 건너뛰도록 합니다.

CRM에서 내보낼 경우 동일한 필드를 매핑하세요. Python 버전에서 CSV 내보내기 대신 Google Sheets API를 사용해 시트를 직접 읽을 수도 있습니다.

2단계: 모든 제안서가 동일한 디자인을 공유하도록 themeId 선택

제안서 시스템의 핵심은 일관성입니다. 각 데크가 다른 템플릿을 사용하면 브랜드가 여러 회사처럼 보입니다. 템플릿 라이브러리를 한 번 검색해 피치 데크 또는 제안서 템플릿을 선택하고, 자동화에 고정된 themeId를 하드코딩하세요.

먼저 2slides.com/templates에서 시각적으로 탐색하고 Pitch Deck 필터를 적용한 뒤 템플릿 이름을 기록하세요.

2Slides Templates Hub with curated slide themes and Pitch Deck filter
그림 1: Templates Hub에서 Pitch Deck 필터 적용 화면. 여기서 템플릿을 선택한 후 검색 엔드포인트로 themeId를 가져옵니다.

그다음 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 스크립트가 동일한 값을 읽도록 하세요. 템플릿은 거래별이 아니라 연 1회 정도 변경합니다.

API는 Fast PPT 웹 도구와 동일한 엔진을 구동합니다: 콘텐츠 붙여넣기, 템플릿 선택, PPTX 획득. 엔드포인트는 이 과정을 UI 없이 각 행에 대해 자동으로 수행합니다.

2Slides Fast PPT interface with content box and template gallery
그림 2: 브라우저 Fast PPT 인터페이스. 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 parameters: themeId, userInput, responseLanguage, mode
그림 3: generate 엔드포인트의 네 가지 파라미터. themeId와 userInput은 필수이며, responseLanguage는 기본값 Auto, mode는 기본값 sync입니다.

mode를 생략하면 동기식으로 실행되어 같은 응답에 downloadUrl이 포함됩니다. 단발 호출에는 간단하지만 Zapier처럼 HTTP 타임아웃이 짧은 플랫폼에서는 비동기가 안전하며, 대량 처리에도 적합합니다.

4단계: Zapier로 새 시트 행에서 PowerPoint 생성

엔지니어가 없는 팀은 Zapier를 사용해 행이 ready로 표시된 지 2분 이내에 담당자 이메일로 제안서를 받을 수 있습니다. Webhooks by Zapier 앱이 두 번의 API 호출을 수행하며 나머지는 표준 단계입니다.

  • 트리거: Google Sheets, 새 행 또는 업데이트된 행. statusready인 행만 통과하도록 필터 추가.
  • Code by Zapier (JavaScript) 또는 Formatter: 행 열에서 userInput 조립 (아래 코드 참조).
  • Webhooks by Zapier, POST https://2slides.com/api/v1/slides/generate. 헤더에 Authorization: Bearer <your key>, JSON 본문에 userInput, themeId, responseLanguage, mode: "async". 응답에서 data.jobId 매핑.
  • Delay by Zapier, 60초 지연.
  • Webhooks by Zapier, GET https://2slides.com/api/v1/jobs/{{jobId}} 같은 헤더로 호출. data.statusdata.downloadUrl 매핑.
  • 필터: data.statussuccess일 때만 진행. 처리 중인 작업은 두 번째 Delay + GET으로 처리.
  • Gmail: 이메일 전송 rep_email로, 제목에 잠재 고객 이름, 본문 또는 첨부파일에 downloadUrl 포함.
  • Google Sheets: 행 업데이트, jobId, downloadUrl 기록 및 statusdone으로 변경.

Code 단계에 프롬프트 로직을 모아두면 영업 관리자가 웹훅을 건드리지 않고 제안서 구조를 변경할 수 있습니다:

// 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 단계 헤더에만 넣으세요. 여러 담당자가 동시에 ready로 표시하면 Zapier가 분당 6회 초과 호출을 시도할 수 있으며, 초과 호출은 속도 제한 오류를 받고 Zapier 내장 재실행 기능이 처리합니다. 안정적 볼륨에는 아래 Python 배치 스크립트를 사용하세요. 동일한 Zapier 패턴은 Zapier와 2Slides로 주간 보고서 슬라이드 자동화에도 적용됩니다.

5단계: Python으로 200개 맞춤형 영업 제안서 대량 처리

월요일까지 200개의 제안서가 필요하면 200개의 Zap을 실행하는 대신 스크립트를 사용하세요. 아래 스크립트는 시트 CSV 내보내기(파일 > 다운로드 > CSV)를 읽고, generate의 분당 6회 제한을 지키며 6개씩 배치 제출, 6초 간격으로 jobs 폴링(분당 10회 제한), 각 PPTX 다운로드, 결과를 Gmail 병합 또는 CRM 가져오기에 쓸 두 번째 CSV에 기록합니다.

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회 초과 generate 호출 금지 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 파일 자체를 보내고, 제목에 잠재 고객 이름을 포함해 담당자가 나중에 쉽게 찾도록 하세요. 다듬어진 레이브비하인드를 원하면 담당자가 편집 후 PowerPoint에서 PDF로 내보낼 수 있습니다.

강력한 제안서 데크란?

3단계 프롬프트 구조를 작성하기 전에 실제 데크를 참고하면 도움이 됩니다. 2Slides 갤러리는 구조 참고용 데크를 호스팅하며, 이미지 디자인 경로를 선택하면 referenceImageUrl로 create-like-this 엔드포인트에 전달할 수도 있습니다. 이들은 API 호출 결과물이 아니라 참고용 데크입니다.

Perplexity ads pitch deck from the 2Slides Gallery, a reference for proposal structure
그림 4: 2Slides 갤러리 피치 데크 커버 슬라이드. 제안서 커버에는 잠재 고객, 연락처, 날짜가 명시되어야 합니다.

Perplexity ads pitch deck from the 2Slides Gallery, a reference for proposal structure
그림 5: 동일 갤러리 데크의 후속 슬라이드. 슬라이드당 하나의 아이디어 밀도를 참고해 번호 매긴 섹션으로 프롬프트에 반영하세요.

강력한 제안서에서 세 가지 패턴은 프롬프트에 적용됩니다: 잠재 고객 상황을 그들의 언어로 열기(pain_points 열), 각 솔루션을 문제점 하나에 매핑, 가격은 단일 슬라이드에 분리. 각 섹션에 무엇이 들어가는지 자세히 보려면 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-thisgenerate-narration, 페이지당 210 크레딧Fast PPT 작업은 내레이션 불가

이 글의 시트 기반 대량 처리에는 Fast PPT가 기본으로 적합합니다. 디자인이 차별화 요소인 5% 거래에만 이미지 파이프라인을 예약하세요.

흔한 실수

  • 분당 6회 초과 호출 폭주. 20개 행을 동시에 ready로 표시하면 20개의 POST가 순식간에 발생. 큐잉 필요: Python 스크립트는 6개씩 배치 후 60초 대기, Zapier는 재실행 기능 또는 Delay 단계로 분산.
  • API 키를 시트나 클라이언트 스크립트에 둠. 키는 Zapier 웹훅 헤더나 서버 환경 변수에만 보관. 시트에 있으면 누구나 크레딧을 소모할 수 있음.
  • 언어 코드 대신 이름 사용. responseLanguage는 "Spanish", "Portuguese" 등 이름을 요구하며 "es", "pt-BR"는 안 됨. Sheets에서 드롭다운으로 검증 권장.
  • Fast PPT에서 내레이션 또는 MP4 기대. generate-narrationcreate-pdf-slides 또는 create-like-this 작업만 받음. generate는 PPTX만 생성.
  • 4000단어 분량의 통화 녹취록을 userInput에 덤프. 먼저 요약하세요. 세미콜론으로 구분된 세 가지 문제점이 긴 노트보다 효과적이며 가격 슬라이드는 깔끔하게 유지.
  • 잘못된 응답 필드 매핑. 작업 ID는 최상위가 아닌 data.jobId에 있음. 폴링 응답에도 { success, data: { ... } } 래퍼가 동일하게 적용됨.

자주 묻는 질문

CRM 데이터에서 Google Sheets 없이 영업 데크를 생성할 수 있나요?

네. API는 userInput 문자열과 themeId만 필요하므로 HubSpot 워크플로우, Salesforce 내보내기, Postgres 쿼리 등 어떤 소스도 가능합니다. Google Sheets는 담당자가 엔지니어 도움 없이 행을 편집하고 ready 표시를 할 수 있어 편리합니다. 거래 단계 변경 시 CRM 네이티브 트리거가 필요하면 앞서 언급한 HubSpot 패턴을 참고하세요.

제안서 한 건 생성에 얼마나 걸리나요?

작업 시작 후 Fast PPT 데크는 약 30초 소요됩니다. Zapier에서는 폴링 전 60초 Delay 한 번이면 대부분 충분합니다. Python 배치에서는 6개 제안서가 1분 내 제출되고, 보통 다음 1분 내 모두 완료되어 한 키로 200개 제안서가 약 70분 내 완성됩니다.

모든 제안서가 똑같이 보이나요?

디자인은 동일하며 의도된 결과입니다. 모든 작업이 같은 themeId를 사용해 색상, 글꼴, 레이아웃이 일관되고, 잠재 고객별로 내용만 달라집니다. 두 가지 디자인을 원하면 시트에 theme 열을 추가해 두 개의 다른 themeId에 매핑하세요.

다른 프레젠테이션 API도 이런 자동화를 지원하나요?

네. Gamma API(developers.gamma.app)도 유사한 자동화 기능을 제공하지만 Pro 플랜이 필요합니다. 2Slides API 키는 무료 계정 포함 모든 계정에서 작동하며, 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