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.
Decision
| 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 |
Pattern
Push event flow:
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: salesforce.settings:global_push_limit (default: 10,000/cron run)
- Per-mapping limit: mapping entity push_limit
- Retry attempts: mapping entity push_retries
- Push frequency: mapping entity push_frequency
Services:
- Queue service: queue.salesforce_push
- Queue class: /web/modules/contrib/salesforce/modules/salesforce_push/src/PushQueue.php
- Queue table: salesforce_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