Apache Software Foundation / SeaTunnel
Merged upstreamFeatureMerged Sep 12, 2026

Add Salesforce upsert sink

Implemented the first Salesforce sink slice in SeaTunnel's existing connector, with external-ID upserts, bounded batching, per-record result inspection, transient retries, checkpoint flushing, and typed row serialization.

apache/seatunnel · #12245

Enterprise connector feature

SeaTunnel can now upsert ordered, checkpoint-aware batches into Salesforce objects through the REST sObject Collections API.

Problem

SeaTunnel could read Salesforce data but could not write records back through a supported sink. A production path needed to respect API count and byte limits, detect partial record failures, preserve repeated-key order, recover a session safely, and surface checkpoint flush failures.

Approach

Adds an external-ID-based sObject Collections writer with `allOrNone` response validation, bounded retry and one session refresh, count and UTF-8 byte batching, and flushes on limits, checkpoints, engine callbacks, and normal close. Parsed configuration masks Salesforce secrets.

Impact and scope

  • Completes a bidirectional Salesforce integration path for incremental synchronization and enterprise data workflows.
  • Prevents silent partial success by inspecting every Salesforce result and failing the batch when any record is rejected or malformed.
  • Coordinates delivery with SeaTunnel checkpoints while documenting at-least-once replay and downstream trigger implications.

Validation

  • All 67 connector tests passed on Java 8 and Java 11, with seven shared configuration tests passing on Java 11.
  • Eight Docker E2E cases passed across Zeta, Flink 1.18, Flink 1.20, and Spark 3.3, covering successful upserts, final-batch flushing, and record-error job failure.
  • A SeaTunnel maintainer approved the feature with explicit recognition; final checks passed and the GitHub-verified merge commit credits Goutam Adwant. Tests used MockServer rather than a live Salesforce organization, and GH-10753 remains open as the connector umbrella.