2Slides Logo
HubSpot + AI Prezentacje: Automatyzacja Prezentacji Sprzedażowych (2026)
2Slides Team
14 min read

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-...
. Każde generowanie prezentacji natychmiast zwraca
jobId
, a następnie odpytujesz
/api/v1/jobs/{id}
do momentu, aż status zmieni się z
pending
processing
success
. Po osiągnięciu sukcesu pobierasz końcowy plik PPTX, PDF lub URL-e poszczególnych slajdów.

Metoda 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:
    Etap oferty
    to dowolny z
    Odkrywanie zakończone
    ,
    Demo zaplanowane
    ,
    Propozycja 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
    oferta
    ,
    powiązana firma
    i
    kontakt 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}
i po sukcesie zapisuje URL prezentacji z powrotem do oferty jako notatkę dotyczącą zaangażowania:

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
) znajduje się w tym samym projekcie aplikacji HubSpot i wywołuje ten sam przepływ
/api/v1/slides/generate
+
/api/v1/jobs/{id}
co Metoda 1, ale blokuje się do momentu, aż zadanie się powiedzie (lub przekroczy limit czasu), zanim zwróci URL prezentacji do karty.

// 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.competitors
w HubSpot — czy to niestandardowe pole tekstowe jednoliniowe, pole wielokrotnego wyboru, czy lista rozwijana — to skarb. Wstrzyknij blok battlecard do promptu warunkowo:

const 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)
do swojego promptu. Prezentacja zawiera teraz ramowanie konkurencyjne na poziomie AE — takie, które normalnie wymaga trzydziestominutowej rozmowy z liderem analiz konkurencyjnych.

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_at
do obiektu transakcji i uwzględnij filtr w Workflow HubSpot:
last_deck_generated_at
jest nieznane lub ma więcej niż 7 dni. Twoja funkcja transformująca powinna zapisywać ten znacznik czasu z powrotem do HubSpot za pośrednictwem Deal API po pomyślnym wygenerowaniu. Samo to zapobiega 90% zmarnowanych wywołań API.

Ile to kosztuje w kredytach 2Slides?

Każde wywołanie

/api/v1/slides/generate
obciąża kredyty w zależności od liczby slajdów i wszelkich dodatków (generowanie obrazów, narracja głosowa). Dla typowej 10-slajdowej prezentacji sprzedażowej z brandingiem zaplanuj 20–40 kredytów na prezentację. Zespół RevOps generujący 500 prezentacji miesięcznie mieści się w przedziale 150–400 USD — znacznie poniżej kosztów pracy AE zaoszczędzonych na pojedynczej transakcji enterprise.

Czy mogę wygenerować prezentację w języku innym niż angielski?

Tak. Przekaż

language: 'de'
,
language: 'ja'
,
language: 'es'
itp. w payloadzie
/api/v1/slides/generate
. Szablon promptu powinien również zawierać zlokalizowany wstęp, gdy rekord kontaktu Twojego głównego użytkownika wskazuje preferowany język inny niż angielski.

Jak zablokować wizualny branding, aby każda prezentacja wyglądała identycznie?

Użyj zablokowanego

theme_id
w każdym żądaniu generowania. Utwórz motyw swojej marki raz w interfejsie 2Slides, skopiuj jego ID i zapisz jako
BRAND_THEME_ID
w zmiennych środowiskowych. Motyw kontroluje czcionki, paletę, umiejscowienie logo i układy główne — więc treść różni się per konto, podczas gdy oprawę wizualną pozostaje piksel w piksel identyczna.

Co jeśli zadanie generowania się nie powiedzie?

Odpytuj

/api/v1/jobs/{id}
i sprawdź
status
. Przy
failed
, odpowiedź zawiera
error
z kodem czytelnym maszynowo. Ponów próbę raz z wykładniczym wycofywaniem; jeśli nie powiedzie się po raz drugi, wyślij alert Slack na kanał RevOps i wróć do statycznej prezentacji szablonowej, aby AE nie był zablokowany przed rozmową.

Podsumowanie

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