Help

Import people from a CSV with photos

Updated .

Save your spreadsheet as CSV, put the photos in a zip, and open Import on the dataset’s records page. Columns are matched to fields by name, photos by file name or by ID number, and a dry run shows exactly what will be created, updated or skipped before anything is saved.

1. Prepare the files

  • The CSV. One row per person, with column names in the first row. From Excel or Google Sheets, choose Save As or Download and pick CSV. An .xlsx file is refused with a message saying so.
  • The photos (optional). A .zip, not .rar or .7z, of JPEG, PNG, WebP, GIF or SVG files, up to 10 MB each. Either name each photo after the person’s ID, like 10482.jpg, or keep your own file names and list each one in a CSV column.

To start from a clean sheet, Download a CSV template on the first step gives you a header row with every field.

2. Files

Open the dataset under Records and press Import (or Import a spreadsheet if it is empty). Choose the CSV and, if you have one, the photos zip. Leave First row has column names ticked unless your first row is already a person.

3. Map columns

Each field shows the column it Comes from and the first value in it. Badgewright matches column names to field names ignoring letter case, spaces and punctuation, so first_name finds First Name. Change any match with the dropdown, or choose Don’t import.

  • The key field (the ID number, marked Key) must be mapped. It is how records are told apart.
  • A photo field set to Match ZIP photos by your ID field finds 10482.jpg for ID 10482.
  • A photo field mapped to a column finds each file by its path in the zip, then by the path without its top folder, then by file name in any letter case, then by the ID number.

Under When a (your ID field) already exists, choose:

  • Add new records only (skip existing), the default, for a first import.
  • Add new and update existing, to refresh people who are already there. Fields you do not map keep their values. A mapped cell that is blank clears that value.

4. Check

The dry run reports Would be created, Would be updated, Would be skipped and Photos to upload, and lists each problem by row. Download error report gives you a CSV of them to fix. Nothing is saved at this step.

A row with any problem is skipped and the rest import normally. The usual ones:

  • Not a date. Use 2026-09-01, or US order like 9/1/2026 or 9/1/26.
  • Not a number. Commas are fine (1,200); letters are not.
  • Not an allowed option. A picklist value must be one of the field’s options, in any letter case. Add the missing option to the field under Datasets, then import again.
  • Repeated ID. Each row needs a unique ID. IDs are matched exactly, so 00123 and 123 are different people.
  • Required field missing, including a required photo that is not in the zip.

5. Import

Press Import and keep the window open until it finishes. Photos upload first, then records, and the result shows how many were Created, Updated and Skipped. Photo metadata, such as location and camera details, is removed when each photo is stored.

Record limits

Only new records count toward your plan’s record limit. The check runs on the dry run and again as records are saved, in batches of 200. If an import would take you over the limit it stops, and the rows before it stay imported. Import the same file again with Add new records only once you have room: the people already imported are skipped.

Still stuck? Write to support with what you tried and what the card looked like. A photo of the printed card helps more than a description of it. All help articles.

Print your first card today.

14 days free, with room for 10,000 records. No card needed to start.