GTM Tech Stack Signal Enrichment avatar

GTM Tech Stack Signal Enrichment

Pricing

from $70.00 / 1,000 results

Go to Apify Store
GTM Tech Stack Signal Enrichment

GTM Tech Stack Signal Enrichment

Detects which GTM tools a company uses on their website. Returns a flat, Clay-ready row with detected CRM, sequencer, and marketing automation signals. Purpose-built for outbound qualification, no JSON parsing required.

Pricing

from $70.00 / 1,000 results

Rating

0.0

(0)

Developer

Mamba Labs

Mamba Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Share

Version: 0.2.1

GTM tech stack detection for Clay. Flat boolean output. No JSON parsing required.

Takes a company domain or URL, renders the page with headless Chromium, and returns a single flat row with boolean flags for each GTM tool detected. Drop it into a Clay HTTP Request column and filter on gtm_tool_count > 0 to qualify your list instantly.


Who this is for

  • Clay users building outbound qualification tables who need GTM tool flags without writing formula columns
  • GTM agencies enriching lead lists with tech stack signals at scale
  • RevOps teams segmenting accounts by CRM, sequencer, and marketing automation usage

What's new in v0.2.1

  • Detection is actually running. Prior versions shipped with a base Docker image that had no Chromium binary. Every run in production was silently failing at chromium.launch() and returning all-false. v0.2.1 switches the base image to apify/actor-node-playwright-chrome:20 which includes Chromium at the path Playwright expects.
  • Detection errors now surface in the output. When the browser fails to launch or every fingerprint lookup errors out, detection_error is set to true and detection_error_reason carries the specific failure (e.g. timeout, error: net::ERR_...). Production failures no longer hide behind a row of false booleans.
  • Input field rename. Primary field is now domain to match Actor 1. Legacy company_domain and url are still accepted for backward compatibility. Existing Clay tables keep working.
  • Apollo fingerprint updated. New cookie patterns (dwnjrn, zp__initial_landing_page) match what Apollo's current marketing site actually sets.
  • Ground truth regression test. tests/ground_truth.js runs the actor against six domains whose marketing sites carry detectable fingerprints. Five of six must pass before any release push.

Input

FieldTypeRequiredNotes
domainStringYesBare company domain. Example: stripe.com. No https://, no www., no trailing slash.
company_domainStringNoDeprecated. Still accepted for backward compatibility with existing Clay tables.
urlStringNoDeprecated. Still accepted.
crawl_additional_pagesBooleanNoDefault true. Set to false for homepage-only runs.

Output

Every field is present in every row. No nested JSON. Ready to use as a Clay enrichment column.

FieldTypeDescription
domainStringNormalized domain from input (new primary key)
company_domainStringSame value as domain. Present for backward compatibility.
crm_detectedStringhubspot / salesforce / pipedrive / zoho / none
seq_tool_detectedStringoutreach / salesloft / apollo / instantly / lemlist / reply / none
uses_hubspotBooleanHubSpot CRM or Marketing Hub detected
uses_salesforceBooleanSalesforce detected
uses_clayBooleanClay detected
uses_apolloBooleanApollo.io detected
uses_outreachBooleanOutreach detected
uses_gongBooleanGong detected
uses_zoominfoBooleanZoomInfo detected
uses_driftBooleanDrift detected
uses_intercomBooleanIntercom detected
uses_marketoBooleanMarketo detected
marketing_automation_detectedStringmarketo / pardot / hubspot / eloqua / none
gtm_tool_countIntegerCount of true boolean fields
tech_stack_signalStringhigh / medium / low
detection_errorBooleanTrue if every fingerprint call returned a browser error or timeout
detection_error_reasonStringSpecific error reason when detection_error is true (for example timeout, error: ENOENT). Null otherwise.
run_dateISO DateTimestamp of the run

Sample output:

{
"company_domain": "hubspot.com",
"crm_detected": "hubspot",
"seq_tool_detected": "none",
"uses_hubspot": true,
"uses_salesforce": false,
"uses_clay": false,
"uses_apollo": false,
"uses_outreach": false,
"uses_gong": false,
"uses_zoominfo": false,
"uses_drift": false,
"uses_intercom": false,
"uses_marketo": false,
"marketing_automation_detected": "hubspot",
"gtm_tool_count": 1,
"tech_stack_signal": "medium",
"detection_error": false,
"run_date": "2026-04-06T09:03:47.744Z"
}

