Research
Maak van een marktvraag een go-to-marketbrief
Stel de markt een precieze vraag, lees de categorie- en prijspagina’s achter het antwoord, verzamel hoe kopers het probleem op X beschrijven en sla een GTM-brief op met onderbouwde beweringen en open vragen.
Prompt kopiëren
Vervang de velden tussen blokhaken en plak in Claude Code, Codex of een AI met terminaltoegang. Die installeert de Felo-skill, vraagt voor credits en voert de workflow uit.
Maak een go-to-market onderzoeksbrief voor [product] dat [segment of ICP] betreedt in [regio], in het [taal]. Motion: [self-serve / sales-led / partner]. Beslissing die het ondersteunt: [lancering / prijs / herpositionering]. Tijdvenster: [laatste 90 dagen / laatste 12 maanden]. Lever een Markdown-brief met: 1. Segmentdefinitie: wie ze zijn, wat ze vandaag gebruiken en wat bronnen over omvang zeggen — citeer een bron of schrijf ‘Niet beschikbaar’. 2. Taal van kopers: hoe ze het probleem beschrijven, met links en datums. 3. Alternatieven: waar ze van overstappen, inclusief spreadsheets en niets doen. 4. Bezwaren en het bewijs dat kopers vragen. 5. Open vragen die publieke bronnen niet kunnen beantwoorden. 6. Een volledige bronnenlijst. Regels: - Elke marktbewering heeft een link en datum. Schat marktomvang, groei of budget nooit op gevoel. - Scheid onafhankelijke bronnen, leverancierspagina’s en je eigen gevolgtrekkingen. - Gebruik X voor taal en bezwaren, niet als bewijs van marktomvang. - Zet het tijdvenster en de regio om in expliciete waarden. - Voordat er credits worden gebruikt, toon je de geplande API-aanroepen en wacht je op mijn goedkeuring. - Publiceer, verstuur, plan niets en schrijf niets in een CRM. - Schrijf het resultaat naar ./gtm-brief.md en vat het samen in de chat.
De kopie bevat ook de installatiestappen en veiligheidsregels.
Wat je krijgt
Voorbeelduitvoer van een run. Geen live generatie.
GTM-brief — [segment] in [regio]
Segmentdefinitie
Kleine operationele teams die planning in spreadsheets doen. Omvang: niet beschikbaar in de geraadpleegde publieke bronnen — geen getal zonder bron.
Taal van kopers
- “we doen dit nog in een spreadsheet” — X-post, 2026-10-18
- “de setup is het moeilijke deel” — X-post, 2026-10-02
Gelabeld als taal, niet als bewijs van prevalentie.
Alternatieven die kopers noemen
Spreadsheets, een bestaande suite en niets doen. Bron: https://example.com/thread (2026-10-18).
Bezwaren en vereist bewijs
Beveiligingsreview en migratiepad. Kopers vragen een referentie met naam; publiek hebben we die niet, dus dit blijft open.
Open vragen
- Hoeveel van het segment heeft al een eigen budgetregel?
- Verandert het bezwaar met bedrijfsgrootte?
Bronnen
- https://example.com/category-page
- https://example.com/pricing-page
- https://example.com/thread
De exacte aanroepen
Voor ontwikkelaars: dezelfde workflow als kopieerbare code in uitvoeringsvolgorde.
Exacte API-aanroepen tonen
Kader de marktvraag
Chat geeft een antwoord en de gebruikte pagina’s terug, dus begin met een vraag die nauw genoeg is: wie koopt, wat gebruiken ze vandaag en welke bezwaren komen op. Bewaar resources als aanwijzingslinks; het antwoord is een aanwijzing, de links zijn bewijs en sluiten de bronnenlijst.
gtm.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 product = "scheduling tool"; // replace with your product const segment = "operations teams at 50-200 person companies"; const region = "DACH"; const market = await felo<ChatData>("/v2/chat", { query: `Who buys ${product} for ${segment} in ${region}, what do they use today, and what objections come up?`, }); const seedSources = market.data.resources.slice(0, 5);Voorbeelduitvoer
{ "answer": "Buyers in this segment usually start from spreadsheets and …", "sources": [ { "link": "https://example.com/category-page", "title": "…", "snippet": "…" } ] }Lees de categoriepagina’s zelf
Haal de pagina’s op die de markt kaderen: categorieoverzicht, vergelijking en prijzen. Extraheer ze als Markdown met leesbaarheid en zet de ophaaldatum erop, want de kwaliteit van de marktlezing hangt af van de pagina’s erachter.
gtm.ts type ExtractData = { data: { content: string } }; const marketPages = [ { url: "https://example.com/category", title: "Category overview" }, { url: "https://example.com/comparison", title: "Comparison page" }, { url: "https://example.com/pricing", title: "Pricing page" }, ]; const pages = await Promise.all( marketPages.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 }; }), );Voorbeelduitvoer
{ "url": "https://example.com/category", "checkedAt": "2026-10-30", "content": "# Category overview\n\nExtracted page text…" }Verzamel hoe kopers het probleem beschrijven
Zoek op X naar de woorden die kopers gebruiken wanneer ze het probleem tegenkomen, niet naar je productnaam. Bewaar accounts en datums; de brief gebruikt posts voor taal en bezwaren, nooit als maat voor marktgrootte of frequentie.
gtm.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 language = await felo<XData>("/v2/x/tweet/search", { query: `(spreadsheet OR "scheduling tool") (alternative OR "looking for")`, limit: 25, since_time: since, }); const quotes = language.data.tweets.slice(0, 5);Voorbeelduitvoer
{ "data": { "tweets": [ { "content": "we are still doing this in a spreadsheet", "author": { "username": "example_ops" }, "created_at": "2026-10-18T11:05:00Z", "metrics": { "retweet_count": 1, "favorite_count": 18 } } ] } }Schrijf de brief rond de beslissing
Breng segmentdefinitie, koperstaal, alternatieven, bezwaren en open vragen samen in één Markdown. Elke bewering behoudt bron en datum, marktgrootte staat er alleen met bron, en wat openbare bronnen niet beantwoorden gaat naar open vragen in plaats van inferentie.
gtm.ts const today = new Date().toISOString().slice(0, 10); const sourceLine = (title: string, url: string, date: string) => `- ${title}: ${url} (checked ${date})`; const brief = [ `# GTM brief — ${segment} in ${region}`, "", "## Segment definition", "See the category page for how the segment is described. Market size: Not available from public sources reviewed.", "", "## Buyer language", ...quotes.map((post) => `- @${post.author.username}, ${post.created_at.slice(0, 10)}: ${post.content}`), "", "## Alternatives buyers mention", "Spreadsheets, an incumbent suite, and doing nothing. Treated as language until a source ranks them.", "", "## Objections and proof required", "Migration path and a named reference. Marked open: whether the objection changes by company size.", "", "## Open questions", "- How much of the segment already has a dedicated budget line?", "- Which objection blocks a pilot most often?", "", "## Sources", ...pages.map((page) => sourceLine(page.title, page.url, page.checkedAt)), ...seedSources.map((source) => `- ${source.title}: ${source.link}`), ].join("\n"); console.log(brief);Voorbeelduitvoer
# GTM brief — operations teams at 50-200 person companies in DACH
Bewaar het bewijs voor de volgende markt
Maak één LiveDoc per segment en regio, voeg opgehaalde pagina’s toe als URL-resources en de brief als document. De volgende markt start met dezelfde bronnen zonder categoriepagina’s opnieuw op te halen, en een URL opnieuw toevoegen wordt gededupliceerd.
gtm.ts type LiveDocData = { data: { short_id: string } }; const briefDoc = await felo<LiveDocData>("/v2/livedocs", { name: `GTM: ${segment} — ${region}`, description: `Market evidence checked ${today}`, }); await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/urls`, { urls: pages.map((page) => ({ url: page.url, title: page.title })), }); await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/doc`, { title: `GTM brief ${today}`, content: brief, }); console.log(briefDoc.data.short_id); // reuse for the next regionVoorbeelduitvoer
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
Wat inbegrepen is
- Onderbouwde marktlezing uit de Chat API en de pagina’s erachter
- Categorie-, vergelijkings- en prijspagina’s als Markdown
- Koperstaal en bezwaren uit X met accounts en datums
- Een brief rond de launchbeslissing, niet rond een onderwerp
- LiveDoc zodat de volgende regio of launch het bewijs hergebruikt
Wat het niet doet
- Alleen openbare bronnen; geen betaalde marktrapporten, panels of klantinterviews
- Schat nooit marktgrootte of groei — zonder data staat er ‘Niet beschikbaar’
- X-posts zijn taal en signaal, geen representatieve koperssteekproef
- Het kiest segment en prijs niet voor je
- Het publiceert de brief niet en schrijft niet in het CRM
Vragen
Heb ik een betaald marktrapport nodig?
Nee. De workflow leest openbare bronnen en markeert gaten. Heb je al een rapport, voeg het als document toe aan de LiveDoc en citeer het zoals elke andere bron.
Kan ik een markt in een andere taal onderzoeken?
Ja. Stel regio en taal in. Citaten blijven in de originele taal met vertaling ernaast, zodat een lokale reviewer de formulering kan controleren.
Krijg ik een marktgrootte?
Alleen als een bron die noemt, met link en datum. Anders schrijft de brief ‘Niet beschikbaar’ in plaats van een getal te verzinnen of uit één post te extrapoleren.
Kan het met klanten praten?
Nee. Het leest openbare bronnen. Voeg interviewnotities als document toe en markeer ze intern; de brief presenteert privénotities nooit als openbaar bewijs.
Wat is het verschil met de researchbrief?
De researchbrief beantwoordt één vraag. Deze workflow structureert bewijs rond een go-to-marketbeslissing — segment, koperstaal, alternatieven, bezwaren en gevraagd bewijs — zodat de uitvoer in een launchplan kan.
Wat kost een brief?
Elke chat-, extractie- en X Search-aanroep verbruikt gebruikscredits; actuele tarieven staan op de prijspagina. De prompt vraagt goedkeuring voor uitgaven.
Gerelateerde workflows
Maak van één vraag een onderbouwde researchbrief
Vraag het web, bewaar de pagina’s achter het antwoord als Markdown, voeg toe wat practitioners op X zeggen en houd het bewijs in een LiveDoc dat je later opnieuw kunt doorzoeken.
Workflow openenResearchBouw een concurrentieanalyse die je salesteam direct kan gebruiken
Verzamel de pagina’s van de concurrent, de berichtgeving eromheen en wat kopers op X zeggen, en zet een analyse in elkaar waarin elke bewering bron, datum en status heeft.
Workflow openenKantoorMaak van een onderzoekspagina een presentatie
Extraheer de pagina, bewaar hem als LiveDoc-context, laat de PPT Task API het deck bouwen en vraag door tot de voltooide link.
Workflow openenMaak het van jou
Hetzelfde recept, aangepast aan hoe je echt oplevert.
Draai per regio
Houd de sectiestructuur gelijk en wijzig alleen regio en taal. Eén LiveDoc per regio en dezelfde vragen, zodat brieven vergelijkbaar blijven.
Voeg je interviewnotities toe
Plak notities van klantgesprekken als document en markeer ze intern. De brief kan ze naast openbaar bewijs noemen, maar presenteert een privénotitie nooit als openbare bron.
Voed het launchdeck
Geef de bezwaren- en bewijssectie aan de deckworkflow en houd de bronnenlijst erbij. De brief blijft de bewijslaag; het deck is een presentatie, geen tweede bron van waarheid.
Verder
De referentiepagina’s achter dit recept en de volgende stappen.