Research at Scale and What It Costs
Outcome: a tiered research design that keeps a 5,000-row run inside budget, with a sampling routine that catches quality drift you can no longer catch by reading.
- Surface
- Sync GTM app and MCP server
- Level
- Beginner
- Uses
- check_credits · everything from lessons 02–08
- Credits
- 0 for planning
- Prerequisite
- Lessons 02–08
What actually changes at scale
Not the technique. Three other things.
| At 50 rows | At 5,000 rows |
|---|---|
| You read every output | You read a sample, or nothing |
| Cost is negligible | Cost is the constraint |
| A 20% error rate is visible | A 20% error rate is invisible |
| One run, one afternoon | Scheduled, repeated, compounding |
So the discipline shifts from “write a good prompt” to “design a run that stays cheap and stays honest”.
Tier the research
The core move: not every row deserves the same research spend.
Tier 3 — everything
Cheap, deterministic, runs on all rows. Firmographic enrichment, one scrape of a predictable page. Fractions of a credit each.
Tier 2 — qualified rows
One constrained research agent question, on rows that passed the cheap gate. About 1 credit each.
Tier 1 — top-scored rows
Multi-source work: the competitor-teardown chain from lesson 08, deep account research, several agent calls. Several credits each, and only for accounts where a person will actually do something with the output.
A worked comparison on 5,000 rows:
| Design | Cost |
|---|---|
| Deep research on everything | 5,000 × 3 = 15,000 credits |
| Tiered: 5,000 cheap + 1,200 mid + 150 deep | 2,500 + 1,200 + 450 = 4,150 credits |
Same accounts reached, 72% less spend, and the deep research now happens on the rows that warranted it.
Cheap questions first
Order research questions by cost, filtering between them.
1. Is the domain live? free-ish, drops the dead rows
2. Is there a pricing page? cheap scrape, drops a segment
3. B2B or B2C? one agent call, drops the wrong model
4. Which segment do they target? one agent call, on survivors only
5. Full teardown many calls, top rows onlyEach step shrinks the input to the next. Reversing the order — deep first, filter after — is the single most expensive mistake available in this course.
Cache at company level
Person-grain tables repeat companies. Three contacts at one company means three rows, and research about the company should run once, not three times.
- Run company research on the company table.
- Join it to the person table on the domain.
- Never put a company-level agent column on a person-grain table.
On a list averaging three contacts per account, this alone cuts company research cost by two thirds.
This is the most common scale mistake and it is invisible in the output — the data is correct, you just paid three times for it. Check any agent column on a person table and ask what its input actually is. If it is the domain, it belongs on the other table.
Sampling for quality
At 5,000 rows nobody reads the output, so quality drift goes unnoticed. Replace reading with sampling.
| Check | How | Frequency |
|---|---|---|
| Value-set drift | Count distinct values in each verdict column | Every run |
| Unknown rate | Percentage per column, compared to last run | Every run |
| Accuracy | 20 random rows verified by hand | Every fifth run, and after any prompt change |
| Empty rate | Percentage of blank outputs | Every run |
A jump in unknown rate or a new distinct value is the earliest warning that something upstream changed — a scraper option, a site redesign, a shift in your source list.
Budgeting a run
- Write the row count entering each tier, not just the total.
- Multiply by cost per row per tier.
- Add 20% headroom for retries and misses.
- Check the balance with
check_creditsbefore starting. - For scheduled runs, confirm the balance covers several cycles, not one.
If the number is uncomfortable, the fix is almost always an earlier filter — not a cheaper model.
Do this now
Assign tiers
Every research column gets a tier. Write the row count for each.
Reorder by cost
Cheapest question first, filter between each.
Move company research to the company table
Then join. Check nothing company-level remains on the person table.
Build the sampling checks
Distinct values, unknown rate, empty rate — as formula columns so they compute automatically.
Budget the run
Per tier, plus headroom.
Run and compare
Actual against estimate. A large gap means a hit rate assumption was wrong; find which.
Schedule the accuracy check
20 rows by hand, every fifth run.
Check your work
- Every research column has a tier and a row count
- Questions run cheapest first with filters between
- No company-level research runs on a person-grain table
- Sampling columns compute automatically each run
- You have a per-tier budget and an actual to compare it against
Where this breaks
Quality degradation at scale is silent by construction. A prompt that was 92% accurate on your test segment can be 60% accurate on a new one — different sites, different conventions, different language — and nothing in the output will say so. Re-validate against 20 labelled rows whenever the data changes, not only when the prompt does. New segment, new validation.
Course complete
You can now decide between a scraper and an agent, extract facts from pages, write prompts that return usable values, structure output into fields that feed a score, run a five-source competitive brief, and keep all of it affordable at volume.
Where to go next:
| You want | Course |
|---|---|
| Research turned into outbound copy | Automated Outbound |
| Agentic builds on top of research | AI-Powered GTM |
| To run research by chat | AI for Sales Reps |
| Research as a recurring trigger | Signals & ABM |
Reference for this lesson: Credits, check_credits, AI agents, Web scrapers.