

Spersonalizowane propozycje sprzedażowe na dużą skalę: Google Sheets + API (2026)
Aby tworzyć spersonalizowane propozycje sprzedażowe na dużą skalę, przechowuj dane potencjalnych klientów w arkuszu Google Sheets (lub eksporcie z CRM), przekształć każdy wiersz w ustrukturyzowany prompt i wyślij go do punktu końcowego 2Slides Fast PPT POST /api/v1/slides/generate z jednym stałym themeId, aby każda prezentacja miała ten sam design. Każda 10-stronicowa propozycja kosztuje 100 kredytów, około 0,25 USD, jest dostarczana jako natywny, edytowalny plik PPTX w około 30 sekund i może być automatycznie wysłana mailem do przedstawiciela handlowego. Ten przepis jest przeznaczony dla liderów RevOps i sales ops oraz założycieli prowadzących działania outbound.
Kluczowe wnioski
- Jedno wywołanie
POST /api/v1/slides/generatezamienia wiersz arkusza na zaprojektowaną, edytowalną propozycję PPTX za 10 kredytów za stronę. - Stały
themeIdzGET /api/v1/themes/search?query=pitch decksprawia, że 200 propozycji jest wizualnie identycznych, więc przedstawiciele modyfikują tylko treść. responseLanguageprzyjmuje nazwę języka z każdego wiersza ("Spanish", "Portuguese"), dzięki czemu konta LATAM i EMEA otrzymują prezentacje w rodzimym języku z tego samego arkusza.- Punkt końcowy generate pozwala na 6 zapytań na minutę na klucz; kolejka w Pythonie z przerwami między partiami generuje 200 propozycji w około 70 minut.
- 500 darmowych kredytów przy rejestracji pokrywa 5 testowych propozycji; 500 propozycji produkcyjnych miesięcznie kosztuje około 102,50 USD w kredytach.
Dla kogo to jest
Prowadzisz RevOps lub sales ops albo jesteś założycielem samodzielnie realizującym outbound. Przedstawiciele spędzają 45 minut na ręcznym tworzeniu prezentacji, która w 80% jest identyczna z poprzednią, więc połowa kwalifikowanych leadów nigdy nie otrzymuje spersonalizowanej propozycji. Dane o potencjalnych klientach masz już w Google Sheets lub eksporcie z CRM z informacjami o firmie, branży, problemach, poziomie cenowym i kontakcie.
Nie używaj tego przepisu, gdy każda propozycja wymaga niestandardowych wizualizacji lub narracji wideo. To zadanie dla pipeline’u opartego na obrazach, omówionego dalej. Jeśli Twój zespół sprzedaży pracuje w HubSpot i chcesz wyzwalać propozycje na podstawie etapów transakcji, przeczytaj wzorzec natywny dla CRM w automatyzacji prezentacji i decków sprzedażowych w HubSpot AI.
Przebieg pracy w skrócie
| Krok | Narzędzie | Co się dzieje | Punkt końcowy 2Slides / kredyty |
|---|---|---|---|
| 1 | Google Sheets lub eksport z CRM | Jeden wiersz na klienta: firma, branża, problemy, poziom cenowy, kontakt, język | brak |
| 2 | 2Slides Templates Hub lub API | Wybierz jeden szablon pitch deck i zanotuj jego themeId | GET /api/v1/themes/search, bezpłatne |
| 3 | Zapier Code step lub Python | Zbuduj ustrukturyzowany prompt userInput z wiersza | brak |
| 4 | Webhooks by Zapier lub requests | Wyślij zadanie generowania propozycji z mode: "async" | POST /api/v1/slides/generate, 10 kredytów/strona |
| 5 | Opóźnienie 60 s, potem GET | Polluj aż status będzie success | GET /api/v1/jobs/{jobId}, bezpłatne |
| 6 | Gmail lub SMTP | Wyślij edytowalny PPTX downloadUrl do przedstawiciela | brak |
| 7 | Aktualizacja Google Sheets | Zapisz jobId i downloadUrl z powrotem do wiersza do audytu | brak |
Krok 1: Ustrukturyzuj arkusz z danymi klientów
Jakość propozycji zależy od kolumn, które dostarczysz. Wystarczy prosty arkusz z jednym wierszem na klienta i następującymi kolumnami:
| company | industry | contact_name | contact_title | pain_points | pricing_tier | price | language | rep_email | status |
|---|---|---|---|---|---|---|---|---|---|
| Northwind Logistics | Freight and logistics | Mariana Ruiz | VP Operations | Manual dispatch scheduling; 18% empty-mile rate; no live ETAs | Growth | USD 1,800/month | Spanish | j.ortiz@yourco.com | ready |
| Contoso Clinics | Outpatient healthcare | David Chen | COO | Paper intake forms; 22-minute average wait; no-show rate 14% | Team | USD 950/month | English | a.park@yourco.com | ready |
Dwie zasady zapewniają niezawodność promptu. Po pierwsze, pain_points zapisz jako krótkie frazy oddzielone średnikami, nie jako akapity, aby model miał trzy wyraźne problemy do rozwiązania. Po drugie, w kolumnie language wpisz nazwę języka dokładnie tak, jak oczekuje API ("Spanish", nie "es"). Kolumna status pozwala automatyzacji pominąć już przetworzone wiersze.
Jeśli eksportujesz z CRM, odwzoruj te same pola. Google Sheets API może też czytać arkusz bezpośrednio, jeśli wolisz nie używać eksportu CSV w poniższej wersji Python.
Krok 2: Wybierz jeden themeId, aby każda propozycja miała ten sam design
Spójność to cel systemu propozycji. Jeśli każda prezentacja używa innego szablonu, Twoja marka wygląda jak dziesięć różnych firm. Wyszukaj bibliotekę szablonów raz, wybierz pitch deck lub szablon propozycji i na stałe wpisz jego themeId w automatyzacji.
Najpierw przeglądaj wizualnie na 2slides.com/templates, filtruj po Pitch Deck i zanotuj nazwę szablonu.

