How to merge two CSV files in your browser (no upload, no signup)
May 27, 2026
Most “merge CSV files online” tools want you to upload your data. That makes sense for them — server-side processing is easier to scale, gives them a chance to gate things behind a signup, and lets them monetize via Pro upgrades. But it’s terrible for you: your business data hits someone else’s server. Sometimes that’s fine. Often it isn’t.
This guide walks through merging two CSV files in your browser using Tabularly — no upload, no signup. Three steps, maybe 30 seconds.
The setup
Let’s say you have two CSV files:
customers.csv — exported from your CRM:
id,name,email
1,Ada,ada@example.com
2,Bob,bob@example.com
3,Carol,carol@example.com
orders.csv — exported from your billing system:
customer_id,product,amount
1,Pro Plan,99
2,Pro Plan,99
1,Add-on,15
You want a single CSV that shows each customer with their orders, joined on the customer ID column. Two complications: the column is called id in one file and customer_id in the other, and one customer (Carol) has no orders.
Step 1: Drop both files
Open tabularly.app/merge-csv and drag both files into the drop zone. (You can also click to pick.) Both files appear in the list with their row counts.
Step 2: Pick the matching column
Tabularly defaults to a 2-table join with id ↔ customer_id as the match — actually, it defaults to whatever the first columns happen to be, but you can change them via the dropdowns. Pick id on the customers side and customer_id on the orders side.
Pick the join type. Inner keeps only customers who have orders (you lose Carol). Left keeps all customers even when they have no orders (Carol stays, with empty cells for product/amount). Right is the mirror — keep all orders even when no matching customer. Outer keeps everything from both sides.
Most “merge” operations want left — you want to start from your customer list and bolt order info onto it, even when some customers have no orders. That’s the default in spreadsheets when you use VLOOKUP-style merges.
Step 3: Execute and download
Click Execute. The merged table appears with one row per (customer, order) combination. Click “Download CSV” and you get a clean merged file.
For our example with left join, the output looks like:
id,name,email,customer_id,product,amount
1,Ada,ada@example.com,1,Pro Plan,99
1,Ada,ada@example.com,1,Add-on,15
2,Bob,bob@example.com,2,Pro Plan,99
3,Carol,carol@example.com,,,
Ada appears twice because she has two orders. Carol appears once with empty order cells (the hallmark of a left join).
What if the columns to match on aren’t obvious?
Sometimes you need to match on multiple columns — for example, when the same customer_id shows up across multiple region codes, and you only want to match within a region. Tabularly handles this: just add another match pair, picking region ↔ region (or whatever you have). All pairs must match for two rows to join.
What about three or more files?
Free tier limits joins to two files. If you have three or more, you can run two merges in sequence: merge A+B first, download the result, drop it back in along with C, merge again. Pro supports N-file chained joins with composite keys in one operation — see pricing for the full Pro feature set.
Verifying nothing got uploaded
If you’re skeptical about the “your file never leaves your browser” claim, verify it yourself. Open DevTools (F12 in most browsers), go to the Network tab, drop your file, execute the merge. You’ll see the page’s own assets load — but no POST or PUT requests carrying your file contents. The whole operation is JavaScript running in your tab.
Common gotchas
- “My match column has the same name in both files but they don’t match.” Two reasons this happens: (1) one side has whitespace in the values (Tabularly does not trim by default — pre-clean if needed), or (2) the values are numbers in one file and number-strings in the other. CSVs are always strings on parse, so this isn’t usually the issue — but worth checking.
- “My output has way more rows than I expected.” One-to-many joins multiply: if customer 1 has 5 orders, the merged result has 5 rows for customer 1. That’s correct behavior. If you want one row per customer instead, you need to aggregate (sum, count, etc.) — aggregation isn’t a Tabularly operation today; do the join in Tabularly, then aggregate in Excel, Sheets, or SQL.
- “My CSV file has weird line breaks.” Tabularly handles CRLF, LF, and mixed endings without issue. If parsing fails, it’s almost always an encoding issue (Latin-1 instead of UTF-8) or a quoting issue (unbalanced quotes). The error message will tell you which.
That’s it. Three steps, no upload, no signup.