Skip to content

iCIMS to Workday Migration: The CTO's Technical Guide

A technical guide to migrating from iCIMS to Workday — covering API rate limits, data model mapping, the CRM gap, and step-by-step migration architecture.

Raaj Raaj · · 24 min read
iCIMS to Workday Migration: The CTO's Technical Guide
TALK TO AN ENGINEER

Planning a migration?

Get a free 30-min call with our engineers. We'll review your setup and map out a custom migration plan — no obligation.

Schedule a free call
  • 1,200+ migrations completed
  • Zero downtime guaranteed
  • Transparent, fixed pricing
  • Project success responsibility
  • Post-migration support included

Migrating from iCIMS to Workday Recruiting is a schema-compression and API-orchestration problem. iCIMS is a recruiter-centric ATS built around flexible, modular data models — Person Profiles, Job Profiles, Recruiting Workflows (the junction object linking candidates to jobs), Talent Pools, and a native CRM with nurture campaigns and SMS outreach. Workday Recruiting is a module inside a unified HCM platform with an opinionated, enterprise-wide data model built around Worker, Job Requisition, Job Application, Candidate, and Organization objects — with strict inbound data constraints.

Every architectural gap between these two systems is where candidate records, historical applications, attachment files, and talent pool data silently break if you don't engineer around them.

If you need a fast decision: CSV exports from iCIMS cannot preserve nested relational data like the Requisition → Candidate → Application → Offer chain, attachment binaries, or CRM pipeline history. API-based extraction via the iCIMS REST API, combined with Workday Web Services (SOAP) or the REST API for loading, is the only path that handles full-fidelity historical migration at enterprise scale. Workday's EIB spreadsheet uploads work for foundation data but are not viable for complex relational objects or binary attachments at scale. The pre-built iCIMS-to-Workday connector is designed for ongoing sync — not one-time historical data transfers.

This guide covers the real API constraints on both sides, object-by-object mapping, every viable migration method with trade-offs, the CRM data gap that trips up most projects, and the edge cases that cause silent data loss.

For related ATS migration topics, see our guides on common ATS migration gotchas, GDPR/CCPA compliance during candidate data transfers, and the HRIS Data Migration Checklist.

iCIMS vs. Workday: The Architecture Gap

iCIMS Talent Cloud is an enterprise ATS with a modular, recruiter-centric architecture. Its data model is built around four primary objects accessible via its REST API (developer-community.icims.com):

  • Person Profile — a generic record for candidates, employees, and hiring managers
  • Job Profile — represents any open or closed requisition with location, description, and metadata
  • Recruiting Workflow — the many-to-many join object between Person and Job profiles, representing a specific application with status, source, and history
  • Company Profile (also called Location Profile) — stores hiring location and company-level data

iCIMS also includes Talent Pool Profiles, iForms (electronic paperwork), Event Profiles, and a built-in CRM with talent pools, email/SMS campaigns, candidate tagging, and pipeline nurture as standard features.

Workday Recruiting is a module within Workday HCM. Its data model is tightly coupled with the broader platform:

  • Candidate — a person who has expressed interest or been sourced
  • Job Requisition — the open position, linked to Organization and Position objects
  • Job Application — the join between Candidate and Job Requisition, carrying stage and disposition data
  • Worker — the HCM-wide employee record a candidate becomes upon hire
  • Organization — supervisory hierarchy that governs positions and access

The CRM and Engagement Gap

This is the structural mismatch that breaks most migrations. iCIMS includes a full CRM natively — talent pools, SMS/email campaigns, candidate tagging, engagement scoring, and pipeline nurture. Workday's talent acquisition suite has expanded to include candidate engagement and marketing capabilities (workday.com), but the practical migration question is narrower: does your licensed Workday tenant have a one-to-one destination for iCIMS talent pools, nurture logic, engagement history, and recruiter notes?

Usually the answer is only partial. Organizations moving from iCIMS to Workday commonly integrate third-party CRM tools like Beamery or Gem for talent pooling and proactive sourcing. This means an entire category of iCIMS data — CRM contacts, campaign history, talent pool memberships, engagement scores — may have no direct target in Workday. You either migrate it to a third-party CRM, archive it to a data lake, or lose it.

Warning

Before scoping, verify your Workday tenant's actual CRM capabilities. If your iCIMS instance relies heavily on CRM features — talent pools, nurture campaigns, engagement scoring — budget for a third-party CRM integration alongside the Workday Recruiting migration. Skipping this step is the most common cause of unexpected data loss.

Key Differences at a Glance

Dimension iCIMS Workday Recruiting
Architecture Standalone ATS with modular add-ons Module within unified HCM suite
CRM/Engagement Native (talent pools, campaigns, nurture, SMS) Candidate engagement features available; full CRM parity depends on tenant licensing
Custom fields Highly configurable per customer Possible but governed by strict business object schema
API model REST (JSON), OAuth 2.0 / HMAC SOAP (WWS) + REST (JSON), OAuth 2.0
Data export API or scheduled SFTP batch files RaaS, EIB, SOAP/REST APIs
Event notifications Push-based (GZIP JSON over HTTPS) Webhook support varies by module
Implementation timeline 3–6 months typical 6–12 months typical

