Research
Onderzoek een productniche voordat je voorraad inkoopt
Verzamel de categoriecontext, leg concurrentpagina’s vast op een genoemde datum, lees op X waar kopers over klagen en houd bewijs en memo in één LiveDoc die je voor de bestelling opnieuw bekijkt.
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.
Onderzoek deze productniche voordat we voorraad inkopen of lanceren: [product of categorie]. Markt: [land of regio]. Kanaal: [marktplaats / DTC / retail]. Tijdvenster voor kopersposts: laatste [30] dagen. Vergelijkbare producten of concurrent-URL’s: [URL’s]. Budget- en margebeperkingen: [beperkingen]. Publiek: [team]. Lever een Markdown-memo met: 1. Een oordeel van één alinea: is dit verder onderzoeken waard, en wat zou je mening veranderen. 2. Vraagsignalen: wat bronnen zeggen over interesse, seizoen en substituten. 3. Concurrerende producten: wat elk beweert, de prijs die op de pagina is vastgelegd en waar kopers vinden dat het tekortschiet. 4. Prijspositionering: de prijzen die daadwerkelijk op de pagina’s zijn gevonden, elk met vastlegdatum. 5. Klachten en onvervulde behoeften, met citaten, accounts en datums. 6. Risico’s en open vragen die vóór de inkoop moeten worden opgelost. 7. Bronnen: elke gebruikte pagina en post, met URL en datum. Regels: - Gebruik alleen wat de API’s teruggeven. Verzin nooit marktomvang, verkoopramingen, reviewaantallen of concurrentprijzen. - Rapporteer prijzen precies zoals vastgelegd, met pagina-URL en vastlegdatum. Middel of normaliseer ze nooit. - Behandel X-posts als anekdotes, niet als marktdata, en zeg het wanneer de steekproef dun is. - Scheid wat een leverancier beweert van wat een koper meldt. - Voordat er credits worden gebruikt, toon je de geplande extracties en zoekopdrachten en wacht je op mijn goedkeuring. - Neem geen contact op met leveranciers, plaats geen orders en stuur niemand een bericht op X. - Schrijf het resultaat naar ./product-research.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.
Productonderzoek — voorbeeldcategorie
Oordeel
Nader bekijken waard, maar het publieke bewijs volstaat niet voor een voorraadbeslissing. De open vragen hieronder zijn de volgende stap.
Categoriecontext
Kopers vergelijken op werkbladruimte en schoonmaken, niet op druk. Geen publieke bron ondersteunt een marktomvangschatting.
Concurrentpagina’s
- Example A — productpagina (vastgelegd op 2026-10-30)
- Example B — productpagina (vastgelegd op 2026-10-30)
Wat kopers melden
- @example_buyer: “Derde vervanging in een jaar; de afdichting begeeft het.” — 2026-10-19
- @example_home: “Schoonmaken kost minuten en niemand noemt het.” — 2026-10-24
Prijspositionering
Prijzen zijn op 2026-10-30 vastgelegd van de gelinkte pagina’s. Ze vallen in twee niveaus; elke pagina wordt direct geciteerd, niet gemiddeld.
Risico’s en open vragen
- Duurzaamheid van de afdichting is de meest herhaalde klacht.
- Geen bron dekt retourpercentages.
- Controleer levertijden en landed cost vóór bestellen.
Bronnen
- https://example.com/product-a — 2026-10-30
- https://x.com/example_buyer/status/... — 2026-10-19
De exacte aanroepen
Voor ontwikkelaars: dezelfde workflow als kopieerbare code in uitvoeringsvolgorde.
Exacte API-aanroepen tonen
Vraag Chat om het categoriebeeld
Begin met het onderbouwde antwoord, niet met een lege pagina: Chat doorzoekt het openbare web, rangschikt pagina’s en geeft gebruikte resources terug. Vraag in één query naar vraagcontext, substituten en veelvoorkomende klachten en bewaar de topresources als bewijslijst.
product-research.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 niche = "portable espresso maker"; // replace with the category you are judging const context = await felo<ChatData>("/v2/chat", { query: `Demand, price bands, and buyer complaints for ${niche} in the US`, }); const sources = context.data.resources.slice(0, 5);Voorbeelduitvoer
{ "answer": "Buyers compare on counter space and cleanup …", "sources": [ { "link": "https://example.com/category-guide", "title": "…", "snippet": "…" } ] }Leg concurrentpagina’s vast
Extraheer twee of drie concurrentproductpagina’s als Markdown met leesbaarheid. Het doel is de claim en de prijs op de pagina van vandaag, niet een herschreven specsheet. Houd URL en inhoud bij elkaar en noteer de ophaaldatum: een prijs zonder datum is een gerucht.
product-research.ts const PRODUCT_PAGES = [ { url: "https://example.com/product-a", title: "Example A — product page" }, { url: "https://example.com/product-b", title: "Example B — product page" }, ]; type ExtractData = { data: { content: string } }; const listings = await Promise.all( PRODUCT_PAGES.map((page) => felo<ExtractData>("/v2/web/extract", { url: page.url, output_format: "markdown", with_readability: true, }).then((extracted) => ({ ...page, content: extracted.data.content })), ), );Voorbeelduitvoer
[ { "url": "https://example.com/product-a", "title": "Example A — product page", "content": "# Example A\n\nSpecs and price as displayed…" } ]Lees wat kopers op X melden
Leverancierspagina’s noemen functies, kopers beschrijven fouten. Zoek de niche plus wrijvingswoorden — verzending, kwaliteit, terugbetaling — in de laatste 30 dagen en bewaar account, datum en link. Dit zijn anekdotes, geen vraagdata, en het memo moet dat zeggen.
product-research.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; metrics: { retweet_count: number; favorite_count: number; reply_count: number }; url: string; }[]; }; }; const since = Math.floor((Date.now() - 30 * 24 * 60 * 60 * 1000) / 1000); const search = await felo<XData>("/v2/x/tweet/search", { query: `"${niche}" (shipping OR quality OR refund)`, limit: 50, since_time: since, }); const complaints = search.data.tweets;Voorbeelduitvoer
{ "data": { "tweets": [ { "content": "Third replacement in a year; the seal fails.", "author": { "username": "example_buyer" }, "created_at": "2026-10-19T15:02:00Z", "metrics": { "retweet_count": 1, "favorite_count": 12, "reply_count": 3 }, "url": "https://x.com/example_buyer/status/..." } ] } }Schrijf het memo
Deze stap is gewone code: breng categorieantwoord, ophaaldata, koperquotes en bronnenlijst samen in één Markdown. Wees eerlijk over open vragen — het memo is nuttig omdat het scheidt wat pagina’s bewijzen van wat je nog met een leverancier moet checken.
product-research.ts const capturedOn = new Date().toISOString().slice(0, 10); const memo = [ `# Product research — ${niche}`, "", "## Category context", context.data.answer, "", "## Competitor pages", ...listings.map( (page) => `- [${page.title}](${page.url}) — captured ${capturedOn}`, ), "", "## What buyers report", ...complaints.slice(0, 10).map( (post) => `- @${post.author.username} (${post.created_at.slice(0, 10)}): ${post.content}`, ), "", "## Sources", ...sources.map((source) => `- [${source.title}](${source.link})`), ].join("\n"); console.log(memo);Bewaar bewijs in een LiveDoc
Draai één keer per niche: maak de LiveDoc en bewaar de
short_idin de configuratie. Voeg concurrentpagina’s en Chat-bronnen toe als URL-resources zodat het archief dedupliceert, en het memo als document. Voor de aankoop kun je vastleggingen doorzoeken en zien welke prijzen bewogen.product-research.ts type LiveDocData = { data: { short_id: string } }; const research = await felo<LiveDocData>("/v2/livedocs", { name: `Product research: ${niche}`, description: "Competitor pages, buyer posts, and the memo", }); await felo(`/v2/livedocs/${research.data.short_id}/resources/urls`, { urls: [ ...listings.map((page) => ({ url: page.url, title: page.title })), ...sources.map((source) => ({ url: source.link, title: source.title })), ].slice(0, 10), }); await felo(`/v2/livedocs/${research.data.short_id}/resources/doc`, { title: `Product memo — ${capturedOn}`, content: memo, });Voorbeelduitvoer
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
Wat inbegrepen is
- Onderbouwd categoriebeeld uit Chat en de pagina’s erachter
- Concurrentpagina’s als Markdown met ophaaldatum
- Koperklachten uit X met accounts, datums en links
- Markdown-memo uit deze invoer
- Eén LiveDoc met bewijs en memo
Wat het niet doet
- Alleen openbare bronnen; betaalde marktrapporten, leveranciersoffertes en interne verkoopdata vallen buiten
- Schat marktgrootte, verkoopvolume of marge niet
- Prijzen worden vastgelegd zoals opgehaald, nooit genormaliseerd of gemiddeld
- X-posts zijn anekdotes, geen vraagdata
- Neemt geen contact op met leveranciers, plaatst geen orders en wijzigt geen listings
Vragen
Waar komt de marktcontext vandaan?
De Chat API geeft een onderbouwd antwoord en de gebruikte openbare pagina’s. Concurrentpagina’s komen uit jouw URL’s en worden met Web Fetch geëxtraheerd; koperposts komen uit X Search. Er worden geen privéverkoopdata gebruikt.
Zegt het of een product verkoopt?
Nee. Het ordent openbaar bewijs — categoriecontext, vastgelegde prijzen en koperklachten — en schrijft op wat onbekend is. Vraagvalidatie vereist je eigen data, zoals advertenties, pre-orders of leveranciersgesprekken.
Wat als de marketplace extractie blokkeert?
Web Fetch haalt openbare pagina’s één URL tegelijk op en sommige sites blokkeren. Gebruik een toegankelijke product- of leverancierspagina en laat het memo de ontbrekende vastlegging markeren in plaats van een prijs te gissen.
Hoe voorkom ik verouderde concurrentprijzen?
Elke prijs in het memo is gekoppeld aan de pagina-URL en ophaaldatum. Draai de extractie opnieuw vlak voor de aankoopbeslissing; het archief bewaart eerdere vastleggingen zodat je prijsbewegingen ziet.
Neemt het contact op met leveranciers of verkopers?
Nee. De workflow is alleen-lezen: pagina’s extraheren, openbare posts zoeken, lokaal memo schrijven. Het verstuurt geen berichten, plaatst geen orders en wijzigt geen listings.
Wat kost een onderzoek?
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 openenContentMaak van socialgesprekken een wekelijkse luisterbrief
Zoek de X-posts van de afgelopen week over je merk en concurrenten, voeg onderbouwde webcontext toe, lees de pagina’s erachter en archiveer elke editie zodat de volgende week bij het bekende begint.
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.
Voeg reviewtranscripten toe
Zijn er reviewvideo’s, haal het transcript met YouTube Subtitling en voeg twee of drie citaten met timestamp toe aan de kopersectie. Een videoreview blijft de ervaring van één persoon, dus houd het anekdotelabel van X-posts.
Vergelijk twee kandidaten
Draai dezelfde stappen per kandidaat en zet de memo’s naast elkaar: geclaimde functies, vastgelegde prijs, terugkerende klacht en open vraag. De vergelijking blijft kwalitatief tot je eigen verkoop- of retourdata hebt.
Vernieuw voor de aankoop
Draai de extractie een dag voor de bestelling opnieuw. Houd dezelfde LiveDoc en voeg een nieuw memo toe, zodat het archief laat zien wat veranderde tussen bureauonderzoek en aankoop, inclusief een prijs buiten budget.
Verder
De referentiepagina’s achter dit recept en de volgende stappen.