2Slides Logo
Proposal Penjualan Personal dengan Skala Besar: Google Sheets + API (2026)
2Slides Team
16 min read

Proposal Penjualan yang Dipersonalisasi dalam Skala Besar: Google Sheets + API (2026)

Untuk menghasilkan proposal penjualan yang dipersonalisasi dalam skala besar, simpan prospek dalam Google Sheet (atau ekspor CRM), ubah setiap baris menjadi prompt terstruktur, dan kirim ke endpoint 2Slides Fast PPT POST /api/v1/slides/generate dengan satu themeId tetap agar setiap deck memiliki desain yang sama. Setiap proposal 10 halaman menghabiskan 100 kredit, sekitar $0,25, tiba sebagai PPTX asli yang dapat diedit dalam waktu sekitar 30 detik, dan dapat dikirimkan otomatis ke perwakilan. Resep ini ditujukan untuk pemimpin RevOps dan sales ops, serta pendiri yang menjalankan outbound.

Poin-poin penting

  • Satu panggilan POST /api/v1/slides/generate mengubah satu baris spreadsheet menjadi proposal PPTX yang dirancang dan dapat diedit dengan biaya 10 kredit per halaman.
  • themeId tetap dari GET /api/v1/themes/search?query=pitch deck menjaga 200 proposal agar tampak identik secara visual, sehingga perwakilan hanya mengubah konten.
  • responseLanguage menerima nama bahasa per baris ("Spanish", "Portuguese"), sehingga akun LATAM dan EMEA mendapatkan deck dalam bahasa asli dari sheet yang sama.
  • Endpoint generate mengizinkan 6 permintaan per menit per kunci; antrean Python yang tidur antar batch dapat menyelesaikan 200 proposal dalam sekitar 70 menit.
  • 500 kredit gratis saat mendaftar mencakup 5 proposal uji; 500 proposal produksi per bulan menghabiskan sekitar $102,50 dalam kredit.

Untuk siapa ini

Anda menjalankan RevOps atau sales ops, atau Anda adalah pendiri yang melakukan outbound sendiri. Perwakilan menghabiskan 45 menit membuat deck proposal yang 80% identik dengan yang sebelumnya, sehingga setengah dari prospek berkualitas Anda tidak pernah mendapatkan proposal yang disesuaikan sama sekali. Data prospek Anda sudah ada di Google Sheet atau ekspor CRM dengan informasi perusahaan, industri, titik sakit, tingkat harga, dan nama kontak.

Jangan gunakan resep ini jika setiap proposal membutuhkan visual khusus atau video narasi. Itu adalah tugas untuk pipeline desain gambar yang dibahas nanti. Jika tim sales Anda menggunakan HubSpot dan Anda ingin proposal dipicu dari tahap deal, baca pola native CRM di Otomasi presentasi AI dan deck penjualan HubSpot.

Alur kerja secara singkat

LangkahAlatApa yang terjadiEndpoint 2Slides / kredit
1Google Sheets atau ekspor CRMSatu baris per prospek: perusahaan, industri, titik sakit, tingkat harga, kontak, bahasatidak ada
22Slides Templates Hub atau APIPilih satu template pitch-deck dan catat themeId-nyaGET /api/v1/themes/search, gratis
3Zapier Code step atau PythonBangun prompt userInput terstruktur dari baristidak ada
4Webhooks by Zapier atau requestsKirim pekerjaan proposal dengan mode: "async"POST /api/v1/slides/generate, 10 kredit/halaman
5Delay 60 s, lalu GETPoll sampai status adalah successGET /api/v1/jobs/{jobId}, gratis
6Langkah Gmail atau SMTPKirim email PPTX yang dapat diedit downloadUrl ke perwakilantidak ada
7Update Google SheetsTulis jobId dan downloadUrl kembali ke baris untuk audittidak ada

Langkah 1: Struktur sheet prospek