Migration Approaches: CSVs, APIs, Connectors, and Middleware

There are five viable paths. None is universally correct — the right choice depends on data volume, relationship complexity, and whether you need a one-time migration or ongoing sync.

1. Native CSV Export / EIB Import

How it works: Export flat files from iCIMS (via scheduled reports or manual CSV export), then load them into Workday using the Enterprise Interface Builder (EIB) with XML spreadsheet templates.

When to use it: Small datasets (under 10,000 records), foundation data only (locations, job profiles, basic candidate contact info), or when historical application chains don't matter.

Constraints:

  • Workday EIB caps at 30 MB per browser upload. SFTP uploads support larger files — commonly cited at 300 MB in implementation guidance, though Workday's public docs don't surface this limit directly. Verify against your tenant before planning single-pass loads. (workday.com)
  • EIB templates require XML Spreadsheet 2003 format — formatting changes can cause silent failures
  • Cannot handle binary attachments (resumes, offer letters)
  • Cannot preserve the Requisition → Candidate → Application → Offer relationship chain
  • iCIMS CSV exports flatten nested structures, losing workflow status history and multi-level relationships

Complexity: Low | Scalability: Small datasets only

For a deeper analysis, see Using CSVs for SaaS Data Migrations: Pros and Cons.

2. API-Based Migration (iCIMS REST → Workday WWS/REST)

How it works: Extract data from iCIMS using its REST API (Search API for IDs, Profiles API for full records, Binary Files endpoints for attachments), transform in a staging layer, then load into Workday using SOAP Web Services (WWS) or the REST API. (developer-community.icims.com)

When to use it: Enterprise-scale migrations where you need full-fidelity historical data, attachments, and relationship preservation.

Constraints:

  • iCIMS enforces a hard limit of 10,000 API calls per day per customer by default, with rate limit headers in each response. Higher limits can be purchased in blocks of 10,000. (developer-community.icims.com)
  • iCIMS supports approximately 5 concurrent API calls per license
  • The iCIMS Search API returns system IDs, not full payloads — forcing a two-step pattern: search first, then hydrate each record individually. Returns up to 1,000 matches per page.
  • Workday does not publish official global rate limits but actively throttles under load. Specific endpoints limit requests to 5 per second, returning 429 Too Many Requests errors. Implementation partners report roughly 10 calls per second before requests start degrading.
  • Workday SOAP requests can take up to 90 seconds regardless of payload size
  • Workday terminates HTTP requests exceeding 6 hours

Complexity: High | Scalability: Enterprise-grade (with proper batching)

This is the only method that gives you a reasonable shot at preserving application lineage. The iCIMS Workflows API exposes submittalstatuslog entries — but only the 100 most recent status updates per workflow. If a requisition has been active for years, decide early whether 100 events is enough. (developer-community.icims.com)

3. Pre-Built iCIMS-Workday Connector

How it works: iCIMS offers a configurable integration with Workday HCM/Recruiting that syncs employee data, requisitions, and applications between the two systems on a set interval. (icims.com)

When to use it: Ongoing operational sync between iCIMS (as the ATS) and Workday (as the HRIS). Not designed for one-time historical data migration.

Constraints:

  • Syncs limited field sets — primarily employee data, requisition metadata, and application status
  • Does not migrate historical candidate pools, CRM data, interview logs, or attachments
  • Designed for organizations running both systems simultaneously, not for migration cutover

Complexity: Medium | Scalability: Limited to operational sync patterns

4. iPaaS / Middleware (Boomi, Workato, MuleSoft)

How it works: Use an integration platform to orchestrate the ETL pipeline between iCIMS and Workday with pre-built connectors, visual workflow builders, and error handling.

When to use it: When you have iPaaS budget, need an auditable integration layer, and want built-in retry/error management — primarily for post-cutover delta sync.

Constraints:

  • Does not eliminate the data-mapping problem — you still define field-by-field transformations
  • Subject to the same iCIMS (10,000/day) and Workday (per-second throttling) rate limits
  • Cost scales with task volume — large historical migrations get expensive on per-task pricing
  • Poor fit for massive historical backfills and attachment-heavy transfers
  • iCIMS push event notifications are real-time (GZIP-compressed JSON over HTTPS, 30-second response window), but file-based exports are scheduled only (developer-community.icims.com)

Complexity: Medium–High | Scalability: Good for ongoing sync, poor for historical backfill

5. Custom ETL Pipeline

How it works: Build a bespoke extraction, transformation, and loading pipeline using Python, Node.js, or similar. Full control over batching, retry logic, staging, crosswalk tables, and relationship reconstruction.

When to use it: When you have a dedicated engineering team, need total control over migration logic, strict audit requirements, and plan multiple rehearsals.

