CSV and Excel importer
for React and web apps

Add a complete import flow to your app. Users map columns, fix errors, and submit clean data. Everything runs in their browser.

100% client-sideWhite-labelFlat $19/domain/month

What's Updog?

A complete import flow that turns your users’ files into clean data for your app.

  1. Your users upload files

    • CSV
    • XLSX
    • XLS
    • XLSB
    • ODS
    • TSV
    • JSON
    • XML
    • PDF
    • Image
  2. Updog Importer, inside the browser

    Reads the files, matches columns to your schema, validates every row and lets users fix what fails.

  3. Your app receives

    Clean rows arrive in your handler. Your app saves them to your database, your API or wherever they belong.

Anatomy of an import

Every screen between a dropped file and clean rows in your app.

  • Drop a CSV, TSV, Excel, JSON, or XML file, or pipe in a remote source like an API or a database query. Parsing happens client-side in the browser, so user files never transit a third-party server on their way into your app.

Click to upload or drag and drop


Imported columns5/6 matched
Target columns

name
First name
surname
Last name
country
Country
level
Level
email
Email
phone
Select column
Country5/5 matched
Show matched

Level4/5 matched
Show matched

associate
Select value
junior
Junior
middle
Middle
senior
Senior
staff
Principal
Add every row

Every row becomes a new entry, even if it repeats one you already have.

First name
Last name
Email
1
Dagny
Taggart
2
Rearden
3
Francisco
d'Anconia
4
John
Galt
5
Ragnar
Danneskjöld
6
Eddie
Willers
7
James
Taggart
8
Lillian
Rearden
9
Wesley
Mouch
10
Hugh
Akston
11
Quentin
Daniels
12
Midas
Mulligan
{
  "sources": [
    {
      "sourceId": "upload",
      "sourceName": "people-may-2026.csv",
      "rows": [
        {
          "row": { "id": 4, "email": "[email protected]" },
          "isNew": false,
          "isChanged": true,
          "isDeleted": false,
          "isValid": true
        }
      ]
    }
  ],
  "counts": { "new": 4, "changed": 2, "deleted": 1, "invalid": 0 }
}

Parsing is only the beginning

Every customer file brings edge cases. Updog handles them for you.

Rows above the header

A title line, a blank row, and an export timestamp above the real header. The header is found without help.

A delimiter that is not a comma

Semicolons, tabs, and pipes are detected from the file rather than assumed, which is what most European exports produce.

The wrong encoding

Text that arrives as mojibake is decoded before parsing, so names in Cyrillic, Japanese, or Chinese survive the trip.

Dates in three formats at once

A column holding 03/04/2024, 2024-04-03, and 3 Apr 2024 is read as dates, with day before month settled once for the whole file.

Numbers wearing costumes

A currency symbol, a thousands separator, or a comma for the decimal point still becomes a number your app can store.

Empty values in required fields

Those cells are marked and counted, the import carries on, and the person fixes them in the grid before you see the rows.

Old and non-Excel spreadsheets are read as well, including .xls, .xlsb, and .ods files.

Working importer in five minutes

  1. Install the package

    Add @updog/data-editor to a React app.

  2. Describe your columns

    Every column gets an id, a title and any number of validators, from built-in rules to your own functions.

  3. Render the component

    Mount <DataEditor> with the columns and an onComplete handler.

Import.tsx
import { DataEditor, type DataEditorColumn } from "@updog/data-editor";
import "@updog/data-editor/styles.css";
type Employee = { name: string; email: string };
const columns: DataEditorColumn[] = [
{ id: "name", title: "Name", validators: [{ type: "required" }] },
{ id: "email", title: "Email", validators: [{ type: "email" }, { type: "unique" }] },
];
export function ImportEmployees() {
return (
<DataEditor<Employee>
apiKey="YOUR_KEY"
columns={columns}
primaryKey="email"
onComplete={(result) => save(result.sources)}
/>
);
}

Works with your stack

A React package, and a Web Component for every other framework.

Guides for AI app builders

Free for development on each of these platforms.

A spreadsheet your users already know

Imported rows land in a full editor with undo, a fill handle and find and replace.

Undo

Undo and redo

Every edit, fill, paste, and delete steps back, for the whole session.

Fill handle

Fill handle

Drag the corner of a cell to copy the value down the column.

Whole row and column selection

