GarageHQ

Bulk importing vehicles from CSV

When you're onboarding a workshop's customer base or migrating a fleet from another system, entering vehicles one by one gets old fast. The CSV import takes a spreadsheet and creates up to 200 vehicles in a single request.

1. Open the import modal

From the dashboard, click Import CSV in the top-right (appears only for eligible plans + roles). A modal opens with a template download link and a file drop-zone.

Dashboard with the Import CSV button top-right
The Import CSV button — visible only to owners/admins on Garage, Fleet, or Enterprise plans.
Import modal with template download and file drop-zone
The import modal — download the template, fill it in, drop the saved CSV on the zone.

2. Download the template

Click Download template to grab a CSV file with the correct column headers. Using the template saves a lot of time because GarageHQ is strict about column names.

Required columns

  • reg — UK registration (e.g. AB12 CDE, ab12cde — whitespace and case normalised on save).

Optional columns

  • make, model, year, colour
  • nickname
  • mot_expiry, tax_expiry, insurance_expiry — all dates in YYYY-MM-DD format
  • notes

Any column GarageHQ doesn't recognise is ignored (doesn't cause a failure).

3. Fill in the spreadsheet

Open the template in Excel, Google Sheets, Numbers — whatever you use. Add one row per vehicle, save as .csv (UTF-8 encoded — the default in most spreadsheet apps).

4. Upload

Drag your saved CSV onto the modal (or click to browse). GarageHQ validates every row before writing anything to the database:

  • Dates must match YYYY-MM-DD
  • Regs must be unique within your organisation
  • Years must be plausible (1900–2030)
  • Rows exceeding 200 are rejected

If validation passes, all vehicles are created in a single atomic batch. The modal shows a success message with the row count and closes.

If validation fails, the modal shows a per-row breakdown — "Row 4: reg field is required", "Row 11: mot_expiry must be YYYY-MM-DD". Fix your spreadsheet, re-upload; no partial writes happen from a failed attempt.

What next?