Skip to Content
DestinationsMarketingSalesforce Marketing Cloud (SFTP)

Salesforce Marketing Cloud (SFTP)

Deliver audience data to Salesforce Marketing Cloud in bulk as files. Zeotap writes delimited files (optionally PGP-encrypted) over SFTP to your account’s Enhanced FTP location, where an Automation Studio automation you configure imports them into a Data Extension. File import bypasses the Marketing Cloud API rate limits entirely.

This destination is built for teams that own their Marketing Cloud import pipeline. Zeotap acts as a reliable file producer; your Automation Studio automation stays in full control of how the data is imported. It’s the right choice when any of these apply:

  • You work with an Enhanced FTP account only — no API Installed Package required.
  • You already have Automation Studio import jobs and want Zeotap to feed them as a drop-in file producer.
  • Your import runs custom logic you control — SQL steps, multi-stage automations, custom validation.
  • You need PGP-encrypted files at rest on the FTP server.

For fully managed bulk loading, the main Salesforce Marketing Cloud destination’s File Upload mode delivers files (via Enhanced FTP, Amazon S3, or Google Cloud Storage), creates and runs the SFMC import automatically, reads results back into your sync runs, and handles removals natively — with zero Automation Studio setup. See the side-by-side comparison to pick the path that fits your team.

Everything below assumes you own the import. For row-level syncs, journey entry, triggered sends, and SMS, use the main destination in either mode.

Prerequisites

  • An Enhanced FTP account in Marketing Cloud (Setup > Data Management > FTP Accounts). Marketing Cloud allows at most 10 active SFTP users per business unit (MID).
  • An Automation Studio automation that imports the files: either a File Drop automation watching the upload directory, or a scheduled automation with an Import File activity.
  • The exact SFTP hostname from Setup > Data Management > FTP Accounts. The hostname is tenant-specific — copy it from Setup rather than deriving it from your API subdomain.
  • Optional: a PGP/GPG key pair registered in Marketing Cloud Key Management if you want files encrypted at rest.

Authentication

Enhanced FTP credentials are separate from your Marketing Cloud login. Create or manage them in Setup > Data Management > FTP Accounts.

Password

Enter the FTP account’s Username and Password.

SSH Key

  1. Generate an SSH key pair.
  2. Register the public key on the FTP user in Marketing Cloud Setup.
  3. In Zeotap, enter the Username and paste the Private Key (PEM/OpenSSH format). If the key is encrypted, also enter the Private Key Passphrase.

Configuration

FieldTypeRequiredDescription
SFTP HostTextYesYour Enhanced FTP hostname, copied exactly from Setup > Data Management > FTP Accounts.
PortNumberNoSFTP port. Default: 22 (Enhanced FTP is SFTP-only).
PGP Public KeyFileNoASCII-armored PGP/GPG public key. If set, each data file is encrypted and a .pgp suffix is added. Upload the matching private key in Marketing Cloud Key Management and configure the import to decrypt. The end-of-sync trigger file is written in plaintext — it contains only filenames and row counts, no audience data.

Target Settings

FieldTypeRequiredDescription
Upload DirectoryTextYesThe Enhanced FTP directory to upload into. Default: Import. Files must live under Import (or a subdirectory of it) for imports to find them; File Drop automations support one automation per watched folder, so a dedicated subdirectory per sync is recommended.
Filename TemplateTextYesTemplate for each generated file. Default: zeotap_{timestamp}_{fileNumber}_{action}.csv. Must contain {fileNumber} and cannot contain path separators.
Field DelimiterSelectNoComma, Tab, or Pipe. Default: Comma.
Include Header RowToggleNoWrite the mapped column names as the first line (default on). Enable Has Column Header in the import activity and map columns by name.
Max Rows Per FileNumberNoOptional. Roll to the next {fileNumber} part when a file reaches this many rows — useful when your import activity expects files of a specific row count. Blank = split by size only.
Max File Size (MB)NumberNoRoll to the next {fileNumber} part when a file reaches this size. Default: 950. Files are streamed, never held whole in memory.
Write Trigger FileToggleNoAfter the sync finishes, upload one small file (rendered with the {action} token set to done) listing every delivered data file and its row count. Recommended when using File Drop automations — see below.

Filename template tokens

TokenValue
{fileNumber}Zero-padded part index, unique across the whole sync. Required.
{timestamp}UTC timestamp, yyyyMMdd-HHmmssSSS.
{action}add, update, or delete for data files; done for the trigger file.

Unknown tokens are left as literal text.

Supported Operations

Sync Modes

Insert, Update, Upsert, Mirror.

Audience Sync Modes

Add, Remove, Mirror, Upsert.

Each sync mode maps to a file action in the filename:

Sync modeFile action
Insert, Add, Upsertadd
Updateupdate
Removedelete
Mirroradd for current members, delete for departed members

Import semantics. The import activity’s update type (Add and Update / Add Only / Update Only / Overwrite) decides how add and update files are applied — configure it to match your intent. For Upsert, use Add and Update.

Delete caveat. Marketing Cloud import activities cannot delete individual Data Extension rows — there is no delete update type. delete files are uploaded for completeness, but acting on them requires an automation you build. See Handling deletes with your own automation for the standard stage-subtract-overwrite recipe, and confirm it is in place before relying on Remove or Mirror removals.

