jCustomer - Salesforce Connector
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
How to install
1. Install the module
- From the Jahia Store: click Install on this listing, or
- Manually: download jcustomer-sfdc-connector-2.2.0.jar and deploy it via the jContent Module Manager, the Provisioning API, or your instance's hot-deploy folder (/var/jahia/modules/).
2. Enable it on your site (Administration → Modules), and make sure jExperience and a jCustomer / Unomi service are available.
3. Create a Salesforce Connected App for the JWT Bearer flow:
- Enable "Use digital signatures" and upload your public certificate.
- OAuth scopes including api; pre-authorize the running user.
4. Configure runtime settings (OSGi config org.jahia.community.jcustomer.sfdc.cfg): set jcustomer.site.key to your jExperience site key, and the jCustomer URL/credentials for your environment (use the container hostname, e.g. http://jcustomer:8181, not localhost).
5. Open the admin panel — jContent → Administration → Sync Salesforce ⇄ jCustomer:
- Connection: enter the Connected App credentials + PEM private key, then Test connection.
- Field Mapping: map fields per object for each direction.
- Triggers: enable inbound (schedule / on-login) and outbound (target object, profile-update / form-submission, schedule), or run Sync now.
Upgrading from an earlier version: deploy the 2.2.0 jar, then run the one-time migration patch migration/2100-migrate-config-to-typed.groovy once (drop it into <jahia>/patches/groovy/) to convert existing configuration to the typed JCR layout. New installs need no migration.
FAQ
Do I need to install anything inside the jCustomer / Unomi container?
No. Outbound sync is poll-based and runs entirely from the Jahia module — no Unomi plugin, no webhook, nothing deployed container-side.
Which Salesforce objects are supported?
Inbound: Contact, Account, and Lead. Outbound: a single chosen target — Lead or Contact.
How does authentication work? Do I need to store a client secret?
It uses the Salesforce JWT Bearer OAuth 2.0 flow (RS256). There's no client secret; you upload a certificate to the Connected App and store the matching RSA private key in Jahia, where it stays server-side.
How are profiles and Salesforce records matched?
By a stored Salesforce id first (e.g. SFDC_ContactId / SFDC_LeadId), then by email. Outbound, unmatched profiles create a new record and the id is written back for future updates.
I edited a profile but nothing reached Salesforce immediately — is that normal?
Outbound runs on its poll schedule. Use Sync now for an immediate run. Direct console/REST profile edits are caught by the next profile poll.
Why can't it create a Lead/Contact?
Salesforce requires LastName (plus Company for a Lead) to create a record. Map those fields, or existing records will still update.
Can I export my field mappings?
Yes — every Field Mapping tab has Export CSV and Export JSON for the selected object, in both directions.
Where is the configuration stored?
In the JCR under /settings/jcustomer-sfdc-connector, using typed node types (jcsfdcnt:*) so it's browsable in the Definitions / JCR browser.
Which Jahia version is required?
Jahia 8.2, with jExperience and a reachable jCustomer / Unomi service.
MIT License
Copyright (c) 2026 Stephane Monier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.