Skip to main content

WF-116: Bulk User Import

Workflow ID: WF-116 Category: User Management Priority: P1 Last Updated: January 11, 2026


Overview

This workflow handles bulk user import via CSV upload, including validation, team assignment, batch invitation sending, and progress tracking.


Trigger Events

  • Admin uploads CSV file
  • HR system integration sync
  • Organization onboarding
  • Team expansion

Sequence Diagram


Process Steps

1. CSV File Preparation

Required Format:

email,first_name,last_name,team,role
john@example.com,John,Doe,Engineering,member
jane@example.com,Jane,Smith,Sales,admin
bob@example.com,Bob,Wilson,Marketing,member

Required Columns:

ColumnTypeRequiredDescription
emailstringYesValid email address
first_namestringYesUser's first name
last_namestringYesUser's last name
teamstringNoTeam name or ID
rolestringNoRole (member/admin)

Optional Columns:

ColumnTypeDescription
departmentstringDepartment name
titlestringJob title
manager_emailstringManager's email
start_datedateAccess start date
expiry_datedateAccess expiry date
license_typestringLicense tier

2. Validation

Validation Rules:

CheckRuleAction if Failed
Email formatRFC 5321 compliantMark row as error
Email uniquenessNot already in systemMark as duplicate
Team existsTeam name must existCreate or error
Role validmember/admin onlyDefault to member
CSV formatProper escapingParse error
File sizeMax 10MB / 10,000 rowsReject file

Validation Response:

{
"file_name": "users.csv",
"total_rows": 150,
"valid_rows": 145,
"error_rows": 5,
"duplicate_rows": 3,
"errors": [
{"row": 12, "column": "email", "error": "Invalid email format"},
{"row": 45, "column": "team", "error": "Team 'Unknown' not found"},
{"row": 78, "column": "email", "error": "Duplicate email in file"}
],
"warnings": [
{"row": 23, "column": "role", "warning": "Unknown role, defaulting to 'member'"}
],
"can_proceed": true
}

3. Preview & Confirmation

Import Preview:

MetricValue
Users to create145
Teams affected5
Invitations to send145
License seats required145
Seats available200

Admin Options:

  • Send invitations immediately
  • Schedule invitations for date
  • Skip duplicate emails
  • Auto-create missing teams
  • Set default role for missing

4. Batch Processing

Queue Processing:

Total: 145 users
├── Batch 1: 50 users (in progress)
├── Batch 2: 50 users (queued)
└── Batch 3: 45 users (queued)

Progress: 32/145 (22%)
├── Created: 30
├── Invited: 28
└── Errors: 2

Processing Order:

  1. Create user record (status: pending)
  2. Assign to team
  3. Apply role/permissions
  4. Send invitation email
  5. Update status to invited

5. Invitation Sending

Batch Email Settings:

SettingDefaultConfigurable
Rate limit10/secondYes
Retry attempts3Yes
Retry delay60 secondsYes
Expiry period7 daysYes

Invitation Email:

Subject: You're invited to join [Organization] on CODITECT

Hi [First Name],

[Admin Name] has invited you to join [Team Name].

Accept your invitation: [INVITATION_URL]

This link expires in 7 days.

6. Progress Tracking

Real-Time Dashboard:

StatusCountPercentage
Queued5034%
Processing53%
Invited8559%
Failed53%
Total145100%

Status Updates:

  • WebSocket for real-time updates
  • Polling fallback every 5 seconds
  • Email summary when complete

API Endpoints

EndpointMethodPurpose
/api/v1/users/bulk-importPOSTUpload and validate CSV
/api/v1/users/bulk-import/previewGETGet import preview
/api/v1/users/bulk-import/confirmPOSTConfirm and execute
/api/v1/users/bulk-import/statusGETGet progress status
/api/v1/users/bulk-import/cancelPOSTCancel in-progress import

Request: Upload CSV

POST /api/v1/users/bulk-import
Content-Type: multipart/form-data

file: users.csv
options: {
"skip_duplicates": true,
"auto_create_teams": false,
"default_role": "member",
"send_invitations": true
}

Response: Validation Result

{
"import_id": "imp_123",
"status": "validated",
"summary": {
"total": 150,
"valid": 145,
"errors": 5,
"duplicates": 3
},
"preview_url": "/api/v1/users/bulk-import/imp_123/preview",
"expires_at": "2026-01-11T13:00:00Z"
}

Request: Confirm Import

POST /api/v1/users/bulk-import/imp_123/confirm
{
"schedule": "immediate",
"skip_errors": true,
"notification_email": "admin@example.com"
}

CSV Template

Download template: /api/v1/users/bulk-import/template

# CODITECT Bulk User Import Template
# Required: email, first_name, last_name
# Optional: team, role, department, title

email,first_name,last_name,team,role,department,title
user@example.com,First,Last,TeamName,member,Engineering,Developer

Error Handling

ErrorCauseResolution
FILE_TOO_LARGEExceeds 10MBSplit into smaller files
INVALID_FORMATMalformed CSVCheck CSV escaping
SEAT_LIMITNot enough licensesPurchase more seats
RATE_LIMITEDToo many importsWait and retry
PARTIAL_FAILURESome users failedReview error report

Audit Events

EventLogged
bulk_import.startedAdmin, File name, Row count
bulk_import.validatedValid/Error counts
bulk_import.confirmedOptions selected
bulk_import.user_createdUser ID, Email
bulk_import.invitation_sentUser ID, Email
bulk_import.completedSuccess/Fail counts
bulk_import.cancelledAdmin, Reason


Last Updated: January 11, 2026