HubSpot Lead Pusher
Pricing
Pay per usage
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
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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
- Go to your HubSpot account → Settings → Integrations → Private Apps
- Click Create a private app
- Name it "Apify Lead Pusher" (or anything)
- Under Scopes, enable:
crm.objects.contacts.writecrm.objects.contacts.readcrm.objects.companies.writecrm.objects.companies.readcrm.objects.deals.write(if using deals)crm.objects.deals.read(if using deals)
- Click Create app and copy the access token
- Paste it into the HubSpot Access Token field
Input
| Field | Type | Default | Description |
|---|---|---|---|
hubspotAccessToken | string | — | Private app access token (leave empty for dry run) |
leads | object[] | — | Inline lead data array |
datasetId | string | — | Apify dataset ID to pull leads from |
createCompanies | boolean | true | Create/update company records |
createContacts | boolean | true | Create/update contact records |
createDeals | boolean | false | Create deals for sales pipeline |
dealStage | string | "appointmentscheduled" | HubSpot deal stage for new deals |
lifecycleStage | string | "lead" | Lifecycle stage for new contacts |
dryRun | boolean | false | Preview 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
- Run B2B Lead Gen Suite with your target websites
- Copy the output dataset ID
- Run HubSpot Lead Pusher with that dataset ID
From Google Maps Lead Enricher
Google Maps Lead Enricher → HubSpot Lead Pusher
- Run Google Maps Lead Enricher with your search query
- Copy the output dataset ID
- 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 ApifyClientclient = 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 firstconst leadsRun = await client.actor('ryanclinton/b2b-lead-gen-suite').call({urls: ['stripe.com', 'shopify.com', 'notion.so'],});// Push results to HubSpotconst hubspotRun = await client.actor('ryanclinton/hubspot-lead-pusher').call({hubspotAccessToken: 'YOUR_HUBSPOT_TOKEN',datasetId: leadsRun.defaultDatasetId,});
Field mapping
| Lead Field | HubSpot Property | Object |
|---|---|---|
domain | domain | Company |
companyName | name | Company |
phones[0] | phone | Company |
city | city | Company |
state | state | Company |
country | country | Company |
industry | industry | Company |
socials.linkedin | linkedin_company_page | Company |
contacts[].email | email | Contact |
contacts[].name | firstname + lastname | Contact |
contacts[].title | jobtitle | Contact |
grade A | hs_lead_status = "OPEN" | Contact |
grade B/C | hs_lead_status = "IN_PROGRESS" | Contact |
grade D/F | hs_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
