Website Tech Gap Scanner
Pricing
from $14.00 / 1,000 website scanneds
Website Tech Gap Scanner
Scan websites for their technology stack and the capabilities they are missing: booking, live chat, CRM, payments, analytics, ad pixels and call tracking, plus email and phone. Export scraped data, run the scraper via API, schedule and monitor runs, or integrate with other tools or AI workflows.
Pricing
from $14.00 / 1,000 website scanneds
Rating
0.0
(0)
Developer
Matvey
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
What is Website Tech Gap Scanner?
Website Tech Gap Scanner turns a list of websites into a qualified prospect list. For every domain it returns the technology stack, the capabilities the website is missing, whether the company is paying for traffic right now, and the email and phone to reach it. Paste domains from Google Maps, a directory, a CRM export or a spreadsheet, press Start, and download the result as JSON, CSV or Excel โ or pull it through the Apify API into n8n, Make, Zapier, Google Sheets or an AI agent.
Most website technology lookup tools tell you what a website has. That is the less useful half. Outbound email does not convert on "I see you use WordPress" โ it converts on "I noticed you are running Meta ads but a visitor cannot book an appointment on your site." This scraper returns both halves plus the contact, so a row is a reason to write, not a trivia card.
No API key, no login, no proxy, no browser. One HTTP request per website, so a list of ten thousand domains costs what the pricing tab says.
What data does Website Tech Gap Scanner extract?
| Field | Example | What it is for |
|---|---|---|
technologies | ["Google Tag Manager", "Meta Pixel", "Shopify", "Yotpo"] | Every tool detected: CMS, ecommerce, payments, booking, chat, CRM, analytics, ad pixels, call tracking, reviews |
technologiesByCategory | {"ecommerce": ["Shopify"], "ads_pixel": ["Meta Pixel"]} | The same list grouped, so a filter can ask "any booking vendor at all?" |
gaps | ["no_online_booking", "no_live_chat"] | Machine-readable keys of what the website lacks โ your opening line |
gapLabels | ["No online booking / scheduling widget"] | The same gaps as sentences you can paste into an email |
runsPaidAds, adPlatforms | true, ["Meta Pixel", "Google Ads Conversion"] | Real money is being spent on traffic right now |
usesCallTracking | true | Paid marketing where the conversion is a phone call, not a checkout |
paidMarketingSignal | true | Either of the two above โ the single "has budget" flag |
adAccountIds | {"metaPixelIds": ["1758221267590067"], "googleAdsIds": ["AW-786649265"]} | Advertising account IDs read out of the tag container |
prospectScore, prospectTier | 90, hot | 0โ100 fit score bucketed into hot / warm / cold |
bookingSignals | ["free consultation", "book online"] | Scheduling wording found in the page text, even when no vendor was identified |
city, stateCode, postalCode | Las Vegas, NV, 89146 | The address the business publishes on its own home page, so you can segment outreach by geography |
locationSource | schema.org | Where the address was read from: schema.org markup or the page text |
primaryEmail, emails | help@allbirds.com | Best address first: the company's own domain, general inboxes over side mailboxes |
phones | ["+14809178400"] | Taken from tel: links only, so free-text digits never leak in |
social | {"linkedin": "โฆ", "instagram": "โฆ"} | Profile links found on the home page |
tagManagerContainers | ["GTM-TH8KRSBJ"] | Which Google Tag Manager containers the site loads |
confidence | high / medium / low | low means the page was too thin to judge โ an anti-bot wall, not an empty answer |
status, error | ok, unreachable | Every submitted domain comes back, so nothing disappears silently |
Which gaps can it detect?
no_online_booking, booking_unverified, no_live_chat, no_crm, no_analytics, no_ads_pixel, no_email_capture, no_online_payments, no_reviews_widget, no_contact_form, no_https, not_mobile_ready, no_meta_description.
The part other tech stack detectors miss
Modern websites no longer put their marketing tags in the HTML. Google Tag Manager injects them at runtime, so a plain HTML scan reports "no advertising pixel" for almost every serious advertiser โ exactly backwards.
This scraper fetches each website's public GTM container and reads the tag list inside it. On a test set of twenty ecommerce and local-business domains, that lifted ad-pixel detection from 0 of 20 to 9 of 20 โ the same websites, the same fetch budget, a completely different answer. The advertising account IDs in adAccountIds come from the same place.
Three states of booking, not two
"No vendor detected" is not the same as "no online booking". A website may use a vendor nobody lists, or keep scheduling on an inner page. So the booking result comes back in three states:
- a booking vendor was identified
booking_unverifiedโ the site advertises scheduling ("book online", "free consultation", "free estimate") but no vendor was attributedno_online_bookingโ no vendor and no mention anywhere
Only the third is safe to write an email about. On a sample of 287 real dental practices, taking "no vendor" at face value would have overstated the target segment 6.6 times.
Vertical vendors, not just Calendly
Clinics, contractors and law firms do not schedule with Calendly. The scanner ships signatures for the vendors they actually run: NexHealth, Zocdoc, LocalMed, Dentrix Ascend, Denticon, Curve Dental, Weave, RevenueWell, Solutionreach, PatientPop, Cherry, Sunbit, CareCredit, JobNimbus, AccuLynx, ServiceTitan, Jobber, Housecall Pro, Roofr, HOVER, Hearth, Clio, Lawmatics, MyCase, Filevine, Smokeball, LawPay, Ngage, Intaker, Smith.ai, CallRail and more โ 144 signatures across 14 categories.
On those 287 dental practices exactly one used Calendly. Without the vertical list the booking gap would have been meaningless.
How much does it cost to scrape website technologies?
Pay-per-event: $0.02 per website scanned, which is $20 per 1,000 websites. Cheaper tiers apply automatically on paid Apify plans.
You are only charged for websites that were actually read. Unreachable domains, invalid domains and rows filtered out by your own settings are free. There is no start fee and no per-page fee โ the number of pages read never changes your bill.
| Your list | Cost |
|---|---|
| 100 websites | $2 |
| 1,000 websites | $20 |
| 10,000 websites | $200 |
The Apify free plan includes $5 of monthly usage, which is about 250 websites per month at no cost. No credit card is needed to try it.
How to scan websites with Website Tech Gap Scanner
- Open the Actor and press Try for free.
- Paste your domains into ๐ Websites, one per line. The three prefilled examples run in about three seconds if you just want to see the output.
- Optionally narrow the list: ๐ฐ Only companies spending on traffic, ๐ณ๏ธ Only websites missing ALL of these, ๐ฏ Minimum prospect score.
- Press Start and download the dataset as JSON, CSV or Excel โ or call the run through the API.

