Enrich HubSpot companies with technographic data from BuiltWith using a Claude Code skill

low complexityCost: Usage-based
Compatible agents

This skill works with any agent that supports the Claude Code skills standard, including Claude Code, Claude Cowork, OpenAI Codex, and Google Antigravity.

Prerequisites

Prerequisites
  • Claude Code or another AI coding agent installed
  • HubSpot private app with crm.objects.companies.read and crm.objects.companies.write scopes
  • BuiltWith Pro plan or above with API access
  • Custom HubSpot company properties: tech_stack_crm, tech_stack_marketing, tech_stack_analytics, tech_stack_all, tech_enrichment_date
Environment Variables
# HubSpot private app token with companies read/write scopes
HUBSPOT_ACCESS_TOKEN=your_value_here
# BuiltWith API key (Pro plan or above required)
BUILTWITH_API_KEY=your_value_here

Why a Claude Code skill?

An Claude Code skill turns technographic enrichment into a conversation. Instead of configuring nodes or maintaining scripts, you tell the agent what you need:

  • "Look up the tech stack for acme.com"
  • "Enrich all companies without tech data — limit to 20"
  • "Which of our target accounts use Salesforce?"
  • "Re-enrich companies whose tech data is older than 90 days"

The agent reads API reference files, queries HubSpot for unenriched companies, calls BuiltWith, categorizes the results, and updates HubSpot — all without you writing code. You can adjust the category taxonomy or add competitor detection in natural language.

How it works

The skill has three parts:

  1. SKILL.md — instructions telling the agent the workflow steps and which reference files to consult
  2. references/ — API documentation for HubSpot Companies Search, BuiltWith lookup, and HubSpot PATCH endpoints
  3. templates/ — category mapping rules and the tech-to-HubSpot property mapping

When you invoke the skill, the agent reads these files, writes a script that follows the patterns, executes it, and reports the results.

What is a Claude Code skill?

An Claude Code skill is a directory of reference files and instructions that teach an AI coding agent how to complete a specific task. Unlike traditional automation that runs the same code every time, a skill lets the agent adapt — it can modify search filters, change batch sizes, handle errors, and explain what it did, all based on your natural-language request. The agent generates and runs code on the fly using the API patterns in the reference files.

Step 1: Create the skill directory

mkdir -p .claude/skills/tech-enrich/{templates,references}

Step 2: Write the SKILL.md file

Create .claude/skills/tech-enrich/SKILL.md:

---
name: tech-enrich
description: Looks up what technologies HubSpot companies use via BuiltWith. Categorizes technologies into CRM, marketing, and analytics stacks and writes them to custom HubSpot company properties.
disable-model-invocation: true
allowed-tools: Bash, Read
---
 
## Workflow
 
1. Read `references/builtwith-api.md` for the BuiltWith lookup API
2. Read `references/hubspot-companies-api.md` for HubSpot search and update patterns
3. Read `templates/category-mapping.md` for the technology categorization rules
4. Search HubSpot for companies where tech_stack_crm has no value (NOT_HAS_PROPERTY)
5. For each company with a domain, call BuiltWith API with the domain
6. Parse the deeply nested response: Results[0].Result.Paths[0].Technologies[]
7. Categorize each technology into CRM, marketing, analytics, or other using the mapping rules
8. PATCH each company in HubSpot with categorized tech stacks and tech_enrichment_date
9. Print a summary: companies processed, enriched, skipped (no domain or no tech data)
 
## Rules
 
- Skip companies without a domain property — BuiltWith requires a domain
- Rate limit: 2 seconds between BuiltWith API calls
- Always set tech_enrichment_date on enriched companies
- Use environment variables: HUBSPOT_ACCESS_TOKEN, BUILTWITH_API_KEY
- BuiltWith credits are expensive (~$0.59/lookup on Pro) — keep batch sizes reasonable

Step 3: Add reference and template files

Create references/builtwith-api.md:

# BuiltWith API Reference
 
## Look up technologies for a domain
 
