Investor call prep

Prepare for investor calls by pulling upcoming meetings from Google Calendar, deeply researching each investor and their firm (website scraping, portfolio analysis, thesis extraction), checking for competitor conflicts, and outputting an honest prep sheet with compatibility assessments.

How to use it

  1. Hit Copy the whole skill.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/research/capabilities/investor-call-prep#main ~/.claude/skills/investor-call-prep

For one project only, change the path to .claude/skills/investor-call-prep.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text303 lines
investor-call-prep/SKILL.md303 lines14.8 KBpushed 96d agoRawView on GitHub

Investor Call Prep

Setup

Read your credentials from ~/.gooseworks/credentials.json:

export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")

If ~/.gooseworks/credentials.json does not exist, tell the user to run: npx gooseworks login

All endpoints use Bearer auth: -H "Authorization: Bearer $GOOSEWORKS_API_KEY"

Pull investor meetings from Google Calendar, deep-research each firm (scrape their website, analyze portfolio, extract thesis), and output an honest prep sheet that says which investors are a real fit and which aren't.

Read-only calendar access. Never creates, modifies, or deletes events.

Input

  • domain (required) — user's company website (provided in the prompt, e.g. "prep my investor calls for orthogonal.com")
  • competitors (optional) — auto-detected if not provided

Always export to Google Sheets at the end — it's free and takes seconds.

Step 1: Pull Investor Meetings

Pull from today through Demo Day (March 24, 2026). All W26 companies are fundraising now through Demo Day. Make multiple calls if needed to avoid truncation — e.g. split into week 1 and week 2.

# Adjust timeMin to today's date
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"google-calendar","path":"/list-events"}'
  "calendarId": "primary",
  "timeMin": "{today}T00:00:00Z",
  "timeMax": "{midpoint}T23:59:59Z",
  "maxResults": 100,
  "singleEvents": true,
  "orderBy": "startTime"
}'

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"google-calendar","path":"/list-events"}'
  "calendarId": "primary",
  "timeMin": "{midpoint+1}T00:00:00Z",
  "timeMax": "2026-03-24T23:59:59Z",
  "maxResults": 100,
  "singleEvents": true,
  "orderBy": "startTime"
}'

Filtering — be precise, not greedy

The keyword approach catches false positives (personal meetings, mock pitches, etc.). Use this priority order:

  1. Strong signal (auto-include): Title starts with "Investors between" — this is the standard Cal.com booking format for investor meetings.
  2. Medium signal (auto-include): Attendee email domain is a known VC domain (e.g. @moonfire.com, @a16z.com, @accel.com) OR the event description contains VC firm names.
  3. Weak signal (requires confirmation): Title contains keywords like invest, vc, fund, capital, ventures, angel, seed, series — BUT does NOT match pattern #1. These need manual review.
  4. Exclude: Events with "mock" or "practice" in title/description (these are rehearsals, not real meetings). Also exclude batch/group events with no attendees (e.g. "Fundraising Open Mic", "Demo Day") — these are YC events, not 1:1 investor calls.

Extract: title, date/time, attendee emails (non-company = investor contacts), description (often has investor names/emails even when attendee list doesn't).

Present filtered list to user for confirmation before proceeding.

Create the Google Sheet immediately after confirmation

Before starting any research, create the spreadsheet and populate it with all confirmed investor rows (date/time, firm name, investor name, firm website — leave research columns blank). Share the link with the user so they can watch results fill in live as each investor is researched. This is much better UX than waiting for all research to complete.

Step 2: Research the User's Company

Ask the user to describe their company in 1-2 sentences rather than relying on Perplexity, which often confuses companies with similar names (e.g. orthogonal.com vs orthogonal.io). The user's own description is always more accurate than a web search for early-stage startups.

Then auto-detect competitors:

# Auto-detect competitors (skip if user provided)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"perplexity","path":"/chat/completions"}'
  "model": "sonar",
  "messages": [{"role": "user", "content": "Top 5-10 competitors of {company_name} ({domain})? {user_provided_description}. Company names and domains only."}]
}'