Constraints:

  • Highest engineering investment — expect 4–12 weeks for a custom integration against Workday
  • Must handle both SOAP and REST on the Workday side (REST has narrower domain coverage)
  • Every Workday integration requires an Integration System User (ISU) — a dedicated Workday user with its own security profile and permissions
  • Ongoing maintenance required as Workday releases new API versions twice per year

Complexity: High | Scalability: Enterprise-grade

For an honest assessment of AI-generated migration scripts, see Why DIY AI Scripts Fail.

Migration Approach Comparison

Approach Complexity Attachments Relationships CRM Data Best For
CSV + EIB Low Small, flat datasets
API-based High Partial Enterprise full-fidelity
Pre-built connector Medium Partial Ongoing sync only
iPaaS / Middleware Medium–High Partial Auditable pipeline, post-cutover sync
Custom ETL High Full control, dedicated team

Scenario recommendations:

  • Small business (<5,000 candidates): CSV + EIB for core data; accept historical data loss
  • Enterprise (50,000+ candidates): API-based or Custom ETL with managed service support
  • Ongoing sync (both systems live): Pre-built connector or iPaaS
  • Low engineering bandwidth: Managed migration service — not a low-code sync tool pretending to be a migration engine

When a Managed Migration Service Is the Better Call

Building an iCIMS-to-Workday migration pipeline in-house sounds reasonable until you hit the compounding constraints:

  1. The iCIMS 10,000 calls/day limit means extracting 100,000 candidate records with attachments takes a minimum of 10+ days of continuous API polling — assuming zero retries and perfect efficiency. Each attachment requires a separate binary GET request.
  2. Workday's undocumented throttling means your load scripts will silently fail under production-level concurrency. Without proper 429-handling and exponential backoff, you get partial loads that look complete.
  3. The ISU security model requires Workday-specific expertise to configure correctly. Misconfigured permissions cause cryptic validation errors at load time.
  4. Workday's bi-annual API updates can break integrations. You're not just building a script — you're signing up for ongoing maintenance.

The hidden cost is not the code. It's the 6–8 weeks of engineering time spent learning two unfamiliar API surfaces, debugging cryptic EIB error messages, and handling edge cases that only surface at scale. The migration also competes with the Workday implementation itself, recruiter training, security design, and UAT for the same internal resources.

This is why we tell CTOs to separate migration delivery from Workday implementation ownership — they compete for the same people and the same calendar. For more on this split, see Why Data Migration Isn't Implementation. For a cost-risk breakdown, see In-House vs. Outsourced Data Migration.

What ClonePartner Brings to iCIMS-to-Workday Migrations

  • Optimized extraction that works within iCIMS's 10,000/day API ceiling through intelligent batching, delta extraction, and parallel binary downloads
  • Full relationship reconstruction — preserving the Requisition → Candidate → Application → Offer/Attachment chain that native tools drop
  • CRM data triage — mapping talent pool memberships and engagement history to either Workday custom fields or a third-party CRM target
  • Attachment migration — extracting resume binaries from iCIMS and loading them as Workday candidate attachments via WWS
  • Enterprise timelines — complex migrations completed in days, not the months typical of DIY Workday implementations

Pre-Migration Planning & Data Audit

Before touching any API, audit what you actually have in iCIMS and what you actually need in Workday.

Data Audit Checklist

iCIMS Object Audit Action
Person Profiles Count candidates, employees, hiring managers. Flag duplicates by email. Identify active vs. archived.
Job Profiles Identify open, closed, evergreen, confidential, and archived requisitions. Decide historical cutoff.
Recruiting Workflows Count applications per candidate. Flag multi-application candidates. Assess history depth.
Talent Pools Inventory all pools, member counts, owners, and campaign associations.
iForms Determine which forms contain compliance-critical data (I-9, background check consent).
Attachments Count and size all resume binaries. Estimate total storage. Verify which are API-accessible.
Custom Fields Export full custom field list. Map to Workday equivalents or flag for archival.
CRM Data Inventory nurture campaigns, engagement scores, SMS/email history.

Define Migration Scope

Most organizations don't need to migrate everything. Force hard yes/no decisions early:

  • Active candidates only vs. full historical archive
  • Last N years of closed requisitions (e.g., 2 years for compliance, 3 years for operational value)
  • CRM data — migrate to Beamery/Gem, archive to data lake, or discard
  • iForms — typically archived as PDFs rather than migrated into Workday business processes
  • Duplicate candidates — deduplicate before migration, not after
  • Stage history — preserve in Workday, archive externally, or discard

If you don't force these decisions early, the project scope becomes a moving target.

Migration Strategy

Strategy When to Use Risk Level
Big bang Clean cutover, short downtime window acceptable, compressed scope High
Phased Migrate by business unit, region, or data type (foundation → candidates → attachments) Medium
Incremental + delta sync Multiple rehearsals needed, iCIMS stays live until final cutover Low

