Design bulk import as a guarded, inspectable workflow that starts with templates and limits, validates the uploaded structure, asks users to confirm column mappings and duplicate rules, previews row-level issues, confirms side effects, tracks import progress, and returns a usable report.
Users need to create, update, or merge many structured records from CSV, XLSX, TSV, copied spreadsheet data, or another system export.
The product can parse the file, validate rows, map columns, detect duplicates, explain side effects, and report results.
Manual entry would be slow, error-prone, or operationally unrealistic.
Users can reasonably prepare data from a template, sample file, or exported source system.
Avoid when
The task needs one document or image attachment rather than parsed record data.
Users are creating one record and need guided judgment, conditional questions, or rich validation better served by a form.
The product cannot safely validate mappings, duplicates, permissions, or overwrite behavior before commit.
The import side effects are too risky without rollback, audit history, or a human approval step.
The audience cannot prepare structured files and would be better served by assisted entry or integration.
Problem it prevents
Bulk imports can save hours of repetitive entry, but they can also corrupt many records at once when requirements, mapping, validation, duplicates, overwrite rules, partial success, and result reporting are unclear.
Pattern anatomy
What a strong implementation has to make clear
User need
Users have many records in a spreadsheet or exported system file and cannot reasonably enter each record manually.
Pattern promise
Design bulk import as a guarded, inspectable workflow that starts with templates and limits, validates the uploaded structure, asks users to confirm column mappings and duplicate rules, previews row-level issues, confirms side effects, tracks import progress, and returns a usable report.
Required state
Pre-import requirements state with template, accepted file types, encoding, row limit, column limit, required fields, and side effects.
Recovery path
The importer says Upload complete when the file is only parsed and no records have been created.
Access contract
Use a real file input or button for selecting the import file, even when drag-and-drop is also available.
Quality bar
The difference between expert and weak execution
Strong implementation
Specific, visible, recoverable
A contacts importer starts with a downloadable CSV template, then shows Email mapped to Email address, Role mapped to Access role, three sample rows, and a warning that Phone is optional and unmapped.
An inventory import screen shows 1200 rows found, 1138 valid, 42 missing SKU, 20 duplicate matches, Update existing selected, and a disabled Start import button until required columns are mapped.
A user uploads contacts.csv, reviews suggested mappings, fixes Department to Team, filters to rows with errors, chooses Import valid rows and export invalid rows, confirms 1138 new and 20 skipped records, then downloads the error report.
An admin chooses Update existing, sees external_id as the match key, reviews which blank cells will preserve existing data, cancels before commit, fixes the spreadsheet, and reruns validation.
Weak implementation
Vague, hidden, hard to recover from
A page has a single Upload spreadsheet button and a spinner, then says Import failed without row numbers, column names, or a corrected-file path.
A CSV drop area auto-imports immediately and overwrites existing records because blank cells and duplicate identifiers were not previewed.
A user uploads a file, the product commits immediately, and only afterward shows that 300 rows were skipped with no file explaining which rows failed.
An importer silently maps Full name into Email because the headers were similar and gives no preview before overwriting customer records.
UI guidance
Show the import as a staged workflow: template or requirements, file upload, detected headers, column mapping, sample row preview, validation results, duplicate review, confirmation, progress, and final report.
Render mapping status, required fields, unmapped columns, row errors, warnings, duplicate matches, create/update counts, skipped rows, and downloadable error reports as visible tables or summaries rather than hidden upload messages.
UX guidance
Use bulk import when users need to create or update many structured records from a spreadsheet, and make them prove mapping and validation before the product commits data.
Let users fix mapping, choose duplicate and blank-value behavior, import only valid rows when supported, cancel before commit, and export failed rows after import.
Implementation contract
What the implementation must handle
States
Pre-import requirements state with template, accepted file types, encoding, row limit, column limit, required fields, and side effects.
File selected state showing filename, size, detected sheet, row count, column count, and parsed headers.
Mapping state with suggested mappings, required-field gaps, unmapped columns, ignored columns, and sample values.
Mapping error state for duplicate target fields, missing required mappings, unsupported fields, or ambiguous headers.
Interaction
Uploading parses the file into headers, sample rows, counts, and metadata before any records are created or updated.
Auto-mapping is a suggestion, not a commit; users can change, clear, ignore, reset, and review mappings before validation.
A required target field cannot be left unmapped unless the import mode or existing data makes it explicitly safe.
Each target field can receive at most one source column unless the product intentionally supports a combine-fields operation.
Accessibility
Use a real file input or button for selecting the import file, even when drag-and-drop is also available.
Represent mapping and validation in semantic tables or lists with clear column headers and row identifiers.
Do not rely on color alone for valid, warning, error, duplicate, ignored, or overwritten states.
Announce validation and import status changes at meaningful checkpoints rather than every row.
Review
What records can this import create, update, merge, skip, notify, or overwrite?
Can users see required fields, detected headers, sample values, unmapped columns, and duplicate mappings before validation?
What row-level errors, warnings, duplicates, and blank-overwrite risks can the user repair before committing?
Does the final confirmation explain counts and side effects in terms the importing user can verify?
Interactive lab
Inspect the states before you copy the pattern
Import structured records from a spreadsheet
Upload a CSV, review auto-mapped columns, fix a required mapping, validate rows, inspect duplicates, choose valid-row-only import, confirm counts, run import, and export failed rows.
Bulk import
Interactive demo is ready
Launch the live UI/UX lab when you want to inspect states, keyboard behavior, and common failure modes.
State To Inspect
Pre-import requirements state with template, accepted file types, encoding, row limit, column limit, required fields, and side effects.
Keyboard / Access
Tab reaches upload action, template download, mapping controls, error filters, duplicate decisions, confirmation controls, and report downloads in a logical order.
Avoid Generating
Treating a spreadsheet import like a generic file attachment with no mapping or row validation.
Supports bulk CSV requirements, limits, create/update modes, unique identifiers, field mapping review, final confirmation, irreversible start, and import history.
Supports unique headers, required values, one source column per target field, data type validation, row warnings, and valid-row-only imports.
Full agent/debug reference
Problem Context
Users have many records in a spreadsheet or exported system file and cannot reasonably enter each record manually.
The target system has required fields, typed values, enums, relationships, unique identifiers, ownership rules, and side effects such as notifications or permission changes.
Column names, date formats, encoding, blank cells, duplicate identifiers, invalid enum values, and missing required values commonly differ between source files and target schema.
Some imports create records, some update records, and some merge into existing data with different behavior for blank values and duplicates.
A failed or partially successful import needs a recovery path, because users should not have to rediscover every bad row by trial and error.
Selection Rules
Choose bulk import when one uploaded file represents many structured records that must be parsed into fields.
Use ordinary file upload when the uploaded file is evidence or content to store, not data to split into rows and columns.
Use drag-and-drop upload only as an optional file-selection enhancement inside the import workflow, not as the whole import experience.
Use multi-step form or complete complex form when a user is creating one record with guided human judgment rather than importing many prepared rows.
Offer a template, sample file, or clear format rules before upload when users can prepare the file in advance.
Require mapping review when column headers can differ from target field names or when unmapped columns would be ignored.
Validate before commit when errors could affect many records, especially required values, type formats, duplicate identifiers, relationships, permissions, and destructive updates.
Let users choose create-only, update-only, create-and-update, merge, or skip behavior when the same file can affect existing records.
Support valid-row-only import only when users can see exactly which rows will import, which will be excluded, and how to fix excluded rows.
Require final confirmation when the import sends notifications, changes permissions, overwrites data, creates many records, or cannot be fully undone.
Required States
Pre-import requirements state with template, accepted file types, encoding, row limit, column limit, required fields, and side effects.
File selected state showing filename, size, detected sheet, row count, column count, and parsed headers.
Mapping state with suggested mappings, required-field gaps, unmapped columns, ignored columns, and sample values.
Mapping error state for duplicate target fields, missing required mappings, unsupported fields, or ambiguous headers.
Validation running state with progress and cancel guidance before data commit.
Validation results state with valid row count, invalid row count, warning count, duplicate count, and row-level details.
Repair state with filters for errors, warnings, duplicates, and unmapped columns plus links to fix or export issues.
Duplicate review state with match key, create/update/skip choice, and overwrite behavior for blank values.
Confirmation state summarizing new, updated, skipped, invalid, warning, notification, and irreversible-change counts.
Import running state with progress, queued status, safe navigation guidance, and import history link.
Import complete state with success count, skipped count, failed count, warnings, download report, and next actions.
Import failed or partially completed state with retry guidance and preserved mapping choices.
Interaction Contract
Uploading parses the file into headers, sample rows, counts, and metadata before any records are created or updated.
Auto-mapping is a suggestion, not a commit; users can change, clear, ignore, reset, and review mappings before validation.
A required target field cannot be left unmapped unless the import mode or existing data makes it explicitly safe.
Each target field can receive at most one source column unless the product intentionally supports a combine-fields operation.
Create/update/merge mode and duplicate matching are visible before final confirmation, including the identifier used to match existing records.
Blank-value overwrite behavior is explicit for updates and merges.
Starting the import after confirmation creates an auditable job with progress and results rather than leaving users on an indefinite spinner.
Users can export invalid rows or an error report that preserves row identifiers and current mappings.
Cancelling before final confirmation does not create or update records; cancelling after commit follows the product's documented job-cancel or rollback policy.
Implementation Checklist
Define accepted file types, encoding, max size, max rows, max columns, supported sheets, required fields, optional fields, ignored fields, relationship fields, duplicate keys, import modes, blank-value behavior, and notification side effects.
Provide templates or sample files that match required headers and data formats.
Parse files server-side or with a trusted parser and show detected headers, row count, column count, sample rows, and parse warnings before mapping.
Build a mapping table that supports auto-map, manual map, ignore, reset, required-field indicators, one-source-to-one-target checks, sample values, and unmapped-column review.
Validate required values, data types, dates, numbers, enums, relationships, duplicates, permissions, row length, unsupported fields, blank overwrites, and file-level limits before commit.
Provide repair views that filter invalid rows, warnings, duplicates, and unmapped columns, with exportable errors and preserved mapping decisions.
Show final confirmation for create/update/merge/skipped counts, notifications, irreversible changes, and valid-row-only behavior.
Run the import as a tracked job with progress, completion, partial failure, retry, import history, and downloadable result report.
Test small files, max-limit files, empty files, duplicate headers, missing required mappings, invalid dates, unknown enum values, duplicate existing records, blank update cells, network interruption, refresh/back, and permission-limited users.
Common Generated-UI Mistakes
Treating a spreadsheet import like a generic file attachment with no mapping or row validation.
Auto-starting the import immediately after upload.
Hiding duplicate matching, create/update mode, blank overwrite behavior, or notification side effects until after commit.
Showing only a generic invalid file error instead of row numbers, column names, and fixable reasons.
Importing valid rows and skipping invalid ones without telling users exactly which rows were excluded.
Letting similar headers auto-map into destructive target fields without a preview.
Forcing users to re-upload and remap from scratch after every recoverable validation error.
Critique Questions
What records can this import create, update, merge, skip, notify, or overwrite?
Can users see required fields, detected headers, sample values, unmapped columns, and duplicate mappings before validation?
What row-level errors, warnings, duplicates, and blank-overwrite risks can the user repair before committing?
Does the final confirmation explain counts and side effects in terms the importing user can verify?
What report or export helps users fix failed rows without rebuilding a whole file?
Can the team audit who imported what file, with which mapping, at what time, and with what result?
Accessibility
Use a real file input or button for selecting the import file, even when drag-and-drop is also available.
Represent mapping and validation in semantic tables or lists with clear column headers and row identifiers.
Do not rely on color alone for valid, warning, error, duplicate, ignored, or overwritten states.
Announce validation and import status changes at meaningful checkpoints rather than every row.
Make row error filters, mapping dropdowns, duplicate decisions, export actions, and final confirmation keyboard reachable.
Keep focus near the mapping or error that changed after auto-map, validation, repair, or reset actions.
Provide downloadable reports in accessible formats with row numbers, field names, error reasons, and recovery guidance.
Keyboard Behavior
Tab reaches upload action, template download, mapping controls, error filters, duplicate decisions, confirmation controls, and report downloads in a logical order.
Enter or Space activates file selection, auto-map, reset mapping, validate, filter, export, cancel, and confirm actions.
Mapping dropdowns can be changed without pointer drag gestures.
After validation, focus moves to the validation summary or first blocking error.
After exporting an error report, focus remains in the results area with confirmation of the downloaded report.
Escape closes confirmation dialogs without starting the import.