Verify the competitor list with the user before proceeding. Perplexity often returns enterprise incumbents (MuleSoft, Workato) rather than actual startup competitors. The user knows their competitive landscape better.

Save the company description and confirmed competitor list — use them for every investor assessment.

Step 2b: Reverse-lookup competitor investors (one-time, cheap)

Instead of asking each investor "have you invested in X?" (unreliable), do a single reverse lookup for each competitor. This is 1 Perplexity call per competitor — not per investor.

# Run one call per competitor (e.g. 5 competitors = 5 calls total)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"perplexity","path":"/chat/completions"}'
  "model": "sonar",
  "messages": [{"role": "user", "content": "Who are the investors in {competitor_name} ({competitor_domain})? List all known venture capital firms and angel investors who have invested in them, with round details if available."}]
}'

Build a lookup table: {investor_firm -> [competitors they backed]}. Cross-reference this against the meeting list. This catches conflicts that per-investor Perplexity queries miss, at a fraction of the cost.

Step 3: Research Each Investor

Run ALL of these in parallel per investor. Every source adds unique data.

3a. Apollo — investor profile from email

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"apollo","path":"/api/v1/people/match"}'
  "email": "{investor_email}",
  "reveal_personal_emails": true
}'

No attendee email? Don't stop. Parse firm name from event title, then:

# Firm enrichment
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"apollo","path":"/api/v1/organizations/enrich","query":{"domain":"{firm_domain}"}}'

# Find key people
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"apollo","path":"/api/v1/mixed_people/search"}'
  "q_organization_domains": "{firm_domain}",
  "person_titles": ["Partner", "Principal", "Managing Director", "GP", "General Partner", "Investor"],
  "page": 1,
  "per_page": 10
}'

3b. Scrape the firm's website (most reliable source)

VC websites are the ground truth. Perplexity and Apollo often have gaps for smaller firms.

# Main page — thesis, overview, portfolio
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "https://{firm_website}",
  "user_prompt": "Extract ALL information: investment thesis, fund size, check size, stage focus, sector focus, geographic focus, every portfolio company listed, team members with titles and LinkedIn URLs, contact info."
}'

# Portfolio page (try /portfolio, /companies, /investments — skip on 404)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "https://{firm_website}/portfolio",
  "user_prompt": "Extract every portfolio company: name, sector, funding stage, description, website URL."
}'

# Team page (try /team, /people, /about — skip on 404)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
  "website_url": "https://{firm_website}/team",
  "user_prompt": "Extract every team member: full name, title, LinkedIn URL, bio summary, background."
}'

3c. Perplexity — thesis, portfolio, competitor check

