Taleo to Workday Migration: The CTO's Technical Guide
A CTO-level guide to migrating from Oracle Taleo to Workday Recruiting — covering TCC extraction, EIB limits, WWS API constraints, and attachment handling.
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 Oracle Taleo to Workday Recruiting is a format-translation and schema-compression problem. Taleo is a legacy ATS built on deeply nested, proprietary XML data structures with a SOAP-only integration layer. Workday Recruiting is part of a unified HCM platform with a modern but opinionated data model, strict inbound file limits, and rate-controlled APIs. Every architectural gap between these two systems is where candidate data, attachment files, and submission history silently break if you don't engineer around them.
If you need a fast decision: CSV exports from Taleo cannot preserve nested relational data like Requisition → Candidate → Submission → Offer chains or binary attachments. API-based extraction via Taleo Connect Client (TCC), combined with Workday Web Services (WWS) SOAP API for loading, is the only path that handles full-fidelity historical migration at enterprise scale. EIB spreadsheet uploads work for foundation data but hit a hard ceiling at 300 MB and can't handle complex relational objects or attachments.
The chain that matters is requisition → candidate → submission/job application → offer/attachment. That relationship graph is where bad migrations lose context. This guide covers the real API constraints on both sides, object-by-object mapping, the attachment extraction problem, a comparison of every viable migration method, and the edge cases that cause silent data loss.
For a broader perspective on HRIS migration planning, see The Ultimate HRIS Data Migration Checklist. If you're evaluating whether to build in-house vs. outsource, see In-House vs. Outsourced Data Migration: A Realistic Cost & Risk Analysis.
The Taleo-to-Workday Architecture Clash
Oracle Taleo Enterprise Edition is a standalone ATS with a highly configurable data model. Requisitions, Candidates, Submissions (the join object between a Candidate and a Requisition), Offers, and Onboarding records each live in separate entity trees with enforced parent-child relationships. Custom fields (User-Defined Fields, or UDFs) are layered on top of every entity. The system stores attachments — resumes, cover letters, offer documents — as Base64-encoded, gzip-compressed binary blobs inside the candidate and submission entities. Oracle's integration story centers on TCC, which communicates using proprietary Taleo message formats built on XML, SOAP, and WS-Addressing, and supports advanced SQ-XML queries for complex extraction logic. (docs.oracle.com)
Workday Recruiting is not a standalone ATS. It's a module within Workday's unified HCM platform. The core objects — Job Requisitions, Candidates, Job Applications (Workday's equivalent of Taleo Submissions), and Offers — are tightly integrated with Workday's organizational hierarchy, position management, and compensation structures. Workday's data model is less customizable than Taleo's; custom fields exist but are constrained to predefined patterns via calculated fields and custom objects. In the public Recruiting WWS directory, Workday exposes operations for job requisitions, candidates, applicants/pre-hires, job applications, candidate attachments, recruiting agencies, offers, and employment agreements. (community.workday.com)
Workday also positions EIB as the analyst-friendly bulk loader and Workday Studio for sophisticated, highly customizable integrations handling large datasets up to tens of gigabytes. (forms.workday.com)
The architectural differences that matter for migration:
| Dimension | Taleo Enterprise | Workday Recruiting |
|---|---|---|
| Data format | Proprietary T-XML / T-SOAP | SOAP (WWS) + REST (JSON) |
| Custom fields | Unlimited UDFs per entity | Calculated fields, limited custom objects |
| Attachment storage | Base64 + gzip inside entity XML | Separate attachment API (Put_Candidate_Attachment) |
| Candidate-Requisition link | Submission (join entity with full workflow state) | Job Application (business process instance) |
| Bulk export | TCC with XML/CSV-entity modes | EIB (max 300 MB via SFTP) or RaaS reports |
| API authentication | Username/password per zone | OAuth 2.0 or ISU + WS-Security |
The core challenge: Taleo's extraction tools produce proprietary XML, and Workday's ingestion tools expect either strict spreadsheet templates or SOAP/REST payloads in Workday's own schema. The transformation layer between these two is where every migration succeeds or fails.
Migration Approaches
If you need the short answer: CSV is for small, flat moves. TCC plus WWS is the safe path for full-fidelity historical migration. Middleware helps more with coexistence and sync than with a one-time historical backfill.
Native CSV Export → EIB Import
How it works: Export flat CSV files from Taleo's built-in reporting, manually transform them to match Workday EIB templates, upload via browser or SFTP.
When to use it: Only when the scope is narrow — typically active requisitions, a limited candidate set, and little or no attachment history.
Pros: No coding required. Cheapest starting point, fast proof of concept. Cons: Loses all relational data. No attachment support. Cartesian product explosion for multi-valued fields. Manual mapping and error correction. Pushes the hardest part — relationship repair — into manual spreadsheet logic. Scalability: Small datasets only (< 10K records, no attachments). Risk: High — silent data loss on relationships, custom fields, and status history.
API-Based Migration: TCC → WWS
How it works: Build TCC extraction jobs using advanced SQ-XML queries for each entity. Write custom transformation scripts to convert T-XML to Workday's SOAP schema. Use WWS API operations (Put_Candidate, Put_Job_Requisition, Put_Candidate_Attachment) to load data with proper referential integrity. (docs.oracle.com)
When to use it: Whenever historical fidelity matters — submissions, attachments, offers, and custom fields need to survive the migration.
Pros: Full control over extraction, transformation, and loading. Handles attachments, relationships, and custom fields. Best control over ordering, retries, delta replays, and audit logs. Cons: Requires deep expertise in both TCC and WWS. Significant engineering investment (6–12 weeks). Ongoing maintenance for error handling, retries, and edge cases. Scalability: Enterprise-grade with proper batching and parallelization. Risk: Medium — risk scales with engineering quality.
Middleware (MuleSoft, Boomi, Workato)
How it works: Use an iPaaS platform with pre-built Workday connectors. Build custom flows to extract from Taleo APIs and load into Workday.
When to use it: Ongoing coexistence, delta syncs, or when your company already standardizes on an iPaaS and is prepared to build custom Taleo extraction logic.
Pros: Visual development environment. Pre-built Workday connectors handle authentication and basic operations. Orchestration, monitoring, and shared platform controls. Cons: Still requires custom transformation logic for Taleo's T-XML. No-code marketing is misleading here — once Taleo XML/SOAP and Workday recruiting objects meet, you are writing custom logic somewhere. Middleware licensing costs add up. Performance bottlenecks at high volume due to platform overhead on top of Workday's own rate limits.
On the lighter end: as of April 2026, Zapier has a Workday app but its Taleo page is still marked Not Yet Supported. (zapier.com) Lightweight automation tools are not a serious historical-migration engine.
Scalability: Medium — depends on platform throughput and licensing tier. Risk: Medium — hidden complexity in Taleo-side extraction.
Custom ETL Pipeline
How it works: Your team builds the entire path — TCC extraction jobs, a staging schema, transformation code, validation rules, load workers, dead-letter queues, and a source-to-target ID ledger.
When to use it: When you have integration engineers, strong QA discipline, and security or compliance reasons to keep full control.
Pros: Maximum control. Cons: Hidden cost. Most teams underestimate test cycles, exception handling, and recruiter-side UAT. The project becomes another internal product you support long after cutover. Scalability: Strong if well built. Risk: High total cost of ownership.
Managed Migration Service
How it works: A specialized migration partner handles extraction, transformation, loading, validation, and cutover. The client defines scope and provides system access.
Pros: Fastest time-to-completion. Deep domain expertise in both source and target systems. Handles edge cases — attachments, double-compression, CSW-to-stage mapping — without client engineering effort. Zero-downtime execution. Cons: External cost. Requires trust in the partner's process. Scalability: Enterprise-grade by design. Risk: Low — risk is transferred to the partner.
Comparison Table
| Criteria | CSV + EIB | TCC → WWS | Middleware | Custom ETL | Managed Service |
|---|---|---|---|---|---|
| Engineering effort | Low | High | Medium-High | Very High | None |
| Attachment support | ❌ | ✅ | Partial | ✅ | ✅ |
| Relationship preservation | ❌ | ✅ | ✅ | ✅ | ✅ |
| Custom field mapping | Manual | Programmable | Configurable | Programmable | Handled |
| Time to complete | Weeks (manual) | 6–12 weeks | 4–8 weeks | 6–12 weeks | Days to weeks |
| Best for | Proof of concept | Dedicated dev team | iPaaS-heavy orgs | Full-control orgs | Everyone else |
Recommended Path by Scenario
- Small org (< 5K candidates, no attachments): CSV + EIB may suffice if you accept relationship loss.
- Mid-market (5K–100K candidates, attachments required): Middleware or managed service.
- Enterprise (100K+ candidates, compliance-critical): TCC → WWS with a dedicated team, or managed service. EIB won't scale.
- Low engineering bandwidth: Managed service. Every other approach requires significant technical investment. See In-House vs. Outsourced Data Migration.
Pre-Migration Planning & Data Audit
Before writing a single extraction query, audit your Taleo instance. The goal is to reduce scope aggressively — migrating everything is expensive and usually unnecessary.
Data Audit Checklist
- Requisitions: How many are open vs. closed/filled? Most organizations only need to migrate open and recently closed requisitions (last 12–24 months). Archived requisitions older than your compliance retention window can stay in a Taleo data warehouse.
- Candidates: Total candidate count vs. candidates with active submissions. Taleo instances with 5+ years of data often have 500K+ candidate profiles, but only a fraction are relevant to active pipelines.
- Submissions (Applications): The critical join object. Each submission ties a candidate to a requisition and carries workflow state (step + status in the Candidate Selection Workflow). Decide which statuses matter: only active pipeline? Or all historical including rejected/declined?
- Offers: Offer records with compensation data, start dates, and approval chains. These map to Workday's Offer business process.
- Attachments: Resumes, cover letters, certifications, offer letters, onboarding documents. This is the single largest data volume and the hardest to extract.
- Custom Fields (UDFs): Inventory every UDF on Requisition, Candidate, Submission, and Offer entities. Determine which have Workday equivalents vs. which need custom field creation in Workday.
- Compliance Data: EEO, OFCCP, and veteran status fields. These often have specific Workday field mappings and regulatory requirements for preservation.
- Screening questionnaires and structured answers.
- Agencies, agency users, and referrers.
Define Migration Scope
| Scenario | Recommended Scope |
|---|---|
| Compliance-driven (OFCCP audit window) | All requisitions and submissions within the audit period (typically 2 years) |
| Active pipeline only | Open requisitions + candidates in active workflow steps |
| Full historical | All data → requires data warehouse for Taleo archival alongside Workday migration |
A common pattern: migrate active pipeline data into Workday Recruiting, and extract all historical data into a compliance data warehouse using TCC. This avoids overloading Workday with stale data while preserving regulatory access.
If you plan a phased move, Oracle's Exportable Statuses feature can export candidate submissions that reached specific step/status combinations. Oracle warns against using high-volume combinations because the service queries submission history — useful for controlled deltas, not for a lazy full dump. (docs.oracle.com)
For a detailed pre-migration checklist, see The Ultimate HRIS Data Migration Checklist and 5 "Gotchas" in ATS Migration.
Data Model & Object Mapping: Taleo → Workday
This section determines whether your migration produces accurate, queryable data in Workday or a pile of orphaned records.
Core Object Mapping
| Taleo Entity | Workday Equivalent | Key Differences |
|---|---|---|
| Requisition | Job Requisition | Workday ties requisitions to Positions and Supervisory Orgs; Taleo uses OLF (Organization-Location-Job Field) |
| Candidate | Candidate (Pre-Hire) | Workday candidates become Workers upon hire; Taleo keeps them as separate entities |
| Submission | Job Application | Workday Job Applications are business process instances with defined stages; Taleo uses configurable CSW steps/statuses |
| Offer | Offer (within Job Application BP) | Workday offers are a step in the Job Application business process, not a standalone entity |
| Candidate Attachments | Candidate Attachments | Separate API call required: Put_Candidate_Attachment via WWS |
| Submission Attachments | Job Application Attachments | Best fit for requisition-specific resume/cover-letter history |
| Source/Referral | Recruiting Source | Workday has predefined source types; Taleo's source tracking is more granular |
| Recruiting Agency / Agent | Recruiting Agency / Agency User | Map separately if agencies are active in Taleo |
| Candidate Selection Workflow (CSW) | Recruiting Stages/Steps | Taleo CSW is highly configurable with custom steps; Workday stages are defined per business process |
One nuance worth noting: Workday's public Recruiting docs state that pre-hire was previously called applicant in parts of the API. Be explicit about whether a Taleo record becomes a Candidate, a Pre-Hire, a Job Application, or only an archive artifact. (community.workday.com)
Field-Level Mapping
| Taleo Field | Workday Field | Transformation Notes |
|---|---|---|
Candidate.EmailAddress |
Candidate_Data.Contact_Information_Data.Email_Address |
Validate format; primary deduplication key |
Candidate.FirstName / LastName |
Candidate_Data.Personal_Data.Name_Data |
Workday requires legal name structure |
Candidate.Phone |
Candidate_Data.Contact_Information_Data.Phone_Data |
Map phone type (home/mobile/work) |
Requisition.Title |
Job_Requisition.Job_Posting_Title |
Character limit differences |
Requisition.ContestNumber |
Job_Requisition_ID |
Must exist before linking applications |
Requisition.HiringManager |
Job_Requisition.Hiring_Manager |
Must resolve to existing Workday Worker IDs |
Submission.Status + Submission.Step |
Job_Application.Recruiting_Stage |
Requires a custom status-to-stage mapping table |
Offer.Salary |
Offer_Data.Compensation |
Currency and compensation plan alignment |
Candidate.Resume (binary) |
Candidate_Attachment (via WWS) |
Requires Base64 decode + decompress before re-upload |
| UDFs (custom fields) | Calculated Fields / Custom Objects | Not all UDFs have direct equivalents; may require Workday configuration |
A few field-level rules matter more than the rest:
- Keep source primary keys from Taleo in a migration ledger and in Workday external or custom reference fields. This is your lifeline for auditing and rollback.
- Build explicit picklist crosswalks. Never map statuses by label similarity.
- Normalize dates, booleans, and multi-select fields before load.
- Split global candidate data from job-application data. One person can have many submissions.
- Decide early whether old comments and audit events become structured data, attachment bundles, or external archives.
Custom data is where silent loss happens. Workday's Edit_Job_Requisition_Additional_Data docs state that when a custom object allows multiple instances, existing data must also appear in the update request or it will be removed. That is a real overwrite risk during partial replays. (community.workday.com)
Handling Dependencies
The migration must load data in dependency order:
- Foundation data first: Locations, Departments, Job Profiles, Supervisory Orgs (these must already exist in Workday)
- Job Requisitions: Reference foundation data by Workday Reference IDs
- Candidates: Create candidate profiles with personal and contact data
- Job Applications: Link candidates to requisitions (requires both Candidate and Job Requisition Reference IDs)
- Attachments: Upload per-candidate and per-application attachments
- Offers: Create within the Job Application business process context
Breaking this order causes referential integrity failures that are painful to debug in Workday's cryptic error messages.
Extraction: Taleo Connect Client (TCC) and Its Limitations
TCC communicates with Taleo products using proprietary message formats based on XML, SOAP, and WS-Addressing. It also supports custom message formats through client-side or server-side transformations since customer systems usually only support their own formats. Every byte of data extracted from Taleo arrives in a proprietary format that must be transformed before Workday can accept it.
TCC Export Modes
TCC offers three export modes. The choice matters:
- T-XML mode: Uses a structured XML format (akin to a tree view) to represent the data. Well suited to complex data sets including several relations — for example, exporting candidates with their applications, associated requisition information, work experiences, and education elements. Use this for relational data.
- XML (flat) mode: Uses a flat XML format (akin to a tabular list). The main limitation is that when n-ary relations are involved, one record per combination of relations is exported — a candidate with two work experiences and three education elements produces 6 records. Avoid this for candidates with multiple submissions — you'll get a cartesian product explosion.
- CSV-entity mode: Based on the T-XML export mode, it handles multiple values and multilingual fields by serializing them inside a single column. Usable for simple exports but loses structural fidelity.
The Attachment Extraction Problem
TCC does not provide any built-in option to export file attachments. A custom library called TCCCustomSteps is required to export attachment data to the local system. You need:
- The
TCCCustomStepsJAR library (no longer officially hosted; must be sourced independently) - XML export mode (CSV won't work for attachments)
- Post-processing steps using the
ExtractAttachedFilePostStepJava class - For documents in the Recruiting module, Taleo first compresses, then encodes the file in Base64. While using TCC Custom Steps to export the attached files, you must first decode the Base64 content, then decompress it.
For Transitions module documents (onboarding paperwork, signed offer letters), Taleo compresses twice, then Base64 encodes once. For exporting these files using TCC, they need to be decompressed twice. If you don't handle this, exported PDFs and DOCs will appear corrupted.
Oracle also documents that E-Offer PDFs can be exported with TCC, and recommends exporting them promptly because rescinded or reneged advanced offers can change what remains available in the PDF. (docs.oracle.com)
For more context on why native CSV exports fail for complex relational data, see Using CSVs for SaaS Data Migrations: Pros and Cons.
Loading: EIB vs. Web Services vs. REST API
Workday provides several methods for ingesting data. Each has hard constraints that dictate when to use it.
Enterprise Interface Builder (EIB)
What it is: A no-code, spreadsheet-based bulk import tool built into Workday.
Constraints:
- The size limit for SFTP uploads is a maximum of 300 MB; browser uploads are limited to 30 MB. Because this limit isn't prominently published in Workday's marketing materials, verify it in your tenant before sizing the run. (forms.workday.com)
- An EIB can spend up to 2 hours on data transformation. Workday makes a best effort to allow longer-running transforms to complete, but will terminate EIBs that exceed 2 hours if resources are unavailable.
- Workday terminates HTTP requests, including WWS and RaaS, that exceed 6 hours.
- Templates must remain in XML Spreadsheet 2003 format — no formatting changes, no column rearrangement.
- EIBs are finicky, error messages are often cryptic, and many caveats need to be considered.
When to use EIB: Foundation data (Locations, Job Profiles, Cost Centers) and small candidate datasets under 300 MB total. Not suitable for attachments or complex relational loading.
Workday Web Services (WWS) — SOAP API
What it is: Workday's open, standards-based SOAP API for programmatic access to its business management services. (community.workday.com)
For recruiting, the critical operations are:
Put_Candidate: Adds or updates a candidate with the information supplied in the request.Put_Candidate_Attachment: Adds an attachment to a Candidate and/or a Candidate's Job Application.Put_Job_Requisition: Creates or updates job requisitions.Bulk_Import_Put_Candidate: Runs asynchronously and exposes serial, low-concurrency, and high-concurrency processing modes through an HTTP header — useful for controlling throughput during large backfills. (community.workday.com)Get_Candidates: Retrieves candidate data for post-load validation.
Constraints:
- Workday implements rate limiting that significantly impacts integration performance. According to implementation partners and developer community discussions, Workday can handle approximately 10 calls per second and drops requests beyond that.
- By default, the Workday API returns only 100 records unless you specify Page/Count in Response_Filter. Maximum is 999 rows per response. You must implement pagination for any bulk operation.
- SOAP requests are notoriously slow — developers report 60–90 second response times whether retrieving 1 record or 100.
When to use WWS: Complex relational data (Candidates + Job Applications + Attachments), any dataset exceeding EIB limits, and whenever you need programmatic error handling. For the heavy lifting of historical migration, WWS/SOAP is typically required.
Workday REST API
Constraints:
- Workday doesn't publish all rate limits publicly. Most details are available only to customers or partners.
- The REST API doesn't cover everything needed for a complete recruiting integration. Critical functionality still lives exclusively in the SOAP API.
- REST API access requires OAuth 2.0, which involves registering API clients in Workday: API Client Registration, Refresh Token Management, Token Exchange, and Permission Scoping.
When to use REST: Post-migration validation, lighter-weight integrations, and ongoing sync. The REST API has narrower coverage for recruiting operations than WWS.
Workday Studio
Relevant when you need higher-volume orchestration, streaming transforms, split/aggregate patterns, or base64 encoding/decoding at scale. Workday positions Studio for sophisticated integrations handling large datasets up to tens of gigabytes. (forms.workday.com)
Loading Methods Comparison
| Method | Max Payload | Rate Limit | Attachment Support | Error Handling | Complexity |
|---|---|---|---|---|---|
| EIB (browser) | 30 MB | 2-hour transform limit | No | Cryptic spreadsheet errors | Low |
| EIB (SFTP) | 300 MB | 2-hour transform limit | No | Cryptic spreadsheet errors | Low |
| WWS (SOAP) | Per-request | ~10 req/sec | Yes (Put_Candidate_Attachment) |
SOAP faults with detail | High |
| REST API | Per-request | Undisclosed | Limited coverage | HTTP status codes | Medium |
The Attachment Problem: Migrating Resumes at Scale
Attachments are the hardest part of any Taleo-to-Workday migration. Here's why:
- Extraction is non-trivial. TCC doesn't natively export binary files. You need the
TCCCustomStepsJAR, XML export mode, XSL transformation steps, and custom post-processing configuration. - Taleo encodes attachments as Base64 + gzip. Each file must be decoded and decompressed before it can be re-uploaded to Workday. Transitions module files require double decompression.
- Workday's EIB can't handle attachments. The 300 MB EIB limit is for spreadsheet data — attachments must go through the
Put_Candidate_AttachmentSOAP operation, one API call per file. - At ~10 requests/second and 60–90 seconds per SOAP call, uploading 50,000 resumes serially takes days. You need parallelized, batched upload pipelines with retry logic.
- File naming and association. Each attachment must be linked to the correct Candidate Reference ID and optionally to a specific Job Application. Misassociation means a resume ends up on the wrong candidate profile. Workday also rejects duplicate filenames on the same job application. (community.workday.com)
If your Taleo instance has 100K+ candidate attachments, plan for the attachment migration to take longer than all other data combined. Budget time and API capacity accordingly.
For common ATS migration pitfalls including attachment handling, see 5 "Gotchas" in ATS Migration.
Step-by-Step Migration Process
Step 1: Extract from Taleo
Build TCC export jobs for each entity using T-XML mode:
<!-- Example: TCC Export Specification for Candidates -->
<ExportSpec xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07">
<Entity name="Candidate">
<Projections>
<Field path="FirstName"/>
<Field path="LastName"/>
<Field path="EmailAddress"/>
<Field path="Phone"/>
<Relation path="Applications">
<Field path="Requisition,ContestNumber"/>
<Field path="CurrentStep"/>
<Field path="CurrentStatus"/>
</Relation>
</Projections>
<Filters>
<Filter field="Applications,CurrentStatus"
operator="NotEqual" value="Rejected"/>
</Filters>
</Entity>
</ExportSpec>Run separate extraction jobs for:
- Requisitions (with all UDFs)
- Candidates (with personal data, contact info)
- Submissions/Applications (with workflow state)
- Attachments (using TCCCustomSteps post-processing)
- Offers (with compensation data)
Monitor the info.export.limit attributes to ensure large extractions do not time out.
Step 2: Transform
Transformation is the heavy lifting. Your pipeline must:
- Parse T-XML output from TCC
- Flatten nested structures into Workday-compatible schemas
- Map Taleo field values to Workday Reference IDs (e.g., Taleo Location codes → Workday Location Reference IDs)
- Build a CSW step/status → Workday Recruiting Stage mapping table
- Decode and decompress attachment binaries
- Deduplicate candidates based on email and phone
- Resolve hiring manager references to Workday Worker IDs
- Generate Workday SOAP request payloads
# Transform Taleo candidate to Workday Put_Candidate payload
import base64
import gzip
from lxml import etree
def transform_candidate(taleo_xml: str) -> dict:
root = etree.fromstring(taleo_xml)
candidate = {
"Candidate_Data": {
"Personal_Data": {
"Name_Data": {
"Legal_Name": {
"First_Name": root.findtext(".//FirstName"),
"Last_Name": root.findtext(".//LastName"),
}
}
},
"Contact_Information_Data": {
"Email_Address": [{
"Email_Address": root.findtext(".//EmailAddress"),
"Usage_Data": {"Type": "HOME"}
}]
}
}
}
return candidate
def decode_taleo_attachment(base64_content: str, module: str = "recruiting") -> bytes:
"""Decode Taleo attachment: Base64 decode, then gunzip.
For Transitions module, gunzip twice."""
decoded = base64.b64decode(base64_content)
decompressed = gzip.decompress(decoded)
if module == "transitions":
decompressed = gzip.decompress(decompressed) # Double-compressed
return decompressedStep 3: Load into Workday
Load in dependency order using WWS SOAP API:
Put_Job_Requisition— create requisitions referencing existing Workday positionsPut_Candidate— create candidate profiles- Submit Job Applications — link candidates to requisitions
Put_Candidate_Attachment— upload decoded attachment files- Progress applications to correct recruiting stage
Implement retry logic with exponential backoff for Workday's rate limits:
import time
import requests
def call_workday_api(payload: str, max_retries: int = 5):
for attempt in range(max_retries):
response = requests.post(WORKDAY_WWS_URL, data=payload, headers=HEADERS)
if response.status_code == 200:
return response
elif response.status_code == 429: # Rate limited
wait = 2 ** attempt
time.sleep(wait)
else:
log_error(response.status_code, response.text)
raise Exception(f"API error: {response.status_code}")
raise Exception("Max retries exceeded")For high-volume candidate imports, consider Bulk_Import_Put_Candidate which runs asynchronously and supports different concurrency modes via an HTTP header. Workday's high-volume applicant and candidate APIs return background process references, making asynchronous monitoring part of the design. (community.workday.com)
For each API call:
- Persist source ID → target ID mapping
- Log Workday background process references
- Checksum attachments before and after transfer
- Dead-letter validation errors for human review
- Treat duplicate candidates and duplicate filenames as business exceptions, not just transport errors
Step 4: Validate
Do not trust a successful HTTP 200 response as proof of data integrity. After loading, run validation queries:
- Record counts: Compare source extraction counts vs. Workday record counts per entity
- Field-level sampling: Pull 5–10% of records via
Get_Candidatesand compare field values against source data - Attachment verification: Spot-check that attachments open correctly and are associated with the right candidates
- Relationship integrity: Verify Job Application → Candidate and Job Application → Job Requisition links
- Stage/status accuracy: Compare Taleo CSW state vs. Workday recruiting stage against your mapping table
- UAT with recruiters: Have recruiters verify candidate profiles in Workday — can they find a candidate from two years ago, view their resume, and see the requisition they applied for?
Edge Cases That Cause Silent Data Loss
- Duplicate candidates. Taleo allows duplicate candidate profiles (same email, different IDs). Workday deduplication rules may merge or reject these. Run dedup logic before loading.
- CSW step/status mapping gaps. Taleo's highly configurable Candidate Selection Workflow may have custom steps with no Workday equivalent. Map these to the closest Workday recruiting stage or create a catch-all "Migrated" stage.
- Multilingual data. Taleo supports multilingual fields for job postings and candidate data. Workday has language-aware fields but the mapping isn't 1:1. Ensure UTF-8 encoding throughout the pipeline.
- Hiring manager resolution. Taleo Hiring Managers must be resolved to Workday Worker IDs. If a manager has left the organization, the requisition needs a fallback assignment.
- Offer letter attachments from Transitions module. These are double-compressed. Standard TCC extraction produces corrupted files if you don't apply the second decompression.
- API throttling during large loads. At ~10 req/sec with 60–90 second SOAP response times, loading 200K records requires careful parallelization. Too aggressive and Workday drops requests silently.
- EIB template formatting. Any formatting change to the XML Spreadsheet 2003 template — rearranging columns, adding rows, changing formats — causes the upload to fail with no clear error.
- Missing contact or identity data. Workday's import operations require a legal name and at least one contact method for new applicants. Candidate creation fails if phone or email is missing. (community.workday.com)
- Custom data overwrite. Partial updates to multi-instance custom objects can remove existing values if existing data isn't included in the update request. (community.workday.com)
- Attachment filename collisions. Duplicate filenames are not permitted on the same job application in Workday. (community.workday.com)
Limitations You Can't Engineer Around
- Workday has no true equivalent of Taleo's UDF flexibility. Some deeply customized Taleo fields will not have a natural home in Workday. You'll need to decide: store in a custom field, flatten into notes, or accept data loss.
- EIB's 300 MB cap is absolute. There's no workaround — split your data into chunks or use the API.
- Workday does not natively support outbound webhooks for recruiting events. Post-migration sync requires polling.
- SOAP API response times can't be optimized. Design your pipeline to tolerate 60–90 second response times per call.
- Custom objects in Workday are constrained. Unlike Taleo's open-ended entity customization, Workday's custom object framework has structural limits. Not all Taleo custom entities can be replicated.
- No published cross-tenant throughput number. The bulk candidate API exposes processing modes instead, which means you should benchmark in your own tenant and tune concurrency deliberately. (community.workday.com)
Validation & Testing Playbook
| Test | Method | Pass Criteria |
|---|---|---|
| Record count comparison | Count per entity in Taleo vs. Workday | 100% match for in-scope records |
| Field-level validation | Sample 10% of records, compare 15+ fields | > 99.5% field accuracy |
| Attachment integrity | Open 50+ randomly sampled attachments | All files open correctly, correct association |
| Relationship chains | Verify Candidate → Job Application → Job Requisition links | 100% referential integrity |
| Stage/status accuracy | Compare Taleo CSW state vs. Workday recruiting stage | All mapped correctly per mapping table |
| UAT with recruiters | Recruiters verify 20+ candidate profiles in Workday | Functional acceptance sign-off |
Rollback Plan
Workday doesn't have a one-click "undo migration" feature. Your rollback strategy:
- Keep Taleo fully operational until post-migration validation is complete
- Tag all migrated records with a custom identifier (e.g.,
Migration_Batch_ID) so they can be bulk-identified - For catastrophic failures: delete migrated records via API and re-run
- Preserve a replayable delta window
Post-Migration Tasks
- Rebuild recruiting workflows. Taleo's Candidate Selection Workflows don't migrate as configuration. Recreate business process definitions in Workday's Business Process Framework.
- Reconfigure integrations. Any system that fed data to or from Taleo — job boards, background check providers, HRIS feeds — must be repointed to Workday's APIs.
- Train recruiting teams. Workday Recruiting's UI and workflow model are fundamentally different from Taleo's Recruiting Center. Budget real training time — not just a webinar.
- Monitor for 30 days. Watch for data inconsistencies, missing attachments, and broken candidate-requisition links that surface during normal recruiting operations.
- Decommission Taleo. Only after the compliance retention window has passed and all data is confirmed accessible in Workday or your archival warehouse.
Best Practices
- Back up everything before you start. Full TCC extraction of all entities to a local archive. Non-negotiable.
- Run at least two test migrations in Workday's sandbox environment before touching production.
- Validate incrementally. Don't load 500K records and then check. Load 1,000, validate, fix issues, then scale up.
- Automate the transformation layer. Manual CSV manipulation doesn't scale and introduces human error.
- Build an error log, not just success logs. Every API call that returns non-200 should be logged with payload details for debugging.
- Preserve legacy IDs. Always store the Taleo Candidate ID and Requisition ID in a custom field within Workday.
- Plan for the attachment bottleneck. It will take longer than you think. Start attachment extraction and upload early in the timeline.
- Treat duplicate candidates and duplicate filenames as business exceptions, not just transport errors.
When a Managed Migration Service Makes Sense
Building the extraction-transformation-loading pipeline described above is a serious engineering investment. For most organizations, the total cost of internal engineering time, testing, error handling, and timeline risk exceeds the cost of a managed service.
Don't build this in-house if any of these are true:
- No one on your team has real TCC experience
- Your Workday team is strong on configuration but light on WWS integration work
- Attachments or offer documents are non-negotiable
- Recruiters cannot pause work for a long freeze window
- The cost of a dirty cutover is higher than the service fee
The risks specific to DIY on this migration:
- TCC expertise is scarce. Few engineers have deep experience with Taleo's proprietary T-XML format and the TCCCustomSteps library for attachments.
- Workday's SOAP API learning curve is steep. Building correct SOAP envelopes with WS-Security headers, handling cryptic error responses, and managing rate limits requires Workday-specific knowledge.
- Dual-protocol complexity. ISU configurations require extensive Workday-specific knowledge, OAuth 2.0 token management involves platform-specific nuances, and critical HR operations often necessitate SOAP API usage alongside REST endpoints. What begins as a standard REST integration evolves into a dual-protocol implementation with substantially higher resource requirements than anticipated.
The hidden cost in DIY work is not the first script. It is the cleanup: mapping workshops, exception queues, reruns, recruiter validation, late-breaking custom fields, and the final delta cutover.
ClonePartner handles Taleo-to-Workday migrations by managing the entire pipeline: direct extraction from TCC APIs, automated XML-to-SOAP transformation, parallel attachment upload with retry logic, and full validation — with zero downtime. Our team has deep experience with the exact edge cases covered in this guide: double-compressed Transitions attachments, CSW-to-stage mapping, and Workday's EIB limitations.
Frequently Asked Questions
- Can I use CSV exports to migrate data from Taleo to Workday?
- Only for a small, flat scope. CSV exports from Taleo lose relational data (Candidate → Submission → Requisition chains), can't export attachments, and produce cartesian product explosions for multi-valued fields. Use Taleo Connect Client (TCC) with T-XML mode for any migration that requires relational integrity or historical fidelity.
- What is the Workday EIB file size limit for data imports?
- Workday EIB allows a maximum of 30 MB for browser uploads and 300 MB for SFTP uploads. Files exceeding these limits return an error. For larger datasets or attachments, use Workday Web Services (WWS) SOAP API instead. Verify the exact limits in your tenant, as these are not prominently published in Workday's marketing materials.
- How do I extract attachments like resumes from Taleo?
- TCC doesn't natively export attachments. You need the TCCCustomSteps JAR library with the ExtractAttachedFilePostStep Java class, XML export mode, and post-processing steps. Recruiting module files require Base64 decode plus gunzip decompression. Transitions module files (onboarding paperwork, signed offer letters) require double decompression — miss that step and exported files will appear corrupted.
- What Workday API should I use for loading candidate data?
- Use Workday Web Services (WWS) SOAP API: Put_Candidate for candidate profiles, Put_Candidate_Attachment for resumes and documents, and Put_Job_Requisition for requisitions. For high-volume imports, Bulk_Import_Put_Candidate supports serial, low-concurrency, and high-concurrency processing modes. The REST API has narrower coverage for recruiting operations. Expect approximately 10 requests/second rate limits and 60–90 second response times per SOAP call.
- Can Zapier or Make handle a full Taleo to Workday migration?
- Not realistically. As of April 2026, Zapier supports Workday but marks Taleo as not officially supported. Make's Workday HCM tooling still leaves Taleo extraction and historical mapping entirely on you. These tools may help with lightweight ongoing sync, but they are not designed for a one-time historical migration with attachments and complex relational data.