| name | salesforce-architecture-variants |
| description | Choose and implement Salesforce integration architecture patterns for different scales.
Use when designing new Salesforce integrations, choosing between polling/event-driven/Heroku Connect,
or planning migration paths for Salesforce applications.
Trigger with phrases like "salesforce architecture", "salesforce integration pattern",
"how to structure salesforce integration", "salesforce event-driven", "salesforce Heroku Connect".
|
| allowed-tools | Read, Grep |
| version | 1.7.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","crm","salesforce"] |
| compatibility | Designed for Claude Code |
Salesforce Architecture Variants
Overview
Three validated architecture blueprints for Salesforce integrations: Direct API (simple), Event-Driven (scalable), and Middleware/iPaaS (enterprise). Each pattern addresses different scale, latency, and complexity requirements.
Prerequisites
- Understanding of your data volume and sync frequency requirements
- Decision on unidirectional vs bidirectional data flow
- Knowledge of Salesforce edition (affects available features like CDC)
Variant A: Direct API Integration (Simple)
Best for: MVPs, < 50K records/day, single-direction sync
┌─────────────┐ jsforce ┌─────────────┐
│ Your App │ ──── REST API ──▶ │ Salesforce │
│ (Node.js) │ ◀── SOQL/SOSL ── │ Org │
└─────────────┘ └─────────────┘
Data flow:
- App queries SF via SOQL (polling or on-demand)
- App writes to SF via sObject CRUD
- Scheduled cron for periodic sync
Key Characteristics
- Single jsforce connection per process
- Polling-based reads (cron schedule)
- Direct REST writes
- In-memory or Redis caching for describe/metadata
- Suitable for: internal tools, admin dashboards, simple data sync
Code Pattern
import cron from 'node-cron';
cron.schedule('*/15 * * * *', async () => {
const conn = await getConnection();
const accounts = await conn.query(`
SELECT Id, Name, Industry, AnnualRevenue
FROM Account
WHERE LastModifiedDate >= ${fifteenMinutesAgo}
`);
for (const account of accounts.records) {
await localDb.upsert(, (account));
}
});