Push Synchronization (Drupal → Salesforce)
When to Use
Use
salesforce_pushwhen you need to send Drupal entity changes to Salesforce. Useasync = TRUEfor production (queue-based, non-blocking). Useasync = FALSEonly for low-traffic, real-time requirements.
Purpose: Push Drupal entity changes to Salesforce
Decision: Sync vs Async, Upsert vs Create/Update
| Situation | Choose | Why |
|---|---|---|
| High-traffic entities, production | async = TRUE |
Non-blocking, queue processes via cron |
| Low-traffic, real-time needed | async = FALSE |
Immediate sync during entity save |
| Salesforce has external ID field | always_upsert = TRUE |
Handles create/update in one operation |
| No external ID on SF object | always_upsert = FALSE |
Uses create for new, update for existing |
Decision Point - Sync vs Async:
- async = FALSE: Real-time push during entity save (blocking)
- async = TRUE: Queue-based push during cron (non-blocking, recommended)
Decision Point - Upsert vs Create/Update:
- always_upsert = TRUE: Always use upsert operation (requires external ID field)
- always_upsert = FALSE: Use create for new, update for existing
- Upsert key: Mapping entity → key field
Architecture
Queue System:
- Service: queue.salesforce_push
- Class: /web/modules/contrib/salesforce/modules/salesforce_push/src/PushQueue.php
- Table: salesforce_push_queue
- Default limit: 10,000 items per cron run
Queue Processor Plugin System:
- Manager: /web/modules/contrib/salesforce/modules/salesforce_push/src/PushQueueProcessorPluginManager.php
- Default processor: rest plugin
- Custom processors: Extend PushQueueProcessorInterface
Event Flow
- Entity saved →
salesforce_push_entity_crud()→ Queue item created - Cron/standalone → Queue processor runs
SalesforceEvents::PUSH_ALLOWED→ Veto opportunitySalesforceEvents::PUSH_MAPPING_OBJECT→ Modify mapped objectSalesforceEvents::PUSH_PARAMS→ Modify push parameters- API call (create/update/upsert/delete)
SalesforceEvents::PUSH_SUCCESSorSalesforceEvents::PUSH_FAIL
Entity saved
→ salesforce_push_entity_crud()
→ Queue item created (salesforce_push_queue table)
→ Cron or standalone endpoint processes queue
→ SalesforceEvents::PUSH_ALLOWED (veto here)
→ SalesforceEvents::PUSH_MAPPING_OBJECT
→ SalesforceEvents::PUSH_PARAMS (modify fields here)
→ API call (create / update / upsert / delete)
→ SalesforceEvents::PUSH_SUCCESS or PUSH_FAIL
Configuration
- Global push limit:
/admin/config/salesforce→global_push_limit - Per-mapping limits: Mapping entity →
push_limit - Retry attempts: Mapping entity →
push_retries - Push frequency: Mapping entity →
push_frequency
Drush Commands
- Location:
/web/modules/contrib/salesforce/modules/salesforce_push/src/Commands/SalesforcePushCommands.php drush sfpush- Process push queue
Common Mistakes
- Wrong: Relying on
async = FALSEin production for entities saved frequently → Right: Useasync = TRUEand process via cron or standalone endpoint - Wrong: Ignoring
push_retries— failed items accumulate indefinitely → Right: Setpush_retriesand monitorsalesforce_push_queuefor permanently failed items
See Also
- Pull Synchronization
- Queue Processing
- Event System
- Push Queue Operations
- Drush Commands
- Reference:
/web/modules/contrib/salesforce/modules/salesforce_push/src/PushQueue.php