For most iCIMS-to-Workday projects, phased migration works best: load foundation data first, then candidates and applications, then attachments and CRM data last. In enterprise cases with extended timelines, incremental backfill plus a short delta window is the safest pattern.

Info

Keep a raw, immutable copy of every source payload you extract from iCIMS. The easiest rollback is not writing delete scripts in Workday — it's being able to replay a known-good source snapshot with corrected mappings.

Data Model & Object Mapping (iCIMS → Workday)

This is where the real engineering work happens. The data models don't align 1:1, and Workday's stricter schema forces compression decisions.

Core Object Mapping

iCIMS Object Workday Equivalent Notes
Person Profile (Candidate) Candidate Name, contact info, source. Custom fields require Workday custom object or calculated field configuration.
Person Profile (Employee) Worker Only relevant if syncing employee data bidirectionally.
Job Profile Job Requisition Map title, location, department, posting status. Requisition is tightly coupled to Position and Organization.
Recruiting Workflow Job Application The join object. Must carry application status, stage history, and disposition.
Company Profile / Location Organization / Location Workday's supervisory org hierarchy is more rigid than iCIMS's flat company model.
Talent Pool Profile No standard equivalent Migrate to third-party CRM talent pool, Workday custom object, or archive.
CRM Campaigns No standard equivalent Migrate to third-party CRM or archive.
iForms No direct mapping Archive as PDF attachments or extract specific compliance fields into Workday custom objects.
Attachments (resumes) Candidate Attachments Binary extraction from iCIMS, upload via WWS Put_Worker_Document.
Notes / Interview Feedback Job Application Comments Workday's comment model is simpler than iCIMS's structured interview feedback. Expect data compression.

Field-Level Mapping

iCIMS Field iCIMS API Path Workday Field Workday API Element Transform Notes
First Name person.firstname Legal First Name Name_Detail_Data.First_Name Direct map
Last Name person.lastname Legal Last Name Name_Detail_Data.Last_Name Direct map
Email person.email Email Address Email_Address_Data.Email_Address Validate format; primary email only
Phone person.phones Phone Number Phone_Data.Phone_Number Map phone type (home/mobile/work)
Source person.source Recruiting Source Recruiting_Source_Reference Picklist value mapping required
Resume /fields/resume/binary Candidate Attachment Put_Worker_Document Binary transfer, preserve filename
Application Status workflow.status Application Stage Job_Application_Data.Status Map iCIMS statuses to Workday business process stages
Job Title job.jobtitle Job Posting Title Job_Requisition_Data.Job_Posting_Title Direct map
Location job.location (via Company Profile) Location Location_Reference Map to Workday Location reference ID
Hiring Manager job.hiringmanager Hiring Manager Hiring_Manager_Reference Map to Workday Worker WID
Apply Date workflow.createdate Application Date Job_Application_Data.Application_Date Normalize to UTC. Workday defaults to current date if not explicitly set.
Custom Fields person.field_{custom_id} Custom Object / Calculated Field Varies Requires per-field Workday configuration

Key Mapping Considerations

  • Picklist values: iCIMS picklists are customer-configurable. Workday uses constrained reference data. Every picklist needs a value-by-value mapping table. Normalize list values before the first Workday load, not after.
  • Date formats: Both systems use ISO 8601, but Workday enforces UTC timezone handling on all Date and Time fields.
  • Multi-value fields: iCIMS supports field groups (repeating field sets). These must be flattened or mapped to Workday's multi-instance sub-objects.
  • Custom fields: iCIMS customers often have 50+ custom fields per profile. Workday allows custom objects and calculated fields but with governance overhead — each requires security configuration and business process integration. Prioritize which custom fields actually carry business value.
  • Department mapping: Don't map iCIMS department or company fields by label alone. In Workday, routing, security, and reporting depend on distinct organization objects. A text match that looks right in a spreadsheet can break business processes after go-live.
Warning

The Custom Field Trap: iCIMS allows near-unlimited custom fields. Workday heavily restricts custom objects and requires explicit configuration for each. Audit iCIMS custom fields and map them to standard Workday fields wherever possible, or accept that some data stays behind.

Info

iCIMS uses customer-specific custom field IDs, but standard fields have consistent integration IDs across all customers. Always map using standard field IDs where possible to ensure repeatability across environments.

Migration Architecture: APIs, Rate Limits, and Large Datasets

iCIMS Extraction Layer

API surface: REST API at api.icims.com (US) or api-eu.icims.com (EU). Key endpoints (developer-community.icims.com):

  • POST /customers/{id}/search/people — search and paginate through candidates (up to 1,000 per page)
  • GET /customers/{id}/people/{personId} — get full person profile
  • GET /customers/{id}/people/{personId}/fields/resume/binary — extract resume attachment
  • POST /customers/{id}/search/applicantworkflows — list all applications
  • GET /customers/{id}/applicantworkflows/{id} — get application details including status history
  • GET /customers/{id}/applicantworkflows/person/{personId}/job/{jobId} — get workflow by person and job
  • POST /customers/{id}/search/jobs — list all requisitions

