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)