Import from CSV

One guided wizard imports people, companies, households, or tasks from a spreadsheet in four steps. Matched, tagged, and deduplicated.

5 min read

Import / export in the DATA section of the sidebar is history for both directions. To start an import, use Import CSV at the top of that page, or Import CSV in the People, Companies, Households, or Tasks toolbars. Either opens the wizard at /imports/new: Upload → Map columns → Review → Import. The upload step asks what you are importing (people, companies, households, or tasks); coming from a grid preselects its type. Nothing is written to your database until the last step.

Prepare the file

  • Use a CSV with a header row. Column names like “First name”, “Email”, “Phone”, “Company”, or “Tags” are preselected automatically on the mapping step.
  • For people: a Company column links each person to a company, creating the company if no existing one matches its name. Addresses do the same for households. A Tags column applies its comma-separated tags to just that person.
  • A file can be up to 50 MB, and each import has a per-file row limit that depends on your workspace’s plan — the wizard’s upload step shows your own limit before you start mapping. A bigger list still imports fine: split it into files under the limit and run them one at a time. An over-limit file is refused before anything is written: small files at the upload step, large ones as a failed import in history that names the actual row count and your limit.
  • For companies and tasks the wizard needs a mapped name column. Rows without one are skipped. For households, rows matching an address you already have (or repeated in the file) are skipped, and new addresses are queued for geocoding — see Geocoding, boundary matching, and what each costs for when that finishes.
  • A households file that already names each row’s district, ward or precinct can bring those in too, with no lookup and no cost. See Import district, ward and precinct columns.
  • Both UTF-8 and Excel-exported CSVs work as-is.

The four steps

  1. UploadDrop the file or browse to it — up to 50 MB, and up to your workspace’s per-file row limit, which this step states. Most files show their full row and column counts right away. A large file (over about 2 MB) shows a preview of its first rows instead, enough to set up the mapping; the exact totals are counted while the import runs.
  2. Map columnsEach column gets a best-guess field match. Review and correct it. Anything left unmapped shows a “Skipped” chip and is left out.
  3. ReviewFor people, duplicates are matched by email, the same identity rule used everywhere in pplCRM. One choice covers every row that matches an existing person: merge (fills blank fields, never overwrites), skip, or import as new anyway. Most files list the matches right here; a large file is too big to scan in the browser, so the wizard says so and simply applies your choice while the import runs, reporting the results in the completion summary. Rows with a broken email address import without the email — a row with nothing else in it is skipped and counted. Add a comma-separated tag list and/or a list here too (tags also apply to household imports). Other types show a plain recap: how many rows will import and how many will be skipped, and why.
  4. ImportConfirm the recap and click Import N people (or companies, households, tasks). The wizard uploads your file and the server does the rest — parsing, matching, and writing — in the background, so you can navigate away while it works. It lands in import history and the Activity log either way. If you stay, the done screen offers View imported records, Import another file, or Back to import history.

After the import

  • Spot-check a few records against the source file.
  • If you chose "import as new anyway" for any matched duplicates, run the Duplicates finder to reconcile them when convenient.
  • The import history row shows what type each import was and keeps the original file downloadable for 90 days — by the person who ran the import and by admins and owners; every import type records a reason for each skipped row, and a download link for those reasons appears whenever an import has skipped rows or rows lost to a chunk error.
  • Deleting an import can optionally delete the people it created. The dialog lists what else those people carry (gifts, receipts, event registrations, subscriptions), and the delete is refused while any of them holds an issued tax receipt — cancel those receipts first.

Email check-up

Every people import runs a quiet check on each email address — no extra step, no third-party service. It looks up whether the address’s domain can actually receive mail (its DNS records) and whether it belongs to a known disposable-email provider. Addresses that fail either check are suppressed: they stay on the contact, but they’re left out of newsletters and automated emails. The completion email reports the numbers — checked, valid, suppressed, and any likely typos (for example [email protected], which we flag but never change for you) and role addresses (info@, admin@ — kept, never suppressed, since shared inboxes are legitimate contacts). Addresses we couldn’t verify (a slow or flaky DNS lookup) are always kept.

A dirty list can pause your sending
If a large import comes back with an unusually high rate of undeliverable addresses — the signature of a purchased or scraped list — sending is paused pending review, the same way a high bounce rate does. Import only contacts who opted in.
Test with a small file first
Run a ten-row slice through the wizard before the full file. If the column mapping is off you fix ten records, not ten thousand.
Related

Try this on sample data.

Every feature in the docs is live in the free demo workspace — no card, nothing to lose.

Start free