ERP Bulk Import Comparison: Bulk API 2.0 vs IDoc vs FBDI vs SuiteTalk vs DMF

Type: ERP Integration System: Salesforce, SAP S/4HANA, Oracle ERP Cloud, NetSuite, Dynamics 365 F&O Confidence: 0.88 Sources: 8 Verified: 2026-03-02 Freshness: evolving

TL;DR

System Profile

This comparison covers the five most widely adopted ERP bulk import mechanisms. Each system takes a fundamentally different architectural approach: Salesforce uses an asynchronous REST-based job model, SAP uses a document-oriented messaging protocol (IDoc/ALE), Oracle Fusion uses file-based templates processed via ESS jobs, NetSuite uses SOAP web services with governance-controlled concurrency, and Microsoft uses a configurable framework with parallel staging-to-target processing.

SystemRoleAPI SurfaceBulk Mechanism
SalesforceCRM + PlatformBulk API 2.0 (HTTPS/CSV)Async job-based: upload CSV, poll status
SAP S/4HANAERP (Finance, SCM, HR)IDoc/ALE (RFC/tRFC)Message-based: packet processing, parallel IDocs
Oracle ERP CloudERP (Finance, Procurement, SCM)FBDI (File upload + ESS job)File-based: Excel template to CSV, upload, schedule
Oracle NetSuiteERP (Finance, CRM, Commerce)SuiteTalk SOAP / CSV ImportSOAP lists (1K/call) or UI CSV import (25K/file)
Dynamics 365 F&OERP (Finance, SCM)DMF/DIXF (OData + staging)Framework-based: configurable threads, staging tables

API Surfaces & Capabilities

Bulk MechanismProtocolBest ForMax Records/RequestFile/Payload LimitAsync?Auth
SF Bulk API 2.0HTTPS/CSVETL, data migration, >2K records150M records/24h150 MB per jobYesOAuth 2.0
SAP IDoc/ALERFC/tRFCMaster data distribution, EDI, batch postingConfigurable packet (50-100)<10 MB recommendedYes (tRFC)Certificate/SSO
Oracle FBDIFile upload + RESTInitial loads, module-specific importsModule-dependent (500-10K)Excel template (varies)Yes (ESS job)OAuth 2.0
NetSuite SuiteTalkSOAP/XMLBulk operations <25K records1,000 per SOAP call50 MB (CSV)OptionalTBA / OAuth 2.0
D365 DMFOData + stagingData migration, recurring importsConfigurable threshold256 MB - 5 GBYes (batch)Microsoft Entra ID

Rate Limits & Quotas

Per-Request Limits

SystemLimit TypeValueNotes
SalesforceMax file per job150 MBSplit larger datasets across multiple jobs [src1]
SalesforceMax query result15 GB (15 files x 1 GB)Bulk query only [src2]
SAPMax IDoc size (recommended)10 MBLarger IDocs degrade performance [src3]
SAPPacket size (configurable)Default 1, recommend 50-100Partner profile setting
Oracle FBDILines per upload (procurement)500 draft / 10,000 approvedModule-specific limits [src4]
NetSuiteRecords per SOAP call1,000addList/updateList operations [src5]
NetSuiteRecords per CSV file25,000 or 50 MBWhichever limit is reached first
D365 DMFExport file size256 MB (default), 5 GB (configurable)Requires AzureStorageServiceVersion update [src7]
D365OData batch5,000 operations per batchAvoids request count limit [src6]

Rolling / Daily Limits

SystemLimit TypeValueWindow
SalesforceRecords imported150,000,00024h rolling [src1]
SalesforceBulk API batches15,00024h rolling [src1]
SAPAPI callsNo hard daily capThrottled by dialog work processes
Oracle FBDIESS job submissionsNo documented daily capQueue-based, limited by ESS slots
NetSuiteAPI callsTier-dependent60-second + 24-hour rolling windows [src5]
D365Requests per user6,0005-minute sliding window [src6]
D365Execution time per user1,200 seconds5-minute sliding window [src6]

Concurrency Limits

SystemConcurrent LimitDetails
SalesforceOrg-level (edition-dependent)100 Bulk API 2.0 jobs queued, 5 batches processing [src1]
SAPDialog work processesShared with all RFC/tRFC activity; configurable per system
Oracle FBDIESS concurrent slotsShared with all scheduled processes in the pod
NetSuite5-20 base (tier-dependent)+10 per SuiteCloud Plus license; shared across REST/SOAP/RESTlet [src5]
D36552 concurrent requests per userPer user, per app ID, per web server [src6]

Authentication

