Back to Blog

How to Import Notes into HubSpot (CSV, API, and Sync Tools)

Four ways to import notes into HubSpot, from CSV uploads to API to sync tools. Trade-offs of each method and how to pick the right one for your data.

Michael McGarvey

Michael McGarvey

June 8, 2026·8 min read
A HubSpot import dialog showing notes being uploaded onto contact and deal records

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.

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: are you importing once or continuously? A one-time migration (e.g., moving from Salesforce to HubSpot, or pulling historical notes out of a spreadsheet) is a different problem from a continuous sync (every new note in Notion or in your AI notetaker should land on the matching HubSpot record). The methods below split cleanly along that line.

Method 1: CSV import through HubSpot's native import tool

The right answer for one-time bulk imports.

The setup:

  1. In HubSpot, go to Contacts > Import and click Start an import.
  2. Choose File from computer and select the file.
  3. Choose One file, and on the One object page select Notes under the Engagements category.
  4. 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.

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 this method shines. A migration from Salesforce, Pipedrive, or a custom spreadsheet where you have thousands of notes with clean structure (one row per note, association columns populated). The import runs in minutes and HubSpot handles the matching.

Where it falls down. Rich content. Notes in the CSV are plain text. Any formatting (headings, bullet points, bold text, links) gets stripped or arrives as raw markdown that HubSpot renders as plain text. The cleanup tax after the import is usually higher than the time saved by importing in the first place if the notes were rich.

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 this method shines. Bulk imports with rich content. 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. Rate limits (HubSpot allows up to 100 requests per 10 seconds per portal on the standard tier). Auth handling. Maintenance burden a year out when the source system changes or HubSpot rotates an API. 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.

These integrations are the right answer when they exist for your specific source tool. The trade-off is that you only get what the integration was built for. Anything custom requires a different path.

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.

The pattern generalizes. 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.

Try NoteLinker Free

Picking the right import method

A short decision framework that holds up.

If you are doing a one-time migration from another CRM or a spreadsheet, and the notes are mostly plain text, use CSV import. It is the fastest path and you only do it once.

If you are doing a one-time migration with rich content (or thousands of notes that need custom logic), use the HubSpot API and budget engineering time accordingly.

If your source tool has a native HubSpot integration that does what you need, use the native integration. Do not reinvent it.

If you need ongoing imports from a writing tool (especially Notion or another rich-content source), use a purpose-built sync tool. The maintenance and formatting headaches of doing it any other way 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.

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.


Get HubSpot and Notion tips delivered straight to your inbox

We'll email you 1-3 times per week, and never share your information.