Skip to main content

SF-0238 · Concept · Medium

What is a Data Loader CLI?

✓ Verified by Vikas Singhal · Last reviewed 5/17/2026 · Updated for Spring '26

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:

  1. 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.
  2. A mapping file (.sdl) — column-to-field mapping, saved from the GUI or hand-edited.
  3. 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.xml and .sdl into 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.