Skip to main content
Jahia Store
EN

jCustomer - Salesforce Connector

labs
Download 2.6.6

Information

Module ID
jcustomer-sfdc-connector
Group ID
org.jahia.community.modules
Status
labs
Category
Platform, Connectors, Experience Optimization and customer data
Author
Stephane Monier
Developer website
https://www.jahia.com
Requires Jahia
8.2.0.0
Released
2026-10-25
Source
scm:git:https://github.com/Jahia/jcustomer-sfdc-connector.git
Tags
  • salesforce
  • unomi
  • crm
  • jcustomer
  • cdp
  • jexperience
  • connector
  • integration
  • dat-integration
  • profile-sync
  • lead
  • contact
  • personalization
  • marketing

Two-way synchronisation between Salesforce and jCustomer profiles: Salesforce Contacts, Accounts and Leads enrich visitor profiles, and jCustomer profiles create or update Salesforce Leads or Contacts. Field mapping, triggers, history and an overview in a Jahia administration screen, in English and French.

jCustomer - Salesforce Connector keeps Salesforce and jCustomer in step. What your sales team knows about a person (industry, products of interest, company) reaches the visitor's jCustomer profile, where jExperience segments and personalises on it; what visitors do on your site (profile changes, form submissions) reaches Salesforce as a Lead or a Contact. Everything is set up and followed from one administration screen, with no code and nothing to install in jCustomer.