SystemFlowUse WhenNotes
SalesforceOAuth 2.0 JWT BearerServer-to-server bulk jobsRecommended for unattended integrations [src1]
SAPX.509 CertificateSystem-to-system IDoc exchangeConfigured in partner profiles + SM59 RFC destinations
OracleOAuth 2.0 + IDCSFBDI REST uploadToken via Oracle IDCS or OCI IAM
NetSuiteToken-Based Auth (TBA)SuiteTalk SOAP callsConsumer key + token pair [src5]
D365Microsoft Entra ID (OAuth 2.0)All API + DMF accessApp registration with client credentials [src6]

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- User needs to bulk import data into an ERP
|
+-- Which ERP system?
|   +-- Salesforce
|   |   +-- Records > 2,000? --> Bulk API 2.0 (CSV upload, async)
|   |   +-- Records < 2,000? --> REST API (composite, sync)
|   |   +-- Migration > 10M records? --> Bulk API 2.0 with job chunking (150 MB/job)
|   +-- SAP S/4HANA
|   |   +-- On-premise / Private Cloud?
|   |   |   +-- Structured EDI/master data --> IDoc/ALE (packet size 50-100)
|   |   |   +-- Custom data --> BAPI via RFC
|   |   |   +-- Modern API --> OData with $batch
|   |   +-- Public Cloud (Cloud ERP)?
|   |       +-- IDocs NOT available --> OData or SOAP APIs only
|   +-- Oracle ERP Cloud (Fusion)
|   |   +-- Standard import process exists? --> FBDI
|   |   +-- Custom data entity? --> REST API
|   |   +-- HCM data? --> HCM Data Loader (HDL)
|   +-- NetSuite
|   |   +-- Volume < 25K records? --> CSV Import or SuiteTalk SOAP (1K/call)
|   |   +-- Volume > 25K records? --> Split into 25K chunks
|   +-- Dynamics 365 F&O
|       +-- Data migration? --> DMF with batch mode, 8-16 threads
|       +-- Recurring? --> Recurring integrations (exempt from API limits)
|       +-- Ad-hoc API? --> OData $batch (max 5,000 ops)
+-- Cross-system bulk transfer?
    +-- Source ERP --> flat file/CSV --> Target ERP bulk import
    +-- Or use middleware (MuleSoft, Boomi, Workato)

Quick Reference

CapabilitySalesforce Bulk API 2.0SAP IDoc/ALEOracle FBDINetSuite SuiteTalkD365 DMF
Max records/request150M/24h (150 MB/job)Configurable packet (50-100)Module-dependent (500-10K)1,000/SOAP callConfigurable threshold
Max file/payload150 MB per job<10 MB recommendedExcel template (varies)50 MB (CSV)256 MB - 5 GB
Async processingYes (poll status)Yes (tRFC, batch)Yes (ESS job)Optional (SuiteScript)Yes (batch framework)
File formatCSV onlyXML (IDoc segments)CSV from Excel templateCSV or XML (SOAP)CSV, XML, Excel
Parallel processingPlatform-managedConfigurable (packets)ESS slot-limitedConcurrency-governed (5-20)Configurable threads (8-16+)
Error handlingPer-record resultsIDoc status (WE02/WE05)ESS job log + row-levelPer-record in responseStaging table error log
Partial successYes (per-record)Yes (per-IDoc)Yes (row-level)Yes (per-record)Yes (per-record)
Rollback supportNo (per-record commit)Transaction-level (packet)No (row-level commit)No (per-record commit)Transaction-level (configurable)
Cloud availabilityAll editionsOn-prem + Private Cloud ONLYAll Fusion Cloud editionsAll NetSuite editionsCloud (F&O Online)
MaturityVery high (GA since 2018)Very high (30+ years)High (GA since Fusion launch)Moderate (SOAP-era design)High (GA since D365 launch)
Learning curveLow (REST + CSV)High (ALE config)Medium (templates, ESS)Medium (SOAP, governance)Medium (entity config, batch)

Error Handling & Failure Points

Common Error Codes

SystemError Code/StatusMeaningResolution
SalesforceINVALID_BATCHJob data could not be parsedVerify CSV encoding (UTF-8, no BOM) [src1]
SalesforceJob state FailedEntire job failed (system error)Check job info endpoint; retry with backoff [src2]
SAPIDoc status 51Application error during inbound processingCheck WE02/WE05; fix data and reprocess via BD87 [src3]
SAPIDoc status 30Ready to dispatch (stuck)RFC destination down — test SM59 connection
Oracle FBDIESS job ErrorImport process failedCheck ESS job output file for row-level errors [src4]
NetSuiteSSS_REQUEST_LIMIT_EXCEEDEDConcurrency limit hit (SOAP)Implement exponential backoff [src5]
NetSuiteHTTP 429Rate limit exceeded (REST)Back off; check governanceLimits endpoint [src5]
D365HTTP 429Service protection limit exceededRead Retry-After header; implement backoff [src6]

Failure Points in Production

Anti-Patterns

Wrong: Using NetSuite REST API for bulk operations

// BAD -- REST API processes one record at a time
for (const record of records) {
  await fetch(`https://${accountId}.suitetalk.api.netsuite.com/...`, {
    method: 'POST', body: JSON.stringify(record)
  });
}
// 10,000 records = 10,000 API calls = hits concurrency + rate limits

Correct: Use SuiteTalk SOAP addList for bulk operations

