Importing notes into HubSpot is one of those tasks that sounds simple until you try it. The HubSpot docs cover the mechanics of the import tool, the API reference has the endpoints, and the integrations marketplace has dozens of options. The hard part is figuring out which method fits your actual situation: a one-time CSV migration from another CRM is a different problem from an ongoing sync from your Notion workspace, and the right tool for each is genuinely different.
This guide covers the four legitimate methods to get notes into HubSpot, what each one is built for, where each one falls down, and how to pick. By the end you should be able to look at your data shape (how many notes, where they live, how often the import needs to run) and know exactly which method to reach for.
In this article
1.
2.
3.
4.
5.
6.
7.
8.
What "importing notes" actually means in HubSpot
A note in HubSpot is a specific type of activity attached to a contact, company, or deal record. It shows up on the activity timeline alongside emails, meetings, calls, and tasks. Importing notes means creating those activity records programmatically (or in bulk) instead of having a rep type them by hand into the activity composer.
The thing to clarify before picking a method is whether you are importing once or continuously. The two cases split cleanly, and almost every wrong tool choice comes from confusing them.
A one-time migration
Moving from Salesforce to HubSpot, or pulling historical notes out of a spreadsheet. You run it once, validate it, and never touch it again.
A continuous sync
Every new note in Notion or in your AI notetaker should land on the matching HubSpot record. The import never really finishes, because new notes get written every day.
A one-time CSV migration from another CRM is a different problem from an ongoing sync from your Notion workspace, and the right tool for each is genuinely different.
The four methods below split along that line. Two of them are built for the one-time case, and two are built for the continuous case.
Method 1: CSV import through HubSpot's native import tool
The right answer for one-time bulk imports.
- 1
Start the import
In HubSpot, go to Contacts > Import and click Start an import.
- 2
Choose the file
Choose File from computer and select the file.
- 3
Select the Notes object
Choose One file, and on the One object page select Notes under the Engagements category.
- 4
Map the columns
Match each column in the CSV to a HubSpot property. The required mappings are Activity date, Note body, and at least one association property (Contact email, Company domain, or Deal ID).
- 5
Run the import
Kick off the import and let HubSpot handle the matching.
The CSV format that HubSpot expects looks like:
Note Body,Activity Date,Contact Email
"Discovery call summary. Talked about timeline and budget.",2025-08-15,jane@acme.com
"Sent revised proposal with annual discount option.",2025-08-22,jane@acme.com
HubSpot creates a separate note record for each row and attaches it to the matched contact. If multiple contacts share the email, HubSpot attaches the note to all of them. If no match is found, the row is skipped and surfaced in the post-import error log.
Where CSV import shines
- A migration from Salesforce, Pipedrive, or a spreadsheet
- Thousands of notes with clean structure, one row per note
- Association columns already populated
- Runs in minutes with HubSpot handling the matching
Where it falls down
- Notes in the CSV are plain text only
- Headings, bullets, bold, and links get stripped or arrive as raw markdown
- The cleanup tax after a rich-content import can exceed the time saved
- No support for ongoing or repeated imports
For the broader CSV import workflow, the HubSpot note management guide covers the related cleanup patterns.
Method 2: The HubSpot API
The right answer for programmatic imports at scale, custom logic, or ongoing one-direction syncs that you control.
The relevant endpoint is POST /crm/v3/objects/notes, which creates a single note record with associations. The minimum body looks like:
{
"properties": {
"hs_timestamp": "2025-08-15T14:30:00Z",
"hs_note_body": "<p>Discovery call summary.</p>"
},
"associations": [
{
"to": { "id": "1234567" },
"types": [{ "associationCategory": "HUBSPOT_DEFINED", "associationTypeId": 202 }]
}
]
}
hs_note_body accepts HTML, which is what makes the API the right answer when formatting matters. Wrap headings in <h2> tags, bullets in <ul><li>, bold text in <strong>, and the note renders correctly on the HubSpot timeline.
Where the API shines
- Bulk imports with rich content preserved
- Programmatic imports from custom systems
- Ongoing syncs where you control the source side
- Per-team customization of how notes get formatted
Where it falls down
- Requires engineering effort to build and own
- Rate limits of up to 100 requests per 10 seconds per portal on the standard tier
- Auth handling and token rotation
- Maintenance burden a year out when the source or HubSpot changes
If your team does not have engineers, this is the wrong path.
Method 3: Native integrations
For the cases where the source tool has an existing HubSpot connector.
HubSpot's native Notion embed
Lets you embed a Notion page inside a HubSpot contact, company, or deal record. The page renders inside an iframe. The downside is that this is not really an "import" in the sense most teams mean. The note does not land on the activity timeline. It is a viewer for content that lives elsewhere. The post on the Notion HubSpot integration methods covers where this fits and where it does not.
AI notetaker integrations
Granola, Fireflies, Read AI, Avoma, and similar tools have native HubSpot integrations that push the structured meeting summary onto the matched contact or deal as a note. This is the right answer for the meeting-notes-specific case. The best AI notetakers for HubSpot guide covers which ones write to HubSpot cleanly.
Google Workspace integrations
Gmail and Calendar integrations log emails and meeting events automatically. They do not import "notes" per se but they handle the activity-logging side of the same problem.
Method 4: Purpose-built sync tools
The right answer for ongoing imports from a writing tool where rich formatting matters.
The category most teams underbuild is the Notion-to-HubSpot sync. Reps write detailed call summaries, account strategy docs, and meeting notes in Notion because Notion is a better writing environment than HubSpot. The notes need to land on the HubSpot timeline so the rest of the team has the context. Generic automation tools like Zapier and Make can move text between the two but strip Notion's rich content because the block model does not translate cleanly. The output looks ugly and reps stop trusting the workflow.
NoteLinker is built specifically for this pairing. A Sync to HubSpot checkbox on any Notion row pushes the formatted page onto the matching HubSpot contact or deal timeline, with headings, bullets, and bold text preserved. No CSV step, no API code, no Zapier maintenance. The two-minute setup guide covers the install end to end.
For any source tool where notes need to flow continuously into HubSpot and rich formatting matters, a purpose-built tool usually beats a generic automation pipeline.
Import Notion Notes into HubSpot Without the Cleanup Tax
NoteLinker pushes formatted Notion pages onto the matching HubSpot contact and deal timelines automatically. Headings, bullets, and bold text preserved.
Picking the right import method
A short decision framework that holds up.
The fastest path, and you only do it once. Right for moving off another CRM or a spreadsheet where formatting does not matter much.
Right when formatting has to survive or thousands of notes need custom handling. Budget engineering time accordingly.
If the existing integration does what you need, use it. Do not reinvent it.
Right for continuous syncs from Notion or another rich-content source. The maintenance and formatting headaches of any other route add up fast.
Common HubSpot note import mistakes
Four patterns that consistently make imports painful.
Importing without de-duplication checks
Re-running an import without checking for existing notes produces duplicate activities on every contact. HubSpot has no automatic dedup for notes. Use a unique identifier in your CSV (a third-party note ID column) and check against HubSpot's existing notes via the API before re-running.
Skipping the test import
HubSpot's import tool offers a 100-row sample import option. Use it. It catches mapping errors, encoding issues, and association mismatches before they propagate to ten thousand rows.
Importing notes without associations
A note with no contact, company, or deal association lands in HubSpot orphaned. It is technically there. Nobody will ever find it. Always include at least one association column (Contact email, Company domain, or Deal ID) and validate that the values match existing HubSpot records before importing.
Pasting transcripts as notes
AI notetaker transcripts are useful raw data and are usually too long to be useful as HubSpot notes. Import the summary, not the transcript. Attach the transcript as a file if it matters for compliance.
Before you run any import
- Decide whether this is a one-time migration or a continuous sync, and pick the method to match.
- Run the 100-row sample import and review the result before the full load.
- Confirm every row has at least one valid association (Contact email, Company domain, or Deal ID).
- Add a unique note ID column so a re-run does not create duplicates.
- Import summaries rather than full transcripts, and attach transcripts as files where needed.
The right import method for your data is whichever one matches the import frequency, the content richness, and the team's engineering capacity. Pick deliberately, set up the dedup discipline, and the notes will land where reps actually look for them.