Authentication: OAuth 2.0 Client Credentials Grant (regional authorization servers) or BASIC/HMAC for standard integrations. Access tokens expire after 86,400 seconds (24 hours).

Rate limits: 10,000 API calls per day per customer by default (developer-community.icims.com). Each response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers. Limits reset at 12:00 AM UTC. Concurrency limited to approximately 5 simultaneous requests per license. Higher limits can be purchased in blocks of 10,000.

Key constraint: iCIMS scheduled file exports run via SFTP (hourly or daily) and do not support event triggers for flat-file bulk transfers. For granular, on-demand data access during migration, the API is the only path. iCIMS does support push event notifications for real-time operational sync, but these are built for individual record changes — not bulk historical extraction (developer-community.icims.com).

Workday Loading Layer

API surface: Dual API — SOAP Web Services (WWS) for full business object coverage, REST API for simpler operations. Workday Studio for complex orchestration. (community-content.workday.com)

Key operations for recruiting data loading:

  • Put_Candidate (WWS) — create or update candidate records
  • Put_Job_Requisition (WWS) — create requisitions
  • Import_Job_Application — load application records
  • Put_Worker_Document — attach documents to candidate/worker records

Authentication: OAuth 2.0 via Integration System User (ISU). Each ISU requires its own security profile, API client registration, and permission scoping. Workday recommends one ISU per integration system.

Rate limits: No published global limits, but Workday enforces throttling under load. Specific endpoints limit to 5 requests per second, returning 429 Too Many Requests errors. Implementation partners report approximately 10 requests per second before responses start degrading. SOAP requests can report latency of up to 90 seconds per call. Workday terminates HTTP requests exceeding 6 hours.

EIB constraints: 30 MB browser upload. SFTP upload commonly cited at 300 MB — verify in your tenant before planning single-pass loads. XML Spreadsheet 2003 format required. XSLT transformations capped at 2 hours. Error messages are often cryptic.

Batching Strategy for Large Datasets

Given iCIMS's 10,000/day limit and Workday's per-second throttling, a migration of 100,000 candidates requires careful orchestration:

  1. Extract phase: Use iCIMS Search API to get IDs in bulk (1 call per page of up to 1,000 results), then fetch individual records. Budget approximately 3 API calls per candidate (profile + attachment check + binary download). That's 300,000 calls = 30 days of extraction at default limits.
  2. Transform phase: Run offline — normalize picklists, deduplicate, build Workday-compatible payloads, generate external ID crosswalks.
  3. Load phase: Batch Workday WWS calls with delays between requests. Implement exponential backoff on 429 responses. Always load into Sandbox first.
Tip

To compress a 30-day extraction window, request an API Call Limit Increase from iCIMS (available in blocks of 10,000). At 50,000 calls/day, extraction drops to approximately 6 days. This is almost always worth the cost for enterprise migrations.

A good architectural pattern is two queues: one for structured records and one for binary files. Structured data hits foreign-key and picklist validation rules; files hit bandwidth, retry, and storage constraints. Keeping them separate makes failures easier to isolate and replay.

Step-by-Step Migration Process

Step 1: Extract Data from iCIMS

import requests
import time
 
# iCIMS OAuth 2.0 token acquisition
def get_icims_token(client_id, client_secret, auth_server):
    resp = requests.post(f"{auth_server}/oauth/token", data={
        "grant_type": "client_credentials",
        "client_id": client_id,
        "client_secret": client_secret,
        "audience": "https://api.icims.com/v1/"
    })
    return resp.json()["access_token"]
 
# Paginated candidate extraction with rate limit handling
def extract_candidates(token, customer_id, page_size=100):
    headers = {"Authorization": f"Bearer {token}"}
    search_url = f"https://api.icims.com/customers/{customer_id}/search/people"
    
    payload = {
        "filters": [{"name": "person.folder", "value": ["Candidate"]}],
        "count": page_size
    }
    
    candidates = []
    offset = 0
    while True:
        payload["offset"] = offset
        resp = requests.post(search_url, json=payload, headers=headers)
        
        # Check rate limit headers
        remaining = int(resp.headers.get("X-RateLimit-Remaining", 0))
        if remaining < 100:
            reset_seconds = int(resp.headers.get("X-RateLimit-Reset", 3600))
            time.sleep(reset_seconds)
        
        data = resp.json()
        results = data.get("searchResults", [])
        if not results:
            break
        candidates.extend(results)
        offset += page_size
    
    return candidates
 
# Extract individual candidate with resume binary
def extract_candidate_full(token, customer_id, person_id):
    headers = {"Authorization": f"Bearer {token}"}
    base = f"https://api.icims.com/customers/{customer_id}"
    
    profile = requests.get(f"{base}/people/{person_id}", headers=headers).json()
    
    resume = None
    try:
        resume_resp = requests.get(
            f"{base}/people/{person_id}/fields/resume/binary",
            headers=headers
        )
        if resume_resp.status_code == 200:
            resume = resume_resp.content
    except Exception as e:
        log_error(f"Resume extraction failed for {person_id}: {e}")
    
    return {"profile": profile, "resume": resume}