// GOOD -- SOAP addList processes up to 1,000 records per call
const batchSize = 1000;
for (let i = 0; i < records.length; i += batchSize) {
  const batch = records.slice(i, i + batchSize);
  await soapClient.addList({ record: batch });
}
// 10,000 records = 10 API calls

Wrong: Running D365 DMF imports without batch mode

// BAD -- Direct execution uses single thread
// Data Management > Import > Execute (without batch)
// 100K records processed sequentially = hours

Correct: Execute DMF in batch mode with parallel threads

// GOOD -- Enable batch mode with dedicated batch group
// Import threshold record count: 2,500
// Import task count: 4-8
// 100K records / 4 threads = 4x faster

Wrong: SAP IDoc with default packet size for high-volume loads

// BAD -- Default packet size = 1
// 50,000 IDocs = 50,000 transactions = dialog process exhaustion

Correct: Configure packet processing with appropriate batch size

// GOOD -- Set packet size 50-100 in WE20 partner profile
// 50,000 IDocs / 100 = 500 transactions
// Enable background processing: BD87 batch job

Common Pitfalls

Diagnostic Commands

# === Salesforce Bulk API 2.0 ===
# Check job status
curl -H "Authorization: Bearer $SF_TOKEN" \
  "https://yourinstance.salesforce.com/services/data/v62.0/jobs/ingest/$JOB_ID"

# Get failed records
curl -H "Authorization: Bearer $SF_TOKEN" \
  "https://yourinstance.salesforce.com/services/data/v62.0/jobs/ingest/$JOB_ID/failedResults"

# Check API usage limits
curl -H "Authorization: Bearer $SF_TOKEN" \
  "https://yourinstance.salesforce.com/services/data/v62.0/limits"

# === SAP IDoc ===
# Check IDoc status: transaction WE02 or WE05
# Reprocess failed IDocs: transaction BD87
# Test RFC destination: transaction SM59

# === Oracle FBDI ===
# Check ESS job status
curl -H "Authorization: Bearer $OCI_TOKEN" \
  "https://instance.fa.ocs.oraclecloud.com/hcmRestApi/resources/.../erpintegrations?finder=ESSJobStatusFinder;requestId=$JOB_ID"

# === NetSuite ===
# Check governance limits
curl -H "Authorization: OAuth ..." \
  "https://$ACCOUNT.suitetalk.api.netsuite.com/services/rest/record/v1/metadata-catalog/governanceLimits"

# === D365 F&O ===
# Monitor via LCS or OData
curl -H "Authorization: Bearer $D365_TOKEN" \
  "https://instance.operations.dynamics.com/data/DataManagementDefinitionGroups"

Version History & Compatibility

SystemMechanismCurrent VersionKey ChangeStatus
SalesforceBulk API 2.0v62.0 (Spring '26)Simplified from 1.0Current, GA
SAPIDoc/ALES/4HANA 2408No major changes on-premCurrent (on-prem)
SAPIDoc/ALECloud ERP 2508Removed from public cloudSunset (public cloud)
OracleFBDI25CTemplate updates per releaseCurrent, GA
NetSuiteSuiteTalk SOAP2025.1Governance model updatesCurrent, GA
D365 F&ODMF/DIXF10.0.39+User-based limits removed (10.0.36)Current, GA

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Data migration >10K records into any ERPReal-time record updates (<1s needed)System-specific REST/OData API
Scheduled daily/weekly batch loadsEvent-driven integration (CDC, webhooks)Platform Events, CDC, Business Events
Initial system load during implementationInteractive user-initiated single-record opsStandard UI import or REST API
Cross-system data sync (nightly)Sub-second data replicationChange Data Capture or streaming
Master data distribution across ERP landscapeComplex multi-step business process orchestrationMiddleware workflow engine

Cross-System Comparison

CapabilitySalesforce Bulk API 2.0SAP IDoc/ALEOracle FBDINetSuite SuiteTalkD365 DMF
ArchitectureREST + async job queueRFC/tRFC message passingFile upload + ESS jobSOAP web servicesStaging table + batch
Max throughput150M records/24hLimited by dialog processesLimited by ESS slots~25K records/hourConfigurable (threads x records)
Developer experienceExcellent (REST, CSV)Steep (ABAP, ALE config)Moderate (template-driven)Moderate (SOAP, governance)Moderate (entity config, batch)
Error granularityPer-recordPer-IDoc status codesRow-level in ESS outputPer-record in SOAP responsePer-record in staging table
Cloud-native?YesNo (sunset in cloud)YesYesYes
Format flexibilityCSV onlyXML (rigid IDoc segments)Excel template to CSVXML or CSVCSV, XML, Excel
Cost modelAPI allocation (by edition)Included (on-prem license)Included (Fusion license)Governance units + concurrencyIncluded (F&O license)
MonitoringJob status APIWE02/WE05/SM50ESS job consoleSuiteScript logsDMF log + LCS
Best forSaaS integrations, ETLOn-prem ERP-to-ERP, EDIOracle ecosystem importsMid-market bulk opsEnterprise data migration

Important Caveats

Related Units