

HubSpot + AI Prezentacja: Podręcznik Automatyzacji Sales Decków (2026)
Dla zespołów sprzedażowych korzystających z HubSpot w 2026 roku, ROI z automatyzacji indywidualnych sales decków dla każdego klienta jest wymierne: średnie oszczędności czasu AE wynoszące 2–4 godziny tygodniowo, wzrost progresji między spotkaniami o 12–18% oraz redukcja różnic w przygotowaniu prezentacji w zespole o 30-60%. Workflow HubSpot + 2Slides z 2026 roku generuje w pełni spersonalizowany sales deck dla każdego konta, wykorzystując dane już istniejące w HubSpot (firma, etap transakcji, zainteresowanie produktem, kontakt z decydentem, alternatywne rozwiązania konkurencji) poprzez trzy ścieżki integracji: HubSpot Workflow → Webhook → API 2Slides; niestandardowa karta aplikacji HubSpot z przyciskiem Generuj Deck; zaplanowane dzienne przetwarzanie wsadowe dla wszystkich transakcji w określonym etapie. Ten podręcznik zawiera dokładny payload webhooka, szablon promptu, który przekształca pola HubSpot w treść prezentacji, oraz przepływ API 2Slides (generate → jobs/:id → download) używany przez prawdziwe zespoły RevOps w produkcji dzisiaj.
Jeśli zarządzasz operacjami przychodowymi dla zespołu sprzedażowego w HubSpot, już znasz problem: każdy AE prosi marketing lub dział wsparcia sprzedaży o "drobne poprawki" w prezentacji przed kolejną rozmową. Pomnóż to przez czterdziestu przedstawicieli i trzysta aktywnych transakcji, a otrzymasz pracę na pełen etat polegającą na łączeniu szablonów Google Slides z danymi z CRM w stylu Salesforce — z tym że korzystasz z HubSpot, który nie ma natywnego odpowiednika modułu Document Generation z Salesforce.
Ten podręcznik pokazuje, jak podłączyć HubSpot do API V1 2Slides, tak aby każda transakcja na każdym etapie mogła wygenerować spersonalizowany, zgodny z brandingiem, gotowy do wykorzystania sales deck — bez konieczności ręcznego edytowania slajdów przez człowieka. Poniższe wzorce są używane przez zespoły RevOps w firmach B2B SaaS, cyberbezpieczeństwa i enterprise AI do osiągania średnich wartości kontraktów od 40 tys. do ponad 400 tys. dolarów.
Dlaczego prezentacje oparte na HubSpot wygrywają
Biznesowe uzasadnienie dla automatyzacji prezentacji sprzedażowych z HubSpot wynika z trzech mierzalnych dźwigni.
Dźwignia 1: Odzyskany czas AE. Wewnętrzne obserwacje klientów 2Slides z wdrożeniami 20+ stanowisk pokazują, że account executive poświęcają 2–4 godziny tygodniowo na dostosowywanie prezentacji — przepisywanie slajdów wprowadzających, aktualizowanie logo, wklejanie słabości konkurencji, wymianę kalkulatorów ROI. Przy pełnym koszcie AE wynoszącym 160 tys. USD rocznie, to 6 400–12 800 USD na AE rocznie w czystej pracy nad slajdami. Dla 40-osobowego zespołu sprzedaży patrzy się na konserwatywne 256 tys. USD rocznie w odzyskanej wydajności.
Dźwignia 2: Konwersja spotkanie-do-spotkania. Prezentacje generowane z danych CRM na żywo — czyli rzeczywistego przedziału przychodów firmy, faktycznego stanowiska championu, konkurenta faktycznie wymienionego w rekordzie dealu — konwertują rezerwacje kolejnych spotkań o 12–18% lepiej niż ogólne prezentacje szablonowe. Powód jest prosty: konkretność sygnalizuje przygotowanie, a przygotowanie sygnalizuje, że handlowiec jest wart drugiego spotkania.
Dźwignia 3: Redukcja wariancji. Twoi najlepsi AE z pierwszego kwartyla budują świetne prezentacje. Twoi najsłabsi z dolnego kwartyla budują przeciętne prezentacje, które tracą pipeline. Automatyzacja podnosi dolną część. W danych kohortowych zespoły RevOps uruchamiające generowanie prezentacji wyzwalane przez HubSpot zgłaszają 30–60% redukcję wariancji jakości prezentacji mierzonej wynikami kontroli jakości menedżerów.
Wspólny wzorzec dla wszystkich trzech: prezentacja nie jest produktem, przygotowanie jest produktem. Automatyzacja przygotowania to ruch o największej dźwigni, jaki RevOps może wykonać w 2026 roku. Aby głębiej przyjrzeć się stronie enablementu, zobacz nasz przewodnik o tym, jak tworzyć prezentacje sales enablement z AI.
Architektura HubSpot + 2Slides 2026
Zanim przejdziemy do szczegółów każdej metody, oto architektura, którą stosuje każda implementacja:
HubSpot CRM (transakcje, firmy, kontakty) │ ├── Wyzwalacz (workflow, karta aplikacji, cron) │ ▼ Warstwa transformacji (funkcja serverless / Zapier / Make) │ - Buduje prompt z pól CRM │ - Wywołuje API 2Slides V1 │ ▼ 2Slides V1 API ├── POST /api/v1/slides/generate (zwraca jobId) ├── GET /api/v1/jobs/{id} (odpytywanie do momentu status = success) └── GET /api/v1/slides/download-slides-pages-voices (URL-e zasobów) │ ▼ Dostarczenie (z powrotem do transakcji HubSpot jako notatka, email do AE, wiadomość Slack)
API 2Slides jest bezstanowe dla każdego zadania, asynchroniczne i rozliczane na podstawie kredytów. Uwierzytelniasz się za pomocą klucza API w nagłówku
x-api-key: sk-2slides-...jobId/api/v1/jobs/{id}pendingprocessingsuccessMetoda 1: Workflow HubSpot → Webhook → API 2Slides
To najczęstsza ścieżka integracji. Workflow HubSpot obserwuje zmianę etapu w pipeline'ie ofert i wywołuje webhook do funkcji serverless, która komunikuje się z API 2Slides.
Krok 1: Utwórz Workflow w HubSpot
W HubSpot przejdź do Automatyzacja → Przepływy pracy → Utwórz przepływ pracy → Oparty na ofertach. Ustaw wyzwalacz rejestracji:
- Filtr: to dowolny z
Etap oferty,Odkrywanie zakończone,Demo zaplanowanePropozycja wysłana - Ponowna rejestracja: włączona przy zmianie etapu
Dodaj akcję Wyślij webhook:
- Metoda:
POST - URL:
https://your-revops-fn.vercel.app/api/hubspot/generate-deck - Uwzględnij grupy właściwości ,
ofertaipowiązana firmakontakt główny
Krok 2: Funkcja transformująca
Wdróż to na Vercel, Cloudflare Workers lub AWS Lambda. Funkcja otrzymuje webhook z HubSpot, komponuje prompt dla 2Slides i uruchamia generowanie.
// /api/hubspot/generate-deck.ts export async function POST(req: Request) { const payload = await req.json() const deal = payload.properties const company = payload.associations?.company?.properties ?? {} const contact = payload.associations?.contact?.properties ?? {} const prompt = buildDeckPrompt({ deal, company, contact }) const generateRes = await fetch('https://2slides.com/api/v1/slides/generate', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.TWOSLIDES_API_KEY!, }, body: JSON.stringify({ prompt, slide_count: 12, language: 'en', aspect_ratio: '16:9', theme_id: process.env.BRAND_THEME_ID, // twój zablokowany motyw marki metadata: { hubspot_deal_id: deal.hs_object_id, account: company.name, }, }), }) const { jobId } = await generateRes.json() // Zapisz powiązanie jobId -> oferta do późniejszego wyszukania await kv.set(`deal:${deal.hs_object_id}:job`, jobId, { ex: 86400 }) return Response.json({ ok: true, jobId }) }
Krok 3: Odpytuj i dostarczaj
Druga funkcja (wywoływana przez Vercel Cron co 90 sekund lub przez opóźnione ponowne wejście workflow w HubSpot) odpytuje
/api/v1/jobs/{id}const jobRes = await fetch(`https://2slides.com/api/v1/jobs/${jobId}`, { headers: { 'x-api-key': process.env.TWOSLIDES_API_KEY! }, }) const job = await jobRes.json() if (job.status === 'success') { const assets = await fetch( `https://2slides.com/api/v1/slides/download-slides-pages-voices?jobId=${jobId}`, { headers: { 'x-api-key': process.env.TWOSLIDES_API_KEY! } } ).then(r => r.json()) await hubspotClient.crm.objects.notes.basicApi.create({ properties: { hs_note_body: `Świeża prezentacja gotowa: ${assets.pptx_url}`, hs_timestamp: Date.now(), }, associations: [{ to: { id: deal.hs_object_id }, types: [{ category: 'HUBSPOT_DEFINED', typeId: 214 }] }], }) }
To ten sam wzorzec, którego używamy w naszej automatyzacji cotygodniowych raportów Zapier — wywołanie generowania, odpytywanie, dostarczenie — tylko przepuszczone przez HubSpot zamiast Zapier.
Metoda 2: Karta aplikacji HubSpot z przyciskiem Generuj prezentację
Metoda 1 jest automatyczna. Metoda 2 działa na żądanie: AE otwiera deal w HubSpot, widzi niestandardową kartę w prawym pasku bocznym, klika Generuj prezentację, a prezentacja trafia do ich skrzynki odbiorczej dwie minuty później.
To wykorzystuje rozszerzenie UI HubSpot (część platformy Developer Projects).
Kod rozszerzenia UI
// src/app/extensions/DealDeckCard.tsx import { hubspot, Button, Flex, Text, Alert, LoadingSpinner, } from '@hubspot/ui-extensions' import { useState } from 'react' hubspot.extend(({ context, runServerlessFunction }) => ( <DeckCard context={context} runServerless={runServerlessFunction} /> )) function DeckCard({ context, runServerless }) { const [state, setState] = useState<'idle' | 'working' | 'done' | 'error'>('idle') const [deckUrl, setDeckUrl] = useState<string | null>(null) async function onClick() { setState('working') const { response } = await runServerless({ name: 'generateDeck', parameters: { dealId: context.crm.objectId }, }) if (response.deckUrl) { setDeckUrl(response.deckUrl) setState('done') } else { setState('error') } } return ( <Flex direction="column" gap="sm"> <Text>Wygeneruj spersonalizowaną prezentację sprzedażową dla tego konta używając 2Slides.</Text> {state === 'idle' && <Button onClick={onClick}>Generuj prezentację</Button>} {state === 'working' && <LoadingSpinner label="Tworzenie prezentacji (90–120s)" />} {state === 'done' && deckUrl && ( <Alert title="Prezentacja gotowa"> <a href={deckUrl} target="_blank" rel="noreferrer">Otwórz prezentację</a> </Alert> )} {state === 'error' && <Alert variant="danger">Generowanie nie powiodło się — sprawdź logi RevOps.</Alert>} </Flex> ) }
Funkcja Serverless towarzysząca
Funkcja serverless wymieniona powyżej (
generateDeck/api/v1/slides/generate/api/v1/jobs/{id}// src/app/app.functions/generateDeck.js exports.main = async (context) => { const { dealId } = context.parameters const deal = await hubspotFetchDeal(dealId) const prompt = buildDeckPrompt(deal) const gen = await fetch('https://2slides.com/api/v1/slides/generate', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.TWOSLIDES_API_KEY }, body: JSON.stringify({ prompt, slide_count: 12, theme_id: process.env.BRAND_THEME_ID }), }).then(r => r.json()) // Odpytuj przez maksymalnie 3 minuty for (let i = 0; i < 36; i++) { await new Promise(r => setTimeout(r, 5000)) const job = await fetch(`https://2slides.com/api/v1/jobs/${gen.jobId}`, { headers: { 'x-api-key': process.env.TWOSLIDES_API_KEY }, }).then(r => r.json()) if (job.status === 'success') { return { deckUrl: job.result?.pptx_url } } if (job.status === 'failed') throw new Error(job.error || 'generation failed') } throw new Error('timeout') }
Ten wzorzec — obiekt CRM → karta rozszerzenia → wywołanie API → wynik inline — to to samo podejście, którego używają zespoły marketingowe, gdy skalują produkcję treści; zobacz jak zespoły marketingowe uruchamiają prezentacje AI na dużą skalę.
Metoda 3: Zaplanowane Generowanie Wsadowe
Nie każda prezentacja musi być generowana na żądanie. W przypadku przewidywalnych przeglądów pipeline'u — co poniedziałkowy poranek, co kwartalne podsumowanie biznesowe, każde odświeżenie etapu MEDDPICC — zaplanowane zadanie cron jest tańsze i bardziej niezawodne niż webhooki w czasie rzeczywistym.
Wzorzec
Uruchom nocne zadanie, które odpytuje HubSpot o każdą okazję w docelowym etapie, generuje świeżą prezentację dla każdej z nich i wysyła AE poranny digest e-mailem.
// /api/cron/nightly-deck-refresh.ts export const runtime = 'nodejs' export const maxDuration = 300 export async function GET(req: Request) { // Vercel Cron zabezpiecza za pomocą CRON_SECRET if (req.headers.get('authorization') !== `Bearer ${process.env.CRON_SECRET}`) { return new Response('Unauthorized', { status: 401 }) } const deals = await hubspotClient.crm.deals.searchApi.doSearch({ filterGroups: [{ filters: [ { propertyName: 'dealstage', operator: 'EQ', value: 'proposal_sent' }, { propertyName: 'hs_lastmodifieddate', operator: 'GT', value: String(Date.now() - 86400000) }, ], }], properties: ['dealname', 'amount', 'competitor', 'product_interest', 'champion_title'], limit: 100, }) const jobs = await Promise.all(deals.results.map(async (deal) => { const prompt = buildDeckPrompt(deal) const res = await fetch('https://2slides.com/api/v1/slides/generate', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.TWOSLIDES_API_KEY! }, body: JSON.stringify({ prompt, slide_count: 10, theme_id: process.env.BRAND_THEME_ID }), }).then(r => r.json()) return { dealId: deal.id, jobId: res.jobId, owner: deal.properties.hubspot_owner_id } })) await enqueueDeliveryJobs(jobs) // SQS / Upstash QStash / Trigger.dev return Response.json({ enqueued: jobs.length }) }
Zaplanuj w
vercel.json{ "crons": [ { "path": "/api/cron/nightly-deck-refresh", "schedule": "0 6 * * 1-5" } ] }
Szósta rano, dni robocze. AE otwiera e-mail, prezentacja czeka.
Szablon Promptu, Który Przekształca Pola CRM w Treść Prezentacji
Najważniejszym czynnikiem decydującym o jakości prezentacji jest prompt. Dobre prompty kodują to, co doświadczony Account Executive powiedziałby nowemu pracownikowi: „kiedy firma to X, z championem na stanowisku Y, skupionym na rezultacie Z, zbuduj prezentację w ten sposób." Gotowy do wklejenia szablon:
function buildDeckPrompt({ deal, company, contact }: Ctx) { return ` Wygeneruj prezentację sprzedażową składającą się z 10-12 slajdów dla oceny oprogramowania B2B. KONTEKST KONTA - Firma: ${company.name} - Branża: ${company.industry ?? 'nieokreślona'} - Przedział rocznych przychodów: ${company.annualrevenue ?? 'nieokreślony'} - Pracownicy: ${company.numberofemployees ?? 'nieokreślona liczba'} - Strona WWW: ${company.domain} KONTEKST TRANSAKCJI - Etap transakcji: ${deal.dealstage} - Wartość transakcji: $${deal.amount} - Zainteresowanie produktem: ${deal.product_interest} - Priorytetowy przypadek użycia: ${deal.primary_use_case} - Lista konkurencji: ${deal.competitors /* oddzielone przecinkami */} - Harmonogram ewaluacji: ${deal.close_date} KONTEKST CHAMPIONA - Imię i nazwisko: ${contact.firstname} ${contact.lastname} - Stanowisko: ${contact.jobtitle} - Zgłoszone priorytety: ${contact.priorities} STRUKTURA PREZENTACJI 1. Slajd tytułowy — „${company.name} × <Twoja Marka>: ${deal.primary_use_case}" 2. Ich obecna sytuacja — 3 punkty, specyficzne dla branży ${company.industry} 3. Koszt bezczynności — skwantyfikuj używając przedziału ${company.annualrevenue} 4. Nasze podejście — 3 filary dostosowane do ${deal.primary_use_case} 5. Dowody — 2 case studies z branży ${company.industry} (lub pokrewnej) 6. Różnicowanie vs ${deal.competitors} — zobacz sekcję battlecard poniżej 7. Plan wdrożenia — 30/60/90 dni dostosowany do ${deal.close_date} 8. Podsumowanie komercyjne — przedział zakotwiczony w $${deal.amount} 9. Ryzyka i działania naprawcze 10. Kolejne kroki — dostosowane do ${deal.dealstage} TON - Dostosuj do odbiorcy: ${contact.jobtitle} - Formalny, jeśli tytuł zawiera VP, SVP, Chief, Dyrektor; w przeciwnym razie konwersacyjny. - Każdy slajd: jedna idea, jeden wykres lub jeden cytat, bez ścian tekstu. `.trim() }
Trzymaj szablon pod kontrolą wersji. Gdy marketing zaktualizuje framework komunikacji, zmieniasz jeden plik, a następne uruchomienie crona to pobiera.
Obsługa Alternatywnych Konkurentów
Pole
deal.competitorsconst BATTLECARDS: Record<string, string> = { 'Competitor A': ` Competitor A pozycjonuje się na <ich twierdzenie>. Kontra: <twój argument> + <hasło 3-słowowe>. Podchwytliwe pytanie do zasiania: "Kiedy został opublikowany ich ostatni audyt bezpieczeństwa?" `, 'Competitor B': ` Competitor B prowadzi z <ich podejście>. Kontra: <twoja kontra> — odwołaj się do case'u przejścia <nazwa klienta>. Pułapka: "Zapytaj o ich limity na użytkownika powyżej 500 osób." `, } function battlecardSection(competitorsCsv: string) { const names = competitorsCsv.split(',').map(s => s.trim()).filter(Boolean) if (!names.length) return '' return ` KARTY KONKURENCYJNE (BATTLECARDS) ${names.map(n => BATTLECARDS[n] ?? '').filter(Boolean).join('\n')} Użyj tego do wypełnienia slajdu Różnicowanie. Nigdy nie wymieniaj konkurenta więcej niż dwa razy. `.trim() }
Dołącz wynik
battlecardSection(deal.competitors)Przechowuj battlecardy w tabeli bazy danych zamiast kodować je na sztywno, gdy będziesz mieć więcej niż dziesięć. Twój Head of Product Marketing może je edytować bez składania PR-a.
Najczęściej Zadawane Pytania
Jak zatrzymać HubSpot przed generowaniem duplikatów prezentacji przy każdej aktualizacji właściwości?
Dodaj właściwość o nazwie
last_deck_generated_atlast_deck_generated_atIle to kosztuje w kredytach 2Slides?
Każde wywołanie
/api/v1/slides/generateCzy mogę wygenerować prezentację w języku innym niż angielski?
Tak. Przekaż
language: 'de'language: 'ja'language: 'es'/api/v1/slides/generateJak zablokować wizualny branding, aby każda prezentacja wyglądała identycznie?
Użyj zablokowanego
theme_idBRAND_THEME_IDCo jeśli zadanie generowania się nie powiedzie?
Odpytuj
/api/v1/jobs/{id}statusfailederrorPodsumowanie
HubSpot nie próbuje być Salesforce i to jest w porządku — jego prostota jest funkcjonalnością. Ale prostota oznacza również, że nie oferuje natywnej automatyzacji dokumentów. Ta luka jest funkcjonalnością, a nie błędem, ponieważ oznacza, że zespół RevOps, który podłącza HubSpot do API do prezentacji AI, kontroluje najbardziej wartościowy obszar w swoim stosie narzędzi sprzedażowych: prezentację, która trafia przed kupującego.
Trzy powyższe metody — webhook workflow, przycisk karty aplikacji, zaplanowane przetwarzanie wsadowe — obejmują pełen zakres wyzwalaczy generowania, których potrzebuje zespół sprzedaży. Wybierz tę, która pasuje do Twojego etapu lejka. Etapy Discovery i Demo prawie zawsze wymagają generowania na żądanie (karta aplikacji). Etapy Proposal i Negotiation najbardziej korzystają z automatyzacji przy zmianie etapu (webhook workflow). Przeglądy pipeline i przygotowanie QBR to przetwarzanie wsadowe (cron). Uruchom wszystkie trzy, a każda transakcja w pipeline będzie miała świeżą, zgodną z prawdą CRM prezentację w zasięgu ręki, każdego dnia.
Zautomatyzuj swoje prezentacje sprzedażowe z HubSpot — uzyskaj klucz API 2Slides i podłącz go do swojego następnego workflow w mniej niż dzień.
About 2Slides
Create stunning AI-powered presentations in seconds. Transform your ideas into professional slides with 2slides AI Agent.
Try For Free