HubSpot Lead Pusher avatar

HubSpot Lead Pusher

Pricing

Pay per usage

Go to Apify Store
HubSpot Lead Pusher

HubSpot Lead Pusher

Push leads into HubSpot CRM as contacts, companies, and deals. Batch upsert by domain/email prevents duplicates. Dry-run preview mode. Works with any Apify scraper output.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

ryan clinton

ryan clinton

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Push scraped leads directly into HubSpot CRM. Auto-creates contacts, companies, and deals from B2B lead data. Batch upsert with duplicate handling. Dry-run preview mode.

What it does

Give it a list of leads (from our pipeline or your own data) and it:

  • Creates/updates companies in HubSpot from domains
  • Creates/updates contacts from emails with name, title, and lifecycle stage
  • Creates deals for sales pipeline automation (optional)
  • Associates contacts with companies automatically
  • Handles duplicates via batch upsert (updates if exists, creates if new)
  • Dry-run mode — preview mapped HubSpot properties without pushing

Key features

  • Pipeline integration — auto-maps output from B2B Lead Gen Suite and Google Maps Lead Enricher
  • Batch operations — up to 100 records per API call for maximum efficiency
  • Duplicate safe — uses HubSpot's upsert endpoint (no 409 conflict errors)
  • Rate limiting — respects HubSpot free tier limits (100 requests/10 seconds)
  • Error resilience — continues on partial failures, reports errors per lead
  • Dry-run mode — preview exactly what will be pushed before committing
  • Flexible input — inline JSON leads or Apify dataset ID

Setup: HubSpot Access Token

  1. Go to your HubSpot account → SettingsIntegrationsPrivate Apps
  2. Click Create a private app
  3. Name it "Apify Lead Pusher" (or anything)
  4. Under Scopes, enable:
    • crm.objects.contacts.write
    • crm.objects.contacts.read
    • crm.objects.companies.write
    • crm.objects.companies.read
    • crm.objects.deals.write (if using deals)
    • crm.objects.deals.read (if using deals)
  5. Click Create app and copy the access token
  6. Paste it into the HubSpot Access Token field

Input

FieldTypeDefaultDescription
hubspotAccessTokenstringPrivate app access token (leave empty for dry run)
leadsobject[]Inline lead data array
datasetIdstringApify dataset ID to pull leads from
createCompaniesbooleantrueCreate/update company records
createContactsbooleantrueCreate/update contact records
createDealsbooleanfalseCreate deals for sales pipeline
dealStagestring"appointmentscheduled"HubSpot deal stage for new deals
lifecycleStagestring"lead"Lifecycle stage for new contacts
dryRunbooleanfalsePreview mapped data without pushing

Lead data format

Each lead object supports these fields (all optional — use what you have):

{
"domain": "stripe.com",
"companyName": "Stripe",
"emails": ["hello@stripe.com"],
"phones": ["+1-888-926-2289"],
"contacts": [
{"name": "Patrick Collison", "title": "CEO", "email": "patrick@stripe.com"}
],
"socials": {"linkedin": "https://linkedin.com/company/stripe"},
"score": 92,
"grade": "A",
"city": "San Francisco",
"state": "CA",
"country": "US",
"industry": "Financial Services"
}

This format matches the output of B2B Lead Gen Suite and Google Maps Lead Enricher, so you can chain them directly.

Example output

{
"domain": "stripe.com",
"status": "success",
"dryRun": false,
"company": {
"id": "12345678",
"name": "Stripe",
"domain": "stripe.com",
"status": "created"
},
"contacts": [
{
"id": "87654321",
"email": "patrick@stripe.com",
"name": "Patrick Collison",
"status": "created"
}
],
"deal": null,
"associations": {"contactToCompany": 1},
"errors": []
}

Pipeline integration

Chain with our B2B lead generation actors for a complete workflow:

From B2B Lead Gen Suite

B2B Lead Gen Suite → HubSpot Lead Pusher
  1. Run B2B Lead Gen Suite with your target websites
  2. Copy the output dataset ID
  3. Run HubSpot Lead Pusher with that dataset ID

From Google Maps Lead Enricher

Google Maps Lead Enricher → HubSpot Lead Pusher
  1. Run Google Maps Lead Enricher with your search query
  2. Copy the output dataset ID
  3. Run HubSpot Lead Pusher with that dataset ID

Full pipeline

Google Maps Lead Enricher → Website Tech Stack Detector → HubSpot Lead Pusher

API usage

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/hubspot-lead-pusher").call(
run_input={
"hubspotAccessToken": "YOUR_HUBSPOT_TOKEN",
"leads": [
{
"domain": "stripe.com",
"companyName": "Stripe",
"contacts": [{"name": "Patrick Collison", "title": "CEO", "email": "patrick@stripe.com"}],
"score": 92,
"grade": "A"
}
]
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['domain']}: {item['status']}{len(item['contacts'])} contact(s)")

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('ryanclinton/hubspot-lead-pusher').call({
hubspotAccessToken: 'YOUR_HUBSPOT_TOKEN',
leads: [
{
domain: 'stripe.com',
companyName: 'Stripe',
contacts: [{ name: 'Patrick Collison', title: 'CEO', email: 'patrick@stripe.com' }],
score: 92,
grade: 'A',
},
],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
console.log(`${item.domain}: ${item.status}${item.contacts.length} contact(s)`);
});

Chain with another actor

// Run Lead Gen Suite first
const leadsRun = await client.actor('ryanclinton/b2b-lead-gen-suite').call({
urls: ['stripe.com', 'shopify.com', 'notion.so'],
});
// Push results to HubSpot
const hubspotRun = await client.actor('ryanclinton/hubspot-lead-pusher').call({
hubspotAccessToken: 'YOUR_HUBSPOT_TOKEN',
datasetId: leadsRun.defaultDatasetId,
});

Field mapping

Lead FieldHubSpot PropertyObject
domaindomainCompany
companyNamenameCompany
phones[0]phoneCompany
citycityCompany
statestateCompany
countrycountryCompany
industryindustryCompany
socials.linkedinlinkedin_company_pageCompany
contacts[].emailemailContact
contacts[].namefirstname + lastnameContact
contacts[].titlejobtitleContact
grade Ahs_lead_status = "OPEN"Contact
grade B/Chs_lead_status = "IN_PROGRESS"Contact
grade D/Fhs_lead_status = "UNQUALIFIED"Contact

Limitations

  • Requires a HubSpot account (free tier works fine)
  • HubSpot free tier: 100 API requests per 10 seconds, 250K per day
  • Batch size: 100 records per request (HubSpot maximum)
  • Deal creation is create-only (no upsert) — may create duplicates if run multiple times