Useful iCIMS endpoint patterns (developer-community.icims.com):

GET /customers/{customerId}/applicantworkflows/person/{personId}/job/{jobId}
GET /customers/{customerId}/people/{personId}/fields/resume/binary
GET /customers/{customerId}/people/{personId}/fields/resume/pdf

Step 2: Transform Data

Key transformation tasks:

  • Map iCIMS picklist values to Workday reference IDs
  • Convert iCIMS Person Profile fields to Workday Candidate schema
  • Reconstruct the Recruiting Workflow → Job Application relationship using iCIMS workflow IDs
  • Normalize date fields to UTC
  • Handle multi-value fields (education history, work history) into Workday's repeating sub-objects
  • Generate unique reference IDs for each Workday business object
  • Build external ID crosswalks for every migrated person, requisition, workflow, and file — so reruns don't create duplicates

Step 3: Load into Workday

Load order matters. Workday requires foundation objects to exist before you can reference them:

  1. Organizations and Locations — Workday's supervisory org hierarchy must be in place first
  2. Job Requisitions — reference orgs and locations
  3. Candidates — person records with contact info
  4. Job Applications — link Candidates to Requisitions with stage data
  5. Attachments — link to Candidate records
from zeep import Client as SoapClient
 
def load_candidate_to_workday(wws_url, candidate_data, isu_credentials):
    """Load a candidate into Workday via WWS Put_Candidate."""
    client = SoapClient(wws_url)
    
    candidate_payload = {
        "Candidate_Data": {
            "Candidate_ID": candidate_data["reference_id"],
            "Candidate_Personal_Data": {
                "Name_Data": {
                    "Legal_Name_Data": {
                        "Name_Detail_Data": {
                            "First_Name": candidate_data["first_name"],
                            "Last_Name": candidate_data["last_name"]
                        }
                    }
                },
                "Contact_Data": {
                    "Email_Address_Data": [{
                        "Email_Address": candidate_data["email"],
                        "Usage_Data": {"Public": True}
                    }]
                }
            }
        }
    }
    
    try:
        response = client.service.Put_Candidate(**candidate_payload)
        return {"status": "success", "wid": response.Candidate_Reference}
    except Exception as e:
        return {"status": "error", "message": str(e)}

Step 4: Rebuild Relationships

After loading candidates and requisitions independently, reconstruct application relationships:

  1. Map iCIMS Recruiting Workflow IDs to newly created Workday Candidate WIDs and Job Requisition WIDs
  2. Use Import_Job_Application to create application records with correct stage mappings
  3. Explicitly set historical dates — Workday defaults to the current date if application dates are not overridden
  4. Attach resumes to correct candidate records via Put_Worker_Document

