Bulk Records — Import & Export
The Team Certifications page can export every record in your agency to a CSV, and import a CSV back. Same flow handles certifications, background checks, training records, vaccinations, etc.
This is most useful for:
- Backups — periodic full export of agency records.
- Bulk seed — when you onboard a new agency or migrate from another system, hand-build a CSV and import.
- Bulk update — export, edit a column in Excel, re-import; matched rows update in place.
The CSV is metadata only. Supporting documents (PDFs, photos) are not included; see Supporting documents below.
The record lifecycle
Every record moves through three states. The state controls who can edit what.
| State | Set by | Who can edit | What can be edited |
|---|---|---|---|
| Editable (unlocked) | Default on creation | The record's owner (the named member) and admins / training coordinators | All fields |
| Validated (still unlocked) | Agencies that don't require approval, on creation | Same as Editable — owner can keep editing | All fields |
| Locked | Admin runs Validate on a pending record, or clicks the manual lock button | Anyone with access can read; only notes can be edited | Notes only |
Two important properties of this model:
- A record is editable until it's deliberately locked. Auto-validation (in agencies that don't require approval) does not lock the record. The owner can still attach a file, fix a typo, or replace a wrong value.
- Locking is one-way through the UI. Admins can re-unlock from the cert detail modal if needed.
Exporting
From Team Certifications → Export → CSV. Runs as a background task; you'll see a "Comprehensive backup exported" toast when ready.
The exported file is named Team_Certifications_<timestamp>.csv and contains every record where the subject is a person in your agency.
CSV columns
| Column | What it is | Behaviour on import |
|---|---|---|
Record ID | The internal UUID of the record | Optional. When present, the import matches the CSV row to that exact record (rename-safe). When blank, import falls back to matching by (member email, record name, record type). Leave blank for fresh imports so the import creates new records instead of trying to update non-existent ones. |
Record Type | CERTIFICATION, BACKGROUND_CHECK, MEDICAL_RECORD, VACCINATION, TRAINING_RECORD, LICENSE, INSURANCE, OTHER | Required. |
Subject Type | Always PERSON for member records | Required. |
Template Name | The name of the agency Record Template, if the record was created from one | Optional. If present, the import looks up that template by name; if not found, the record is still created but template-linked fields (lock flags, notification timing) won't apply. |
User Email | The agency member's login email | Required. Lookup is case-insensitive but the user must already exist in the agency. Rows with unknown emails are skipped with an error. |
User First Name / User Last Name | Display only | Ignored on import — the user is identified by email. |
Record Name | The cert / record name | Required. |
Description | Free text | Optional. |
Issuing Organization | Who issued it | Optional. |
External Record ID | The ID printed on the certificate, if any (different from Record ID above) | Optional. |
Issue Date | YYYY-MM-DD | Required. |
Expiry Period | Months until expiration. Falls back to the template's value if blank. | Optional. |
Status | ACTIVE, EXPIRED, etc. — recalculated from Issue Date + Expiry Period on save. | Ignored — the system computes it. |
Validation Status | valid, pending, invalid | Optional. Defaults to pending when blank or unrecognized. Setting valid does NOT lock the record. The value affects what an admin can do next — see Validation Status and the import below. |
Training Hours, Location, Instructor, Certification Level, Notes | Free-text / numeric metadata | Optional. |
First / Second / Third / Final Notification Days | Days before expiration to send each notification. Falls back to the template's values if blank. | Optional. |
Type Specific Data | JSON blob for record-type-specific fields like check_type for Background Checks | Optional. |
Created By Email | Audit trail | Ignored on import — the importer's email is recorded. |
Importing
From Team Certifications → Import. Pick a CSV file; the import runs in the background and shows a results modal when done.
What the import does, row by row
- Find the user by
User Email(case-insensitive). Skip the row with an error if not found. - Check for an existing record:
- If
Record IDis present and matches a record in your agency → update that record. - Otherwise, look for an existing record with the same (user, Record Name, Record Type). If found → update.
- Otherwise → create a new record.
- If
- Apply the CSV's values to the record. The owner can edit anything except
notesafter this — unless the record is already locked. - Files are not affected. Existing files on existing records survive untouched.
Import results
The modal reports:
- Created — new records added.
- Updated — existing records where one or more fields changed.
- Errors — per-row error messages (e.g. "Row 47: User with email orphan@example.com not found in agency"). Other rows in the same file still import normally.
Validation Status and the import
The import never locks records on its own — locking is always a deliberate admin action (Validate or the manual Lock button). But the value you put in Validation Status controls what the admin can do next.
Validation Status in CSV | Imported record state | What admins see |
|---|---|---|
Blank, or pending | pending, unlocked | Validate button is available. Clicking it flips the record to valid AND auto-locks it. This is the normal review flow. |
valid | valid, unlocked | Validate button is unavailable (record reports "already validated"). To lock, admin uses the manual Lock button. Owner can edit until the lock fires. |
invalid | invalid, unlocked | Validate button is available — admin re-validates → record flips to valid and auto-locks. |
Recommendation: for a fresh agency seed or a normal bulk import, leave Validation Status blank. Records arrive as pending, the admin reviews each one through the normal Validate flow, and the lock happens at the moment they sign off — same as records created through the wizard.
Pre-marking rows as valid is appropriate when you're migrating from another system where approvals already happened. In that case the records skip the review step but do not lock automatically; lock them manually if you want them sealed.
Other ways to keep imports clean
- Don't worry about
Record ID. If you're seeding fresh records, leave the column blank (or omit it entirely) and the import will create new rows. StatusandCreated By Emailare read-only. The system computesStatusfrom issue date + expiry; the importer's email is recorded asCreated Byautomatically. Anything you put in those columns is ignored.
Round-trip update workflow
The most reliable bulk-update pattern:
- Export the CSV from Team Certifications.
- Open in Excel; edit only the cells you want to change.
- Re-import. The
Record IDcolumn ensures every row matches the original record; only your edits are applied.
This avoids the "two records with the same name got collapsed" edge case that can happen when matching by name alone.
Supporting documents
The CSV does not include file attachments. To add a supporting document for a record:
- Open the record from Team Certifications (or the member's own My Certifications page).
- Use the Edit action.
- Drag-and-drop or pick a file in the Supporting Documents section.
- Save.
This works whether the record was created via the wizard or imported from a CSV. The only thing that prevents file uploads is a locked record (lock = admin signed off).
For agencies that need full backup including files, contact support — file-bundle export is on the roadmap but not yet built.
Permissions summary
| Action | Required permission |
|---|---|
| Export CSV | Admin or Training Coordinator |
| Import CSV | Admin or Training Coordinator |
| Edit a record (when unlocked) | The record's owner, or Admin / Training Coordinator |
Edit notes only | Anyone with view access |
| Validate a pending record | Admin or Training Coordinator |
| Lock a record manually | Admin or Training Coordinator |
| Unlock a locked record | Admin |