DEV Community

Jeremy Libeskind
Jeremy Libeskind

Posted on

Inside the Jewish Agency’s Global Service Center

1 · Business Context
One hotline, six languages (Hebrew, English, French, Spanish, Portuguese, Russian) and 39 toll-free numbers.
The Jewish Agency for Israel - U.S.

Voice, email, web-forms and WhatsApp (+972-52-474-0024) flow into one triage queue.
The Jewish Agency for Israel - U.S.

100 K+ inquiries/year ranging from basic eligibility checks to full family relocation dossiers.

2 · High-Level Architecture
mermaid
Copier
Modifier
graph TD
subgraph Front Door
WebForm[["Next.js form"]] --> SFAPI
WhatsApp[[WhatsApp]] --> Twilio
Twilio --> Webhook
Voice[[Telephony / WebRTC]] --> CTI
end

subgraph Core CRM
SFAPI[Salesforce REST+Bulk] --> SVC[Service Cloud]
Webhook --> AzureFn
AzureFn --> SVC
CTI -- OpenCTI --> SVC
end

subgraph DataOps
SVC --> Plauti[Plauti Deduplicate]
SVC --> DW[(Azure SQL DW)]
DW --> PowerBI[Power BI]
end
Service Cloud stores Contact, Account and custom AliyahCase_c objects; each inbound interaction becomes a Case with parent AliyahCase_c.

Twilio handles WhatsApp and SMS; a Node.js webhook (deployed as Azure Function) upserts the Contact and opens/updates the Case.

CTI layer (Avaya or Genesys; any Salesforce-OpenCTI-compliant switch) feeds call-metadata in real time.

Nightly Azure Data Factory jobs snapshot Salesforce via Bulk API to a SQL DW for analytics.

The choice of Salesforce is no secret—Jewish Agency has been a customer since 2007, with in-house subsidiary TechUnity acting as primary SI.
Salesforce AppExchange
Plauti

Their privacy policy also lists Salesforce, Azure, AWS, Oracle Eloqua, Zoom as core providers.
The Jewish Agency for Israel - U.S.

3 · Inbound Flow in Detail
a) WhatsApp → Salesforce in <1 s
js
Copier
Modifier
// /api/whatsapp-webhook (Azure Function / Node 20)
import sf from './salesforce.js'; // jsforce wrapper
export default async (req, res) => {
const { WaId, Body, ProfileName } = req.body;
// 1. Upsert Contact
const contactId = await sf.upsert('Contact', {
MobilePhone: +${WaId},
LastName: ProfileName || 'WhatsApp User'
}, 'MobilePhone');
// 2. Create or Update open Case
const [ caseId ] = await sf.tooling.query(
SELECT Id FROM Case
WHERE ContactId='${contactId}' AND Status!='Closed'
ORDER BY CreatedDate DESC LIMIT 1
);
const CaseFields = {
ContactId: contactId,
Origin: 'WhatsApp',
Subject: Body.slice(0,80),
Description: Body,
Status: 'New'
};
await sf.upsert('Case', { Id: caseId?.Id, ...CaseFields });
return res.sendStatus(204);
};
b) Voice & CTI
Screen-pop: OpenCTI shows agent a Lightning Console tab keyed by ANI (caller ID).

Disposition codes map to Salesforce “Quick Actions” on the Case.

3-second SLA for record retrieval comes from caching Contact rows in Redis in Azure Functions.

c) Web Forms
The public Global Center form (/global_service_center) posts to Salesforce via Web-to-Case with GraphQL fallback if spam-score ≤ 0.7.

4 · Keeping the Data Clean
During the 2022 Ukraine crisis, duplicate rates spiked; TechUnity installed Plauti Deduplicate (100 % native) bringing manual merge time from 1.5 h → 30 min per day.
Plauti

Key rules:

Field Fuzzy Algo Threshold
First/Last (HE<–>EN) Jaro–Winkler + transliteration ≥ 0.88
DOB + Passport Exact 1
Phone (E.164) Exact 1

All merges gate on a manual approval queue—critical when you’re moving families across borders.

5 · Dev & Release Pipeline
Stage Tooling
Source-of-truth GitHub Enterprise mono-repo
CI GitHub Actions (salesforcedx + npm ci)
Scratch Orgs Spun per PR, seeded via sfdx force:source:push
Static Tests ESLint, PMD Apex, OWASP ZAP on Next.js front-end
QA FullCopy sandbox refreshed nightly
Prod Deploy sfdx force:org:deploy + Azure Bicep for infra

Zero-downtime is achieved with blue/green Functions slots and Salesforce Quick Deploy (validation runs hours earlier).

6 · Security & Compliance Notes
PII at rest encrypted by Salesforce Shield; cross-cloud data in Azure SQL encrypted with TDE.

GDPR Article 46 transfers are covered via SCCs; Israel has adequacy, US workloads ride on DPF/ SCC.

Agents authenticate via Azure AD SAML → Salesforce SSO; MFA enforced.

7 · What We’d Do Differently
Event-Driven mesh – migrate webhook plumbing to Azure Event Grid & Functions for better fan-out.

Real-time translation – add Amazon Translate layer so less-common languages auto-bridge to Hebrew agents.

Open Telemetry everywhere – today only Functions & CTI emit spans; Salesforce Event Monitoring would complete the picture.

8 · Takeaways
Even a 95-year-old nonprofit can ship a cloud-native, API-first contact-center.

Data quality is the hidden hero—don’t scale inquiries until you master dedupe.

Treat every inbound channel as just another JSON payload; your CRM is the single truth.

Questions, ideas, war stories? Drop them below or ping me on GitHub – always happy to talk CRM architecture for social-impact scale-ups!

Top comments (0)