# Changelog of Company Tech Stack Detection: BuiltWith Alternative (`mambalabs/gtm-tech-stack-signal-scraper`) Actor

- **URL**: https://apify.com/mambalabs/gtm-tech-stack-signal-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/mambalabs/gtm-tech-stack-signal-scraper.md

## Changelog

All notable changes to this actor are documented here.

### \[0.2.1] - 2026-04-20

#### Fixed

- Detection was returning zero for every domain in production. Root cause: the auto-generated Dockerfile used `apify/actor-node:20` as the base image, which does not ship a Chromium binary. `playwright-chromium` silently failed at `chromium.launch()` with `ENOENT` on `chrome-headless-shell`. The detector's internal catch swallowed the error and returned an all-false fingerprint array, and main.js wrote `detection_error: false` because its own try/catch never fired. Shipped a custom `.actor/Dockerfile` using `apify/actor-node-playwright-chrome:20` as the base, which includes Chromium preinstalled at the path Playwright expects.
- Detection error surfacing. `main.js` now inspects the detector's return value. If every entry's `reason` is `timeout` or starts with `error:`, `detection_error` is set to `true` and the specific `detection_error_reason` is included in the output. This exposes container-level failures in the dataset row instead of hiding them behind a row of false booleans.

#### Changed

- Input field renamed to `domain`. `company_domain` and `url` still accepted for backward compatibility with existing Clay tables and API callers. Input schema marks `domain` as required, with the two legacy fields carried as deprecated optional fields. Matches Actor 1's input shape.
- Apollo fingerprint updated. Added cookie patterns for `dwnjrn` and `zp__initial_landing_page`, which are the cookies Apollo's own marketing site currently sets. The original `_auid` pattern is preserved.
- Output now includes both `domain` and `company_domain` (same value) for forward and backward compatibility with Clay templates.

#### Added

- Ground truth regression test at `tests/ground_truth.js`. Runs the actor against six domains (monday, retool, asana, webflow, calendly, zapier) whose marketing sites carry detectable fingerprints for HubSpot, Marketo, or Intercom (two of each for balanced coverage). Gate: five of six must pass before any apify push. Replaces the prior ad-hoc "all false on every domain" production verification.
- README `Coverage and limitations` section documenting bot-protected domains (Cloudflare Enterprise, Akamai, PerimeterX), backend-only tools with no web pixel, and vendor-self-site patterns.

#### Removed

- `outreach.io`, `apollo.io`, `gong.io`, `drift.com`, `clay.com` are no longer valid ground truth targets for self-detection. Their marketing sites run someone else's stack (typically Marketo or HubSpot) and their own products have no public-site fingerprint. Documented in README.

### \[0.2.0] - 2026-04-15

#### Added

- `uses_marketo` boolean field: Marketo was already detected via `marketing_automation_detected` but had no boolean output. `gtm_tool_count` now correctly increments when Marketo is the only GTM tool present.
- Multi-page crawling: actor now crawls up to 2 additional pages per domain (pricing, product) after the homepage. Signals detected on any crawled page count as detected. Controlled via the new `crawl_additional_pages` input (default: true).
- CDN obfuscation fallback: cookie names and JS global variables are now checked as primary signals before script src URL patterns. Improves detection accuracy for companies routing scripts through Cloudflare Workers, Fastly, or custom CDN configurations.
- `crawl_additional_pages` input field (boolean, default true): set to false to crawl homepage only for faster volume runs.

#### Changed

- Detection priority order updated across all tools: cookies first, JS globals second, script src third.
- `gtm_tool_count` now includes `uses_marketo` in its total.

#### Removed

- `uses_linkedin_sales_nav` removed from output schema. LinkedIn Sales Navigator is an internal tool with no reliable client-side fingerprint. Previous detection signals produced frequent false negatives. Documented as out of scope.

### \[0.1.0] - 2026-04-07

#### Added

- Initial release to Apify Store.
- Playwright-based GTM tool detection for 15 tools: HubSpot, Salesforce, Clay, Apollo, Outreach, Gong, ZoomInfo, LinkedIn Sales Nav (removed in 0.2.0), Drift, Intercom, Marketo, Pardot, Salesloft, Instantly, Lemlist.
- Flat boolean output: uses\_hubspot, uses\_salesforce, uses\_clay, uses\_apollo, uses\_outreach, uses\_gong, uses\_zoominfo, uses\_drift, uses\_intercom.
- CRM detection string: crm\_detected.
- Sequencer detection string: seq\_tool\_detected.
- Marketing automation detection string: marketing\_automation\_detected.
- GTM tool count integer: gtm\_tool\_count.
- Signal strength string: tech\_stack\_signal (high / medium / low).
- Error handling: detection\_error boolean with graceful null output on timeout.