Kualitas proposal ditentukan oleh kolom yang Anda berikan. Sheet datar dengan satu baris per prospek dan kolom-kolom berikut sudah cukup:

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

Dua aturan membuat prompt downstream dapat diandalkan. Pertama, tulis pain_points sebagai frasa pendek yang dipisahkan titik koma, bukan paragraf, agar model mendapatkan tiga masalah jelas untuk diatasi. Kedua, gunakan kolom language untuk memuat nama bahasa persis seperti yang diharapkan API ("Spanish", bukan "es"). Kolom status memungkinkan otomatisasi melewati baris yang sudah diproses.

Jika Anda mengekspor dari CRM, peta bidang yang sama. Google Sheets API juga dapat membaca sheet langsung jika Anda tidak ingin menggunakan ekspor CSV pada versi Python di bawah.

Langkah 2: Pilih satu themeId agar setiap proposal memiliki desain yang sama

Konsistensi adalah tujuan sistem proposal. Jika setiap deck menggunakan template berbeda, merek Anda terlihat seperti sepuluh perusahaan berbeda. Cari perpustakaan template sekali, pilih template pitch-deck atau proposal, dan hard-code themeId-nya dalam otomatisasi.

Jelajahi secara visual terlebih dahulu di 2slides.com/templates, filter dengan Pitch Deck, dan catat nama templatenya.

2Slides Templates Hub dengan tema slide yang dikurasi dan filter Pitch Deck
Gambar 1: Templates Hub, difilter ke Pitch Deck. Pilih satu template di sini, lalu ambil themeId-nya melalui endpoint pencarian.

Kemudian dapatkan ID template yang sama dari API. Endpoint pencarian gratis dan dibatasi 6 permintaan per menit, yang tidak masalah karena Anda hanya memanggilnya sekali.

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

Respons menampilkan template yang cocok dengan themeId dan metadata-nya. Salin ID ke variabel lingkungan (PROPOSAL_THEME_ID) agar langkah Zapier dan skrip Python membaca nilai yang sama. Ganti template setahun sekali, bukan per deal.

API menjalankan mesin yang sama dengan alat web Fast PPT: tempel konten, pilih template, dapatkan PPTX. Endpoint ini hanya menjalankan proses itu secara headless untuk setiap baris di sheet Anda.

Antarmuka 2Slides Fast PPT dengan kotak konten dan galeri template
Gambar 2: Fast PPT di browser. Endpoint generate menjalankan alur ini tanpa UI, yang memungkinkan otomatisasi Google Sheets ke PowerPoint.

Langkah 3: Bangun prompt dan panggil API otomatisasi proposal penjualan

Prompt proposal harus terstruktur, bukan percakapan. Beritahu model siapa prospek, apa masalahnya, apa rekomendasi Anda, dan bagian apa yang harus dibuat dalam urutan apa. Letakkan harga di slide sendiri agar perwakilan bisa mengedit tanpa mengganggu deck lainnya.

Berikut panggilan tepat untuk baris pertama sheet di atas. Perhatikan responseLanguage berasal dari baris, dan mode adalah "async" agar panggilan langsung mengembalikan 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" }'

Setiap respons 2Slides dibungkus dalam amplop yang sama, yang penting saat Anda memetakan bidang di Zapier:

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

Polling job setiap 5 sampai 10 detik. Deck Fast PPT biasanya selesai dalam sekitar 30 detik.

curl -s https://2slides.com/api/v1/jobs/a1b2c3d4 \ -H "Authorization: Bearer $SLIDES_API_KEY" # { "success": true, "data": { "jobId": "a1b2c3d4", "status": "success", "downloadUrl": "https://..." } }

Parameter POST /api/v1/slides/generate: themeId, userInput, responseLanguage, mode
Gambar 3: Empat parameter endpoint generate. themeId dan userInput wajib; responseLanguage default Auto dan mode default sync.