Critical: use context-rich prompts. Include location, GP names, aliases. "Tell me about e2vc" gets nothing. "Tell me about e2vc, formerly 500 Emerging Europe, based in Turkey" gets rich results.

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"perplexity","path":"/chat/completions"}'
  "model": "sonar",
  "messages": [{"role": "user", "content": "Tell me about {firm_name}, a venture capital firm{location_context}{gp_context}{alias_context}. I am raising for {company_name}, {company_description}. Answer:
1. Investment thesis and typical check size?
2. Notable portfolio companies in {company_sectors}?
3. Have they invested in any of these competitors: {competitor_list}?
4. What stage?
5. Recent investments or news?
6. Key partners and backgrounds?
7. Would {company_name} be a good fit for them? Why or why not?"}]
}'

Step 4: Classify Before Compiling

Before writing up the prep sheet, classify each meeting into one of these categories based on research:

  1. VC Fund — traditional venture capital firm (GP, Partner, Principal, Associate)
  2. Angel — individual investor (current/former founder, operator, or executive investing personally)
  3. NOT an investor — flag prominently. This includes:
    • Founders of other startups (potential BD/partnership, not fundraise)
    • Researchers/academics with no investing track record
    • Operators at companies (not investing personally)
    • Mock pitch / practice sessions

For non-investors, still include them in the sheet but mark the Compatibility column as "NOT AN INVESTOR" and explain what the meeting likely is (BD, partnership, mock pitch, etc.). This prevents the user from wasting prep time on a fundraise pitch when the meeting is something else.

Surface ecosystem investments, not just competitor conflicts

When an investor has portfolio companies that are adjacent to the user's space (not direct competitors but in the same ecosystem), surface these as Ecosystem Signals rather than ignoring them. These are actually positive — they show the investor understands the space.

Examples:

  • An investor backed CrewAI (AI agent framework) → they understand agents need API access → good hook for Orthogonal
  • An investor backed Arcade.dev (AI tooling) → adjacent, not a conflict → shows thesis alignment
  • An investor backed Langbase (AI agents) → ecosystem overlap → talking point

Only flag as Competitor Conflict if the portfolio company is a direct competitor (same product, same customer, same use case). Adjacent/ecosystem companies go in the Talking Points column as conversation hooks.

Step 5: Compile Prep Sheet

Cross-reference all sources. When they conflict, prefer: website > Apollo > Perplexity.

Output format per meeting:

## {Firm Name} — {Date/Time}

**Investor:** {Name}, {Title}
**LinkedIn:** {linkedin_url}
**Firm:** {firm_name} | {firm_linkedin_url} | {firm_website}

**Thesis:** {specific, not generic}
**Stage:** {seed, Series A, etc.} | **Check Size:** {range} | **Fund Size:** {if known}
**Geographic Focus:** {regions}

**Portfolio ({count}):** {most relevant to user's space}
**Competitor Conflicts:** {names} or None found

**Compatibility: {verdict}**
{honest, company-specific assessment}

**Talking Points:**
1. {angle from portfolio overlap}
2. {angle from partner's background}
3. {angle from thesis alignment}

Compatibility — Be Honest and Specific

Every rating must reference the user's specific company, product, and sector. Generic assessments are useless.

Strong Fit — Thesis covers user's sector AND stage. Adjacent portfolio companies (not competitors). Partner has relevant domain expertise.

"Strong fit — Revo invests in B2B SaaS + AI from Turkey/CEE at seed-Series A ($500K-$5M). Their marketplace portfolio companies are adjacent. Melis's M&A background means she gets platform economics."

Moderate Fit — Partial overlap. Be specific about what's missing.

"Moderate fit — right stage but portfolio leans fintech/industrial tech, no developer tools. You'll need to educate them on the API marketplace space."

Weak Fit — Wrong thesis, stage, geography, or has funded a competitor. Don't sugarcoat.

"Weak fit — consumer apps focus, Series B+ checks. No dev tools portfolio. May not be worth your limited pre-demo-day time."

Competitor Conflict — Flag prominently.

"They backed Composio — a direct competitor. Ask early whether this creates a conflict."

Step 6: Google Sheets Export

The spreadsheet was already created in Step 1. Update each row as research completes — use curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"api":"google-sheets","path":"/update-values"}'

Important: Always use curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"api":"google-sheets","path":"for"}'

Tips

  • Parallelize everything: Apollo, Scrapegraph, Perplexity, Fiber are independent — run all in parallel per investor, and process investors simultaneously.
  • Website > all other sources: Firm websites are ground truth. Always scrape.
  • No email? Parse the firm name from the event title → derive domain → Apollo org enrich + people search + website scrape.
  • Context in Perplexity prompts: Include location, GP names, "formerly known as" — massively improves results for smaller firms.
  • Be brutal on fit: User has limited time. Say which meetings to prioritize and which to skip.
  • Firm domain from email: [email protected] → domain is somefirm.com.
  • Multiple attendees: Run Apollo on each. Most senior person = decision-maker.
1---
2name: investor-call-prep
3description: Prepare for investor calls by pulling upcoming meetings from Google Calendar, deeply researching each investor and their firm (website scraping, portfolio analysis, thesis extraction), checking for competitor conflicts, and outputting an honest prep sheet with compatibility assessments. Use when asked to prep for investor meetings, fundraising calls, VC meetings, or demo day.
4source: orthogonal
5---
6 
7 
8# Investor Call Prep
9 
10## Setup
11 
12Read your credentials from ~/.gooseworks/credentials.json:
13```bash
14export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
15export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")
16```
17 
18If ~/.gooseworks/credentials.json does not exist, tell the user to run: `npx gooseworks login`
19 
20All endpoints use Bearer auth: `-H "Authorization: Bearer $GOOSEWORKS_API_KEY"`
21 
22 
23Pull investor meetings from Google Calendar, deep-research each firm (scrape their website, analyze portfolio, extract thesis), and output an honest prep sheet that says which investors are a real fit and which aren't.
24 
25**Read-only calendar access. Never creates, modifies, or deletes events.**
26 
27## Input
28 
29- **domain** (required) — user's company website (provided in the prompt, e.g. "prep my investor calls for orthogonal.com")
30- **competitors** (optional) — auto-detected if not provided
31 
32Always export to Google Sheets at the end — it's free and takes seconds.
33 
34## Step 1: Pull Investor Meetings
35 
36Pull from today through Demo Day (March 24, 2026). All W26 companies are fundraising now through Demo Day. Make multiple calls if needed to avoid truncation — e.g. split into week 1 and week 2.
37 
38```bash
39# Adjust timeMin to today's date
40curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
41 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
42 -H "Content-Type: application/json" \
43 -d '{"api":"google-calendar","path":"/list-events"}'
44 "calendarId": "primary",
45 "timeMin": "{today}T00:00:00Z",
46 "timeMax": "{midpoint}T23:59:59Z",
47 "maxResults": 100,
48 "singleEvents": true,
49 "orderBy": "startTime"
50}'
51 
52curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
53 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
54 -H "Content-Type: application/json" \
55 -d '{"api":"google-calendar","path":"/list-events"}'
56 "calendarId": "primary",
57 "timeMin": "{midpoint+1}T00:00:00Z",
58 "timeMax": "2026-03-24T23:59:59Z",
59 "maxResults": 100,
60 "singleEvents": true,
61 "orderBy": "startTime"
62}'
63```
64 
65### Filtering — be precise, not greedy
66 
67The keyword approach catches false positives (personal meetings, mock pitches, etc.). Use this priority order:
68 
691. **Strong signal (auto-include):** Title starts with "Investors between" — this is the standard Cal.com booking format for investor meetings.
702. **Medium signal (auto-include):** Attendee email domain is a known VC domain (e.g. `@moonfire.com`, `@a16z.com`, `@accel.com`) OR the event description contains VC firm names.
713. **Weak signal (requires confirmation):** Title contains keywords like `invest`, `vc`, `fund`, `capital`, `ventures`, `angel`, `seed`, `series` — BUT does NOT match pattern #1. These need manual review.
724. **Exclude:** Events with "mock" or "practice" in title/description (these are rehearsals, not real meetings). Also exclude batch/group events with no attendees (e.g. "Fundraising Open Mic", "Demo Day") — these are YC events, not 1:1 investor calls.
73 
74Extract: title, date/time, attendee emails (non-company = investor contacts), description (often has investor names/emails even when attendee list doesn't).
75 
76**Present filtered list to user for confirmation before proceeding.**
77 
78### Create the Google Sheet immediately after confirmation
79 
80Before starting any research, create the spreadsheet and populate it with all confirmed investor rows (date/time, firm name, investor name, firm website — leave research columns blank). Share the link with the user so they can watch results fill in live as each investor is researched. This is much better UX than waiting for all research to complete.
81 
82## Step 2: Research the User's Company
83 
84**Ask the user to describe their company in 1-2 sentences** rather than relying on Perplexity, which often confuses companies with similar names (e.g. orthogonal.com vs orthogonal.io). The user's own description is always more accurate than a web search for early-stage startups.
85 
86Then auto-detect competitors:
87 
88```bash
89# Auto-detect competitors (skip if user provided)
90curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
91 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
92 -H "Content-Type: application/json" \
93 -d '{"api":"perplexity","path":"/chat/completions"}'
94 "model": "sonar",
95 "messages": [{"role": "user", "content": "Top 5-10 competitors of {company_name} ({domain})? {user_provided_description}. Company names and domains only."}]
96}'
97```
98 
99**Verify the competitor list with the user** before proceeding. Perplexity often returns enterprise incumbents (MuleSoft, Workato) rather than actual startup competitors. The user knows their competitive landscape better.
100 
101Save the company description and confirmed competitor list — use them for every investor assessment.
102 
103### Step 2b: Reverse-lookup competitor investors (one-time, cheap)
104 
105Instead of asking each investor "have you invested in X?" (unreliable), do a single reverse lookup for each competitor. This is 1 Perplexity call per competitor — not per investor.
106 
107```bash
108# Run one call per competitor (e.g. 5 competitors = 5 calls total)
109curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
110 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
111 -H "Content-Type: application/json" \
112 -d '{"api":"perplexity","path":"/chat/completions"}'
113 "model": "sonar",
114 "messages": [{"role": "user", "content": "Who are the investors in {competitor_name} ({competitor_domain})? List all known venture capital firms and angel investors who have invested in them, with round details if available."}]
115}'
116```
117 
118Build a lookup table: `{investor_firm -> [competitors they backed]}`. Cross-reference this against the meeting list. This catches conflicts that per-investor Perplexity queries miss, at a fraction of the cost.
119 
120## Step 3: Research Each Investor
121 
122Run ALL of these in parallel per investor. Every source adds unique data.
123 
124### 3a. Apollo — investor profile from email
125 
126```bash
127curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
128 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
129 -H "Content-Type: application/json" \
130 -d '{"api":"apollo","path":"/api/v1/people/match"}'
131 "email": "{investor_email}",
132 "reveal_personal_emails": true
133}'
134```
135 
136**No attendee email? Don't stop.** Parse firm name from event title, then:
137 
138```bash
139# Firm enrichment
140curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
141 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
142 -H "Content-Type: application/json" \
143 -d '{"api":"apollo","path":"/api/v1/organizations/enrich","query":{"domain":"{firm_domain}"}}'
144 
145# Find key people
146curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
147 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
148 -H "Content-Type: application/json" \
149 -d '{"api":"apollo","path":"/api/v1/mixed_people/search"}'
150 "q_organization_domains": "{firm_domain}",
151 "person_titles": ["Partner", "Principal", "Managing Director", "GP", "General Partner", "Investor"],
152 "page": 1,
153 "per_page": 10
154}'
155```
156 
157### 3b. Scrape the firm's website (most reliable source)
158 
159VC websites are the ground truth. Perplexity and Apollo often have gaps for smaller firms.
160 
161```bash
162# Main page — thesis, overview, portfolio
163curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
164 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
165 -H "Content-Type: application/json" \
166 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
167 "website_url": "https://{firm_website}",
168 "user_prompt": "Extract ALL information: investment thesis, fund size, check size, stage focus, sector focus, geographic focus, every portfolio company listed, team members with titles and LinkedIn URLs, contact info."
169}'
170 
171# Portfolio page (try /portfolio, /companies, /investments — skip on 404)
172curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
173 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
174 -H "Content-Type: application/json" \
175 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
176 "website_url": "https://{firm_website}/portfolio",
177 "user_prompt": "Extract every portfolio company: name, sector, funding stage, description, website URL."
178}'
179 
180# Team page (try /team, /people, /about — skip on 404)
181curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
182 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
183 -H "Content-Type: application/json" \
184 -d '{"api":"scrapegraph","path":"/v1/smartscraper"}'
185 "website_url": "https://{firm_website}/team",
186 "user_prompt": "Extract every team member: full name, title, LinkedIn URL, bio summary, background."
187}'
188```
189 
190### 3c. Perplexity — thesis, portfolio, competitor check
191 
192**Critical: use context-rich prompts.** Include location, GP names, aliases. "Tell me about e2vc" gets nothing. "Tell me about e2vc, formerly 500 Emerging Europe, based in Turkey" gets rich results.
193 
194```bash
195curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
196 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
197 -H "Content-Type: application/json" \
198 -d '{"api":"perplexity","path":"/chat/completions"}'
199 "model": "sonar",
200 "messages": [{"role": "user", "content": "Tell me about {firm_name}, a venture capital firm{location_context}{gp_context}{alias_context}. I am raising for {company_name}, {company_description}. Answer:
2011. Investment thesis and typical check size?
2022. Notable portfolio companies in {company_sectors}?
2033. Have they invested in any of these competitors: {competitor_list}?
2044. What stage?
2055. Recent investments or news?
2066. Key partners and backgrounds?
2077. Would {company_name} be a good fit for them? Why or why not?"}]
208}'
209```
210 
211 
212## Step 4: Classify Before Compiling
213 
214Before writing up the prep sheet, classify each meeting into one of these categories based on research:
215 
2161. **VC Fund** — traditional venture capital firm (GP, Partner, Principal, Associate)
2172. **Angel** — individual investor (current/former founder, operator, or executive investing personally)
2183. **NOT an investor** — flag prominently. This includes:
219 - Founders of other startups (potential BD/partnership, not fundraise)
220 - Researchers/academics with no investing track record
221 - Operators at companies (not investing personally)
222 - Mock pitch / practice sessions
223 
224For non-investors, still include them in the sheet but mark the Compatibility column as "NOT AN INVESTOR" and explain what the meeting likely is (BD, partnership, mock pitch, etc.). This prevents the user from wasting prep time on a fundraise pitch when the meeting is something else.
225 
226### Surface ecosystem investments, not just competitor conflicts
227 
228When an investor has portfolio companies that are **adjacent** to the user's space (not direct competitors but in the same ecosystem), surface these as **Ecosystem Signals** rather than ignoring them. These are actually positive — they show the investor understands the space.
229 
230Examples:
231- An investor backed CrewAI (AI agent framework) → they understand agents need API access → good hook for Orthogonal
232- An investor backed Arcade.dev (AI tooling) → adjacent, not a conflict → shows thesis alignment
233- An investor backed Langbase (AI agents) → ecosystem overlap → talking point
234 
235Only flag as **Competitor Conflict** if the portfolio company is a direct competitor (same product, same customer, same use case). Adjacent/ecosystem companies go in the Talking Points column as conversation hooks.
236 
237## Step 5: Compile Prep Sheet
238 
239Cross-reference all sources. When they conflict, prefer: **website > Apollo > Perplexity**.
240 
241### Output format per meeting:
242 
243```
244## {Firm Name} — {Date/Time}
245 
246**Investor:** {Name}, {Title}
247**LinkedIn:** {linkedin_url}
248**Firm:** {firm_name} | {firm_linkedin_url} | {firm_website}
249 
250**Thesis:** {specific, not generic}
251**Stage:** {seed, Series A, etc.} | **Check Size:** {range} | **Fund Size:** {if known}
252**Geographic Focus:** {regions}
253 
254**Portfolio ({count}):** {most relevant to user's space}
255**Competitor Conflicts:** {names} or None found
256 
257**Compatibility: {verdict}**
258{honest, company-specific assessment}
259 
260**Talking Points:**
2611. {angle from portfolio overlap}
2622. {angle from partner's background}
2633. {angle from thesis alignment}
264```
265 
266### Compatibility — Be Honest and Specific
267 
268Every rating must reference the user's specific company, product, and sector. Generic assessments are useless.
269 
270**Strong Fit** — Thesis covers user's sector AND stage. Adjacent portfolio companies (not competitors). Partner has relevant domain expertise.
271> "Strong fit — Revo invests in B2B SaaS + AI from Turkey/CEE at seed-Series A ($500K-$5M). Their marketplace portfolio companies are adjacent. Melis's M&A background means she gets platform economics."
272 
273**Moderate Fit** — Partial overlap. Be specific about what's missing.
274> "Moderate fit — right stage but portfolio leans fintech/industrial tech, no developer tools. You'll need to educate them on the API marketplace space."
275 
276**Weak Fit** — Wrong thesis, stage, geography, or has funded a competitor. Don't sugarcoat.
277> "Weak fit — consumer apps focus, Series B+ checks. No dev tools portfolio. May not be worth your limited pre-demo-day time."
278 
279**Competitor Conflict** — Flag prominently.
280> "They backed Composio — a direct competitor. Ask early whether this creates a conflict."
281 
282## Step 6: Google Sheets Export
283 
284The spreadsheet was already created in Step 1. Update each row as research completes — use `curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
285 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
286 -H "Content-Type: application/json" \
287 -d '{"api":"google-sheets","path":"/update-values`"}'
288 
289**Important:** Always use `curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
290 -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
291 -H "Content-Type: application/json" \
292 -d '{"api":"google-sheets`","path":"for"}'
293 
294## Tips
295 
296- **Parallelize everything**: Apollo, Scrapegraph, Perplexity, Fiber are independent — run all in parallel per investor, and process investors simultaneously.
297- **Website > all other sources**: Firm websites are ground truth. Always scrape.
298- **No email? Parse the firm name** from the event title → derive domain → Apollo org enrich + people search + website scrape.
299- **Context in Perplexity prompts**: Include location, GP names, "formerly known as" — massively improves results for smaller firms.
300- **Be brutal on fit**: User has limited time. Say which meetings to prioritize and which to skip.
301- **Firm domain from email**: `[email protected]` → domain is `somefirm.com`.
302- **Multiple attendees**: Run Apollo on each. Most senior person = decision-maker.
303 

Discussion

Alternatives

Also in Competitor research
Competitor Comparison & Alternatives PagesTell us your product and a rival you keep losing deals to, and get back a ready-to-publish page that shows why customers should pick you.Business & ops · MITAd angle minerMine the highest-converting ad angles from customer reviews, Reddit complaints, support tickets, and competitor ads. Extracts actual pain language, competitor weaknesses, and outcome phrases that real buyers use. Outputs a ranked angle bank with proof quotes and recommended ad formats per angle.Business & ops · MITX audience insightsRead your X (Twitter) audience and niche from real data. Pull a handle's recent tweets (yours or a competitor's) with likes, replies, and views, see which formats and hooks are working, read the repliers on a tweet (X gates likers, so repliers are the signal), and scan a niche query for top tweets. Powered by Apify, no login. Triggers on "analyze my tweets", "what is working on X", "read the replies", "competitor tweets", "who is engaging". Not for writing a tweet (use x-post-writer).Marketing · MITFacebook Audience InsightsRead a Facebook Page and its audience from real data. Pull any Page's public stats (yours or a competitor's): followers, likes, categories, intro, websites. And pull the commenters on a public Page post, since Facebook hides the reactor and liker roster and shows counts only, so commenters are the signal. Powered by Apify, no login. Triggers on "analyze my Page", "competitor Page stats", "who is commenting", "read the comments", "audience insights". Not for writing Page posts (use fb-post-writer).Marketing · MIT