Install any skill in seconds. Free to start, no credit card required.
Get Started Free →jeremylongshore/hubspot-bulk-migration
Bulk-migrate CRM data into HubSpot from Salesforce, Pipedrive, or Copper — or export off HubSpot — with field mapping, ID continuity, association re-linking, dedup safety, rate-limit budgeting, and rollback mitigation across 100K+ record datasets.
Passed 18 of 22 test cases with the skill, and 14 of 22 without it.
and 5 more in the full report
6 fixed12 passed either way2 still failing2 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 6 test cases the skill fixed. Same model, same prompt, with and without the skill.
I need a Python script to migrate our CRM records from Pipedrive exports into HubSpot using their API. We have CSV files for our organizations, contacts, and deals. Please write code that ensures we don't lose our Pipedrive record IDs, links the records together properly after importing, normalizes email addresses to avoid duplicate contacts, validates data against HubSpot's property schemas prior to making writes, and saves a local mapping file so we can undo the import if something goes wrong.
| Checked | Without skill | With skill |
|---|---|---|
| Creates custom source ID properties programmatically via POST /crm/v3/properties/{object_type} before importing records. | Missed | Passed |
| Imports contact records using the batch upsert endpoint /crm/v3/objects/contacts/batch/upsert. | Missed | Passed |
| Re-links record associations in a post-import pass using the batch association endpoint /crm/v4/associations/{from_type}/{to_type}/batch/create. | Missed | Passed |
The instructions your model reads when the skill loads.
Move CRM data into HubSpot from Salesforce, Pipedrive, or Copper — or extract it back out — without losing cross-system IDs, breaking associations, or flooding the portal with duplicates. This is not a data-mapping worksheet. It is the code, sequencing, and guardrails your migration runs at 2am against 150K records when the daily API quota is finite, HubSpot has no bulk-delete API, and a bad import leaves permanent junk that requires a support ticket to remove.
The six production failures this skill addresses:
source_crm_id property on every object type before the first record lands, and write the source ID into it during import.batch/upsert not batch/create for contacts.M/D/Y format fail HubSpot's ISO 8601 validation; multi-picklist values not in HubSpot's allowed enumeration are silently dropped. Fix: run a pre-migration dry-run that validates every field against HubSpot's property schema before writing a single record.source_id → hubspot_id mapping file throughout the migration so batch/archive calls are programmable.Auth: set HUBSPOT_ACCESS_TOKEN environment variable to a private app token with CRM write scopes. For token caching, rotation, and multi-portal routing see the hubspot-auth skill in this pack.
crm.objects.contacts.write, crm.objects.companies.write, crm.objects.deals.write, crm.associations.write, crm.schemas.contacts.writepip install requests)HUBSPOT_ACCESS_TOKEN set in environmentBefore importing a single record, create a custom property on every object type to store the source CRM's record ID. Treat 409 CONFLICT as success — property creation is idempotent.
import os, requests
TOKEN = os.environ["HUBSPOT_ACCESS_TOKEN"]
BASE = "https://api.hubapi.com"
HDRS = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
def create_source_id_property(object_type: str, source_crm: str) -> None:
prop_name = f"{source_crm}_id"
payload = {
test cases passed, vs 14 / 22 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.