โฌ๏ธ Input
{"domains": ["allbirds.com", "roofingbybruce.com", "bostondentalgroup.com"],"onlyPaidTraffic": true,"onlyWithGaps": ["no_online_booking"],"minProspectScore": 60}
Filtering so you only pay for rows you will use
onlyPaidTraffickeeps only companies with an advertising pixel or call tracking.onlyWithGapskeeps only websites lacking every capability you select. Selling booking software?no_online_booking. Selling chat or intake?no_live_chat.minProspectScoreat60returns the hot tier only.onlyStateskeeps only websites whose published address is in the states you list (two-letter codes).
Filtered rows are never written to the dataset and never billed.
Advanced
expandTagManager(on by default) reads the public GTM container. Turning it off makes runs slightly faster and ad detection far worse.maxConcurrencyraises throughput on long lists.requestTimeoutSecscontrols how long a slow website is given.
โฌ๏ธ Output
One row per website. Failed rows carry status and error so nothing disappears from your list.

{"domain": "allbirds.com","status": "ok","confidence": "high","prospectScore": 90,"prospectTier": "hot","runsPaidAds": true,"paidMarketingSignal": true,"adPlatforms": ["Meta Pixel", "Google Ads Conversion", "TikTok Pixel"],"adAccountIds": { "googleAdsIds": ["AW-786649265"], "ga4Ids": ["G-XXXXXXXX"] },"technologies": ["Google Tag Manager", "Google Analytics 4", "Meta Pixel", "Shopify", "Yotpo"],"gaps": ["no_online_booking", "no_live_chat", "no_crm"],"gapLabels": ["No online booking / scheduling widget", "No live chat or messaging widget"],"city": "Beverly Hills","stateCode": "CA","postalCode": "90211","locationSource": "page text","primaryEmail": "help@allbirds.com","phones": [],"tagManagerContainers": ["GTM-TH8KRSBJ"]}
Use cases for website technology and gap data
Agencies selling a specific service
Filter on the gap your service fills and on paidMarketingSignal, and every row is a company that already spends on traffic and lacks exactly what you sell. The email writes itself, and gapLabels gives you the sentence.
SaaS vendors displacing a competitor
technologies names the incumbent. Filter for websites running a competing product and you have a switch list; filter for websites running none and you have a greenfield list.
Outreach segmented by geography
stateCode and city come from the address the business publishes itself, so a nationwide list splits into territories without a separate enrichment step. Measured on 151 live US law-firm websites, 69% published a parsable address โ 51% in schema.org markup, 53% in the page text, with overlap. The remaining 31% come back with stateCode: null rather than a guess, and the onlyStates filter drops them.
Lead qualification before outreach
Run a Google Maps or directory export through the scanner and drop everything below a score. A smaller, hotter list protects your sending domain better than volume ever will.
AI agents and enrichment pipelines
Flat, predictable fields and a one-call API make this easy to wire into an agent that qualifies inbound domains, or into a nightly n8n job that enriches new CRM rows.
Integrations
Run it from the API, from the Python or JavaScript Apify client, on a schedule, or through n8n, Make, Zapier and Google Sheets. It also works as a tool over the Apify MCP server, so an AI agent can call it directly.
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("lergassy/website-tech-gap-scanner").call(run_input={"domains": ["allbirds.com", "bostondentalgroup.com"],"onlyPaidTraffic": True,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["domain"], row["prospectTier"], row["gapLabels"])
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });const run = await client.actor('lergassy/website-tech-gap-scanner').call({domains: ['allbirds.com', 'bostondentalgroup.com'],minProspectScore: 60,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Troubleshooting
- A row came back with
confidence: "low". The website answered but served almost nothing โ usually an anti-bot page or a JavaScript-only shell. Treat it as "unknown", not as "no technologies". - A gap looks wrong. The scanner reads the home page. A booking widget that lives only on
/appointmentsreads asbooking_unverifiedwhen the site mentions scheduling, and as a gap when it does not. For high-value lists, treat gaps as a hypothesis worth one click. - No advertising pixel on a company you know advertises. Check that
expandTagManageris on. Tags injected by other managers, such as server-side GTM or Segment, are not expanded. stateCodeis null. The website publishes no machine-readable address on its home page. The location is never guessed from the domain name or the phone number.- A domain is
unreachable. The website did not answer over HTTPS,wwwor HTTP within your timeout. RaiserequestTimeoutSecsfor slow hosts.
โ FAQ
Is it legal to scrape website technology data?
The scanner reads publicly served pages and public tag-manager containers, the same files any visitor's browser downloads. It uses no login and no personal account. Contact details are the ones the business publishes on its own website. Laws differ by country and by how you use the data โ consult a lawyer for your case, and respect GDPR/CAN-SPAM when you email anyone.
How is this different from BuiltWith or Wappalyzer?
Those tell you what is installed. This also tells you what is missing, whether the company is spending on ads (by reading the tag container, not just the HTML), scores the prospect, and returns the contact โ and it knows the vertical booking and CRM vendors that generic detectors have never heard of.
How many websites can I scan in one run?
There is no fixed cap. Measured throughput is about one website per second at the default concurrency of 10, and about three per second at concurrency 40 โ so a thousand-domain list takes roughly fifteen minutes on the defaults, or six minutes with concurrency raised. Raise โก Websites in parallel for long lists.
Can it tell me where each company is located?
Yes, when the website says so. city, stateCode and postalCode are read from schema.org markup or the published address in the page, and onlyStates filters on them. About 7 in 10 US business websites carry a parsable address; the rest return null rather than a guess.
Does one row equal one website?
Yes. One row per submitted domain, including the ones that failed โ and failed rows are free.
Can I use it with the Apify API?
Yes. Start runs, poll status and read the dataset over the REST API, or use the Python and JavaScript clients as shown above.
Can I use it through an MCP server?
Yes. The Actor is available as a tool through the Apify MCP server, so an AI agent can call it with the input schema alone.
Can I integrate it with other apps?
Yes โ n8n, Make, Zapier, Google Sheets, Slack and webhooks are all supported by the Apify platform.
Do I need a proxy?
No. The scanner makes plain HTTP requests and needs no proxy, no browser and no API key.
Your feedback
Found a technology it should detect, or a vendor missing from a vertical? Open an issue on the Actor's Issues tab โ vendor signatures are quick to add, and requests get shipped. Ratings and reviews are read and answered.
You might also like
| Actor | What it does |
|---|---|
| Website Contacts API | Deep contact extraction: emails, phones, WhatsApp, socials and postal address from a whole website |
| Email Verifier & Phone Number Validator | Validate the addresses and numbers before you send |
| US New Business Leads | Newly registered US companies, straight from state and city registries |
| Shopify Store Scraper | Emails, apps and catalogue figures for Shopify stores |
| Jobs API | Job postings from Indeed, LinkedIn and company career sites โ a hiring intent signal |