Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Dander Salesforce Connector

First-party Salesforce Bulk API 2.0 connector plugin for Dander.

Alpha: pin both Dander and this plugin exactly. Scheduled ingestion is read-only. Explicit connector write commands are experimental and mutate Salesforce. Contact Email and Phone are enabled by default and are personal data; deploy them only into an approved project.

What it reads

The four endpoints stream bounded CSV result pages and commit separate SystemModstamp watermarks:

Endpoint Raw relation Salesforce operation Deletion state
accounts raw.salesforce_accounts queryAll IsDeleted
contacts raw.salesforce_contacts queryAll IsDeleted
opportunities raw.salesforce_opportunities queryAll IsDeleted
users raw.salesforce_users query IsActive

Inclusive SystemModstamp >= cursor filters deliberately reread the cursor boundary. Dander's SCD1 writer makes that replay duplicate-free. Soft-deleted CRM records remain as tombstones rather than being physically deleted from BigQuery, and inactive owners remain available for historical joins. Salesforce records that have already been hard-deleted or purged cannot be recovered by this connector.

Salesforce's deleted-record feed retains at most 15 days. Dander rejects a wider or non-forward window instead of silently presenting it as complete.

Install and configure

Declare the exact candidate version in dander.yaml:

version: 1
plugins:
  salesforce:
    distribution: dander-connector-salesforce
    version: 0.3.0rc1
pipelines:
  salesforce_crm:
    source: salesforce
    models: []
    build_models: false
    schedule: "0 7 * * *"
    time_zone: America/New_York
    paused: true
    secrets:
      SALESFORCE_EXTERNAL_CLIENT_APP_ID: salesforce-client-id
      SALESFORCE_EXTERNAL_CLIENT_APP_PRIVATE_KEY: salesforce-private-key

Existing installations may keep their current pipeline ID to avoid replacing Cloud Run and Scheduler resources. Install the manifest's exact package pin:

dander plugins install

Copy salesforce_jwt.example.yaml into connectors/salesforce.yaml. Replace only the public org URL, OAuth subject, and login-domain settings. Store the External Client App ID and RSA private key in Dander's secret store; never put credential values in YAML.

The Salesforce integration user needs API access plus read access to each selected object and field. Custom fields are opt-in: add each field to both the endpoint's SOQL SELECT and its raw_schema. This explicit declaration prevents undeclared source drift from entering BigQuery.

Runtime contract

  • Engine: salesforce_bulk2
  • Authentication: Dander core's cloud-neutral oauth2_jwt strategy
  • API: Salesforce Bulk API 2.0 Query
  • Publication: Dander's idempotent SCD1 writer
  • Memory: CSV pages are streamed and bounded by Salesforce maxRecords
  • Replay: inclusive server-side SystemModstamp filters
  • Optional reads: exact aggregate count and one-record lookup by validated Salesforce Id
  • Optional deleted feed: Accounts, Contacts, and Opportunities within Salesforce's 15-day window
  • Explicit writes: create, update, and delete by validated Salesforce Id
  • Connection check: authenticated REST /limits probe that returns no business records

With Dander 0.5.0 or newer, inspect and check an installed pipeline without ingestion:

dander connector inspect salesforce_crm
dander connector check salesforce_crm

Dander retains its deprecated built-in Salesforce fallback for compatibility. An explicitly pinned plugin takes precedence.

Experimental write-back

Write-back is never invoked by dander run. It requires the separate connector command, local JSON input files, and an explicit --confirm-write acknowledgement:

dander connector write salesforce_crm accounts create --record new-account.json --confirm-write
dander connector write salesforce_crm accounts update --identity account-id.json \
  --changes account-changes.json --confirm-write
dander connector write salesforce_crm accounts delete --identity account-id.json --confirm-write

Upsert is disabled by default. To enable it for a custom endpoint, declare one Salesforce External ID field as the endpoint's sole primary key, include it in both the SOQL selection and raw_schema, and name it in request_body:

primary_key: [Dander_External_ID__c]
request_body:
  operation: queryAll
  query: SELECT Dander_External_ID__c, Name FROM Account
  upsert_external_id_field: Dander_External_ID__c
raw_schema:
  - {name: Dander_External_ID__c, type: STRING, mode: REQUIRED}
  - {name: Name, type: STRING, mode: REQUIRED}

Before each upsert, the connector checks Salesforce metadata and refuses fields that are not marked both External ID and Unique. External-ID values are encoded as one URL path segment. The local control field is not sent in Bulk query job bodies.

These write capabilities require public dander-platform>=0.6.0rc1,<0.7. Provider writes remain explicit CLI operations and are not invoked by normal scheduled ingestion.

Development

uv sync --extra dev
uv run ruff check .
uv run mypy src tests
uv run pytest

Apache-2.0 licensed.

Metadata

Release files for dander-connector-salesforce 0.3.0rc1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dander-connector-salesforce 0.3.0rc1
File Size Uploaded
dander_connector_salesforce-0.3.0rc1.tar.gz 167.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dander-connector-salesforce 0.3.0rc1
File Interpreter ABI Platform
dander_connector_salesforce-0.3.0rc1-py3-none-any.whl Python 3 none any Details

Total release size: 186.9 kB

Release files / dander_connector_salesforce-0.3.0rc1.tar.gz

Download URL dander_connector_salesforce-0.3.0rc1.tar.gz
Size 167.3 kB
Tags Source
SHA-256 checksum
How to use checksums
fc0238cb01aa5175086cce5b0c0f45b38e96a106776f40a92f43a58aef27f0fd
BLAKE2b-256 checksum
How to use checksums
8a9dc3261788c623fddccf832b1e4357a77886db982e4b4eac55789fb383f812
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log

Release files / dander_connector_salesforce-0.3.0rc1-py3-none-any.whl

Download URL dander_connector_salesforce-0.3.0rc1-py3-none-any.whl
Size 19.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1d4bc92e350cb72e5b5d02c9505e4be74fb57a136edb1562693f96a75373feec
BLAKE2b-256 checksum
How to use checksums
1634f4fd393e3e73e438d0583561cd26db14d4380b26492623018f51c890eae5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page