This is where scripts most commonly fail. A Recruiting Workflow in iCIMS must become three separate Workday operations: POST the candidate, POST the requisition (if it doesn't exist), and POST the application linking the two — all with historical dates preserved.

Step 5: Migrate Attachments

Extract resume binaries from iCIMS via the Binary Files endpoint. Run this in a separate pipeline from structured data — attachments have different failure modes (MIME type mismatches, antivirus rejections, file size limits) and should be batched during off-peak hours.

High-Level Migration Orchestrator

import time
import random
 
class ICIMSToWorkdayMigration:
    def __init__(self, config):
        self.icims_client = ICIMSClient(config.icims)
        self.workday_client = WorkdayClient(config.workday)
        self.mapper = DataMapper(config.field_mappings)
        self.logger = MigrationLogger(config.log_path)
    
    def run(self):
        # Phase 1: Extract
        candidates = self.icims_client.extract_all_candidates()
        jobs = self.icims_client.extract_all_jobs()
        workflows = self.icims_client.extract_all_workflows()
        
        # Phase 2: Transform
        wd_candidates = [self.mapper.transform_candidate(c) for c in candidates]
        wd_requisitions = [self.mapper.transform_job(j) for j in jobs]
        wd_applications = [self.mapper.transform_workflow(w) for w in workflows]
        
        # Phase 3: Load (order matters)
        self.load_with_retry(self.workday_client.put_candidates, wd_candidates)
        self.load_with_retry(self.workday_client.put_requisitions, wd_requisitions)
        self.load_with_retry(self.workday_client.put_applications, wd_applications)
        
        # Phase 4: Attachments (separate pipeline)
        for candidate in candidates:
            if candidate.get("resume"):
                self.workday_client.put_document(
                    candidate["workday_wid"],
                    candidate["resume"]
                )
        
        # Phase 5: Validate
        self.validate(candidates, wd_candidates)
    
    def load_with_retry(self, load_fn, records, max_retries=3):
        for record in records:
            for attempt in range(max_retries):
                try:
                    result = load_fn(record)
                    self.logger.log_success(record, result)
                    break
                except RateLimitError:
                    time.sleep(2 ** attempt)  # Exponential backoff
                except ValidationError as e:
                    self.logger.log_error(record, e)
                    break  # Don't retry validation errors
    
    def validate(self, source, target):
        assert len(source) == len(target), "Record count mismatch"
        sample = random.sample(target, min(len(target), 500))
        for record in sample:
            self.logger.log_validation(record)

Edge Cases That Break Migrations

Duplicate candidates: iCIMS allows the same person to exist as both a candidate and employee with different profile IDs. Workday deduplicates aggressively by email. Build dedup logic before loading — not after. Duplicate candidates and duplicate applications are different problems: one person can legitimately have multiple applications across jobs. Your dedup rules must distinguish person identity from application identity. (developer-community.icims.com)

Multi-application candidates: In iCIMS, one person can have dozens of Recruiting Workflows across different jobs over several years. Each must become a separate Job Application in Workday, all linked to a single unified Candidate record.

Workflow history is capped at 100 events: The iCIMS API exposes submittalstatuslog entries but limits results to the 100 most recent status updates per workflow. If a requisition has been active for years, older history won't be accessible via the API. Decide early whether 100 events is sufficient, whether historical logs exist in another export, or whether you'll archive older history outside Workday. (developer-community.icims.com)

Not every attachment is API-accessible: iCIMS documents binary access for resumes and file/image fields, but files on the Person profile Attachments tab may have no field ID and be ATS-only unless they live in a custom binary field. Verify attachment accessibility in your specific tenant before scoping the migration. (developer-community.icims.com)

Custom field overflow: iCIMS customers often have 50+ custom fields per profile. Workday's custom object model requires explicit configuration for each — security policy updates, ISU permission grants, and business process integration. Prioritize which custom fields carry real business value.

Missing required fields: Workday enforces required fields that iCIMS may allow to be blank (e.g., country codes, properly formatted email addresses, candidate addresses). Your ETL pipeline must include a pre-load validation pass that flags incomplete records and injects sensible defaults where appropriate.

iCIMS iForms: These contain compliance-critical data (I-9 verification, background check consent) stored in a separate data model. They cannot be directly migrated into Workday business processes — archive them as PDF attachments or extract specific fields into Workday custom objects.

Historical date handling: Workday defaults to the current date for application dates if not explicitly overridden. If you're loading 3 years of historical applications, every record needs an explicit application date or you'll end up with thousands of applications incorrectly dated to today.

EEO/OFCCP compliance data: Equal Employment Opportunity data and OFCCP audit logs must be migrated with exact historical timestamps to maintain legal compliance. This data cannot be approximated or reconstructed.

Candidate source attribution: iCIMS's source/source channel taxonomy may not map cleanly to Workday's source reference data. Mismatched source values break recruiting analytics from day one.

For a deeper dive into structural traps, see our guide on ATS migration gotchas.

Validation, Testing & Rollback

Validation Framework

Check Method Threshold
Record count Compare iCIMS source count vs. Workday target count per object type 100% match
Field-level spot check Sample 5% of records, compare 10 critical fields each <0.1% error rate
Relationship integrity Verify Candidate → Application → Requisition chains 100% linked
Attachment verification Confirm resume count matches, spot-check file opens correctly 100% count match
Picklist accuracy Compare transformed values against Workday reference data Zero unmapped values
Source attribution Verify candidate source data mapped correctly Sampled comparison
Date accuracy Confirm historical dates preserved, not defaulted to current date Spot-check 100 records

Testing Strategy

  1. Always test in Workday Sandbox first. Never execute a production migration without full sandbox validation. Workday's EIB includes a Validate File Only mode that runs a trial without committing data.
  2. Start small: Load 100 records to catch schema errors early.
  3. Scale incrementally: 100 → 1,000 → 10,000 → full load. Check error rates at each tier.
  4. Run at least two full test migrations before production — one happy-path test and one ugly-data test with edge cases.
  5. UAT with real recruiters: Have 3–5 recruiters verify their own candidate records, applications, and attachment accessibility. Use live business cases: pick one high-volume requisition, one confidential requisition, one hired candidate with files, and one recruiter-owned talent pool that matters. If those pass, the rest is usually a scale problem, not a logic problem.
  6. Confirm idempotency: Re-run the migration to verify no duplicate records are created.

Rollback Planning

  • Before migration: Take a full data export of the iCIMS environment (data + attachment archive). Snapshot the Workday Sandbox state.
  • During migration: Log every API call with request/response payloads. Track Workday WIDs mapped to iCIMS source IDs via crosswalk tables.
  • If rollback needed: Use Workday's rescind/cancel operations for loaded business process records. For EIB loads, error reports identify which records failed. The easiest rollback is replaying a known-good source snapshot with corrected mappings.

Post-Migration Tasks

  1. Rebuild automations: iCIMS workflow triggers, email templates, and status-change automations don't transfer. Rebuild in Workday's Business Process framework.
  2. Reconfigure integrations: Job board postings, background check vendors, assessment tools — all need new connections to Workday's integration layer.
  3. User training: Workday Recruiting's UI paradigm differs significantly from iCIMS. Recruiters used to iCIMS's flexible CRM will need role-specific training on Workday's structured, process-driven interface.
  4. Monitor for 30 days: Set up audit reports in Workday to flag candidate records missing critical data. Watch for unmapped values and user-reported issues.
  5. Keep iCIMS read-only during hypercare so unresolved exceptions can be replayed or archived.
  6. CRM migration (if applicable): If moving CRM data to Beamery or Gem, this can run in parallel with or after the core ATS migration.

Best Practices

  • Back up everything before migration. Keep raw, immutable source payloads from iCIMS — not just transformed exports.
  • Load reference and organization data first. Workday requires foundation objects before people and applications.
  • Keep binary files in a separate pipeline from structured data. Different failure modes, different retry logic.
  • Normalize picklists before the first Workday load, not after.
  • Use external IDs and crosswalk tables everywhere. This is what makes reruns safe and reconciliation possible.
  • Run at least one ugly-data rehearsal — not just a happy-path test with clean records.
  • Budget for API limit increases. At default iCIMS limits, enterprise extractions take weeks. A paid increase to 50,000+/day is almost always worth the cost.
  • Separate migration ownership from implementation ownership. The Workday implementation team and the data migration team should operate independently with a clear handoff protocol.
  • Document every mapping decision. Field-level mapping tables become the source of truth for validation and future audits.
  • Be careful with AI-generated scripts. They rarely account for tenant-specific rules, rate limits, or attachment edge cases. See Using Generative AI in SaaS Data Migration.

What Comes Next

The iCIMS-to-Workday migration is not a weekend project. The API rate limits, CRM data gap, and Workday's strict inbound schema mean every shortcut has a cost — usually measured in silent data loss or broken candidate relationships that surface weeks after go-live.

The CTO decision is not CSV versus API in the abstract. It's whether you accept a lossy migration. If the answer is yes, keep the scope tight and use the simplest tooling possible. If the answer is no, design for staged extraction, explicit crosswalks, replayable loads, and a team that owns reconciliation — not just a connector that promises a fast start.

The organizations that execute this well share three patterns: they separate migration from implementation, they invest in test migrations before production, and they treat the field-level mapping table as the most important document in the project.

Frequently Asked Questions

Can I migrate iCIMS data to Workday using CSV files?
Only for basic, flat data like candidate names and emails. CSV exports from iCIMS flatten nested relationships (Requisition → Candidate → Application chains), drop attachments, and lose CRM/talent pool data. Workday's EIB import caps at 30 MB via browser upload and around 300 MB via SFTP. For enterprise-scale migrations with full-fidelity historical data, API-based extraction is required.
What are the iCIMS API rate limits for data migration?
iCIMS enforces a default limit of 10,000 API calls per day per customer, with approximately 5 concurrent calls per license. Each response includes rate limit headers showing remaining calls and reset time (12:00 AM UTC). Higher limits can be purchased in blocks of 10,000. For 100K+ candidate migrations, budget at minimum 30 days of extraction at default limits.
Does Workday Recruiting have a CRM equivalent to iCIMS?
Not a direct equivalent. Workday's talent acquisition suite includes candidate engagement and marketing features, but iCIMS's full CRM functionality — talent pools, nurture campaigns, SMS outreach, engagement scoring — typically doesn't map one-to-one into Workday. Organizations commonly integrate third-party CRM tools like Beamery or Gem. Verify your specific Workday tenant's capabilities before scoping.
How long does an iCIMS to Workday migration take?
Timeline depends on data volume and method. A small migration (under 5,000 candidates) using CSV/EIB can complete in 1–2 weeks. Enterprise-scale API-based migrations (50,000+ candidates with attachments) typically take 4–8 weeks including test migrations, with the extraction phase alone taking 1–4 weeks depending on API limit increases. Workday implementations themselves average 6–12 months.
What data is most likely to be lost when migrating from iCIMS to Workday?
The most common data loss areas are: CRM engagement history (no standard Workday target), structured interview scorecards (compressed to comments), iForm compliance data (no direct mapping), historical application stage timestamps (Workday may reject backdated transitions), talent pool memberships (require third-party CRM), and files on the iCIMS Attachments tab that lack a field ID and aren't API-accessible.

More from our Blog

5
ATS

5 "Gotchas" in ATS Migration: Tackling Custom Fields, Integrations, and Compliance

Don't get derailed by hidden surprises. This guide uncovers the 5 critical "gotchas" that derail most projects, from mapping tricky custom fields and preventing broken integrations to navigating complex data compliance rules. Learn how to tackle these common challenges before they start and ensure your migration is a seamless success, not a costly failure.

Raaj Raaj · · 14 min read