Feature · Fastest Lead Loader

Fastest Lead Loader.

A 1-million-row leads.csv finishes parsing in seconds. No CLI. No batched chunks. No "your file is too large, please split it". Drag the file into the dashboard; we dedup on phone + list-id, validate format, map columns to your custom fields, and stream rows into vicidial_list in single COPY statements. The same machine that ships your dialer in 40 seconds loads your million leads while you blink.
See pricing

7-day free trial · Cancel anytime · Pay with card, PayPal, or USDT

vicifast — lead-loader
$ vicifast leads import --list 1001 leads.csv
parsing:       1,000,000 rows · 6 columns · 240k rows/sec
deduping:      vs vicidial_list.phone_number on list_id=1001
              · 8 duplicates skipped
validating:    NANPA + libphonenumber
              · 7 invalid rows quarantined → leads.invalid.csv
mapping:       phone,first_name,last_name,city,state,custom_data
loading:       single COPY statement to vicidial_list
              · 999,985 rows inserted in 4.1s
done:          (total 8.3s · 1,000,000 input · 999,985 inserted)
40smedian deploy time
99.94%fleet uptime · last 30d
6regions live
Auditedevery state change

What you get

The full fastest lead loader surface, end-to-end.

Every card below is a shipped capability. Hover for emphasis; click any matching feature for the deep page.

Drag-and-drop, not a CLI

The Leads tab in your list opens a drop zone. Drop a CSV up to 300 MB; we stream-parse it on the server. The browser never holds the whole file — you can close the tab and come back to find it done.

Column mapping with smart defaults

We detect phone / first / last / city / state / postal from the header row. Anything else maps to the list custom fields. You can override before the load runs.

Dedup on phone + list-id at insert time

Duplicates against the existing list are skipped at the SQL level, not in JS. A million-row file finishes inside a single transaction; rollback is atomic if anything goes wrong.

Invalid rows quarantined, not rejected

A bad phone number does not fail the import. Invalid rows are dropped to an invalid.csv you can download and fix; the rest of the file lands.

No size limit on the plan

Plans do not gate by lead count. Load 10 million if your campaign needs it. The Hetzner disk is yours; the platform is not metering the rows.

No "upload then wait for a worker"

The import is synchronous from your perspective. The progress bar in the dashboard is the actual COPY transaction running. Average finish: 8 seconds for a million rows.

Append, replace, or reset modes

Append to the existing list, replace it entirely (with a typed confirmation), or reset and load fresh. The mode is chosen up-front; no surprise replacements after a careless click.

CSV, Excel, and Google Sheets

Drop .csv, .xlsx, or paste a Google Sheets share URL — the importer handles all three. The Sheets path uses a one-off read-only API call; we never store credentials.

A realistic full-million import. The CLI is shown for clarity; the dashboard flow runs the same pipeline from a drag-and-drop. Invalid rows download as a side-CSV instead of failing the whole import.

FAQ

Questions worth answering

Drop your first million leads in seconds.

Start the trial. Drag a CSV, choose mapping, watch the COPY transaction finish before your coffee. Dedup + validate + invalid-quarantine on every import.

All features