Skip to Content
CoursesResearch & Web Scraping09 Research at scale

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 rowsAt 5,000 rows
You read every outputYou read a sample, or nothing
Cost is negligibleCost is the constraint
A 20% error rate is visibleA 20% error rate is invisible
One run, one afternoonScheduled, 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:

DesignCost
Deep research on everything5,000 × 3 = 15,000 credits
Tiered: 5,000 cheap + 1,200 mid + 150 deep2,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 only

Each 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.

CheckHowFrequency
Value-set driftCount distinct values in each verdict columnEvery run
Unknown ratePercentage per column, compared to last runEvery run
Accuracy20 random rows verified by handEvery fifth run, and after any prompt change
Empty ratePercentage of blank outputsEvery 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

  1. Write the row count entering each tier, not just the total.
  2. Multiply by cost per row per tier.
  3. Add 20% headroom for retries and misses.
  4. Check the balance with check_credits before starting.
  5. 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 wantCourse
Research turned into outbound copyAutomated Outbound
Agentic builds on top of researchAI-Powered GTM
To run research by chatAI for Sales Reps
Research as a recurring triggerSignals & ABM

Reference for this lesson: Credits, check_credits, AI agents, Web scrapers.