```
GET https://api.builtwith.com/v21/api.json?KEY={BUILTWITH_API_KEY}&LOOKUP={domain}
```
 
Response structure (deeply nested):
```json
{
  "Results": [
    {
      "Result": {
        "Paths": [
          {
            "Technologies": [
              {
                "Name": "Salesforce",
                "Tag": "crm",
                "Categories": ["CRM", "Customer Relationship Management"]
              },
              {
                "Name": "Google Analytics",
                "Tag": "analytics",
                "Categories": ["Analytics", "Web Analytics"]
              }
            ]
          }
        ]
      }
    }
  ]
}
```
 
Key behaviors:
- Domain should be bare (e.g., "acme.com"), not a full URL
- If the domain isn't recognized, Results may be empty or Paths may have no Technologies
- Each Technology has a Name, Tag (category identifier), and Categories array
- Always use optional chaining at every nesting level: Results?.[0]?.Result?.Paths?.[0]?.Technologies
- Rate limit varies by plan — use 2-second delay between calls on Pro plan
- Pro plan: 500 calls/month ($295/mo). Enterprise: 2,000 calls/month ($495/mo)

Create references/hubspot-companies-api.md:

# HubSpot Companies API Reference
 
## Search for companies missing tech data
 
```
POST https://api.hubapi.com/crm/v3/objects/companies/search
Authorization: Bearer {HUBSPOT_ACCESS_TOKEN}
Content-Type: application/json
```
 
Request body:
```json
{
  "filterGroups": [{
    "filters": [{
      "propertyName": "tech_stack_crm",
      "operator": "NOT_HAS_PROPERTY"
    }]
  }],
  "properties": ["domain", "name"],
  "limit": 50,
  "after": 0
}
```
 
Response:
```json
{
  "results": [
    {
      "id": "456",
      "properties": {
        "domain": "acme.com",
        "name": "Acme Inc"
      }
    }
  ],
  "paging": { "next": { "after": "50" } }
}
```
 
Pagination: continue with `after` value until `paging.next` is absent.
 
## Update a company
 
```
PATCH https://api.hubapi.com/crm/v3/objects/companies/{companyId}
Authorization: Bearer {HUBSPOT_ACCESS_TOKEN}
Content-Type: application/json
```
 
Request body:
```json
{
  "properties": {
    "tech_stack_crm": "Salesforce, HubSpot",
    "tech_stack_marketing": "Marketo, Mailchimp",
    "tech_stack_analytics": "Google Analytics, Mixpanel",
    "tech_stack_all": "Salesforce, HubSpot, Marketo, ...",
    "tech_enrichment_date": "2026-03-05"
  }
}
```
 
Custom properties must be created in HubSpot first:
- tech_stack_crm (single-line text)
- tech_stack_marketing (single-line text)
- tech_stack_analytics (single-line text)
- tech_stack_all (multi-line text)
- tech_enrichment_date (date, YYYY-MM-DD format)

Create templates/category-mapping.md:

# Technology Category Mapping
 
## Category rules
 
Map each technology to a category based on its Tag and Categories fields:
 
| Category | Tag patterns | Example technologies |
|---|---|---|
| CRM | crm, customer-relationship | Salesforce, HubSpot, Zoho CRM |
| Marketing | marketing-automation, email, marketing | Marketo, Pardot, Mailchimp, ActiveCampaign |
| Analytics | analytics, web-analytics | Google Analytics, Mixpanel, Amplitude, Hotjar |
| E-commerce | ecommerce, shopping-cart, payment | Shopify, WooCommerce, Stripe, PayPal |
| Hosting | hosting, cdn, cloud-paas | AWS, Cloudflare, Vercel, Netlify |
 
## Matching logic
 
1. Convert the Tag to lowercase
2. Check if any category pattern is a substring of the Tag
3. Also check the Categories array (lowercase) for pattern matches
4. If a technology matches multiple categories, assign it to the first match
5. Technologies that don't match any category are included in tech_stack_all but not in specific category fields
 
## HubSpot property values
 