Clay gate column: gtm_tool_count > 0


How signal strength is derived

StrengthCriteria
highCRM detected AND sequencer detected AND 3 or more total tools
mediumCRM or sequencer detected, 1 to 2 total tools
lowAt least 1 tool detected, no CRM and no sequencer

Clay integration

  1. Add a new column in your Clay table. Select HTTP Request.
  2. Set the URL to: https://api.apify.com/v2/acts/mambalabs~gtm-tech-stack-signal-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN
  3. Set Method to POST.
  4. Set the body: { "domain": "{{domain}}" }
  5. Map the response fields you want as Clay columns: crm_detected, gtm_tool_count, tech_stack_signal, uses_hubspot.
  6. Set your run condition: only run if domain is not empty.
  7. Filter your view: gtm_tool_count greater than 0.

Your API token is in your Apify account under Settings > Integrations.


Coverage and limitations

Bot-protected domains may return negative results. Sites fronted by Cloudflare Enterprise, Akamai Bot Manager, or PerimeterX often serve a challenge page or stub to headless Chromium requests from a datacenter IP. The detector navigates successfully, captures an empty stub HTML, and returns all-false with detection_error: false (no error was actually thrown, the browser got a valid 200 response). Known examples include salesforce.com, zoominfo.com, and marketo.com. If you need those, flag the rows for manual review. A stealth-mode build with residential proxies is a candidate for a future coverage-expansion release.

Backend-only tools with no web pixel are out of scope. Clay, Salesloft, Instantly, Lemlist, and server-side Segment leave no public client-side signal on a customer's website. The fingerprints file marks these with detectable: false by design. Do not expect uses_clay: true even on companies you know use Clay. This is documented, not a bug.

Vendor marketing sites reflect their marketing stack, not their product. outreach.io runs Marketo on its marketing site. apollo.io runs HubSpot plus Intercom. gong.io runs Marketo. drift.com runs Marketo post-Salesloft-acquisition. The actor reports what the page actually uses, which is the correct outbound-qualification signal. "This company uses Outreach" is not inferable from "outreach.io's marketing site loads Marketo scripts," and we do not hard-code self-domain shortcuts.

Tools loaded only behind authenticated pages will not be detected. The actor crawls the homepage and up to two public pages (pricing, product). Dashboards, customer portals, and auth-gated paths are unreachable.

Heavily obfuscated CDN routing can reduce script src accuracy. Cookie names and JS global variables are checked as primary signals to partially compensate, but companies that fully mask outbound requests through Cloudflare Workers or Fastly with custom domains may still slip through.

LinkedIn Sales Navigator is not detectable and was removed in v0.2.0.


Pricing

$0.07 per result. Pay per event, billed once per domain processed.


  • GTM Hiring Signal Scraper - Scrape Greenhouse, Lever, and Ashby for GTM hiring signals. $0.07/result.
  • GTM Signals Aggregator - Run both hiring signals and tech stack detection in one call. $0.12/result vs $0.14 if run separately. Saves 14% and adds a composite signal score.

Clay Integration

One flat row per domain, Clay-ready. Add this actor as a Run Apify Actor enrichment column in any Clay table with a company_domain column.

Input mapping:

  • Apify Actor: mambalabs/gtm-tech-stack-signal-scraper
  • Input Data: {"domain": "[company_domain pill]"}
  • Run condition: company_domain is not empty

Output fields map directly to Clay formula columns using dot notation:

  • {{actor_output}}?.uses_hubspot
  • {{actor_output}}?.uses_marketo
  • {{actor_output}}?.uses_intercom
  • {{actor_output}}?.crm_detected
  • {{actor_output}}?.seq_tool_detected
  • {{actor_output}}?.gtm_tool_count
  • {{actor_output}}?.tech_stack_signal
  • {{actor_output}}?.detection_error

Gate downstream tables on gtm_tool_count > 0 or tech_stack_signal = high to focus on companies running real GTM infrastructure.


Clay Table Template

A prebuilt Clay table template is available. It includes the actor call, eight formula columns, and a qualifier column ready to use.

Template: https://app.clay.com/shared-table/share_0tduwikWCKnZFC2dJde

A reusable Clay Function is also available. Call it from any table without rebuilding the column logic:

Function: https://app.clay.com/shared-table/share_0tdutnkHyf2yPQ6Gjie

Use the function when you want updates to the detection logic to propagate automatically. Use the template when you want a static copy to modify.


Built by Mamba Labs.