Module 08 · Scrape, local and chaining
Outcome: the last three tools covered, four chains you can run today, and one rule that decides the order every step goes in.
- Surface
- MCP server
- Level
- Beginner
- Uses
scrape_emails_from_websitescrape_phones_from_websitegoogle_maps_listings- Credits
- ~1.3 for the examples, ~33 for a full chain
- Prerequisite
- Modules 01–07
Tools in this module
| Tool | Cost | Required input | Returns |
|---|---|---|---|
scrape_emails_from_website | 0.5 | url | Published email addresses |
scrape_phones_from_website | 0.5 | url | Published phone numbers |
google_maps_listings | 0.3 | query | Business listings, optionally with reviews |
That is 50 of 50. The tools catalogue is the reference for all of them.
Example prompts
scrape_emails_from_website
The URL is reduced to the site root before crawling, so a deep link works fine.
Use scrape_emails_from_website with url "acmedental.com".
Return every address found, and tell me which are role addresses
(info@, sales@, hello@) and which look like named people.
Then verify_email on the named ones only.Scraped addresses are published, not enriched — expect info@ and contact@. Pair with verify_email at 0.3 before sending, and prefer named addresses when the site publishes them.
scrape_phones_from_website
Use scrape_phones_from_website with url "acmedental.com".
Return every number found with the page it appeared on.
Then validate_whatsapp on any mobile-format number.At 0.5 credits, this is the cheapest phone route on the server — module 03’s lookups are 12.
google_maps_listings
Use google_maps_listings with:
- query "dental clinics"
- location "Austin, TX"
- include_reviews true
- max_results 50
Return business name, website, phone, rating and review count.
Sort by review count.include_reviews scrapes each place detail page, so it is slower and richer. Leave it off when you only need names and websites.
Four chains worth saving
1 · Verified contact from a LinkedIn URL
For https://linkedin.com/in/janedoe:
1. linkedin_profile_enrich
2. find_work_email with organization_name from step 1
3. verify_email on the result — stop if undeliverable
Return: name, title, company, email, status. Report credits used.~2.3 credits.
2 · Account brief from a domain
For stripe.com:
1. enrich_linkedin_page with identifier "stripe.com"
2. find_company_techstack with domain "stripe.com"
3. find_company_website_traffic with domain "stripe.com"
4. company_product_launch with domain "stripe.com", details "last 12 months"
Return a 150-word brief plus one reason they would care about us.~3.5 credits.
3 · Warm list from a post
1. linkedin_post_commenters, post_url <url>, sort_order "Most recent"
2. Filter to VP/Head/Director titles at 51-500 employee companies.
Drop the rest before spending anything.
3. First 25 survivors: find_work_email, then verify_email.
Skip anyone with no result — do not guess.
Return a table with name, title, company, email, status.~33 credits for 25 verified contacts.
4 · Local list from Google Maps
1. google_maps_listings, query "dental clinics", location "Austin, TX",
max_results 50
2. For the 20 with the most reviews: scrape_emails_from_website on each website
3. verify_email on every named address found
Return: business, website, email, status, review count.~13 credits — 0.3 to source the 50, 10 to scrape 20 sites, the rest verification.
The ordering rule
Source
One search tool produces the rows. Cheap per row, and it decides everything downstream. A bad list cannot be rescued by good enrichment.
Filter
Free. It happens in the model’s context on data you already paid for. Every row cut here is a row you do not pay to enrich.
Enrich
find_work_email at 1, verify_email at 0.3, enrich_person at 1. The expensive steps, running last, on the shortest possible list.
Report
“Report credits used at the end.” A chain that quietly dropped half its rows looks identical to one that worked.
Chains that cost too much are almost always chains where step 3 ran before step 2.
Workflow prompts
The full shape: SyncGTM sources and verifies, another system stores or sends.
Local list straight into a Google Sheet
- source the businesses
- scrape their sites for contact details
- verify, then write the sheet
1. google_maps_listings — query "dental clinics", location "Austin, TX",
max_results 50. 0.3 credits for the search.
2. Drop any listing with no website. Rank the rest by review count.
3. For the top 20: scrape_emails_from_website and
scrape_phones_from_website — 1 credit per business.
4. Split addresses into named (first.last@) and role (info@, hello@).
verify_email on the named ones only.
5. Write to a new Google Sheet "Austin dental — <today>" with columns:
business, website, named email, status, role email, phone, rating,
reviews. Leave cells blank where nothing was published — do not guess.Fill the gaps a CRM import left behind
- find records with no contact route at all
- try the company website before anything paid
- write back only what verified
1. Pull Attio companies with no associated contact and no phone on record.
2. For each domain: scrape_emails_from_website, then
scrape_phones_from_website. 1 credit per company — confirm the total.
3. verify_email on any named address found. Skip role addresses.
4. Show me the diff table first: company, found email, status, found phone.
5. On my go-ahead, write the verified email and the phone to the Attio
company record. Do not overwrite anything already there.Enrich a conference exhibitor list overnight
- take the exhibitor page
- pull contactable details per exhibitor
- hand back one ranked list
1. Here are 60 exhibitor domains from <conference>.
2. scrape_emails_from_website on each — 30 credits total, confirm first.
3. For any company where nothing was published, fall back to
find_people_within_company with job_title ["Head of Marketing",
"VP Marketing"], max_profiles 2, then find_work_email on those.
4. verify_email on everything found.
5. Return one CSV: company, domain, contact name if any, email, source
(scraped or enriched), status. Tell me the coverage rate for each source.Best prompting practices
- Number the steps. A numbered list is a chain; a paragraph is a suggestion.
- Put the cap in the step that spends. “The first 25 survivors”, not “the survivors”.
- Write the stop condition. “Skip anyone with no result — do not guess” prevents invented emails.
- Ask for the row count at each step. Silent drops are the most common failure in a long chain.
- Split anything past six steps. Twelve steps in one message is where a model starts skipping filters.
- Bracket with
check_creditsthe first time you run a new chain.
Where this breaks
Long chains drift. Six steps is fine; twelve is not. Split and check the row count between messages.
If a chain finishes suspiciously fast and your balance has not moved, no tool ran. Re-prompt with “use the SyncGTM MCP server” and the tool names. Common issues has the rest.
Further automation
MCP Local & Site Scraper is this module as a skill file — /mcp-local-scraper sources from Maps, scrapes the sites and verifies only the named addresses.
Every chain above exists as an installable skill file — already scoped to the right tools, filters and caps, triggered with a slash command. The eight SyncGTM MCP agents are this course, one per module. Check the library before writing your own.
You have finished the course
All 50 tools, one example prompt each. What to do next:
| You want | Go to |
|---|---|
| Full rep workflows built on these tools | AI for Sales Reps |
| Agentic builds — outbound, research, CRM repair | AI-Powered GTM |
| The same outcomes as scheduled tables | SyncGTM 101 |
| A team rollout with credit guardrails | AI for RevOps |
Reference: Scrape Emails · Scrape Phones · Google Maps Listings · Tools · Prompting guide · Common issues