Enrich HubSpot companies with technographic data from BuiltWith using Make
Prerequisites
- Make account (Free or Core plan)
- HubSpot connection configured in Make via OAuth
- BuiltWith API key (Pro plan or above for API access)
- Custom HubSpot company properties for tech stack data (e.g.,
tech_stack_crm,tech_stack_marketing,tech_stack_analytics)
Step 1: Create the scenario and schedule
Create a new scenario. Set the schedule for weekly execution:
- Schedule type: At regular intervals
- Run scenario: Every week
- Day: Sunday
- Time: 22:00
- Timezone: Your team's timezone
Step 2: Search for companies without tech data
Add an HTTP module (Make an API Call):
- URL:
https://api.hubapi.com/crm/v3/objects/companies/search - Method: POST
- Headers: Authorization handled by HubSpot connection
- Body:
{
"filterGroups": [{
"filters": [{
"propertyName": "tech_stack_crm",
"operator": "NOT_HAS_PROPERTY"
}]
}],
"properties": ["domain", "name"],
"limit": 50
}Step 3: Iterate over companies
Add an Iterator module:
- Array:
{{1.results}}
This emits one bundle per company for the downstream modules.
Step 4: Call BuiltWith API
Add an HTTP module:
- URL:
https://api.builtwith.com/v21/api.json?KEY=YOUR_BUILTWITH_KEY&LOOKUP={{2.properties.domain}} - Method: GET
BuiltWith requires a domain, not a company name. If your HubSpot companies don't have a domain property, you'll need to add a step to resolve the domain first — or skip companies without domains. Add a Filter before this module: {{2.properties.domain}} exists.
Step 5: Parse technologies with a Text Parser
Use Make's built-in JSON module → Parse JSON to extract the Technologies array.
Then add a Set Multiple Variables module (under Tools) to categorize the results. Map expressions using Make's map() and join() functions:
| Variable | Value |
|---|---|
tech_stack_crm | CRM tools from the Technologies array |
tech_stack_marketing | Marketing automation tools |
tech_stack_analytics | Analytics tools |
tech_stack_all | All technology names joined |
For complex categorization, use a Code module (available on Core plan) instead:
const techs = input.Results?.[0]?.Result?.Paths?.[0]?.Technologies || [];
const crm = techs.filter(t => /crm/i.test(t.Tag)).map(t => t.Name);
const marketing = techs.filter(t => /marketing|email/i.test(t.Tag)).map(t => t.Name);
const analytics = techs.filter(t => /analytics/i.test(t.Tag)).map(t => t.Name);
return {
tech_stack_crm: crm.join(", ") || "None detected",
tech_stack_marketing: marketing.join(", ") || "None detected",
tech_stack_analytics: analytics.join(", ") || "None detected",
tech_stack_all: techs.map(t => t.Name).join(", "),
};The Code module requires the Core plan ($29/mo). On the Free plan, use a combination of JSON Parse, Text Aggregator, and Filters to achieve the same result — though it takes more modules.
Step 6: Update the HubSpot company
Add an HTTP module:
- Method: PATCH
- URL:
https://api.hubapi.com/crm/v3/objects/companies/{{2.id}} - Headers: Authorization via HubSpot connection
- Body:
{
"properties": {
"tech_stack_crm": "{{4.tech_stack_crm}}",
"tech_stack_marketing": "{{4.tech_stack_marketing}}",
"tech_stack_analytics": "{{4.tech_stack_analytics}}",
"tech_stack_all": "{{4.tech_stack_all}}",
"tech_enrichment_date": "{{formatDate(now; 'YYYY-MM-DD')}}"
}
}Step 7: Add rate limiting and error handling
- Add a Sleep module (2 seconds) between the Iterator and the BuiltWith HTTP call — BuiltWith rate limits vary by plan
- Add a Resume error handler on the BuiltWith module for
429responses - Add a Filter after the BuiltWith module to skip domains that returned no technologies
- Click Run once to test with a few companies
- Toggle the scenario to Active
Cost and credits
- Make Free plan: 1,000 credits/month. Each company uses ~4-5 credits. Handles ~200-250 lookups/month.
- Make Core plan: $29/mo for 10,000 credits. Handles ~2,000-2,500 lookups/month.
- BuiltWith Pro: $295/mo for 500 API calls (
$0.59 per lookup). Enterprise: $495/mo for 2,000 calls ($0.25 per lookup). - Weekly batch of 50 companies: ~50 BuiltWith calls + ~250 Make credits.
On the Pro plan (500 calls/month), a weekly batch of 50 companies uses 200 calls/month — leaving 300 for re-enrichment or ad-hoc lookups. Don't enrich your entire company database at once. Prioritize target accounts and high-value prospects.
Next steps
- Add a Data Store — track which domains have been looked up to avoid duplicate BuiltWith calls on subsequent runs
- Detect competitor tools — add specific variable-setting for whether the company uses a competitor product (
uses_competitor = true/false) - Add to lead scoring — create a HubSpot workflow that adjusts company score based on
tech_stack_crmvalues
Need help implementing this?
We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.