The Data Loader CLI is the headless, scriptable version of Data Loader. Instead of clicking through the GUI, you describe the job in XML files and run it from a terminal. Everything the GUI does — Insert, Update, Upsert, Delete, Hard Delete, Export, Export All — works the same way from the CLI.
It ships with Data Loader. On Windows, look for process.bat. On macOS / Linux, process.sh.
Why it exists
- Scheduled ETL. Nightly load from the billing system, weekly Contact export to a data warehouse. Cron/Task Scheduler fires the CLI; nobody has to log in.
- Repeatable runs. Same script, same XML, same mapping → same job every time. No “did the new admin map a column differently?”
- Server-side runs. Put it on a small Linux box, give it an integration-user OAuth credential, let it run. No desktop required.
- CI / migration pipelines. Part of a larger sandbox-seeding or org-refresh workflow.
The three files
A CLI job needs three artifacts on disk:
process-conf.xml— defines one or more jobs (<bean>entries): which org, which operation, which CSV, which mapping, batch size, Bulk API on/off, success/error paths, etc.- A mapping file (
.sdl) — column-to-field mapping, saved from the GUI or hand-edited. - The source CSV — your data.
A minimal process-conf.xml snippet:
<bean id="accountUpsert"
class="com.salesforce.dataloader.process.ProcessRunner"
singleton="false">
<description>Nightly Account upsert from ERP</description>
<property name="name" value="accountUpsert"/>
<property name="configOverrideMap">
<map>
<entry key="sfdc.username" value="[email protected]"/>
<entry key="sfdc.password" value="encryptedPasswordHere"/>
<entry key="sfdc.endpoint" value="https://login.salesforce.com"/>
<entry key="sfdc.entity" value="Account"/>
<entry key="process.operation" value="upsert"/>
<entry key="sfdc.externalIdField" value="Legacy_Id__c"/>
<entry key="process.mappingFile" value="C:/etl/account-upsert.sdl"/>
<entry key="dataAccess.name" value="C:/etl/accounts.csv"/>
<entry key="dataAccess.type" value="csvRead"/>
<entry key="process.outputSuccess" value="C:/etl/success/account-success.csv"/>
<entry key="process.outputError" value="C:/etl/error/account-error.csv"/>
<entry key="sfdc.useBulkApi" value="true"/>
<entry key="sfdc.loadBatchSize" value="2000"/>
</map>
</property>
</bean>
You run it with:
process.bat "C:\etl" accountUpsert
The first argument is the directory containing process-conf.xml; the second is the bean id.
Encrypted passwords
You don’t store the password in plain text. The CLI ships an encrypt.bat / encrypt.sh that generates an encrypted password string keyed against a local keyfile. The XML holds the encrypted blob.
OAuth refresh-token flow is also supported and recommended for production — no password rotation pain, and the credential can be revoked from Salesforce side without touching the server.
Pairs naturally with
- Windows Task Scheduler / cron — run the CLI on a schedule.
- Git — check the
process-conf.xmland.sdlinto source control. - CI — call from Jenkins/Azure DevOps as part of a release pipeline.
When to choose the CLI over the GUI
- You want this load to run again, the same way, without you.
- You’re loading from a server, not a desktop.
- The job is part of an integration, not a one-off cleanup.
- You want diffable, reviewable configuration.
For everything else — exploratory loads, one-off admin tasks, mapping experimentation — the GUI is faster.
Verified against: Data Loader Guide — Using the Command-Line Interface, Metadata API Developer Guide. Last reviewed 2026-05-17 for Spring ‘26 release.