Jika Anda tidak menyertakan mode, endpoint berjalan secara sinkron dan mengembalikan downloadUrl dalam respons yang sama. Ini lebih sederhana untuk panggilan sekali saja, tapi async lebih aman saat platform seperti Zapier memiliki timeout HTTP pendek, dan pilihan tepat untuk batch.

Langkah 4: Generasi PowerPoint dengan Zapier dari baris sheet baru

Untuk tim tanpa engineer on call, Zapier mengirim proposal ke inbox perwakilan dalam dua menit setelah baris ditandai siap. Aplikasi Webhooks by Zapier membuat dua panggilan API; sisanya adalah langkah standar.

  • Trigger: Google Sheets, baris baru atau diperbarui. Tambahkan langkah Filter agar hanya baris dengan status sama dengan ready yang lanjut.
  • Code by Zapier (JavaScript) atau Formatter: susun userInput dari kolom baris (cuplikan di bawah).
  • Webhooks by Zapier, POST ke https://2slides.com/api/v1/slides/generate. Header Authorization: Bearer <your key>, body JSON dengan userInput, themeId, responseLanguage, mode: "async". Peta data.jobId dari respons.
  • Delay by Zapier, tunda 60 detik.
  • Webhooks by Zapier, GET https://2slides.com/api/v1/jobs/{{jobId}} dengan header sama. Peta data.status dan data.downloadUrl.
  • Filter: lanjutkan hanya jika data.status sama dengan success. Untuk job yang masih diproses, pasangkan Delay dan GET kedua.
  • Gmail: Kirim Email ke rep_email dengan nama prospek di subjek dan downloadUrl di badan atau lampiran.
  • Google Sheets: Update Row, tulis jobId, downloadUrl, dan set status ke done.

Langkah Code menjaga logika prompt di satu tempat, sehingga manajer sales bisa mengubah struktur proposal tanpa mengubah webhook:

// Code by Zapier (JavaScript). inputData fields dipetakan dari baris sheet. 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" };

Simpan API key di header Webhooks, jangan di sheet. Jika beberapa perwakilan menandai baris siap bersamaan, Zapier mungkin mengirim lebih dari 6 panggilan generate per menit; panggilan ekstra mendapat error rate-limit dan replay bawaan Zapier menanganinya. Untuk volume lebih stabil, gunakan batch Python di bawah. Pola Zapier yang sama digunakan untuk deck berulang di otomasi slide laporan mingguan dengan Zapier dan 2Slides.

Langkah 5: Batch 200 proposal penjualan yang dipersonalisasi dengan Python

Saat kampanye butuh 200 proposal sebelum Senin, jalankan skrip daripada memicu 200 Zap. Skrip di bawah membaca ekspor CSV sheet (File, Download, CSV), mengirim pekerjaan dalam batch 6 untuk menghormati batas 6 permintaan per menit pada generate, polling tiap job dengan jeda 6 detik agar tetap di bawah batas 10 permintaan per menit pada jobs, mengunduh setiap PPTX, dan menulis hasil ke CSV kedua yang bisa dipakai untuk merge Gmail atau impor 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"] # dari GET /themes/search?query=pitch deck BATCH = 6 # generate: 6 requests/menit per kunci POLL_GAP = 6 # jobs: 10 requests/menit -> satu polling tiap 6 detik 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"}) # Tidak pernah lebih dari 6 panggilan generate dalam jendela 60 detik. 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()

Waktu: setiap batch 6 butuh sekitar 60 sampai 120 detik termasuk polling, jadi 200 proposal (34 batch) selesai dalam sekitar 70 menit dengan satu kunci. Skrip idempoten berdasarkan status, jadi jika mati di baris 140 Anda bisa menjalankan ulang dan hanya baris ready yang tersisa yang dikirim. Untuk run lebih besar dan pola antrean lain, lihat cara batch-generate presentasi dengan API AI.

Langkah 6: Berikan perwakilan PPTX yang dapat diedit, bukan PDF