Następnie pobierz ten sam szablon jako ID z API. Endpoint wyszukiwania jest bezpłatny i ograniczony do 6 zapytań na minutę, co tu nie ma znaczenia, bo wywołujesz go raz.
curl -s "https://2slides.com/api/v1/themes/search?query=pitch%20deck&limit=5" \
-H "Authorization: Bearer $SLIDES_API_KEY"Odpowiedź zawiera listę pasujących szablonów z ich themeId i metadanymi. Skopiuj ID do zmiennej środowiskowej (PROPOSAL_THEME_ID), aby krok w Zapier i skrypt Python czytały tę samą wartość. Zmieniaj szablon raz do roku, nie przy każdej transakcji.
API napędza ten sam silnik co narzędzie Fast PPT w przeglądarce: wklej treść, wybierz szablon, pobierz PPTX. Endpoint robi to bez interfejsu dla każdego wiersza w arkuszu.

Krok 3: Zbuduj prompt i wywołaj API automatyzacji propozycji sprzedażowej
Prompt do propozycji powinien być ustrukturyzowany, nie konwersacyjny. Powiedz modelowi, kim jest klient, co go boli, co rekomendujesz i jakie sekcje mają powstać w jakiej kolejności. Cennik trzymaj na osobnym slajdzie, aby przedstawiciele mogli go edytować bez zmiany reszty prezentacji.
Oto dokładne wywołanie dla pierwszego wiersza powyższego arkusza. Zauważ, że responseLanguage pochodzi z wiersza, a mode to "async", więc wywołanie zwraca od razu ID zadania.
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"
}'Każda odpowiedź 2Slides jest opakowana w ten sam format, co ma znaczenie przy mapowaniu pól w Zapier:
{ "success": true, "data": { "jobId": "a1b2c3d4", "status": "pending" } }Polluj zadanie co 5 do 10 sekund. Prezentacje Fast PPT zwykle kończą się w około 30 sekund.
curl -s https://2slides.com/api/v1/jobs/a1b2c3d4 \
-H "Authorization: Bearer $SLIDES_API_KEY"
# { "success": true, "data": { "jobId": "a1b2c3d4", "status": "success", "downloadUrl": "https://..." } }
Jeśli pominiesz mode, endpoint działa synchronicznie i zwraca downloadUrl w tej samej odpowiedzi. To prostsze dla pojedynczych wywołań, ale async jest bezpieczniejsze przy platformach z krótkim timeoutem HTTP, jak Zapier, i jest właściwym wyborem dla batchy.
Krok 4: Generowanie PowerPoint w Zapier z nowego wiersza arkusza
Dla zespołów bez inżyniera na wezwanie, Zapier dostarcza propozycję do skrzynki przedstawiciela w ciągu dwóch minut od oznaczenia wiersza jako gotowy. Aplikacja Webhooks by Zapier wykonuje dwa wywołania API; reszta to standardowe kroki.
- Trigger: Google Sheets, nowy lub zaktualizowany wiersz. Dodaj krok Filtr, aby kontynuować tylko wiersze z
statusrównymready. - Code by Zapier (JavaScript) lub Formatter: zbuduj
userInputz kolumn wiersza (fragment poniżej). - Webhooks by Zapier, POST do
https://2slides.com/api/v1/slides/generate. NagłówekAuthorization: Bearer <twój klucz>, ciało JSON zuserInput,themeId,responseLanguage,mode: "async". Mapujdata.jobIdz odpowiedzi. - Delay by Zapier, opóźnienie 60 sekund.
- Webhooks by Zapier, GET
https://2slides.com/api/v1/jobs/{{jobId}}z tym samym nagłówkiem. Mapujdata.statusidata.downloadUrl. - Filter: kontynuuj tylko jeśli
data.statustosuccess. Dla rzadkich przypadków przetwarzania, dodaj drugi Delay + GET. - Gmail: Wyślij maila do
rep_emailz nazwą klienta w temacie idownloadUrlw treści lub załączniku. - Google Sheets: Aktualizuj wiersz, zapisz
jobId,downloadUrli ustawstatusnadone.
Krok Code trzyma logikę promptu w jednym miejscu, więc menedżer sprzedaży może zmienić strukturę propozycji bez ingerencji w webhook:
// Code by Zapier (JavaScript). inputData fields są mapowane z wiersza arkusza.
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" };Trzymaj klucz API w nagłówku webhooka Zapier, nigdy w arkuszu. Jeśli kilku przedstawicieli oznaczy wiersze jako gotowe jednocześnie, Zapier może wysłać ponad 6 wywołań generate na minutę; nadmiarowe wywołania otrzymają błąd limitu i wbudowany mechanizm powtórek Zapier je obsłuży. Dla stabilniejszego wolumenu użyj poniższego batcha w Pythonie. Ten sam wzorzec Zapier jest używany do cyklicznych decków w automatyzacji cotygodniowych raportów z Zapier i 2Slides.
Krok 5: Batch 200 spersonalizowanych propozycji sprzedażowych na dużą skalę w Pythonie
Gdy kampania wymaga 200 propozycji do poniedziałku, uruchom skrypt zamiast 200 Zapsów. Poniższy skrypt czyta eksport CSV arkusza (Plik, Pobierz, CSV), wysyła zadania w partiach po 6, aby przestrzegać limitu 6 zapytań na minutę dla generate, polluje każde zadanie z 6-sekundową przerwą, aby nie przekroczyć 10 zapytań na minutę dla jobs, pobiera każdy PPTX i zapisuje wyniki do drugiego CSV, który możesz wykorzystać w mail merge Gmaila lub imporcie 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"] # z GET /themes/search?query=pitch deck
BATCH = 6 # generate: 6 zapytań/min na klucz
POLL_GAP = 6 # jobs: 10 zapytań/min -> jedno poll co 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"})
# Nigdy nie więcej niż 6 wywołań generate w ciągu 60 sekund.
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()Czas: każda partia 6 zajmuje około 60-120 sekund wraz z pollingiem, więc 200 propozycji (34 partie) kończy się w około 70 minut na jednym kluczu. Skrypt jest idempotentny wg status, więc jeśli przerwie się na wierszu 140, uruchamiasz go ponownie i wysyłane są tylko pozostałe 60 wierszy ready. Dla większych wolumenów i innych wzorców kolejkowania zobacz jak batchowo generować prezentacje z AI API.
Krok 6: Przekaż przedstawicielom edytowalny PPTX, nie PDF
Wynikiem generate jest natywny plik PowerPoint: prawdziwe pola tekstowe, prawdziwe tabele, master slides szablonu. To powód, dla którego Fast PPT jest lepszy do propozycji niż deck renderowany jako obraz.
Przedstawiciele modyfikują propozycje po wygenerowaniu. Zatwierdzają rabat, zmieniają liczbę miejsc na rozmowie, dział prawny chce klauzulę na slajdzie warunków, logo klienta musi trafić na okładkę. Z edytowalnym PPTX przedstawiciel otwiera plik, edytuje slajd z ceną i wysyła. Z PDF lub deckiem obrazów każda zmiana wymaga ponownej generacji i przeglądu całej prezentacji.
Krok Gmail (lub narzędzie mailowe CRM) powinien więc wysyłać sam plik PPTX, nie link do podglądu, a temat maila powinien zawierać nazwę klienta, aby łatwo było go znaleźć. Jeśli chcesz też elegancki materiał do pozostawienia, przedstawiciele mogą wyeksportować PDF z PowerPoint po edycji.
Jak wygląda mocny deck propozycji
Przed napisaniem struktury promptu w Kroku 3 warto obejrzeć prawdziwe decki. Galeria 2Slides udostępnia przykładowe prezentacje do analizy struktury lub do przekazania jako referenceImageUrl do endpointu create-like-this, jeśli wybierasz pipeline oparty na obrazach. To są decki referencyjne, nie wygenerowane przez API powyżej.


