CSV to Airtable: Clean and Merge Rows by Unique Key Before You Import
Airtable's CSV import extension can merge a CSV into an existing table so imports update records instead of creating duplicates. It works by matching a field you pick, the merge field, against a column in your CSV. The catch: the merge only behaves the way you expect if your file is already clean. If your unique-key column has duplicate values, Airtable keeps only the first matching row and silently drops the rest. If a cell is blank, it can overwrite good data in your base depending on one toggle. This guide shows you exactly what to fix in the CSV before you open the import extension.
How the Airtable CSV merge actually works
When you add the CSV Import extension to a base and turn on "Merge with existing records," Airtable asks you to choose a merge field. That field is your unique key: an ID number, a SKU, an email address, anything that identifies a row uniquely. Airtable compares each row in your CSV against the existing records using that field. On a match, it updates the matched record with the CSV's values. When a CSV row has no match in the table, the extension creates a new record instead. So a single import can update some rows and add others in one pass.
The behavior that trips people up lives in the details of that matching step, and those details are why pre-cleaning matters more than any import setting.
Three matching rules from Airtable's own documentation decide whether your merge succeeds:
- Matching on the merge field is case-sensitive. Airtable treats sampleemail@example.com and SampleEmail@example.com as two different values, so casing differences create duplicate records instead of updates.
- Leading and trailing whitespace is ignored when finding matches. A trailing space on a key will not break the match, but it can still cause other problems downstream.
- If your CSV contains multiple rows with the same value in the merge field, the extension uses only the first of those rows. Every later duplicate is ignored.
That last rule is the big one. If your export has two rows for the same SKU, Airtable imports the first and throws away the second without warning. If the second row held the newer price or the corrected address, you just lost it. Dedupe the unique-key column before you import, and decide which duplicate wins on purpose.
Why blank cells overwrite good data
Once "Merge with existing records" is on, Airtable shows a second option: "Skip blank or invalid CSV values." It exists because of a specific failure. Say a record in your base already has a phone number, and the CSV row that matches it has an empty phone cell. With skip turned off, the merge writes that blank over the existing number and you lose it. With skip on, Airtable leaves the existing value alone when the CSV cell is blank.
That toggle sounds like it solves the whole problem, but leaning on it is risky for two reasons. First, "blank" is narrower than "bad." A cell containing the literal text N/A, null, or a lone hyphen is not blank to Airtable; it is a value, and it will happily overwrite your clean data. Second, the toggle is global. It applies to every column at once, so you cannot say "skip blanks in phone but let blanks clear the notes field." Cleaning the file first gives you column-level control that the checkbox cannot.
Pro tip: standardize your placeholder values (N/A, NULL, None, --) to true empty cells before import. Then "Skip blank or invalid CSV values" catches all of them, and you get predictable behavior instead of a mix of skipped blanks and overwriting text placeholders.
What are the Airtable CSV import limits?
Two hard limits govern the CSV Import extension, and both are easy to hit with a raw export from an accounting system or a marketplace.
Per Airtable's support documentation, the CSV Import extension caps out at:
- 25,000 rows per import. A larger export has to be split into multiple files, and each split has to carry the header row and a clean unique-key column of its own.
- 5 MB per CSV file. A file under 25,000 rows can still exceed 5 MB if rows are wide or hold long text, so watch the file size, not just the row count.
There is also a first-row-as-field-names option in the import flow. Airtable reads your first row as the column headers that it maps to table fields. If your export starts with a title row, a date-range banner, or a couple of blank lines above the real header, the mapping step reads garbage and your merge field will not line up with the right column. Strip those report headers so row one is your true header row.
How to prep a CSV for a clean Airtable merge
Run through this checklist before you touch the import extension. It maps one-to-one to the ways a merge goes wrong.
Pre-import checklist for a merge that updates instead of duplicates:
- Remove report headers and footers so the true header row is row one.
- Confirm your merge field exists as a single, clearly named column (id, sku, email) and that the header matches nothing else by accident.
- Trim whitespace on the unique-key column so stray spaces do not haunt you later, even though Airtable trims for matching.
- Normalize the case of your unique key if the source is inconsistent, because matching is case-sensitive.
- Dedupe the unique-key column so each key appears once, and make sure the surviving row is the one you actually want to keep.
- Standardize placeholder text (N/A, null, None, -) to genuine empty cells so "skip blank" behaves consistently.
- Check the row count is under 25,000 and the file is under 5 MB; split if needed.
- Verify the file with a before/after preview so you catch a mangled key column before Airtable does.
Before and after: a file that would have duplicated records
Here is a vendor export headed for an Airtable products table where sku is the merge field. It has everything that breaks a merge: a duplicate key, inconsistent casing, a trailing space, and placeholder text that would overwrite good data.
sku,product_name,unit_price,supplier
AB-100,Wall Bracket,12.50,Acme
ab-100,Wall Bracket (rev),13.75,Acme
AB-100 ,Wall Bracket,12.50,Acme
CD-200,Hex Bolt M6,N/A,Bolt Co
CD-200,Hex Bolt M6,4.10,Bolt CoImported as-is, Airtable treats AB-100 and ab-100 as two different keys because matching is case-sensitive, so the lowercase row spawns a brand-new record instead of updating. The third row, "AB-100 " with a trailing space, does match the first AB-100 (whitespace is ignored for matching), so it just collides as a duplicate and the extension keeps the first AB-100 row and drops it. For CD-200, the extension keeps only the first row, imports the N/A price, and drops the row that actually had 4.10. The result in your base is duplicate records plus a text value where a number should be.
Cleaned up, the same data becomes one row per key, consistent casing, no trailing space, and the good price surviving the dedupe:
sku,product_name,unit_price,supplier
AB-100,Wall Bracket (rev),13.75,Acme
CD-200,Hex Bolt M6,4.10,Bolt CoNow the merge does exactly what you want: two existing records updated, zero duplicates, no blank or placeholder value clobbering a field. The decision about which duplicate wins (the rev row for AB-100, the priced row for CD-200) was made by you in the file, not by Airtable's first-row-wins rule by accident.
Where a cleaning tool fits
Most of this prep is mechanical, and doing it by hand in Excel invites new problems. Excel likes to strip leading zeros off SKUs and reformat anything that looks like a date, which is the last thing you want in a merge-key column. A dedicated cleaning step avoids that. PipeSheets runs a CSV or XLSX through a pipeline and shows you a before/after preview with detected column types before you download, so you can confirm your unique-key column survived intact rather than discovering the damage after Airtable has already created 400 duplicate records.
The one-click Quick Clean preset handles the bulk of this list in a single pass: it trims whitespace across every column, standardizes null-like values (N/A, null, NULL, None) to true empties, removes fully empty rows and columns, and normalizes headers to snake_case so your merge field has a clean, predictable name. For the case-sensitivity and dedupe steps, a custom pipeline with a case transform on the key column plus a remove-empty-rows step gets the file merge-ready. Then you preview, download, and import.
The rule of thumb: let Airtable do the matching and updating, and let a cleaning step guarantee the file it matches on is unambiguous. The merge field is only as reliable as the column behind it, so PipeSheets or any prep step earns its place by making that column boringly consistent before the import runs.
Quick answers
Does Airtable update or duplicate records on CSV import?
It depends on the "Merge with existing records" option. Off, every CSV row becomes a new record. On, Airtable matches rows against your chosen merge field and updates the matches, creating new records only for rows with no match.
Why did my Airtable merge create duplicates anyway?
Almost always a merge-field mismatch. Matching is case-sensitive, so AB-100 and ab-100 read as different keys and both spawn records. Clean and standardize the key column before importing.
What happens if my CSV has two rows with the same key?
Airtable imports only the first row with that merge-field value and ignores the rest. Dedupe the unique-key column first so the row you want is the one that survives.
Related guides
- HubSpot Contacts + Companies Import: Clean One-Sheet Files, Headers, IDs, and DomainsImporting contacts and companies together in HubSpot fails on the same handful of file problems: multiple sheets, headers that don't match properties, and missing dedupe keys. Here's how to prep the file so records create, update, and associate on the first try.
- Salesforce Account and Contact Update CSVs: Matching by Email, ID, or External IDUpdating existing Salesforce records with a CSV comes down to one decision: which match key ties each row to the right record. This guide covers matching by Salesforce ID, email, or external ID, and how to preflight the file so you don't create duplicate contacts.
- How to Clean an Excel Contact List for Mail Merge (Word and Gmail)Mail merge failures almost always trace back to the spreadsheet, not Word or Gmail. Here is exactly how to clean your contact list so every letter and email comes out right the first time.
- WooCommerce Variable Product CSVs: Parent Rows, Variations, and Attribute ColumnsA variable product is never one CSV row. It is a parent row plus one row per variation, linked through the Parent column. Here is the exact column structure the WooCommerce importer expects, and how to fix variations that import broken.
Try the automated solution
PipeSheets can fix these issues automatically. Clean your first file free.
Clean Your CSV