Badania
Zbuduj analizę konkurencji, której użyje zespół sprzedaży
Zbierz strony konkurenta, otaczające go relacje i to, co kupujący mówią na X, a potem złóż analizę, w której każde twierdzenie ma źródło, datę i status.
Skopiuj prompt
Podmień pola w nawiasach kwadratowych i wklej do Claude Code, Codex albo AI z dostępem do terminala. Instaluje skill Felo, pyta przed wydaniem kredytów i uruchamia workflow.
Przygotuj analizę konkurencji [nazwa konkurenta] dla [nasz produkt]. Zakres: [segment], [region], [język]. Okres: [ostatnie 90 dni / ostatnie 12 miesięcy]. Decyzja, którą wspiera: [zmiana cen / pozycjonowanie premiery / obsługa obiekcji]. Źródła na start: [domena konkurenta], [URL strony z cenami], [URL changelog]. Przygotuj analizę w Markdown zawierającą: 1. Jak się pozycjonują, ich własnymi słowami. 2. Tabelę dowodów: twierdzenie, tytuł źródła, URL, data, status (Verified / Vendor claim / Third-party / Signal / Inference / Not verified). 3. Ceny: co mówi strona, z linkiem i datą sprawdzenia. Nigdy nie przenoś stawki do tekstu bez strony i daty. 4. Miejsca, w których kupujący się sprzeciwiają, z kontami X i datami, oznaczone jako sygnał. 5. Co powinniśmy zrobić dalej, oznaczone jako rekomendacja. 6. Pełną listę źródeł. Zasady: - Cytuj ich pozycjonowanie; nie przeformułowuj go na mocniejsze twierdzenie. - Oddziel twierdzenia dostawcy, relacje zewnętrzne i własne wnioski. Oznacz każdy wiersz. - Nigdy nie wymyślaj ceny, metryki, nazwy klienta ani benchmarku. Brak danych to „Brak danych”. - Zamień okres i region na konkretne wartości. - Zanim zużyjesz kredyty, pokaż planowane wywołania API i poczekaj na moją zgodę. - Nie publikuj, nie wysyłaj, nie planuj i nie zapisuj niczego w CRM. - Zapisz wynik w ./competitor-teardown.md i podsumuj go w czacie.
Kopia zawiera też kroki instalacji i zasady bezpieczeństwa.
Co otrzymujesz
Przykładowy wynik jednego uruchomienia. Nie generowanie na żywo.
Teardown konkurencji — [konkurent], sprawdzono 2026-10-30
Jak się pozycjonują
Nagłówek strony: „Platforma dla rosnących zespołów wsparcia.” Strona kategorii: „Wszystko, czego potrzebuje Twój zespół wsparcia.” Oba to twierdzenia dostawcy, cytowane dosłownie.
Tabela dowodów
| Twierdzenie | Źródło | Data | Status |
|---|---|---|---|
| Pozycjonuje się jako platforma, nie punktowe narzędzie | https://example.com/competitor/home | 2026-10-30 | Verified |
| Wydaje zmiany co tydzień | https://example.com/competitor/changelog | 2026-10-28 | Verified |
| Wymieniony w niezależnych zestawieniach | https://example.com/roundup | 2026-10-27 | Third-party |
| Kupujący wspominają wolny onboarding | post X cytowany niżej | 2026-10-14 | Signal |
| Enterprise to ich największy segment | Brak danych | — | Not verified |
Ceny
Strona cen wymienia plan progowy i plan zużyciowy. Stawki nie są tu powtarzane; sprawdź stronę na żywo i datę: https://example.com/competitor/pricing (2026-10-30).
Gdzie kupujący się sprzeciwiają
@example_dev, 2026-10-14: „instalacja zajęła więcej czasu, niż sugerowało demo.” Jeden datowany post; to skarga, nie szacunek częstości.
Rekomendacja
Na stronie porównania wysuń czas do pierwszego wyniku. To nasza dedukcja, nie twierdzenie konkurenta.
Źródła
- https://example.com/competitor/home
- https://example.com/competitor/pricing
- https://example.com/competitor/changelog
Dokładne wywołania
Dla deweloperów: ten sam workflow jako kod, w kolejności wykonania.
Pokaż rzeczywiste wywołania API
Zacznij od podstawy ze źródłami
Chat zwraca odpowiedź i użyte strony, czyli mapę, gdzie mówi się o konkurencie. Traktuj odpowiedź jako wskazówkę, nie źródło: zachowaj linki, bo dają wiersze od stron trzecich. Helper wysyła klucz raz i rzuca błąd poza 2xx.
competitor.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } type ChatData = { data: { answer: string; resources: { link: string; title: string; snippet: string }[]; }; }; const competitor = "Example Competitor"; const segment = "mid-market support teams"; const baseline = await felo<ChatData>("/v2/chat", { query: `How does ${competitor} position itself for ${segment}? Include pricing and recent launches.`, }); const seedSources = baseline.data.resources.slice(0, 5);Przykładowy wynik
{ "answer": "The competitor positions itself as …", "sources": [ { "link": "https://example.com/competitor", "title": "…", "snippet": "…" } ] }Pobierz strony, które kontrolują
Relacje stron trzecich pokazują, co ludzie myślą; ich strony pokazują, co twierdzą. Wyekstrahuj stronę główną, cennik i changelog jako Markdown z trybem czytania i zapisz datę pobrania: cennik bez daty to pułapka.
competitor.ts type ExtractData = { data: { content: string } }; const ownedPages = [ { url: "https://example.com/competitor/home", title: "Homepage" }, { url: "https://example.com/competitor/pricing", title: "Pricing" }, { url: "https://example.com/competitor/changelog", title: "Changelog" }, ]; const fetched = await Promise.all( ownedPages.map(async (page) => { const res = await felo<ExtractData>("/v2/web/extract", { url: page.url, output_format: "markdown", with_readability: true, with_cache: true, }); const checkedAt = new Date().toISOString().slice(0, 10); return { ...page, checkedAt, content: res.data.content }; }), );Przykładowy wynik
{ "url": "https://example.com/competitor/pricing", "checkedAt": "2026-10-30", "content": "# Pricing\n\nExtracted page text…" }Zobacz, co kupujący mówią na X
Szukaj na X obiekcji i obejść dotyczących konkurenta. Zachowaj konto i datę każdego posta; datowany cytat dowodzi skargi, nie jej częstotliwości. Analiza oznacza to jako sygnał i nigdy nie zamienia kilku postów w procent.
competitor.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; metrics: { retweet_count: number; favorite_count: number }; }[]; }; }; const since = Math.floor((Date.now() - 90 * 24 * 60 * 60 * 1000) / 1000); const buyerSignal = await felo<XData>("/v2/x/tweet/search", { query: `"${competitor}" (pricing OR onboarding OR migration)`, limit: 25, since_time: since, }); const objections = buyerSignal.data.tweets.slice(0, 5);Przykładowy wynik
{ "data": { "tweets": [ { "content": "setup took longer than the demo suggested", "author": { "username": "example_dev" }, "created_at": "2026-10-14T09:20:00Z", "metrics": { "retweet_count": 3, "favorite_count": 24 } } ] } }Złóż analizę z tabelą dowodów
To krok redakcyjny: zamień strony i posty w twierdzenia i daj każdemu źródło, datę i status. Kolumna statusu trzyma dokument uczciwym:
Verifieddla tego, co mówi strona,Vendor claimdla marketingu,Third-partydla relacji zewnętrznych,Signaldla datowanego posta,Inferencedla twojej lektury iNot verifiedbez dowodów.competitor.ts const today = new Date().toISOString().slice(0, 10); const row = (claim: string, source: string, date: string, status: string) => `| ${claim} | ${source} | ${date} | ${status} |`; const teardown = [ `# Competitor teardown — ${competitor}`, `Scope: ${segment}. Checked ${today}.`, "", "| Claim | Source | Date | Status |", "| --- | --- | --- | --- |", row("Free tier listed on the pricing page", ownedPages[1].url, fetched[1].checkedAt, "Verified"), row("Positions as a platform, not a point tool", ownedPages[0].url, fetched[0].checkedAt, "Vendor claim"), row("Discussed in independent coverage", seedSources[0]?.link ?? "Not available", today, "Third-party"), row("Buyers report onboarding friction", "X post, quoted below", today, "Signal"), row("Most revenue comes from enterprise", "Not available", "—", "Not verified"), "", "## Recommendation", "Lead with time-to-first-result on the comparison page. Inference, not a competitor claim.", ].join("\n"); console.log(teardown);Przykładowy wynik
| Free tier listed on the pricing page | https://example.com/competitor/pricing | 2026-10-30 | Verified |
Zarchiwizuj w LiveDoc na kolejną aktualizację
Utwórz jeden LiveDoc na konkurenta, dodaj pobrane strony jako zasoby URL i analizę jako dokument. Ponowne dodanie URL jest deduplikowane, więc w kolejnym kwartale pobierasz tylko zmiany, a poprzednia analiza zostaje w tym samym archiwum.
competitor.ts type LiveDocData = { data: { short_id: string } }; const teardownDoc = await felo<LiveDocData>("/v2/livedocs", { name: `Teardown: ${competitor}`, description: `Sources and teardown checked ${today}`, }); await felo(`/v2/livedocs/${teardownDoc.data.short_id}/resources/urls`, { urls: fetched.map((page) => ({ url: page.url, title: page.title })), }); await felo(`/v2/livedocs/${teardownDoc.data.short_id}/resources/doc`, { title: `Teardown ${today}`, content: teardown, }); console.log(teardownDoc.data.short_id); // the next refresh reuses this LiveDocPrzykładowy wynik
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
Co zawiera
- Podstawa ze źródłami z Chat API i strony za nią
- Strona główna, cennik i changelog konkurenta jako Markdown
- Datowane komentarze kupujących z X, oznaczone jako sygnał, nie dowód
- Tabela dowodów oddzielająca zweryfikowane fakty, twierdzenia dostawcy i inferencję
- LiveDoc trzymający źródła, żeby nie zaczynać od zera
Czego nie robi
- Tylko źródła publiczne; bez wywiadów win/loss, notatek CRM i prywatnych dashboardów
- Ceny są linkowane i datowane, nigdy nie zamrażane w tabeli bez daty weryfikacji
- Zasięg X jest niepełny i nie stanowi reprezentatywnej próby kupujących
- Nie wybiera twojego pozycjonowania; rekomendacje są oznaczone jako inferencja
- Nie publikuje analizy ani nie zapisuje do narzędzi battlecard
Pytania
Skąd pochodzą dowody?
Chat API zwraca podstawę ze źródłami i użyte strony, Web Fetch zamienia strony konkurenta w Markdown, a X Search dodaje datowane posty. Każdy wiersz ma źródło i datę, inferencja ma własny status.
Czy można objąć kilku konkurentów?
Tak. Uruchom ten sam prompt dla każdego konkurenta i trzymaj jeden LiveDoc na firmę. Strona porównawcza łączy tylko wiersze „zweryfikowane”, bez mieszania dowodów z dwóch uruchomień.
Czy można cytować ich ceny?
Workflow zapisuje, co mówi strona cennika, z linkiem i datą weryfikacji. Nie zamraża stawek w tekście, bo ceny się zmieniają, a nieaktualna liczba jest gorsza od braku liczby.
A nasze notatki win/loss?
Czyta tylko źródła publiczne. Dodaj notatki wewnętrzne jako osobny dokument w LiveDoc i oznacz jako wewnętrzne; nigdy nie są cytowane w materiałach dla klientów.
Jak często odświeżać?
Wyzwalaczem, nie kalendarzem: zmiana ceny, launch albo start cyklu sprzedaży. Uruchom ponownie w tym samym LiveDoc, żeby poprzedni kwartał stał obok nowego.
Ile kosztuje jedna analiza?
Każde wywołanie czatu, ekstrakcji i wyszukiwania X zużywa kredyty według użycia; aktualne stawki na stronie cen. Prompt pyta o zgodę przed wydaniem.
Powiązane workflowy
Zamień jedno pytanie w brief badawczy ze źródłami
Zapytaj web, zapisz strony stojące za odpowiedzią jako Markdown, dodaj to, co mówią praktycy na X, i zachowaj dowody w LiveDoc, który można później przeszukać.
Otwórz workflowBadaniaZamień pytanie rynkowe w brief go-to-market
Zadaj rynkowi precyzyjne pytanie, przeczytaj strony kategorii i cen za odpowiedzią, zbierz, jak kupujący opisują problem na X, i zapisz brief GTM z twierdzeniami ze źródeł i otwartymi pytaniami.
Otwórz workflowTreściPublikuj codzienny digest AI, który zespół naprawdę czyta
Weź podsumowanie ze źródłami, dodaj rozmowy praktyków na X, pobierz transkrypt wideo, złóż wydanie w Markdown i zarchiwizuj w LiveDoc.
Otwórz workflowDostosuj
Ta sama receptura, dopasowana do tego, jak naprawdę dostarczasz.
Odświeżaj wyzwalaczem, nie kalendarzem
Uruchom ponownie, gdy konkurent zmieni ceny, zrobi duży launch albo przed cyklem sprzedaży. Trzymaj każdą analizę jako datowany dokument w tym samym LiveDoc.
Zamień analizę w battlecardy
Z tej samej tabeli napisz stronę na rolę — kupujący ekonomiczny, champion, recenzent techniczny — używając tylko wierszy `Verified` z linkami. Zostaw `Inference` poza materiałami dla klientów.
Porównaj dwóch konkurentów
Uruchom workflow dla każdego konkurenta z osobnymi LiveDocs i zbuduj stronę porównawczą tylko z wierszy `Verified` w obu uruchomieniach. Nigdy nie łącz dwóch uruchomień bez kolumny statusu.
Idź dalej
Strony referencyjne za tą recepturą i kolejne kroki.