Features

FeatureSupported
Field MappingYes — columns are written in alphabetical order with the header row carrying field names; map columns by name in the import activity.
Schema Introspection

How It Works

  1. Rows in each batch are grouped by action (add, update, delete).
  2. Each group is streamed as a delimited file directly to the SFTP server, rolling into numbered {fileNumber} parts at the size threshold. Files are never buffered in memory, so any audience size fits.
  3. If a PGP key is configured, content is encrypted in-stream and the file gets a .pgp suffix.
  4. When the sync finishes and Write Trigger File is enabled, one final file is uploaded (action token done) containing a file_name,row_count line for every delivered data file.
  5. Your automation imports the files into the target Data Extension.

Triggering imports reliably

Marketing Cloud File Drop automations have two behaviors that matter for automated delivery:

  • Renames don’t trigger. Renaming a file without changing its content does not start a File Drop automation.
  • Pattern matching ignores extensions. The filename pattern (Contains / Begins With / Ends With) is evaluated against the filename without the extension after the final dot, so a partially uploaded data file can match your pattern and trigger an import before the upload finishes.

For reliable triggering, enable Write Trigger File and point the File Drop automation’s filename pattern at the trigger file (for example, Ends With done), not at the data files. Every file listed in the trigger has fully landed — partially written files are always removed — so the automation never runs against an incomplete file. The import activity can then reference the data files by their own naming pattern.

Partially failed syncs still trigger. If a sync fails partway through, the trigger file is still written at the end and lists the subset of files that were fully delivered — the automation will import those files. The delivered files are individually complete and valid, but they may not cover the whole audience; check the sync run status in Zeotap before relying on the imported result.

If you use a scheduled automation instead of File Drop, none of this applies — schedule the import after your sync’s expected completion time.

Handling deletes with your own automation

Marketing Cloud import activities cannot delete Data Extension rows, and SQL Query activities cannot run DELETE statements either — a query’s result can only Overwrite, Append, or Update a target Data Extension. The standard Marketing Cloud pattern for file-based deletes is therefore stage, subtract, overwrite:

  1. Create a staging Data Extension (for example MyAudience_Deletes) with just the key column(s) from your delete files — typically ContactKey.
  2. Add an Import File activity to your automation that loads the delete files (filename pattern matching on _delete — remember pattern matching ignores the extension) into the staging Data Extension with update type Overwrite, so it always holds only the latest sync’s removals.
  3. Add a SQL Query activity after the import that rewrites the main Data Extension without the staged rows, with target update type Overwrite:
SELECT m.* FROM MyAudience m LEFT JOIN MyAudience_Deletes d ON m.ContactKey = d.ContactKey WHERE d.ContactKey IS NULL
  1. Order the automation’s steps so the add file import runs first, then the delete staging import, then the SQL activity. With Write Trigger File enabled, a single File Drop automation matched on the trigger file can run all three steps in sequence.

Two things to size for:

  • The SQL activity rewrites the entire main Data Extension each run. That is fine for most audience sizes, but for very large Data Extensions with frequent small removals, consider handling removals on the API path instead.
  • SQL Query activities time out at 30 minutes in Marketing Cloud; extremely large rewrites may need the Data Extension split or the API path.

Simpler alternative: if you can provision an API Installed Package, use the main Salesforce Marketing Cloud destination instead — in both its API mode and its File Upload mode, removals are executed natively through the SOAP delete API with no automation to build.

Best Practices

  • Match the filename template, delimiter, and header setting to what the import activity expects.
  • Keep {fileNumber} in the template — it is the only per-part discriminator.
  • Use a dedicated subdirectory under Import per sync when using File Drop automations (one automation per folder).
  • Enable Write Trigger File with File Drop automations and match on the trigger file.
  • Files are retained on Enhanced FTP for 21 days and then removed automatically; imports should run well within that window.
  • PGP encryption is optional — SFTP transport is already encrypted. Use it when your compliance rules require encryption at rest on the FTP server.

Troubleshooting

Authentication failed

Confirm the FTP username and password (or SSH key) in Setup > Data Management > FTP Accounts. Enhanced FTP credentials are not your Marketing Cloud login. Repeated failed logins lock the account for 30 minutes.

Connection fails

Copy the hostname exactly from Setup > Data Management > FTP Accounts — it is tenant-specific. Enhanced FTP accepts SFTP (port 22) only, allows at most 10 simultaneous connections, and closes idle connections after 10 minutes.

The automation doesn’t start

If the File Drop automation matches on data filenames, remember pattern matching ignores the extension and renames never trigger. Enable Write Trigger File and match on the trigger file instead. Also confirm the watched folder is under Import or Triggered_Automations and has only one File Drop automation.

The import runs but rows are wrong or rejected

Check that the import activity’s delimiter and Has Column Header setting match the destination configuration, and that columns are mapped by name (Zeotap writes columns alphabetically, so positional mapping is not recommended).

Deletes have no effect

Import activities cannot delete Data Extension rows. Follow Handling deletes with your own automation to add the stage-subtract-overwrite steps to your automation, or handle removals with the API-based Salesforce Marketing Cloud destination, which deletes natively.

PGP decryption fails

Confirm the private key matching your configured public key is uploaded in Marketing Cloud Key Management and that the import flow decrypts the file (the file carries a .pgp extension).

Last updated on