Skip to main content
HackHQ

CSV Import

Bulk import judges on HackHQ from a CSV file. Map columns, preview rows, and add up to 1,000 judges at once with automatic deduplication and auto-assignment.

CSV import is the fastest way to bring a panel of judges in from a spreadsheet, an old form provider, or another platform. Click Import in the Judge Voting section header (next to Add Judge) to open the import wizard.

When to use it

  • Bringing in a sponsor's judge panel from a shared spreadsheet
  • Migrating a recurring panel from a previous event
  • Adding a partner organization's full slate of judges in one batch
  • Loading a list compiled outside HackHQ (Notion, Airtable, email thread)

For a single judge, use Add Judge instead. CSV import is optimized for batches.

Download a sample CSV

The upload step has a Sample CSV button (next to the dropzone). Clicking it downloads a hackhq-sample-judges.csv file with the two columns the importer expects (Name, Email) and three example rows, the third of which leaves email blank to demonstrate that email is optional.

Use it when you're not sure how to name your columns or just want a clean starting point you can paste your judge list into.

CSV requirements

The importer accepts standard CSV files (comma-separated, UTF-8). Up to 1,000 rows per import.

ColumnRequiredNotes
NameYesUp to 255 characters
EmailNoMust be a valid email if present
Other columnsNoIgnored

Header names are matched flexibly, anything close to "name" or "email" maps to the right column. Other columns are ignored, the importer doesn't create custom fields for judges (judge data is just name, email, and voting token).

Email is optional for judges. Judges without an email can still vote, they just won't get an email invitation, you'll need to share their voting link manually using the Copy links action on the Voting tab. See Adding Judges.

The import wizard

The wizard steps through four stages:

Upload

Drag a CSV file onto the dropzone or click to browse. The file is parsed in the browser, nothing is sent to the server until you confirm the import.

Preview

The preview shows the first five rows with the column mapping HackHQ inferred from your headers. You can:

  • Reassign any column to Name or Email
  • Toggle other columns off, they're ignored anyway
  • See per-row validation errors before continuing (missing name, invalid email)

The summary line tells you how many rows are valid and how many have issues. Only valid rows continue to the import step.

Import

HackHQ creates judges one row at a time, each in its own database transaction. The transaction re-checks your plan's judge limit on every row, so two organizers running concurrent imports can't collectively overshoot the cap. The dialog can't be dismissed during this step.

Results

The results step summarizes what happened: imported, skipped duplicates, errors. Click Done to close, or Back to upload a corrected file.

Duplicate handling

Two duplicate checks run, but only against rows that have an email:

  • Already in the system: a judge with the same email already exists on this event. The row is skipped and counted as "duplicate of an existing judge" in the results.
  • Duplicated within your CSV: the same email appears twice in the same file. Only the first row imports; later rows are counted as "duplicate within file" so you can spot the issue in your spreadsheet.

Rows without an email are never deduped, this matches the Add Judge behavior, where multiple judges named "John Smith" are allowed when you don't have email addresses for them.

Plan limits

Each plan caps the number of judges per event. The importer enforces this cap inside the per-row transaction with a live count, which means:

  • If your CSV exceeds the cap, the importer fills up to the limit and pushes the rest into row-level errors with a clear "Your plan allows N judges. Upgrade to import more." message.
  • Concurrent imports can't race past the cap together.

If you need a larger panel, see Billing for plan options.

What happens after import

When the import finishes, HackHQ:

  • Generates a unique voting token (and matching link) for each new judge
  • Creates a default voting configuration with Score Criteria (Overall, Innovation, Technical Implementation) if your event didn't have one yet, so the new judges have something to score immediately. Already-configured events keep their existing setup.
  • Triggers auto-assign for each new judge so they get the same submission distribution as your existing panel
  • Updates the Voting tab so the new judges and their progress cards appear right away

After importing, share voting links using Invite all on the Voting tab to email every judge their unique link, or Copy links to grab them all at once for a Slack message or shared spreadsheet.

Errors

Errors are listed in the results step with the original spreadsheet row number, so the row label matches what you see in Excel or Google Sheets (header is row 1, the first data row is row 2). Common causes:

  • Missing name: the Name column is required on every row
  • Invalid email: the Email column has a value that isn't a valid email
  • Plan limit hit: importing the row would push you over your plan's judge cap

Rows that error out leave no trace, no partial judge record, no orphaned config. Fix your CSV and re-run, the importer will skip judges already created on the previous run.

Tips

  • Start from the sample CSV if you've never used the importer before. The Sample CSV button on the upload step gives you a file with the right column names already filled in.
  • Try a small file first. Run 3-5 rows through the wizard to confirm your column mappings before uploading the full batch.
  • Pre-clean emails in your spreadsheet. Imports are deduped on lowercase, trimmed emails, but trailing whitespace in source data is a common cause of "missing" matches when re-importing.
  • Use one judge per row. Multi-email or comma-separated emails in a single cell aren't supported, split them into separate rows first.
  • Plan for at least 3 judges per submission to reduce individual bias, see Adding Judges.

On this page