Select a whole row or column

Click the header to take the column, or the row number to take the row.

Find and replace across the file

Find and replace

Search the whole file or one column, then replace every match at once.

Sorting and filtering

Sort and filter

Sort by any column, and narrow the file by text, number range, or date range.

Column formulas

Formulas

Trim, split, merge, or change the case of a whole column in one pass.

Bring your own AI

Your model, your prompt and your data. Updog Importer wires them together.

Matching

Map messy column headers and dropdown values to your schema with any AI model. Whatever the model skips falls back to built-in fuzzy matching.

Chat

An assistant that opens from the grid footer, where users describe a fix in plain language. Your model returns a transformation and Updog applies it across every row, in the browser.

Updog never makes the call. Bring your own AI means your model, your provider, your request. With every message Updog passes along the context you need to build a prompt that you send to any LLM, then you return a transformation function that Updog applies across every row, keeping the whole thing fast and private.

A million rows, in the browser

One unedited take on the benchmark file, 1,000,000 rows by 20 columns.

Parsing, column matching, validation, filtering, sorting, editing, undo and export run on that file inside the tab. The grid draws on canvas and only paints the rows on screen, so scrolling costs the same at row 1 and at row 1,000,000. A million rows is the practical ceiling at 20 columns. The benchmark holds 20,000,000 cells with every filter active, so fewer columns can carry 5 or 10 million rows.

What your security team will ask

The file never leaves the browser, so the answers are short.

No new sub-processor
Row data is processed in the tab. Updog never receives it, so there is nothing to add to your sub-processor list.
No DPA for the import
A data processing agreement covers data a vendor handles for you. For the file itself there is none to sign.
No residency question
The file stays on the machine it was opened on, in whatever region that is.

Updog holds no SOC 2 report and no ISO 27001 certificate.

Every feature on every plan

Parsing, matching, editing and validation, on the free plan and the paid one alike.

Eight import formats

CSV, XLSX, TSV, JSON, XML. Legacy XLS, binary XLSB, and OpenDocument ODS read too. Drop a file, get structured data.

Smart column matching

Auto-maps imported columns to your schema. Fuzzy matching, synonyms, or your own callback.

Value mapping

Map imported values to the options your columns expect.

Multi-source merging

Import multiple files into one grid. Each source tracked, toggled, or removed independently.

Deduplicate rows

Second import? Existing rows update in place. New rows append. No duplicates.

A million rows

Canvas rendering, virtual scrolling, Web Worker filtering.

Dynamic columns

Imported file has columns your schema doesn't? Users create them on the fly.

Inline editing

Click a cell, start typing. Tab, Enter, arrow keys. It works like a spreadsheet.

Typed cell editors

Text, email, url, phone, number, boolean, date, time, select, multiselect, country and currency.

Add / delete rows

Insert above, insert below, duplicate, delete.

Copy / paste

Cells, ranges, rows. Paste from Excel or Google Sheets.

Fill handle

Drag to fill. Source values repeat across the target range.

100% client-side

Everything runs in the browser. No backend, no data leaves the user's machine.

Undo / redo

Every edit, paste, transform, and delete goes on the stack. Full command history.

Find & replace

Search across all cells. Case-sensitive, exact match, column-scoped. Replace one or all.

Column sorting

Ascending, descending, or clear. Stable sort, locale-aware.

Configurable filters

Select lists, number ranges, date ranges. Define per column, users control from the sidebar.

Column transforms

Split, merge, trim, and more. Bulk operations across a million rows.

Formulas

Spreadsheet-style expressions on columns. Concat, split, substring, substitute. Everything recomputes live as data changes.

Bring your own AI

Clean messy data with a prompt. Split names, normalize dates, fix casing. Your model, your prompt, your data.

Built-in validators

Required, unique, type checks. Errors surface inline, and users fix them in place.

Custom validators

Write your own validation function per column.

Cross-field validation

Declare dependent fields. When one cell changes, related cells re-validate automatically.

Display formatters

Show "$1,000" in the cell. Store "1000" underneath. Formatters are display-only.

Input transformers

Normalize on entry. Trim whitespace, parse numbers, format dates, all before they hit the store.

Clean exports

CSV, XLSX, TSV, JSON, XML. Validated and formatted. Ready for your pipeline.

No Powered by badge

