Import recently funded companies from Crunchbase into HubSpot using n8n

medium complexityCost: $0-24/mo

Prerequisites

Prerequisites
  • n8n instance (cloud or self-hosted)
  • Crunchbase API key (requires Enterprise or API/Data License plan)
  • HubSpot private app token with crm.objects.companies.read and crm.objects.companies.write scopes
  • Custom HubSpot company properties for funding data (recommended: funding_stage, funding_amount, funding_date, investors)
  • n8n credential configured for HubSpot
Crunchbase API requires Enterprise plan

The search endpoints used in this workflow (/searches/funding_rounds, /searches/organizations) require a Crunchbase Enterprise or API/Data License plan. The Pro plan only provides Zapier integration and CSV exports, not direct API access. Pricing starts at ~$49/mo for basic API access.

Why n8n?

n8n gives you a visual workflow editor with a built-in Code node for custom logic — ideal for this recipe, which requires pagination, ICP filtering, domain normalization, and deduplication. Self-hosted n8n is completely free with unlimited executions, and the Schedule Trigger node runs your workflow on a set cadence without any external scheduler.

The HTTP Request node handles Crunchbase and HubSpot API calls directly, while the Code node lets you do ICP filtering and domain extraction in a few lines of JavaScript. The Split In Batches node handles the iteration loop. The trade-off vs. pure code is that debugging multi-step API flows in the visual editor can be harder when responses are deeply nested — but you get execution history and retry handling for free.

Step 1: Add a schedule trigger

Create a new workflow and add a Schedule Trigger node:

  • Rule: Every day at 8:00 AM (or weekly on Mondays — adjust to your preferred cadence)

This kicks off a daily check for new funding rounds.

Step 2: Search Crunchbase for recent funding rounds

Add an HTTP Request node to search for funding rounds announced in the last 30 days:

  • Method: POST
  • URL: https://api.crunchbase.com/api/v4/searches/funding_rounds
  • Headers: X-cb-user-key: YOUR_CRUNCHBASE_API_KEY
  • Body:
{
  "field_ids": [
    "identifier",
    "announced_on",
    "money_raised",
    "funded_organization_identifier",
    "investment_type",
    "investor_identifiers"
  ],
  "query": [
    {
      "type": "predicate",
      "field_id": "announced_on",
      "operator_id": "gte",
      "values": ["{{$now.minus(30, 'days').format('yyyy-MM-dd')}}"]
    },
    {
      "type": "predicate",
      "field_id": "investment_type",
      "operator_id": "includes",
      "values": ["series_a", "series_b", "series_c", "series_d"]
    }
  ],
  "limit": 100
}
Filter by funding stage

Adjust the investment_type filter to match your ICP. Series A companies are actively building and buying tools. Seed-stage may be too early. Series C+ may already have established vendor relationships.

Step 3: Loop through funding rounds

Add a Split In Batches node to iterate over the entities array from the Crunchbase response. Each entity contains the funding round details and a reference to the funded organization.

Step 4: Fetch organization details

For each funding round, add an HTTP Request node to get company details:

  • Method: GET
  • URL: https://api.crunchbase.com/api/v4/entities/organizations/{{ $json.properties.funded_organization_identifier.uuid }}
  • Headers: X-cb-user-key: YOUR_CRUNCHBASE_API_KEY
  • Query params: field_ids=short_description,categories,location_identifiers,num_employees_enum,website_url,linkedin

Step 5: Filter for ICP matches

Add an IF node to filter companies by your criteria:

  • Condition 1: num_employees_enum matches your target range (e.g., c_0051_0100, c_0101_0250)
  • Condition 2: Company has a website_url (needed for HubSpot domain)

Step 6: Check for existing companies in HubSpot

Add an HTTP Request node:

  • Method: POST
  • URL: https://api.hubapi.com/crm/v3/objects/companies/search
  • Body:
{
  "filterGroups": [{
    "filters": [{
      "propertyName": "domain",
      "operator": "EQ",
      "value": "{{ $json.properties.website_url.replace('https://', '').replace('http://', '').replace('www.', '').split('/')[0] }}"
    }]
  }]
}

Add an IF node: proceed only if total equals 0.

Step 7: Create company in HubSpot

Add an HTTP Request node:

  • Method: POST
  • URL: https://api.hubapi.com/crm/v3/objects/companies
  • Body:
{
  "properties": {
    "domain": "{{ $json.org.properties.website_url }}",
    "name": "{{ $json.org.properties.identifier.value }}",
    "industry": "{{ $json.org.properties.categories[0].value }}",
    "description": "{{ $json.org.properties.short_description }}",
    "funding_stage": "{{ $json.round.properties.investment_type }}",
    "funding_amount": "{{ $json.round.properties.money_raised.value }}",
    "funding_date": "{{ $json.round.properties.announced_on }}",
    "investors": "{{ $json.round.properties.investor_identifiers.map(i => i.value).join(', ') }}"
  }
}
Create custom properties first

HubSpot will reject properties that don't exist. Before running this workflow, create the custom company properties: funding_stage (single-line text), funding_amount (number), funding_date (date), and investors (single-line text) in HubSpot Settings → Properties.

Step 8: Activate and test

  1. Click Execute Workflow to run a test pass
  2. Verify companies appear in HubSpot with correct funding data
  3. Toggle the workflow to Active

Troubleshooting

Common questions

Does processing 100 funding rounds count as 100 n8n executions?

No. The entire workflow — trigger, all API calls, filtering, company creation — counts as 1 execution. Even if you process 100 funding rounds and create 50 companies, it's still 1 execution. Each iteration within a Split In Batches node is part of the same execution.

Will the Crunchbase API rate limit me during a large run?

Crunchbase allows 200 requests/minute. Each funding round requires 1 organization lookup, so 100 rounds = ~100 API calls. The Split In Batches node processes items sequentially with natural latency between steps, which usually keeps you well under the limit. For larger runs (200+ rounds), add a Wait node with a 200ms delay inside the loop.

How do I handle Crunchbase pagination in n8n?

The search API returns max 100 results per page. For most weekly runs, 100 is sufficient. If you need more, add a loop: after the Crunchbase search node, check if the response contains 100 entities. If so, make another request with after_id set to the last entity's UUID. Use a Loop node or recursive sub-workflow.

Can I run this weekly instead of daily?

Yes. Change the Schedule Trigger to run weekly (e.g., Monday at 8 AM) and adjust the date filter in the Crunchbase search body to look back 7 days instead of 30. Weekly runs reduce API usage and are usually sufficient — funding announcements don't require same-day action.

Cost

  • n8n Cloud Starter: $24/mo for 2,500 executions. Daily run = ~30 executions/month (1 per day).
  • Self-hosted n8n: Free.
  • Crunchbase API: Enterprise plan required. Pricing varies — contact Crunchbase sales. Basic API access starts around $49/mo.

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.