csv & excel imports, embedded

The last CSV importer
you'll ever ship.
Drop in, done.

Rowslint is a drop-in widget for CSV and Excel imports. Your users map columns, clean data, and sync millions of rows — without you writing a parser, a validator, or a support ticket.

Get started Read the docs npm i @rowslint/importer-js
Browser-side parsing GDPR-compliant EU/US data residency 99.99% uptime
rowslint · import customers
v2.4.1
1
Upload
2
Map
3
Review
4
Import
Drop your CSV or Excel file
or paste from clipboard · max 2GB
.csv.xlsx.tsv.json
customers-q1-2026.csv0%
acme-customers.csv
Lightweight streamed, in-browser
< 5 min median time to integrate
how it works

Three steps.
Zero support tickets.

Every import pipeline starts the same way and fails in the same places. Rowslint ships the last 10% — the messy, user-facing part — so you can focus on what happens after the data lands.

01

Embed in 2 lines

One React, Vue, or vanilla JS snippet. It inherits your theme tokens, your auth session, and your brand.

<button onclick="launch()">Drop a CSV</button>
02

Define your schema

Declare target fields with types, regexes, enums, or async validators. Rowslint handles the rest.

schema.email().unique()
03

Users import, you receive clean data

Rows stream to your webhook or database — typed, deduplicated, and validated. Nothing sits on our servers.

webhook: "/api/import"
features

Built by people
who've been on-call.

Every feature in Rowslint exists because someone, somewhere, got paged at 3am for a malformed CSV. We've seen the worst data you can imagine — and shipped defenses against it.

AI column matching

Matches "Email Addr", "e_mail", "contact" → email with 99%+ accuracy. Users rarely touch mappings.

2GB files, streamed

Chunked parsing in the browser. Never blocks the main thread. Users see rows as they arrive.

Privacy-first

Rows are parsed in the browser. Nothing touches our infra unless you opt in. BYO S3 for persistence.

Inline validation

Zod, Yup, regex, or your async endpoint. Users fix errors in-widget — no back-and-forth.

Fully white-label

Every color, radius, and copy string is themeable. It looks like your product, not ours.

Webhooks & streams

Stream rows to your webhook as they land, or batch to S3, Postgres, Snowflake, BigQuery.

integrate

Two lines,
no backend required.

Point Rowslint at a schema. Give it a handler. Ship. React, Vue, Svelte, vanilla JS — pick your poison. Full TypeScript types out of the box.

ImportCustomers.tsx
jsx
1 import { launchRowslint } from "@rowslint/importer-js";
2
3 export function ImportCustomers() {
4 const launch = () =>
5 launchRowslint({
6 apiKey: process.env.ROWSLINT_API_KEY,
7 config: { templateKey: "customers_v3" },
8 onComplete: (rows) => save(rows),
9 });
10
11 return (
12 <button onClick={launch}>
13 Import customers
14 </button>
15 );
16 }
TypeScript-native

Schema types flow all the way to your onImport handler. No any. No casts.

Framework agnostic

@rowslint/importer-js, /react, /vue, /svelte — same API, same bundle size.

Tree-shakable

Lightweight by design. Validators, Excel parser, and locale bundles load on demand.

Headless mode

Bring your own UI. Use hooks for file parsing, mapping, and validation only.

column mapping

Your users'
spreadsheet mess,
mapped in milliseconds.

Rowslint fingerprints headers and sample data against your schema. Fuzzy matching, synonyms, case, whitespace, and common typos are handled before the user sees the screen. They rarely need to lift a finger.

Source file
Email Addr [email protected]
full_name Noah Chen
org Acme Inc.
signed up 2026-01-14
status active
Your schema
email string
name string
company string
created_at datetime
status enum
5 of 5 columns auto-matched · avg confidence 96% ready to import
validation

Bad data
stops at the door.

Define rules once — Zod, Yup, regex, or async fetches to your API. Rowslint runs them on every row and surfaces errors inline. Users fix, skip, or bulk-edit before anything leaves the browser.

validators.ts · 6 rules · 48,213 rows
runtime: 142ms
Field Rule Sample Status
email z.string().email() "[email protected]" passing
phone z.string().regex(/^\+?[1-9]\d{7,14}$/) "+14155550142" passing
plan z.enum(["free","pro","enterprise"]) "pro" passing
mrr z.number().positive() -32.00 blocked
domain async (v) => await checkDNS(v) "acm.io" review
created_at z.coerce.date() "2026-13-01" blocked
security & compliance

Private by default.
Compliant by design.

Rowslint was built for regulated industries. The default architecture is privacy-first: parsing, validation, and column mapping happen in the user's browser. Nothing persists on our infrastructure unless you explicitly ask it to.

Zero retention

Files are parsed in-browser and discarded the moment your handler returns.

GDPR-compliant

EU data residency. Privacy-first by default.

Browser-side parsing

Rows never touch our servers by default.

Bring your own keys

Customer-managed encryption keys for sensitive workloads.

pricing

Priced per row.
Never per seat.

All plans include a 14-day free trial. No credit card required. Need a custom plan? Contact us for enterprise solutions.

Free
Perfect for trying out our CSV import widget.
$0 /month
Get started
  • 100 file imports / month
  • Basic data validation
  • CSV & Excel formats
  • Email notifications
  • Standard support
Most popular
Pro
For growing teams with higher volume needs.
$45 /month
Start free trial
  • 10,000 file imports / month
  • Advanced data validation
  • CSV, Excel & JSON formats
  • Custom field mapping
  • Webhook integrations
  • Advanced analytics
  • Priority support
Max
For enterprise teams at scale.
$85 /month
Start free trial
  • 50,000 file imports / month
  • Enterprise-grade validation
  • All file formats supported
  • Custom branding
  • API access
  • Custom data transformations
  • Dedicated support
vs. alternatives

Faster to ship.
Cheaper to run.
Nicer to use.

We've built these systems before — in-house, with competitors, from scratch. Rowslint is what we wish we'd had.

Rowslint
Flatfile-likes
In-house build
Rolling your own
Setup time
< 5 min
2–3 days
1 week
2+ weeks
Browser-side parsing
AI column matching
2GB file support
Async validators
White-label theming
Self-hosted option
frequently asked

Answers,
before you ask.

Couldn't find what you're looking for? Check the documentation →

Nowhere, by default. Rowslint parses and validates rows entirely in the user's browser. You receive the clean data through your webhook or a direct stream to your S3 / Postgres / Snowflake. Opt-in ephemeral storage (max 24h) is available on Pro for resume-after-close flows.

ship it this sprint

Your users have a spreadsheet.
Let's give them somewhere to put it.

14-day free trial · No credit card required · Cancel anytime