{"data":{"slug":"prospect-research-with-ai-assistant","title":"Research ~500 target accounts a month with an AI assistant and Google Sheets","summary":"Replace the account-research columns you'd build in Clay with batched, cited web research in Claude or ChatGPT, a strict JSON output schema, a scoring rubric and a 10% hallucination spot-check. It does not replace verified contact data — you still need Apollo, ZoomInfo or similar for emails and phones.","outcome":"Each month, turn a list of ~500 target companies into a qualified, cited, de-duplicated account list with a fit score and a personalisation angle for the best ones.","capabilities":["prospect-research","web-research","ai-chat-assistant","database-spreadsheet"],"replaces":[{"tool":"clay","scope":"partial"}],"requiredTools":[{"tool":"claude","purpose":"Web search / Research mode with citations to research each batch and return JSON.","optional":true},{"tool":"chatgpt","purpose":"Alternative: web search or deep research with citations to research each batch.","optional":true},{"tool":"google-workspace","purpose":"Google Sheets as the master account list, de-dup formulas and QA log.","optional":false},{"tool":"apollo","purpose":"Verified business emails/phones for Tier A accounts only. Any licensed contact-data provider works (ZoomInfo, etc.).","optional":true}],"additionalMonthlyUSD":0,"difficulty":"moderate","skill":"basic","setupTime":"2–3 hours (rubric, prompt tuning on 2 test batches, sheet setup)","illustrative":true,"evidenceStatus":"editorial","lastReviewed":"2026-10-13","links":{"page":"/workflows/prospect-research-with-ai-assistant","api":"/api/v1/workflows/prospect-research-with-ai-assistant","markdown":"/workflows/prospect-research-with-ai-assistant.md"},"additionalCost":{"monthlyUSD":0,"explanation":"$0 extra if you already pay for Claude or ChatGPT with web search and already have a contact-data source. Usage limits on research features vary by plan, so heavy months may hit caps. Contact data is NOT included: if Clay was also your email-finding tool, budget for a contact-data provider separately."},"timePerRun":"15–30 minutes per batch of 10–25 companies including QA; ~25–50 batches for 500 accounts (roughly 8–20 hours a month)","goodFitFor":["Founders, SDRs and small sales teams researching tens to a few hundred accounts per week","Account-based outreach where a cited 'why now' matters more than list size","Teams that used Clay mainly for AI research and scoring columns, not for waterfall contact enrichment","Anyone who can spend a few hours a week on batched research and spot-checks"],"notFitFor":["Teams that need verified emails, mobile numbers or firmographics at scale — that's a contact-data product, not an AI assistant","Thousands of accounts per month or fully automated enrichment on a trigger — manual batching doesn't scale; consider an API pipeline or keep Clay","Workflows that depend on scraping LinkedIn or other sites whose terms forbid automated collection","Anyone not willing to spot-check sources — unchecked AI research will contain fabricated or misattributed facts"],"before":"A Clay workbook imports a company list, runs enrichment and AI research columns per row (company summary, recent news, hiring signals, a scoring formula, an AI-written first line) and pushes results to a CRM or sequencer. It's fast and automated but billed in credits/actions, and the bill grows with every column and re-run.","after":"A Google Sheet holds the master list. Each working session you paste 10–25 new, de-duplicated companies into a saved research prompt in Claude or ChatGPT with web search on. The assistant returns strict JSON (one object per company, every claim with a source URL), which you paste into the sheet. Formulas flag duplicates and score totals; you open the sources for 10% of rows (and every Tier A) before trusting the batch. Only Tier A accounts go to Apollo/ZoomInfo for verified contacts.","steps":[{"title":"Write your rubric before you research anything","body":"Copy the **Qualification rubric** artifact and replace the bracketed descriptions with your real ICP: core industries, employee sweet spot, the signals that actually predicted past wins.\n\nTest it on **10 past customers and 10 lost deals**. If the rubric doesn't rank most past customers above the losses, fix the rubric now — no prompt will rescue a vague ICP.\n\nKeep `reachability` partly human: warm paths come from *your* CRM and network, not from the AI."},{"title":"Set up the master sheet","body":"Create a Google Sheet with tabs **Input**, **Accounts**, **Manual**, **QA**.\n\n- **Input:** `Company name | Domain | Normalised domain | Already researched?` with the formulas from the *De-duplication and QA* artifact.\n- **Accounts:** one column per field in the JSON schema, plus `Batch ID`, `Researched on`, `QA result`, `Owner`, `Status`.\n- Use **Data → Data validation** dropdowns for `tier` and `Status` (`New / Checked / Contacted / Disqualified`).\n\nTo paste JSON into columns, ask the assistant to also output the batch as **TSV** in a second code block (the batch prompt below does this), then paste into the first empty row of Accounts."},{"title":"Run research in batches of 10–25","body":"In Claude (turn on **web search**, or use **Research** on Pro/Max/Team/Enterprise) or ChatGPT (web search or **deep research**), paste the **Batch account research** prompt with 10–25 companies.\n\nWhy small batches:\n- Quality drops and the model starts skipping or merging companies in long lists.\n- Research modes consume plan limits faster; Anthropic notes Research uses the same limits as normal chats but can use them up faster.\n- A bad batch of 20 is cheap to re-run; a bad batch of 200 isn't.\n\n**Throughput reality:** 500 accounts ≈ 25 batches of 20. At 15–30 minutes per batch including QA, budget **8–20 hours a month**. Save the prompt in a Claude Project or ChatGPT Project/custom GPT so every batch uses identical instructions."},{"title":"Validate structure, de-duplicate, then spot-check sources","body":"Follow the *De-duplication and QA* artifact for every batch:\n\n1. **Structure:** row count in = out; `fit_total` = sum of scores; every row has ≥1 source; no emails/phones.\n2. **Identity:** if `resolved_domain` ≠ input domain, the model may have researched a namesake — move to **Manual**.\n3. **Spot-check 10%** (minimum 3 rows, plus *every* Tier A): open each source URL and confirm the claim is on the page and the date matches. Log PASS/FAIL in **QA**.\n4. If more than 1 in 10 fails, re-run the batch through the **Verify claims** prompt or redo it — don't fix rows by hand and trust the rest.\n\nThe rule *“no URL, no claim”* is what makes this usable: an uncited signal is capped at 1 point by the rubric."},{"title":"Get contact data the compliant way — only for Tier A","body":"An AI assistant **does not provide verified contact data**. Emails it 'finds' are often guessed patterns. For Tier A accounts only:\n\n- Look up the buyer in **Apollo, ZoomInfo or another licensed provider**, or use contact details the company publishes for business enquiries.\n- **Do not scrape LinkedIn.** LinkedIn's User Agreement (section 8.2) prohibits scraping or copying profiles and using bots or unauthorised automated methods. Read profiles manually if you must; don't automate it.\n- **GDPR (EU/UK contacts):** document your lawful basis (usually legitimate interests) and give the Article 14 notice — who you are, why you have their data, where it came from, their rights — **at first contact** at the latest.\n- **CAN-SPAM (US):** applies to B2B email too. Accurate headers and subject, a postal address, a clear opt-out honoured within 10 business days. Other countries (e.g. Canada's CASL) can be stricter — check where your recipients are."},{"title":"Write openers from cited signals and close the loop","body":"Use the **Personalisation from cited signals** prompt on Tier A rows only. It must quote the signal and URL it used, so you can check it in seconds.\n\nAfter a month, compare reply and meeting rates by tier. If Tier B converts like Tier A, your rubric is too strict; if Tier A doesn't convert, re-weight `need_signal` and `timing`. Then decide what to cancel: if you only used Clay's research columns, downgrade it; if you also relied on its contact waterfall, keep or replace that part with a contact-data subscription."}],"prompts":[{"title":"Batch account research (strict JSON)","purpose":"Research 10–25 companies with citations and score them against your rubric.","text":"You are a B2B research analyst. Use web search. Research each company below for a seller of {{our_offer}} whose ideal customer is: {{icp_description}}.\n\nCompanies (name, domain):\n{{company_list}}\n\nScoring rubric (score each 0–3):\n{{rubric}}\n\nRules:\n1. Every factual claim must come from a page you actually opened. Put its URL in source_url / sources. If you cannot find a source, write \"unknown\" and add the gap to `unknowns`. Never guess employee counts, funding or dates.\n2. Prefer the company's own site, press releases, job boards and reputable news from the last 12 months. Today is {{today}}; ignore signals older than 18 months.\n3. If a name is ambiguous, research the company at the given domain; set match_confidence accordingly. If you can't confirm it's the same company, use \"low\" or \"not_found\" and don't score it.\n4. Do NOT output personal email addresses, phone numbers or home locations. Do not use LinkedIn content obtained by scraping.\n5. reachability: score only 2 (buyer role publicly identifiable) or 1 (unclear); I'll add warm paths myself.\n6. fit_total must equal the sum of fit_scores. Tier: A 11–15 with need_signal ≥2; B 7–10; C 3–6; otherwise disqualified with a reason.\n\nOutput exactly two code blocks and nothing else:\n(a) a JSON array that validates against this schema:\n{{json_schema}}\n(b) the same rows as TSV with a header row, columns in schema order, signals flattened as \"type: claim (date) URL\" joined by \" | \".\nReturn one object per input company, in input order, even if not found.","variables":["our_offer","icp_description","company_list","rubric","today","json_schema"]},{"title":"Verify claims (second pass)","purpose":"Have the assistant re-check a batch whose spot-check failed, claim by claim.","text":"Act as a fact-checker. For each row in the JSON below, open every source_url and check whether the page explicitly supports the claim, for the right company and date.\n\n{{batch_json}}\n\nReturn a table with columns: input_name | claim | source_url | verdict (SUPPORTED / NOT FOUND ON PAGE / WRONG COMPANY / WRONG DATE / PAGE UNAVAILABLE) | corrected claim with new URL, or \"remove\".\nThen return the corrected JSON array with unsupported claims removed, fit_scores lowered where a removed claim was the basis (cap uncited criteria at 1), fit_total and tier recomputed. Do not add new claims without a URL.","variables":["batch_json"]},{"title":"Personalisation from cited signals","purpose":"Draft a first line for Tier A accounts that a human can verify in seconds.","text":"Write a first line for a cold email from {{sender_name}} at {{our_company}} to the {{buyer_role}} at {{company_name}}.\n\nUse ONLY these cited signals:\n{{signals_with_urls}}\n\nOur relevant proof point: {{proof_point}}\n\nRules: max 30 words; reference exactly one signal factually (no flattery, no 'I noticed', no invented details); no claims about the person. Give 3 options, and under each write the signal and URL it relies on.","variables":["sender_name","our_company","buyer_role","company_name","signals_with_urls","proof_point"]}],"artifacts":[{"title":"JSON output schema for a research batch","kind":"schema","language":"json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"title\": \"AccountResearchBatch\",\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"required\": [\"input_name\", \"input_domain\", \"resolved_domain\", \"match_confidence\",\n                 \"what_they_do\", \"industry\", \"hq_country\", \"employee_range\",\n                 \"signals\", \"fit_scores\", \"fit_total\", \"tier\", \"personalization_hook\",\n                 \"unknowns\", \"sources\"],\n    \"properties\": {\n      \"input_name\":       { \"type\": \"string\", \"description\": \"Exactly as given in the input list\" },\n      \"input_domain\":     { \"type\": \"string\" },\n      \"resolved_domain\":  { \"type\": \"string\", \"description\": \"Domain of the company actually researched. Empty if not found.\" },\n      \"match_confidence\": { \"enum\": [\"high\", \"medium\", \"low\", \"not_found\"] },\n      \"what_they_do\":     { \"type\": \"string\", \"maxLength\": 300, \"description\": \"One or two plain sentences\" },\n      \"industry\":         { \"type\": \"string\" },\n      \"hq_country\":       { \"type\": \"string\", \"description\": \"ISO country name or 'unknown'\" },\n      \"employee_range\":   { \"enum\": [\"1-10\", \"11-50\", \"51-200\", \"201-500\", \"501-1000\", \"1001-5000\", \"5000+\", \"unknown\"] },\n      \"signals\": {\n        \"type\": \"array\", \"maxItems\": 5,\n        \"items\": {\n          \"type\": \"object\", \"additionalProperties\": false,\n          \"required\": [\"type\", \"claim\", \"date\", \"source_url\"],\n          \"properties\": {\n            \"type\":       { \"enum\": [\"hiring\", \"funding\", \"leadership_change\", \"product_launch\", \"expansion\", \"tech_stack\", \"partnership\", \"other\"] },\n            \"claim\":      { \"type\": \"string\", \"maxLength\": 200 },\n            \"date\":       { \"type\": \"string\", \"description\": \"YYYY-MM or YYYY-MM-DD; 'unknown' if not stated\" },\n            \"source_url\": { \"type\": \"string\", \"format\": \"uri\" }\n          }\n        }\n      },\n      \"fit_scores\": {\n        \"type\": \"object\", \"additionalProperties\": false,\n        \"required\": [\"icp_industry\", \"size\", \"need_signal\", \"timing\", \"reachability\"],\n        \"properties\": {\n          \"icp_industry\": { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 3 },\n          \"size\":         { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 3 },\n          \"need_signal\":  { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 3 },\n          \"timing\":       { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 3 },\n          \"reachability\": { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 3 }\n        }\n      },\n      \"fit_total\":   { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 15 },\n      \"tier\":        { \"enum\": [\"A\", \"B\", \"C\", \"disqualified\"] },\n      \"disqualify_reason\": { \"type\": \"string\" },\n      \"personalization_hook\": { \"type\": \"string\", \"maxLength\": 240, \"description\": \"Must reference one of the cited signals\" },\n      \"unknowns\":    { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n      \"sources\":     { \"type\": \"array\", \"minItems\": 1, \"items\": { \"type\": \"string\", \"format\": \"uri\" } }\n    }\n  }\n}\n\nNOTE: this schema intentionally has NO fields for personal email addresses or phone numbers.\nVerified contact data comes from a contact-data provider, not from an AI assistant."},{"title":"Qualification rubric (0–15)","kind":"template","content":"QUALIFICATION RUBRIC — edit the descriptions to match YOUR ideal customer profile (ICP).\nScore each criterion 0–3. Total 0–15. The AI proposes scores; a human confirms Tier A.\n\n1. icp_industry\n   3 = core target industry ([your core industries])\n   2 = adjacent industry we have won before\n   1 = plausible but no references\n   0 = outside our market → disqualified\n\n2. size  (employees, from the company's own site or a cited source)\n   3 = inside our sweet spot (e.g. 51–500)\n   2 = just outside (e.g. 20–50 or 501–1,000)\n   1 = far outside but has a relevant division\n   0 = unknown after research (do NOT guess)\n\n3. need_signal  (evidence they have the problem we solve)\n   3 = explicit, dated, cited signal in the last 6 months (job post for the role we replace, public complaint, initiative announced)\n   2 = indirect signal (growth, new market, tech stack that implies the need)\n   1 = generic fit only\n   0 = signal suggests they've already solved it (e.g. announced a competitor)\n\n4. timing\n   3 = trigger event in the last 90 days (funding, new leader in the buyer role, expansion)\n   2 = trigger event 3–12 months ago\n   1 = none found\n   0 = known freeze (layoffs, acquisition pending) — note it\n\n5. reachability\n   3 = we have a warm path (customer, investor, partner in common) — fill from YOUR records, not the AI\n   2 = clear buyer role exists and is publicly identifiable\n   1 = buyer role unclear\n   0 = no way in found\n\nTIERS\n   A = 11–15 and need_signal ≥ 2 → human review, then contact-data lookup, then personal outreach\n   B = 7–10 → nurture list / lighter-touch sequence\n   C = 3–6 → park; re-check in 6 months\n   disqualified = icp_industry 0, or a hard exclusion (existing customer, competitor, sanctioned country, under legal minimum size)\n\nRULE: any score based on a claim without a source URL is capped at 1."},{"title":"De-duplication and QA checklist with Sheets formulas","kind":"checklist","content":"DE-DUPLICATION AND QA — run on every batch before it enters the master sheet\n\nA. De-duplicate (Google Sheets, master tab \"Accounts\")\n   1. Normalise the domain in a helper column (assume raw domain/URL in column B):\n      =LOWER(REGEXREPLACE(REGEXREPLACE(TRIM(B2),\"^(https?://)?(www\\.)?\",\"\"),\"[/?#].*$\",\"\"))\n   2. Flag duplicates against everything already researched:\n      =IF(COUNTIF($C$2:$C, C2)>1, \"DUPLICATE\", \"\")\n   3. Before each run, remove input rows whose normalised domain already exists in Accounts\n      (=ISNUMBER(MATCH(C2, Accounts!C:C, 0)) on the input tab). This avoids paying for the same research twice.\n   4. Also check resolved_domain vs input_domain: if they differ, the AI may have researched a\n      different company with a similar name → set status \"CHECK MATCH\".\n\nB. Structural checks (instant, every row)\n   [ ] JSON parsed without edits (if not, re-run the batch; do not hand-fix silently)\n   [ ] Row count out = row count in\n   [ ] fit_total equals the sum of fit_scores\n   [ ] Every signal has a source_url; every row has ≥1 source\n   [ ] No email addresses or phone numbers anywhere in the output (search for \"@\" and digit runs) — delete if present\n   [ ] match_confidence \"low\"/\"not_found\" rows are moved to a Manual tab, not scored\n\nC. Hallucination spot-check (10% of rows, minimum 3 per batch, ALWAYS include every Tier A)\n   For each sampled row, open every source URL and confirm:\n   [ ] The page loads and is about this company (not a namesake)\n   [ ] The claim is actually stated on the page (not inferred)\n   [ ] The date matches\n   Record result in a \"QA\" column: PASS / FAIL + note.\n   If >1 of 10 sampled rows FAIL → re-run the whole batch with the verification prompt; don't trust the rest.\n\nD. Compliance gate before any outreach\n   [ ] Contact details came from a licensed provider or the person's own published business contact page — not scraped from LinkedIn\n   [ ] EU/UK contacts: lawful basis (usually legitimate interests) documented; GDPR Art. 14 notice given at first contact\n   [ ] US commercial email: CAN-SPAM basics in the template (accurate From/subject, postal address, working opt-out honoured within 10 business days)\n   [ ] Suppression list (unsubscribes, existing customers, competitors) applied"}],"limitations":["No verified contact data: AI assistants don't maintain a B2B contact database. Emails they produce are often guessed patterns; use a licensed contact-data provider.","Manual batching: 10–25 companies per run. 500 accounts a month is 25–50 runs and roughly 8–20 hours of human time, versus near-zero in an automated Clay table.","Research quality depends on what's public. Private companies, small firms and non-English markets return many 'unknown' fields.","AI research makes mistakes: namesake companies, outdated news presented as current and claims not actually on the cited page. The 10% spot-check reduces but doesn't eliminate this.","Research features have plan-based usage limits that can change; a heavy month can hit them.","No native CRM/sequencer push — results move by copy/paste or CSV import."],"risks":[{"type":"reliability","severity":"high","note":"Hallucinated or misattributed facts can end up in outreach and damage credibility. Mitigation: no URL, no claim; spot-check 10% plus every Tier A; re-run failing batches."},{"type":"compliance","severity":"high","note":"Outreach to people still triggers GDPR (EU/UK: lawful basis, Article 14 notice by first contact) and CAN-SPAM (US: applies to B2B; FTC lists penalties of up to $53,088 per violating email). Using the AI doesn't change who is the data controller — you are."},{"type":"compliance","severity":"medium","note":"Scraping LinkedIn (directly or by asking an agent to) breaches LinkedIn's User Agreement section 8.2 and can get accounts restricted. Keep research to public web pages and licensed data."},{"type":"sensitive_data","severity":"low","note":"Company lists and ICP notes are commercially sensitive. Use a business/team plan or check your consumer plan's training settings before pasting customer or pipeline data."},{"type":"functionality_loss","severity":"medium","note":"You lose Clay's automation: scheduled refreshes, enrichment waterfalls across providers and pushes to CRM/sequencers."}],"verificationChecklist":["The rubric ranks at least 7 of 10 known past customers above at least 7 of 10 known lost/unfit deals in a back-test.","Two full test batches (≥40 companies) came back as valid JSON with one row per input, in order, with no emails or phone numbers.","Spot-check of those batches: at least 90% of sampled claims are SUPPORTED when you open the source URL; every Tier A row passed a full source check.","Side-by-side on 25 accounts: the AI's tiering agrees with your existing Clay scoring (or a human's judgement) on at least 20.","The de-dup formula catches a deliberately re-pasted batch (all rows flagged DUPLICATE) and normalises 'https://www.example.com/about' to 'example.com'.","Contact data for Tier A accounts is coming from a licensed provider or published business contacts, and your outreach template includes the CAN-SPAM elements and (for EU/UK) an Article 14 notice.","You timed a real month's workload (or a week × 4) and the hours are acceptable versus what you pay for Clay."],"savingsMethodology":"Savings = Clay subscription you can drop or downgrade − any extra spend (normally $0 if you already pay for Claude/ChatGPT with web search). Contact-data costs are excluded on both sides: if Clay was also your email finder, you need a contact-data subscription either way, so subtract that from the savings. Labour is the hidden cost: at 15–30 minutes per 10–25 companies, 500 accounts is roughly 8–20 hours a month — price your time before deciding.","example":{"scenario":"A two-person outbound team that used a Clay Launch plan mainly for research and scoring columns on ~500 accounts a month.","currentMonthlyUSD":167,"newMonthlyUSD":0,"assumptions":["ILLUSTRATIVE: Clay's pricing page on 2026-10-13 showed $167/month as the Launch headline price but also lower 'starts at' prices and different figures in its FAQ, so we treat $167 as an example, not a verified price. Use your own invoice.","They already pay for Claude or ChatGPT with web search; no new subscription.","Contact data comes from an Apollo/ZoomInfo seat they already have; that cost is unchanged and excluded.","8–20 hours a month of research and QA time is not converted to dollars."]},"evidence":{"status":"editorial","sources":[{"url":"https://www.clay.com/pricing","title":"Clay pricing","accessedAt":"2026-10-13","note":"Free plan exists; Launch shown at $167/mo headline with other 'starts at' figures and different FAQ figures — inconsistent, so treated as illustrative."},{"url":"https://support.claude.com/en/articles/11088861-using-research-on-claude","title":"Using Research on Claude","accessedAt":"2026-10-13","note":"Research available on Pro, Max, Team and Enterprise; requires web search; provides citations; uses the same limits as normal chats but can use them faster."},{"url":"https://www.linkedin.com/legal/user-agreement","title":"LinkedIn User Agreement","accessedAt":"2026-10-13","note":"Section 8.2 prohibits scraping/copying profiles and using bots or unauthorised automated methods."},{"url":"https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business","title":"FTC CAN-SPAM Act compliance guide","accessedAt":"2026-10-13","note":"No exception for B2B email; postal address; opt-out honoured within 10 business days; penalties up to $53,088 per email."},{"url":"https://gdpr-info.eu/art-14-gdpr/","title":"GDPR Article 14","accessedAt":"2026-10-13","note":"Information to provide when data not obtained from the data subject; at the latest at first communication or within one month."},{"url":"https://help.openai.com/en/articles/10500283-deep-research-faq","title":"ChatGPT deep research FAQ","accessedAt":"2026-10-13","note":"Returned HTTP 403 to our fetch; plan limits for ChatGPT deep research not verified."}],"verifiedBy":"agent:claude-research","notes":"Throughput and time estimates are editorial estimates from batch sizes, not measurements. ChatGPT deep-research plan limits could not be verified on OpenAI's site today. Not legal advice."}},"meta":{"apiVersion":"v1","dataVersion":"4f1b9f55d2a1","dataGeneratedAt":"2026-10-13T14:29:58.201Z","docs":"/docs/api","evidenceLegend":"/docs/data-model#evidence","disclaimer":"Prices and capabilities change. Check each item's evidence status and verification date. Savings are estimates, not guarantees."}}