Trzy wzorce z mocnych propozycji przenoszą się do promptu: otwarcie sytuacją klienta jego słowami (kolumna pain_points), przypisanie każdego rozwiązania do jednego problemu oraz wyodrębnienie cennika na osobnym slajdzie. Dla głębszego wglądu, co powinno się znaleźć w każdej sekcji, zobacz jak stworzyć deck sprzedażowy wspierany AI.
Koszty
Fast PPT jest rozliczany po 10 kredytów za stronę, a typowa propozycja ma 10 stron. Wyszukiwanie szablonu i polling zadań są bezpłatne.
| Wolumen | Strony | Kredyty | Pakiety kredytów | USD | Za propozycję |
|---|---|---|---|---|---|
| 20 propozycji/miesiąc | 200 | 2,000 | 1 × 5 USD (2,000) | 5,00 USD | 0,25 USD |
| 500 propozycji/miesiąc | 5,000 | 50,000 | 1 × 80 USD (40,000) + 1 × 22,50 USD (10,000) | 102,50 USD | 0,21 USD |
500 darmowych kredytów przy rejestracji pokrywa 5 pełnych propozycji testowych. Kredyty są pay-as-you-go bez wymogu miejsc, więc jeden współdzielony klucz może obsłużyć 12-osobowy zespół sprzedaży.
Fast PPT czy slajdy projektowane obrazem dla tego przypadku?
| Potrzeba | Użyj | Dlaczego |
|---|---|---|
| Edytowalne propozycje, które przedstawiciele będą modyfikować | generate (Fast PPT), 10 kredytów/strona | Natywny PPTX, ~30 s, spójny szablon |
| Wizualnie unikalne decki dla kilku kont enterprise | create-pdf-slides, 10 + 100 kredytów/strona przy 2K | Layouty projektowane na podstawie promptu stylu |
| Dopasowanie wyglądu do istniejącego decka marki | create-like-this z referenceImageUrl, ten sam koszt | Projekt systemu na podstawie obrazu referencyjnego |
| Narracja wideo propozycji do sprzedaży asynchronicznej | create-pdf-slides lub create-like-this, potem generate-narration za 210 kredytów/strona | Fast PPT nie obsługuje narracji |
Dla przepływu opartego na arkuszu w tym artykule Fast PPT jest domyślnym wyborem. Pipeline obrazowy zarezerwuj dla 5% transakcji, gdzie design jest wyróżnikiem.
Typowe pułapki
- Przekroczenie 6 zapytań na minutę. 20 wierszy oznaczonych jako gotowe naraz to 20 POSTów w kilka sekund. Kolejkuj je: skrypt Python batchuje po 6 i czeka 60 sekund; w Zapier polegaj na powtórkach lub rozłóż wywołania Delay.
- Klucz API w arkuszu lub skrypcie po stronie klienta. Trzymaj klucz w nagłówku webhooka Zapier lub zmiennej środowiskowej po stronie serwera. Każdy z dostępem do arkusza mógłby inaczej zużywać Twoje kredyty.
- Kody języków zamiast nazw.
responseLanguageoczekuje "Spanish" lub "Portuguese", nie "es" czy "pt-BR". Zweryfikuj kolumnę listą rozwijaną w Sheets. - Oczekiwanie narracji lub MP4 z Fast PPT. Endpoint
generate-narrationprzyjmuje tylko zadania zcreate-pdf-slideslubcreate-like-this. Propozycje zgeneratesą tylko w PPTX. - Wrzucanie 4000-słownego zapisu rozmowy do
userInput. Najpierw podsumuj. Trzy punkty problemów oddzielone średnikami działają lepiej niż ściana tekstu, a slajd cenowy pozostaje czytelny. - Mapowanie złego pola odpowiedzi. ID zadania jest w
data.jobId, nie na najwyższym poziomie. Ta sama koperta{ success, data: { ... } }dotyczy odpowiedzi poll.
Najczęściej zadawane pytania
Czy mogę generować decki sprzedażowe z danych CRM bez Google Sheets?
Tak. API potrzebuje tylko ciągu userInput i themeId, więc dowolne źródło działa: workflow HubSpot, eksport Salesforce lub zapytanie Postgres. Google Sheets jest wygodne, bo przedstawiciele mogą edytować wiersze i oznaczać je jako gotowe bez pomocy inżyniera. Dla natywnego triggera CRM na zmianę etapu transakcji zobacz wzorzec HubSpot podany wcześniej.
Ile czasu zajmuje wygenerowanie jednej propozycji?
Około 30 sekund na Fast PPT po rozpoczęciu zadania. W Zapier pojedyncze opóźnienie 60 sekund przed pollingiem wystarcza niemal zawsze. W batchu Python sześć propozycji wysyła się w minutę i zwykle wszystkie kończą w kolejnej minucie, więc 200 propozycji kończy się w około 70 minut na jednym kluczu API.
Czy każda propozycja będzie wyglądać tak samo?
Design tak, i to jest zamierzone. Ponieważ każde zadanie używa tego samego themeId, kolory, czcionki i układy są identyczne w całej partii, zmienia się tylko treść dla klienta. Jeśli chcesz dwa wyglądy, np. jeden dla enterprise, drugi dla SMB, dodaj kolumnę theme w arkuszu i mapuj ją na dwa różne themeId.
Czy inne API prezentacji wspierają taką automatyzację?
Tak. API Gamma na developers.gamma.app oferuje podobną automatyzację generowania, choć klucze API tam wymagają planu Pro. Klucze 2Slides działają na każdym koncie, także darmowym z 500 kredytami, a Fast PPT generuje natywny PPTX, a nie hostowaną stronę, co umożliwia edycję slajdów cenowych po stronie przedstawiciela.
Czy przedstawiciele mogą edytować slajd cenowy po generacji?
Tak, to główny powód używania Fast PPT. Plik to standardowy PPTX z edytowalnymi polami tekstowymi i tabelami, więc przedstawiciel może zmienić liczbę miejsc, zastosować zatwierdzony rabat lub dodać klauzulę prawną w PowerPoint lub Google Slides. Nie trzeba ponownie generować, a reszta decka pozostaje nienaruszona.
Kolejne kroki
Spersonalizowane propozycje sprzedażowe na dużą skalę to trzy elementy: czysty arkusz, jeden stały szablon i kolejka respektująca 6 zapytań na minutę.
- Pobierz klucz API na 2slides.com/api. Rejestracja daje 500 darmowych kredytów, wystarczających na 5 testowych propozycji.
- Przeglądaj inne przepisy zespołowe w poście hub, przypadki użycia AI presentation API według zespołu.
- Zgłębiaj temat sprzedaży z automatyzacją decków sprzedażowych HubSpot AI i batchowym generowaniem prezentacji z AI API.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free