Output dari generate adalah file PowerPoint asli: kotak teks nyata, tabel nyata, master slide template. Ini alasan menggunakan Fast PPT untuk proposal daripada deck yang dirender sebagai gambar.

Perwakilan mengubah proposal setelah dibuat. Diskon disetujui, jumlah kursi berubah saat panggilan, legal ingin klausul di slide syarat, logo prospek harus ada di cover. Dengan PPTX yang dapat diedit, perwakilan membuka file, mengedit slide harga, dan mengirimnya. Dengan PDF atau deck gambar, setiap perubahan berarti harus membuat ulang dan meninjau ulang seluruh deck.

Langkah Gmail (atau alat email CRM Anda) harus mengirimkan file PPTX itu sendiri, bukan tautan viewer, dan subjek harus memuat nama prospek agar perwakilan mudah menemukannya nanti. Jika ingin dokumen leave-behind yang rapi, perwakilan bisa ekspor ke PDF dari PowerPoint setelah mengedit.

Seperti apa deck proposal yang kuat

Sebelum menulis struktur prompt di Langkah 3, ada baiknya melihat deck nyata. Galeri 2Slides menampung deck referensi yang bisa Anda pelajari strukturnya, atau gunakan sebagai referenceImageUrl pada endpoint create-like-this jika memilih jalur desain gambar. Ini deck referensi, bukan output dari panggilan API di atas.

Pitch deck iklan Perplexity dari Galeri 2Slides, referensi struktur proposal
Gambar 4: Slide cover pitch deck di Galeri 2Slides. Cover proposal harus menyebutkan prospek, kontak, dan tanggal.

Pitch deck iklan Perplexity dari Galeri 2Slides, referensi struktur proposal
Gambar 5: Slide berikutnya dari deck yang sama di Galeri. Perhatikan kepadatan satu ide per slide; cerminkan ini dalam prompt Anda dengan bagian bernomor.

Tiga pola dari proposal kuat yang bisa diterapkan ke prompt Anda: buka dengan situasi prospek dalam kata-kata mereka (kolom pain_points), petakan setiap solusi ke satu titik sakit, dan pisahkan harga di slide tunggal. Untuk pandangan lebih dalam tentang isi tiap bagian, lihat cara membuat deck sales enablement dengan AI.

Biayanya berapa

Fast PPT dikenakan biaya 10 kredit per halaman, dan proposal biasa 10 halaman. Pencarian tema dan polling job gratis.

VolumeHalamanKreditPaket kreditUSDPer proposal
20 proposal/bulan2002,0001 × $5 (2,000)$5.00$0.25
500 proposal/bulan5,00050,0001 × $80 (40,000) + 1 × $22.50 (10,000)$102.50$0.21

500 kredit gratis saat mendaftar mencakup 5 proposal penuh untuk pengujian. Kredit bayar sesuai pemakaian tanpa syarat kursi, jadi satu kunci bersama bisa melayani tim sales 12 orang.

Fast PPT atau slide desain gambar untuk kasus ini?

KebutuhanGunakanKenapa
Proposal yang dapat diedit dan dimodifikasi perwakilangenerate (Fast PPT), 10 kredit/halamanPPTX asli, ~30 s, template konsisten
Deck visual khusus untuk beberapa akun enterprisecreate-pdf-slides, 10 + 100 kredit/halaman di 2KLayout desain gambar dari prompt gaya
Cocokkan tampilan deck brand yang adacreate-like-this dengan referenceImageUrl, biaya samaMengambil sistem desain dari gambar referensi
Video proposal narasi untuk penjualan asinkroncreate-pdf-slides atau create-like-this, lalu generate-narration 210 kredit/halamanJob Fast PPT tidak bisa dinarasikan

Untuk alur volume berbasis sheet dalam artikel ini, Fast PPT adalah default yang tepat. Simpan pipeline gambar untuk 5% deal di mana desain jadi pembeda.