Salesforce to jCustomer

  • Contact, Account and Lead fields mapped to jCustomer profile properties, object by object. Profiles are matched by the Salesforce id stored on them, else by email.
  • Three triggers: at every Jahia login (the visitor's own record, without delaying the login), on a schedule (a daily or periodic delta of the records changed since the last run) and on demand with Sync now.
  • Values in the right shape: a multi-select picklist fills a multi-valued jCustomer property as a list, ready for segment conditions; only the values that changed are written.

jCustomer to Salesforce

  • Lead or Contact, your choice: profile properties mapped to the target object's fields. The record is found by its stored id, else by email, updated when it exists and created when it does not; its id is stored back on the profile.
  • Automatic push when a profile changes or a visitor submits a form, every 5 minutes by default or on the schedule you choose, from the moment you turn it on. Sync now and Push one profile run it on demand.
  • Salesforce's own rules are shown while you map: a Lead needs a last name and a company to be created, a Contact a last name.

One screen to run it

  • Overview: the connection status (tested when you open it), each direction's triggers in plain words, how many fields each object maps and the last run, with what needs attention listed on top and a button that opens the screen that fixes it.
  • Mapping with field pickers filled from your Salesforce org and your jCustomer properties, warnings for a field mapped twice, export to CSV or JSON.
  • Triggers as switches, with a schedule builder that reads in words (Every day at 05:00).
  • History per direction: every run with what triggered it and its created, updated, skipped and error counts; expand a run to see each person, the Salesforce record and every field that changed. Export to CSV or JSON, purge when you want.
  • Built with Jahia's own design system, in English and French.

Secure by design

  • Signs in to Salesforce with the JWT Bearer flow of a Connected App: no password or client secret, and the private key stays on the server.
  • Reserved to server and site administrators; actions that change something are protected by Jahia's CSRF guard; the Salesforce address is checked before any call.
  • Works on Jahia Cloud and on premise: the jCustomer instance and its key come from the site's jExperience settings.

Requirements: Jahia 8.2, jExperience 3.8 or later with jCustomer, and a Salesforce Connected App with digital signatures enabled and the integration user pre-authorized. Setup guide and full change history: github.com/Jahia/jcustomer-sfdc-connector.

Screenshots

Versions

Fixed

  • The admin screen's cards take the full width of the window, with the same margin on both sides; they stopped at 1200 pixels and left the right side of wide windows empty.
Requires Jahia 8.2.0.0Released 2026-10-25

2.6.5

  • Value if empty for picklists: chosen from the Salesforce field's own values, several of them for a multi-select picklist.
  • The mapping warns about values Salesforce would refuse: a value outside a restricted picklist, or a multi-valued jCustomer property mapped to a single-value picklist.

2.6.4

  • Maintenance release: faster builds, no change of behaviour.
Requires Jahia 8.2.0.0Released 2026-10-25

2.6.3

  • Field mappings are saved only for the Salesforce objects the connector maps (Contact, Account or Lead from Salesforce; Lead or Contact to Salesforce).
  • The module is now built and tested automatically for every change and every release.

2.6.2

  • Converted Leads: once Salesforce converts a visitor's Lead to a Contact, their changes now update that Contact. Before, every update failed, and a visitor without a stored Lead could be created again as a duplicate Lead.
  • Value if empty and fixed values in the jCustomer to Salesforce mapping: for example Company = Web visitor, so that visitors who gave no company become Leads instead of being skipped.

2.6.1

  • Fixed: after a bulk import or a busy campaign, changes beyond the first 500 profiles were not sent to Salesforce. Every change since the last run is now sent.
  • Fixed: a profile that could not be sent (Salesforce unreachable, a validation rule) was not tried again. It is now retried by the next runs, 5 times in all, and shown in the history if it still fails.


 

Requires Jahia 8.2.0.0Released 2026-10-24

2.6.0

  • Automatic purge of the sync history, set per direction in its History tab: runs older than 30 days (or the number of days you choose) are deleted every hour. The history holds personal data, so it is no longer kept indefinitely.
  • History stored by day, so that it stays fast however many runs it holds. Existing history is reorganised automatically when the module starts.
  • Fixed: opening a run on the second page of the history or later went back to the first page.
  • Error messages from the server are shown in full in the administration screen.
Requires Jahia 8.2.0.0Released 2026-10-24

2.5.0

  • Redesigned administration screen in Jahia's design system, with a new Overview tab: the connection status, each direction's triggers, mapping coverage and last run, and what needs attention with a button that opens the screen that fixes it.
  • Each direction has three tabs: Mapping, Triggers and History. Schedules read in words, Save is enabled only when something changed, and results appear next to the button that produced them.
  • History: every field changed for a person is visible when a run is expanded; dates read 5 minutes ago, the exact date on hover.
  • Fixed: a single value of a Salesforce multi-select picklist left the multi-valued jCustomer property empty. Values now follow the property type; profiles affected are repaired on their next sync (run Sync now after upgrading).
  • Security: actions that change something (save, sync, push, purge) are protected by Jahia's CSRF guard again.
  • The screen fits narrow windows and works with the jContent versions of Jahia 8.2.3 and later.

Full history: CHANGELOG.md

Requires Jahia 8.2.0.0Released 2026-10-24

2.4.1

Fixed

  • An inbound sync (login or manual) of a profile that already holds the Salesforce values is no longer reported as an error. It is recorded as “skipped: already up to date”, and only the values that changed are sent to jCustomer.
  • History tab: the Refresh, Export and Purge buttons could be pushed off screen on jContent 3.8 when a run had a long status. The screen now fits its container, and long messages wrap.

Changed

  • Inbound history records list only the fields that changed.

2.4.0

Added

  • Sync history for each direction (SFDC to jCustomer, jCustomer to SFDC): one row per run, with when it ran, what triggered it, and how many records were created, updated, skipped or in error. Expand a run to see each record: who, the Salesforce record, the fields written, and why a record was skipped or failed.
  • Export CSV / Export JSON of a direction’s history, and Purge history with confirmation.
  • History retention can be configured (history.max.runs, history.max.records.per.run, history.max.value.length). Scheduled runs that found no change are not recorded.

2.3.5

Fixed

  • jCustomer to Salesforce: “Profile updates” did not push anything automatically. The poll now runs whenever “Profile updates” or “Form submissions” is on.
  • The Triggers tab shows the stored settings: a trigger that was never saved is shown as off.
  • Results now report created, updated, skipped and errors separately; a profile that was not sent is no longer counted as updated.

Changed

  • Profile changes are polled every 5 minutes by default (outbound.poll.cron). A schedule chosen in the Triggers tab still takes precedence.
  • Turning a trigger on pushes changes made from that moment, with no backfill. The poll is skipped while the Salesforce connection is disabled.
  • The separate “Enable scheduled sync” switch is removed.
Requires Jahia 8.2.0.0Released 2026-10-23

Hardening release: nothing hardcoded in the module.

Fixed

  • sfdc.api.version is now actually used. It was documented but never read, because the API version was hardcoded in the code, the CND default and the admin UI. One source now: the Connection's API version when set, else sfdc.api.version from the OSGi configuration. A missing version is reported as an error instead of being guessed.
  • Connection tab text (labels, placeholders, hints) comes from the EN/FR locale files. Some of it was hardcoded in French for every language.
  • Private key guidance is correct: only an unencrypted PKCS#8 PEM (-----BEGIN PRIVATE KEY-----) works. The hint gives the conversion for PKCS#1 keys: openssl pkcs8 -topk8 -nocrypt -in old.key -out key.pem.

Changed

  • The API version field stays empty unless you set it, and shows the configured sfdc.api.version as its placeholder, so saving the form no longer pins the default on the connection.

Upgrade

Deploy the jar; no migration. Existing connections keep their stored API version.

Requires Jahia 8.2.0.0Released 2026-10-23

Bug-fix release. Salesforce to jCustomer updates now actually reach jCustomer, on any project, Jahia Cloud or on-premise.

Fixed

  • Inbound updates were silently dropped. Profile updates sent a custom updateUserEfficyPortalData event that only one demo jCustomer had a rule for. Every other jCustomer accepted it and changed nothing, while the log said Login sync complete. Updates now use Unomi's standard updateProperties event, signed with the jCustomer key from the site's jExperience settings. No custom jCustomer rule and no extra configuration: it works wherever jExperience works.
  • Dropped updates are reported. The jCustomer response is checked, and a refused update logs an explicit error naming what to check. The login sync logs one of: profile updated, Salesforce record found but nothing updated, no Salesforce record.
  • "Sync now" (inbound) always ran against a hardcoded site, and the outbound scheduled reconcile ignored the configured site and buffer.
  • A failed Salesforce-id writeback no longer fails an outbound push that Salesforce already accepted.

Changed

  • No project-specific defaults. The site is resolved in this order:

    1. The site the admin UI is open on (manual runs).
    2. jcustomer.site.key, when it names an existing site.
    3. The single site with jExperience installed.

    jcustomer.site.key now ships empty. A stale value that is not a site on the server is ignored with a warning.

Upgrade

Deploy the jar; no migration. If several sites have jExperience, set jcustomer.site.key in org.jahia.community.jcustomer.sfdc. If the log shows jCustomer did not update profile ... updated=0, jCustomer refuses updateProperties for jExperience's key or this server's address: check jCustomer's third-party settings (UNOMI_THIRDPARTY_PROVIDER1_*). This is the same setup jExperience needs for its own login events.

Requires Jahia 8.2.0.0Released 2026-10-23
  • Mapping dropdowns sorted alphabetically. The jCustomer-property and Salesforce-field pickers (both sync directions) now list options alphabetically (case-insensitive) instead of fetch order, so a long property list is predictable to scan. (jCustomer's own picker groups by card; matching that needs per-property Unomi group data the connector doesn't pass yet, so alphabetical is the equivalent.)
  • Operator config now survives a redeploy. The shipped org.jahia.community.jcustomer.sfdc.cfg gained the # default configuration marker, so Jahia installs it only when absent. Previously every module redeploy overwrote it, wiping any jcustomer.url / credentials and silently dropping the live property lookup back to the generic fallback. Existing installs keep their current config; no action needed.

No migration required; deploy the jar.

Requires Jahia 8.2.0.0Released 2026-10-23

Authentication JSON handling hardened; Salesforce API-client input validation.

Requires Jahia 8.2.0.0Released 2026-10-23
Requires Jahia 8.2.0.0Released 2026-08-04
Requires Jahia 8.2.0.0Released 2026-08-04