How to Import CSV into Notion
Import CSV files into Notion databases - create new databases or add to existing ones. Includes critical limitations like the merge duplicate issue, row limits, and column type detection.

Notion makes importing CSV files easy—until you need to update existing data. Then you hit the wall that frustrates everyone: Notion's "Merge with CSV" feature doesn't update existing rows. It creates duplicates.
This guide covers both import methods, explains column type detection, and shows you the workarounds for Notion's limitations. (Yes, there are workarounds. They're not pretty, but they work.)
Two Ways to Import CSV into Notion
Notion gives you two import methods. They behave very differently:
| Method | What It Does | Use Case |
|---|---|---|
| Native CSV Import | Creates a new database from your CSV | Starting fresh, one-time imports |
| Merge with CSV | Adds rows to an existing database | Ongoing data additions |
Pick the wrong one and you'll end up with duplicate data everywhere.
Method 1: Import CSV to Create a New Database
This is the standard import. It takes your CSV and creates a brand new Notion database.
Step-by-Step Instructions
-
Open Notion on desktop or web (CSV import doesn't work on mobile)
-
Navigate to Settings
- Click "Settings" in your sidebar, or type
/csvanywhere in Notion
- Click "Settings" in your sidebar, or type
-
Select Import → CSV
- Choose "Import" from the settings menu
- Click "CSV" from the options
-
Upload your file
- Select your
.csvfile - Notion only accepts
.csv—not.xlsxor.xls
- Select your
-
Review the import preview
- Notion shows you what your data looks like
- You can adjust column types here
-
Complete the import
- Click "Import" to create your new database
What Happens During Import
When Notion processes your CSV:
- The first row becomes column headers. Every column in row 1 becomes a property name.
- The first text column becomes the title property. This is your database's primary key—choose wisely before importing.
- Column types are auto-detected. Sometimes Notion gets this wrong, and you'll need to fix it manually.
This method works fine for one-time imports. If you need ongoing updates, keep reading.
Method 2: Merge CSV with an Existing Database
Already have a Notion database? Use "Merge with CSV" to add more data.
Step-by-Step Instructions
-
Open your existing database as a full page (not inline—this matters)
-
Access the menu
- Click the three dots (
•••) at the top right
- Click the three dots (
-
Select "Merge with CSV"
-
Upload your CSV file
-
Map your columns
- Match CSV columns to existing database properties
- Headers must match property names exactly
-
Complete the merge
The Critical Limitation: Merge Creates Duplicates
Here's where people get burned. From Notion's own documentation:
"Imports from CSV to existing database will add rows to the database, not update existing rows. Watch out for duplicate data."
So if you have "John Smith" in your database, and you import a CSV with updated info for "John Smith"—you get two John Smiths. Not one updated record. Two separate rows.
There's no built-in deduplication. Every merge adds new rows. Period.
Workarounds for the Duplicate Problem
Option 1: Manual cleanup Sort by a unique field, find the duplicates, delete them by hand. Tedious, but it works for small imports.
Option 2: Nuclear option Delete all existing rows, then import your complete CSV. You lose Notion-specific data like comments and linked database connections.
Option 3: Command-line tools
Tools like csv2notion and csv2notion-neo can actually update existing rows. You'll need to be comfortable with the terminal and API tokens.
Option 4: Automation platforms Make, Zapier, n8n—these can match on unique identifiers and update records properly. More setup work, but you get real sync.
Column Type Auto-Detection
Notion's import wizard looks at your data and guesses property types. It's pretty good, honestly, though not perfect.
Supported Property Types
| Property Type | Auto-Detected? |
|---|---|
| Text | Yes |
| Number | Yes |
| Select | Sometimes |
| Multi-select | Sometimes |
| Date | Yes (MM/DD/YYYY format) |
| Checkbox | Yes |
| URL | Yes |
| Yes | |
| Phone | Yes |
| Person | No |
| Files & media | No |
How Detection Works
Notion checks the values in each column:
- Numbers: All numeric? Becomes Number type.
- Dates: MM/DD/YYYY format? Becomes Date.
- URLs: Starts with http? URL property.
- Booleans: true/false values? Checkbox.
Here's the catch: if even one cell has mixed data, Notion defaults to Text. A column with 99 numbers and 1 text value becomes Text. Safe, but annoying.
Properties You Can't Import
These are auto-generated by Notion—you can't set them via CSV:
- Created time / Created by
- Last edited time / Last edited by
- Formula, Rollup, Button
- ID (auto-number)
You also cannot import into relation properties. Notion's docs are clear: "CSV columns cannot be merged with Notion relation properties." Want to populate relations? Do it manually or use third-party tools.
Size and Row Limits
Notion doesn't publish hard limits, but they exist.
File Size
| Plan | Maximum Upload |
|---|---|
| Free | 5 MB |
| Paid | 200 MB |
Practical Row Limits
There's no official row cap, but things get slow past 10,000 rows. Very large CSVs can time out, partially fail, or make your database painfully slow.
Dealing with Large Files
If your CSV is huge:
- Split it into 5,000-8,000 row chunks
- Import separately into different databases
- Use command-line tools like csv2notion—they don't have the web interface's limits
Preparing Your CSV
Clean data imports cleanly. Garbage in, garbage out.
You Need: Header Row
First row = column headers. No header row means your first data row becomes property names. (Ask me how I know.)
You Need: UTF-8 Encoding
Garbled characters after import? Encoding problem. Almost always.
How to get UTF-8:
- Excel: Save As → CSV UTF-8 (Comma delimited)
- Google Sheets: File → Download → CSV (it's automatic)
- Numbers: Export To → CSV, select Unicode (UTF-8)
Quick Checklist
| Thing | Why |
|---|---|
| Unique headers | Duplicate column names = confusion |
| No blank headers | Creates unnamed properties |
| Consistent date format | MM/DD/YYYY works best |
| No stray commas | Extra commas = phantom columns |
| Closed quotes | Unclosed quotes break everything |
First Column Matters
Notion uses the first text column as your title property. If your first column is an ID number, that becomes your title. Probably not what you want.
Fix: Reorder columns before import. Put the descriptive field first.
Common Import Errors
"Import failed" or Timeout
File's too big. Split your CSV—stay under 10,000 rows.
Garbled Characters
Wrong encoding. Re-export with UTF-8.
Wrong Column Types
Mixed data in columns. Clean your source data, or fix property types manually after import (though you might lose data).
Missing Data or Extra Columns
Formatting issues—stray commas, unclosed quotes. Open your CSV in a text editor and look for problems.
"Merge with CSV" Not Showing Up
Your database is inline, not full-page. Open it as a full page first.
Duplicate Data After Merge
Not a bug. It's how Notion works. See the workarounds section.
Third-Party Tools
When native import fails you, these tools can help.
csv2notion
A Python CLI tool with features Notion should have built in:
pip install csv2notion
csv2notion --token YOUR_TOKEN --url DATABASE_URL your_file.csvWhat you get: true merge (updates existing rows), manual column types, relation handling, duplicate detection.
csv2notion-neo
An enhanced fork with JSON support. Worth checking out.
Automation Platforms
Make, Zapier, n8n can do scheduled imports, proper record updates, and even relation population. Setup's more involved, but you get actual sync instead of "add more duplicates."
Notion API
For developers who want full control:
| Endpoint | Purpose |
|---|---|
| POST /v1/pages | Create pages |
| PATCH /v1/pages/{id} | Update existing pages |
Downsides: no bulk endpoint (you loop through records one by one), rate limited to 3 requests/second.
FAQ
Can I import CSV on mobile?
No. Desktop and web only.
Maximum columns?
50 properties, including system-generated ones.
Can I import into a linked database view?
No. Import into the source database.
What about non-US date formats?
Notion likes MM/DD/YYYY. Other formats often import as text. You can change the property type after, with mixed results.
Can I import files or images?
Not really. You can include URLs, but they import as URL properties, not file attachments.
Does formatting survive?
No. CSV is plain text. Bold, links, all that—gone.
Can I undo an import?
Nope. Delete the database (new imports) or manually remove the rows (merges).
When Native Import Falls Short
Notion's CSV import handles basic, one-time imports fine. But it breaks down when you need:
- Real sync: Update records instead of creating duplicates
- Scale: 10,000+ rows without timeouts
- End-user uploads: Let users import CSVs with validation
- Column mapping: Match arbitrary CSV columns to your schema
For these cases, purpose-built tools make more sense. ImportCSV gives you a drop-in importer with column mapping, validation, and webhook delivery—no need to build the UI yourself.
Bottom line: Notion's CSV import does the basics. Just know that merge creates duplicates (not updates), performance tanks past 10,000 rows, and some property types can't be imported at all. For anything beyond simple imports, you'll need third-party tools or the API.
Wrap-up
CSV imports shouldn't slow you down. ImportCSV aims to expand into your workflow — whether you're building data import flows, handling customer uploads, or processing large datasets.
If that sounds like the kind of tooling you want to use, try ImportCSV .