Find them without leaving Notion
Before exporting anything, make the duplicates visible in a view. Two things work well:
- Sort by the property that should be unique (title, email, order number). Repeats land next to each other, which is enough for a database of a few hundred rows.
- Group by that property in a table or board view. Notion shows a count on each group heading, so every group with a count above 1 is a duplicate set. This scales much better than scrolling a sorted list.
If you only have a handful, stop here: select the extra pages with the checkboxes on the left of a table row and delete them. Deleted pages go to Trash and can be restored.
Export, clean, then delete in place
For a database large enough that eyeballing it is not realistic, get the data out and let a tool count for you.
- Open the database as a full page, click the ••• menu at the top right, choose Export, and set the format to Markdown & CSV. Notion emails or downloads a file (a .zip when the export contains more than one file).
- Open the CSV in the CSV dedupe tool, pick the column that defines a duplicate, and run it. The removed count tells you how many extras exist. Turn on fuzzy matching if the values are typed by hand and vary in spacing or capitalisation, which is best on lists under a few thousand rows.
- Use the result as a worklist and delete those pages inside Notion.
Why not just re-import the clean file
Because a Notion import is an insert, not an upsert. There is no key column that makes Notion recognise "this row is that page", so every imported row becomes a brand new page with a new ID. That means relations pointing at the old pages, rollups built on those relations, comments, and anything you wrote in the body of a page all stay behind. If your database is a flat list with no relations and no page content, re-importing into a new empty database is fine and fast. If it is wired into the rest of your workspace, delete in place instead.
Stopping them coming back
Most duplicate rows in Notion arrive from an automation or a form, not from a person. If a Zapier, Make, or n8n step creates a page every run, add a search or find step before it so the automation updates when a match exists. And keep the export: it is the only backup of the rows you are about to delete. Cleaning a contact list rather than a project database? The CRM contact dedupe workflow covers the same export and clean loop with the re-import step done safely.
FAQ
Frequently asked questions
Does Notion have a built-in way to remove duplicates?
No. There is no dedupe command in a Notion database. You can surface duplicates with a view (sort by the title property, or group by the property that should be unique) and then delete the extra pages by hand, but nothing removes them for you.
What happens if I re-import a cleaned CSV?
Notion creates new pages. Imported rows never update existing pages by matching on a key, so importing a cleaned export into a database that still holds the originals doubles it. Import into a fresh empty database instead.
What do I lose in the export and re-import round trip?
Page IDs, and everything attached to them: relations, rollups that point at the old pages, comments, and any content written inside a page below its properties. Links elsewhere in your workspace that point at the old pages break too.
Is there a safer option than re-importing?
Yes, and it is usually the right one. Use the exported CSV only to work out which rows are duplicates, then delete those specific pages inside Notion. Nothing is recreated, so relations and page content survive.
Last updated