From salesforce-pack
Provides Salesforce integration architecture blueprints: Direct API polling for simple syncs, Event-Driven CDC for scalable bidirectional flow, Middleware for enterprise scale.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin salesforce-packThis skill is limited to using the following tools:
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.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
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.
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
// Cron-based sync — runs every 15 minutes
import cron from 'node-cron';
cron.schedule('*/15 * * * *', async () => {
const conn = await getConnection();
// Fetch recently modified accounts
const accounts = await conn.query(`
SELECT Id, Name, Industry, AnnualRevenue
FROM Account
WHERE LastModifiedDate >= ${fifteenMinutesAgo}
`);
// Sync to local database
for (const account of accounts.records) {
await localDb.upsert('accounts', mapFromSalesforce(account));
}
});
Best for: Real-time sync, 50K-5M records/day, bidirectional flow
┌─────────────┐ ┌─────────────┐
│ Your App │ ◀─── CDC Events ─── │ Salesforce │
│ (listener) │ Change Data Capture │ Org │
│ │ │ │
│ │ ── Bulk API 2.0 ──▶ │ │
│ │ (write-back) │ │
└──────┬──────┘ └─────────────┘
│
┌────▼────┐
│ Queue │ (Redis/SQS/Pub-Sub)
│ (async │
│ writes)│
└─────────┘
// Event-driven — near-real-time sync
import { getConnection } from './salesforce/connection';
const conn = await getConnection();
// Subscribe to Account changes via CDC
conn.streaming.topic('/data/AccountChangeEvent').subscribe(async (event) => {
const { changeType, recordIds, changedFields } = event.payload.ChangeEventHeader;
switch (changeType) {
case 'CREATE':
await localDb.insert('accounts', mapFromSalesforce(event.payload));
break;
case 'UPDATE':
await localDb.update('accounts', recordIds[0], mapChangedFields(event.payload, changedFields));
break;
case 'DELETE':
await localDb.delete('accounts', recordIds[0]);
break;
}
});
// Write-back via queue (async, decoupled)
queue.process('sync-to-salesforce', async (job) => {
const conn = await getConnection();
await conn.sobject(job.data.objectType).upsert(
job.data.records,
'External_ID__c'
);
});
Best for: Multi-system integration, 5M+ records/day, complex transformations
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Your App │ ── API ──────▶ │ Middleware │ ── REST ────▶ │ Salesforce │
│ │ │ (MuleSoft/ │ │ Org │
│ │ │ Workato/ │ ◀─ CDC ──────│ │
│ │ ◀─ Webhooks ── │ Zapier) │ │ │
└─────────────┘ └──────┬───────┘ └─────────────┘
│
┌─────▼──────┐
│ Other │
│ Systems │
│ (ERP, DW, │
│ Marketing) │
└─────────────┘
| Platform | Salesforce Integration | Best For |
|---|---|---|
| MuleSoft | Native (Salesforce owns it) | Enterprise, complex flows |
| Heroku Connect | Bi-directional auto-sync | Simple sync to Postgres |
| Workato | Pre-built recipes | Business user automation |
| Zapier | Trigger-based | Simple 1:1 integrations |
| Dell Boomi | Enterprise iPaaS | Legacy system integration |
| Factor | Direct API (A) | Event-Driven (B) | Middleware (C) |
|---|---|---|---|
| Records/day | < 50K | 50K-5M | 5M+ |
| Latency | Minutes (polling) | Seconds (CDC) | Depends on config |
| Direction | Usually one-way | Bidirectional | Multi-directional |
| API call efficiency | Medium | High (no polling) | High (batched) |
| Complexity | Low | Medium | Low (config-driven) |
| Cost | jsforce only | jsforce + queue infra | iPaaS license ($$$) |
| SF Edition required | Any with API | Enterprise+ (CDC) | Any |
| Team skills | Node.js developers | Node.js + streaming | Business analysts OK |
Variant A (Direct API)
│
│ Growing data volume / need real-time sync
▼
Variant B (Event-Driven)
│
│ Multiple systems / compliance / no-code needed
▼
Variant C (Middleware/iPaaS)
| Issue | Cause | Solution |
|---|---|---|
| Polling misses changes | Interval too long | Switch to CDC (Variant B) |
| CDC events lost | No replay tracking | Persist last replayId |
| API limits exhausted | Polling too frequently | Batch with Collections/Bulk API |
| Middleware cost too high | Over-engineered | Start with Variant A or B |
For common anti-patterns, see salesforce-known-pitfalls.