Kesalahan umum

  • Melebihi 6 permintaan per menit. Dua puluh baris ditandai siap sekaligus berarti 20 POST dalam hitungan detik. Antri: skrip Python batch 6 dan tunggu jendela 60 detik; di Zapier, andalkan replay atau tunda dengan Delay.
  • API key di sheet atau skrip sisi klien. Simpan kunci di header webhook Zapier atau variabel lingkungan server. Jika tidak, siapa pun dengan sheet bisa menghabiskan kredit Anda.
  • Kode bahasa bukan nama. responseLanguage ingin "Spanish" atau "Portuguese", bukan "es" atau "pt-BR". Validasi kolom dengan dropdown di Sheets.
  • Mengharapkan narasi atau MP4 dari Fast PPT. Endpoint generate-narration hanya menerima job dari create-pdf-slides atau create-like-this. Proposal dari generate hanya PPTX.
  • Memasukkan transkrip panggilan discovery 4.000 kata ke userInput. Ringkas dulu. Tiga titik sakit yang dipisah titik koma lebih efektif daripada catatan panjang, dan slide harga tetap bersih.
  • Memetakan bidang respons yang salah. Job ID ada di data.jobId, bukan di level atas. Amplop { success, data: { ... } } sama berlaku untuk respons polling.

Pertanyaan yang Sering Diajukan

Bisakah saya menghasilkan deck penjualan dari data CRM tanpa Google Sheets?

Bisa. API hanya butuh string userInput dan themeId, jadi sumber apa pun bisa: workflow HubSpot, ekspor Salesforce, atau query Postgres. Google Sheets nyaman karena perwakilan bisa mengedit baris dan menandai siap tanpa bantuan engineer. Untuk trigger native CRM pada perubahan tahap deal, lihat pola HubSpot yang sudah disebutkan di atas.

Berapa lama waktu yang dibutuhkan untuk menghasilkan satu proposal?

Sekitar 30 detik untuk deck Fast PPT setelah job dimulai. Di Zapier, Delay 60 detik sebelum polling sudah cukup hampir selalu. Di batch Python, enam proposal dikirim dalam satu menit dan biasanya selesai dalam menit berikutnya, jadi 200 proposal selesai sekitar 70 menit dengan satu kunci API.

Apakah setiap proposal akan terlihat sama?

Desainnya akan sama, itu memang disengaja. Karena setiap job menggunakan themeId yang sama, warna, font, dan tata letak identik di seluruh batch, hanya konten yang berubah per prospek. Jika Anda ingin dua tampilan, misalnya satu untuk enterprise dan satu untuk SMB, tambahkan kolom theme di sheet dan peta ke dua nilai themeId berbeda.

Apakah API presentasi lain mendukung otomatisasi seperti ini?

Ya. API Gamma di developers.gamma.app menawarkan otomatisasi serupa, meski kunci API di sana memerlukan paket Pro. Kunci API 2Slides bekerja di akun mana pun, termasuk akun gratis dengan 500 kredit, dan output Fast PPT adalah PPTX asli, bukan halaman yang dihosting, yang membuat edit slide harga oleh perwakilan praktis.

Bisakah perwakilan mengedit slide harga setelah pembuatan?

Bisa, itu alasan utama menggunakan jalur Fast PPT. File adalah PPTX standar dengan kotak teks dan tabel yang dapat diedit, jadi perwakilan bisa mengubah jumlah kursi, menerapkan diskon yang disetujui, atau menambahkan klausul legal di PowerPoint atau Google Slides. Tidak perlu regenerasi, dan deck lainnya tetap tidak berubah.

Langkah berikutnya

Proposal penjualan yang dipersonalisasi dalam skala besar terdiri dari tiga bagian: sheet yang bersih, satu template tetap, dan antrean yang menghormati 6 permintaan per menit.

About 2Slides

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

Try For Free