- If a category has matches: join technology names with ", " (e.g., "Salesforce, HubSpot")
- If a category has no matches: write "None detected"
- tech_stack_all: join ALL technology names regardless of category

Step 4: Test the skill

# In Claude Code
/tech-enrich

Start with a single company to verify the flow:

"Look up the tech stack for one company — show me what BuiltWith returns before writing to HubSpot"

The agent will call BuiltWith, show you the categorized results, and wait for your approval before updating.

Step 5: Schedule it (optional)

Option A: Cron + CLI

# Run weekly on Sunday at 10 PM
0 22 * * 0 cd /path/to/project && claude -p "Run /tech-enrich for companies without tech data. Limit to 50." --allowedTools 'Bash,Read' 2>&1 >> /var/log/tech-enrich.log

Option B: GitHub Actions

name: Technographic Enrichment
on:
  schedule:
    - cron: '0 3 * * 0'  # Weekly Sunday 3 AM UTC
  workflow_dispatch: {}
jobs:
  enrich:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: anthropics/claude-code-action@v1
        with:
          prompt: "Run /tech-enrich for companies without tech data. Limit to 50."
          allowed_tools: "Bash,Read"
        env:
          HUBSPOT_ACCESS_TOKEN: ${{ secrets.HUBSPOT_ACCESS_TOKEN }}
          BUILTWITH_API_KEY: ${{ secrets.BUILTWITH_API_KEY }}

Option C: Cowork Scheduled Tasks

Claude Desktop's Cowork supports built-in scheduled tasks. Open a Cowork session, type /schedule, and configure the cadence — hourly, daily, weekly, or weekdays only. Each scheduled run has full access to your connected tools, plugins, and MCP servers.

Scheduled tasks only run while your computer is awake and Claude Desktop is open. If a run is missed, Cowork executes it automatically when the app reopens. For always-on scheduling, use GitHub Actions (Option B) instead. Available on all paid plans (Pro, Max, Team, Enterprise).

Troubleshooting

When to use this approach

  • You want to test BuiltWith on a few target accounts before committing to a recurring automation
  • You need ad-hoc lookups — "what tech does this prospect's company use?"
  • You want to run tasks in the background via Claude Cowork while focusing on other work
  • You want to customize the category mapping in natural language ("also categorize CDN tools")
  • You want to run enrichment before a quarterly account review

When to switch to a dedicated tool

  • You need technographic data automatically enriched on every new company without intervention
  • You want visual dashboards showing tech stack distribution and trends over time
  • Multiple team members need to trigger and customize the enrichment
  • You want to chain tech enrichment with scoring workflows in one platform

Common questions

Does the agent call BuiltWith for every company, or can it batch?

BuiltWith's API processes one domain per call — there's no bulk endpoint. The agent calls the API once per company with a 2-second delay between calls. For 50 companies, expect about 2 minutes of processing time.

How many BuiltWith credits does a typical run use?

1 credit per domain lookup, regardless of how many technologies are detected. A weekly batch of 50 companies uses 200 credits/month. On the Pro plan (500 calls/month), that leaves 300 for ad-hoc lookups or re-enrichment.

Can I ask the agent to find companies using a specific competitor?

Yes. After enrichment, ask: "Which companies in HubSpot have Salesforce in their tech_stack_crm?" The agent can search HubSpot for companies with that value and return a list. You can also ask it to set a boolean uses_competitor_crm property during enrichment.

What's the difference between this and the code approach?

The code approach gives you a static script with a fixed category map. The Claude Code skill lets you adjust categories, batch sizes, and filtering criteria in natural language. Ask the agent to "also categorize e-commerce platforms" and it will update the categorization logic without you editing files.

Cost

  • BuiltWith Pro: $295/mo for 500 API calls ($0.59/lookup). Enterprise: $495/mo for 2,000 calls ($0.25/lookup).
  • HubSpot: Free within API rate limits.
  • Claude Code: Usage-based pricing per conversation. A typical enrichment run uses one conversation turn.
  • GitHub Actions: Free tier covers weekly scheduled runs.

Looking to scale your AI operations?

We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.