Match your brand colors, fonts, and design system. Every Updog plan includes full white labeling at no extra cost.

Any frontend framework

Native React component. Web Component wrapper for Vue, Angular, Svelte, or plain HTML.

Sticky columns

Pin columns so identifiers stay visible while users scroll horizontally.

Accessibility

Shadow table for screen readers. ARIA roles, live regions, full keyboard navigation.

i18n & RTL

Override every string. Right-to-left layout where the locale demands it.

Read-only mode

One prop. The grid becomes view-only. No editing, no deletion, no import.

Flat pricing

Predictable from your first import to your millionth, with no per-import fees.

Dev

Free

  • Localhost and preview domains
  • Every feature, no branding
  • No account needed
Install the package

Team

2 months free when paid yearly

$19/domain/month

  • Your first paid domain covers two
  • Manage domains in the console
  • Email support
Start 14-day trial

No card needed

Frequently asked questions

Everything you need to know about Updog.

Is it really 100% client-side?

Yes. Parsing, validation, transformation, and editing all run in the browser. Your users' data never leaves their machine. No server, no data residency, no third-party processing.

Can Updog really handle 1 million rows in the browser?

Yes. Updog's 1M-row benchmark covers the full client-side import workflow: parsing, column mapping, validation, filtering, sorting, editing, undo/redo, transformations, and export. In our 1,000,000-row by 20-column benchmark, Updog uses around 800MB on the main thread, plus about 350MB in a Web Worker for the full working set.

Which frameworks are supported?

React as a first-class component. For Vue, Svelte, Angular, or any other framework, a Web Component that works anywhere.

What file formats can users import?

CSV, TSV, XLSX, legacy XLS, binary XLSB, OpenDocument ODS, JSON and XML. Users can also paste from Google Sheets or Excel and merge several files into one import. A PDF, a scan or any other format goes to a parser you register, and Updog imports the rows it returns.

Is it just an importer or also an editor?

Both. Take a messy file and clean it up. Or start with data you already have. Users get undo/redo, find & replace, copy/paste, fill handle, and built-in transformation functions.

Does the editor work like a real spreadsheet?

Yes. Copy, cut, and paste, including from spreadsheets your users already use. Select a cell, a range, a full row or column, or hold Cmd/Ctrl to pick non-adjacent cells. Keyboard navigation and the fill handle work the way people expect. If they have used a spreadsheet before, they already know this one.

How does pricing work?

$0 on localhost and preview domains, the ones Vercel, Netlify, Lovable, Bolt, Base44, StackBlitz, and ngrok hand out. $19 per production domain per month, and your first paid domain covers two. Each domain after that is $19/mo. Subdomains count as their own domains. Every plan includes every feature. No per-row fees, no per-import fees, no usage caps.

Is there a Powered by badge or any Updog branding?

There is no Powered by badge and no Updog logo, on any plan including the free one. Every visual element is yours to change through CSS variables and class overrides, from colors and fonts to spacing and borders, and every string of text can be replaced with your own.

How does the AI assistant work?

You own the prompt. Choose any LLM provider, write a prompt that returns a transformation function. That function is applied against the data locally, in the browser.

Do I need SOC 2 or compliance audits?

Imported row data does not transit or get stored on Updog infrastructure. Parsing, mapping, validation and editing run in the browser, and the one request the SDK makes is a license check that carries no file contents, so no data processor relationship arises over your users' files. Updog Software Solutions FZCO holds no SOC 2 report and no ISO 27001 certificate. Where procurement requires a certificate covering the import vendor whatever the architecture, a hosted importer is the honest answer.

What does the integration involve?

Install the package, describe the columns in an array and render <DataEditor> with an onComplete handler. An AI assistant like Claude Code does this in under five minutes from the agents page in the docs. From there the importer parses, maps, validates and edits files without further code. You write the validators your schema needs and the handler that sends the rows to your API.

What happens to my integration if Updog shuts down?

The package sits in your bundle and Updog holds none of your data. The one dependency is the licence check against api.updog.tech. When that server cannot be reached, the editor keeps working for seven days on a signed offline grant, then shows a licence error. Localhost and preview domains are never checked.

Can I edit data that already lives in my app, without importing a file?

Yes. Pass a loadData function and the editor pulls rows from your API into the same grid. onComplete hands the changed rows back.

Try for free

Free on localhost and preview domains, with every feature included.