Tech Stack Snapshot
Per-company tech-stack snapshot grouped by category, with displacement angles for competitive tools and integration angles for partner tools — anchored on the user's GTM context. Resolves mixed-identifier inputs, queries search_companies with techAttributeTagList to check each product in a curated universe, and presents both the detected stack and the gaps honestly.
How it works
search_companies accepts techAttributeTagList (tech-product IDs) as a filter:
Iterate over a curated universe of ~30–50 high-relevance tech products → build a company × product matrix → group by category and pair with GTM-context-anchored plays.
The bar
- Resolution accuracy 100% — every input bucketed; never silently picked.
- Detections are binary and verified — ✅ comes from a non-zero
search_companiesresult; ❌ means no tag. Never invent presence. - Output is grouped by category.
- Recommended plays anchor on GTM context.
- Coverage gaps surfaced honestly — absence = "no tag detected", not "no tool used."
Always-on context: get_gtm_context
Every run calls get_gtm_context(detailed: true). Drives:
- Which categories are in scope (sales-focused vs. dev-focused).
- Which detected tools map to displacement vs. integration angles.
- Framing of recommended plays (anchored on specific value props).
Scope
Snapshots are company-level. Per-person tech-skill data is out of scope.
Input
- Companies (required) — list of ZI IDs / names / domains / mixed CSV.
- Categories of interest (optional) — any of:
sales,marketing,analytics,data,conversation_intelligence,intent_abm,cdp,devops,security,customer_service,collaboration. Default = first 7 (B2B SaaS sales motion). - Custom universe (optional) —
["product_id_1", ...]to override curated default. - Use case (default
sales_prep) —sales_prep,battle_card,integration_partner_research,displacement_targeting. Affects play framing.
The curated universe (default)
~30 anchor products across 7 categories. The skill resolves vendors and products at runtime via lookup — see §3.5 below for the canonical enumeration paths. The default anchor set:
Always include both generic vendor IDs AND specific sub-products — companies tagged with the generic ID won't surface if only sub-products are checked. Salesforce has 70+ tagged products; the universe must include each vendor's major sub-products.
User can extend / narrow per run.
Enumerating the full tech taxonomy via lookup
The orchestrator does NOT need to memorize ZoomInfo's tech taxonomy — every list is enumerable from lookup at runtime. Three calls give you the entire surface area:
Use this path when the user asks "what categories of tech does ZI track?" / "what vendors exist in the [X] category?" / "what are all the products for [vendor]?" — and when extending the universe beyond the default 7 categories without hardcoding new entries.
lookup quirk to respect: multi-field requests with per-field fuzzyMatch can silently fail on the second field. Call once per fieldName when using fuzzyMatch.
Workflow
1. Pull GTM context (always)
get_gtm_context(detailed: true). Capture competitors (displacement framing), offerings (integration framing), strategic priorities, ICP (sanity-check).
2. Honor input data first
Use user-supplied categories / custom universe / use case. Default only for missing fields.
3. Resolve identifiers (four-bucket routing — same as score-accounts)
- Numeric ZI ID → auto-resolved.
- Domain →
search_companies(companyWebsite). Single match → auto-resolved. Multiple → ambiguous. - Name →
search_companies(companyName). Dominant top match → auto-resolved. Clear top with plausible alternatives → verified. No dominant winner → ambiguous. - No match → failed.
100% resolution accuracy. Probe only resolved + verified rows.
Domain-confirmation gate (mandatory for high-collision names). When search_companies(companyName=X) returns >100 matches AND no strong GTM tiebreaker, require domain confirmation. Never silently auto-pick — the cost is wasted MCP calls AND misleading output.
Duplicate-record detection (mandatory). If two+ candidates share same domain root, ≤20% revenue diff, AND same metro/country → flag suspected duplicate. Probe BOTH records and union the detections — tags may be split across entries (record A might have Salesforce; record B might have HubSpot). Annotate [from A] / [from B] in the output.
Probing one record and reporting "no detections" is the failure mode this rule prevents.
4. Build the product universe
For each category in scope:
lookup tech-vendors fuzzyMatch=<vendor>— one call per anchor vendor (multi-field fuzzyMatch is unreliable). For category-wide expansion, uselookup tech-vendorswith acategoryorparentCategoryfilter instead of fuzzyMatch — returns the full vendor list for that category.lookup tech-products vendor=<resolved-vendor-name>— returns the vendor's full product catalogue; select anchor products by name match. Requires at least one ofvendor,category, orparentCategory.- Aggregate to
{product_id, product_name, category, vendor}.
To enumerate the full tech taxonomy (categories → vendors → products) instead of hardcoding, see the table in "Enumerating the full tech taxonomy via lookup" above.
If custom universe supplied, skip this step; attach category metadata for grouping.
5. Probe each product against the input company list
For each product ID, run one batched call (not one-per-company):
Cache per (product × company) into a matrix.
Batch limit: ≤10 concurrent search_companies calls. For 30 products, 3 sequential batches of 10.
6. Build per-company snapshots
For each company:
- Group detections by category.
- Multi-product anomaly. If ≥3 products in the same category are tagged (Marketo + Pardot + Marketing Cloud), surface "multi-product anomaly" flag. Don't pick a "primary." Common causes: multi-BU, stale tagging from acquisitions, ZI overlap. Surface so the user investigates.
- Stack signature. Top 4-5 detected tools as a short label (
Salesforce + Marketo + Snowflake + Mixpanel). If <3 detections, label "sparse — likely incomplete coverage." - Identify coverage gaps — categories with no detected product.
- Size vs. universe mismatch. If
employeeCount< 50 AND universe is enterprise-default, surface: "small company / enterprise universe — default universe may be blind to SMB tools (Pipedrive, Mailchimp, Zoho). Recommend switching to SMB universe or extending."
7. Map to displacement / integration angles
For each detected tool, apply the GTM-context-anchored angle library:
- In
get_gtm_context.competitors→ displacement angle anchored on a GTM offering / value prop. - In
get_gtm_context.offerings.integration_partners→ integration angle. - Neither → neutral note; don't fabricate.
- Category gap mapping to a GTM offering → opportunity flag (e.g., "No intent/ABM tool detected — greenfield for [the matching GTM-context offering]").
8. Self-check before output
- ☑ Resolution buckets clean.
- ☑ No fabricated detections (every ✅ from a non-zero
search_companiesresult). - ☑ Detections grouped by category.
- ☑ Stack signature surfaced (or "sparse" label).
- ☑ Coverage gaps explicit.
- ☑ Plays anchored on GTM context (not generic).
- ☑ "What we didn't check" caveat included.
- ☑ Stale-tag caveat included.
- ☑ Iteration options offered.
9. Present + offer iteration
- Accept — save universe + snapshot.
- Extend the universe — add products/vendors.
- Drill into a category — broaden the product list.
- Drill into a company — full vendor-by-vendor detail or run
account_researchfor deal-context layered on top. - Switch use case — battle-card / integration-partner-research / displacement-targeting.
- Chain to
personalize-emailfor a contact at a detected-competitor account.
Anti-patterns
- Fabricating tech presence. Never claim a tool is present if
search_companiesreturned 0. - Overclaiming coverage. Default universe is ~30–50 of thousands of products; say so.
- Absence-as-evidence-of-no-tool. "No tag detected" ≠ "company doesn't use this." Could be data gap, recent adoption, or non-standard naming.
- Generic displacement angles. "We're better than Salesforce" is not a play. Every angle anchored on GTM context.
- Flat product list. Category grouping is mandatory.
- Single-product vendor check. Salesforce has 70 tagged products — the universe must include each vendor's major sub-products.
- No GTM context → block the run; skill can't produce plays.
- Silent auto-pick on ambiguous resolution.
Fallback rules
get_gtm_contextempty → continue with detections only; suppress angle library; surface "no GTM context — generic angles only."- Vendor lookup fails for a category → drop that vendor; flag.
- All products return 0 for a company → "No tag matches in the universe checked. Could be ICP-mismatch (too small / wrong industry) or a data gap. Recommend manual verification."
- Ambiguous resolution → pause; never silently pick.
- Failed resolution → list separately.
Output Format
TL;DR — Tech Stack Snapshot · N companies · Pass [M]
Use case: [restate]. Universe: [N products across M categories].
Resolution: [R resolved · A ambiguous · F failed].
Coverage snapshot:
- Most-detected category: [e.g., "CRM (3 of 3 companies)"]
- Most-frequent product: [e.g., "Salesforce: 2 of 3"]
- Notable gap: [e.g., "Intent/ABM detected at 0 of 3 — greenfield for [matching offering]"]
Resolution Summary
(Four-bucket framework as in score-accounts.)
Per-Company Snapshots
For each resolved company:
Cross-Company Comparison (when N > 1)
Universe Reference
Iteration Options
- Accept — save universe + snapshot.
- Extend the universe.
- Drill into a category.
- Drill into a company.
- Switch use case.
- Chain to
personalize-emailfor a detected-competitor account.
Caveats (when relevant)
- Universe scope — N products / M categories. Not exhaustive.
- Absence is absence. No tag ≠ "doesn't use." Could be data gap, recent adoption, non-standard naming.
- Stale-tag risk. ZI tech-tagging refreshes on cycles; cross-check for high-stakes deal contexts.
- Vendor resolution failures. Any vendor that failed lookup is excluded from the universe; flag separately.
- GTM-context gaps. Sparse competitors / offerings → generic angles. Recommend richer GTM context.
Chain Targets
score-accountson the same list with technographic-weighted fit.personalize-emailfor a contact at a detected-competitor account — anchor on the displacement angle.find-similaron a company with a strong stack — find more accounts with the same signature.account-researchto pair technographics with deal narrative.


