Learn about common roadblocks to watch for and ways to address them.
voiceCallId missing from CALL_STARTED
Supervisor view shows no call data, and VoiceCall ownership is never assigned. Always populate callAttributes.voiceCallId.
Publishing events from inside a method Salesforce called
This situation causes duplicate events and state machine bugs. Return a Promise with the result; let the framework publish.
Not following the call scenario diagrams
With the new base connector, events emitted out of context are rejected. Follow the canonical sequences for single-call and multiparty call. The base connector enforces ordering: CALL_CONNECTED before CALL_STARTED, PARTICIPANT_ADDED without an active call, and other out-of-sequence events are dropped. See Call Scenario Diagrams for details.
Not respecting enqueueNextState
Causes dropped calls when reps go Offline mid-call. Declare hasPendingStatusChange: true and honor the flag in setAgentStatus(). Offline is the worst status to flip to mid-call; always queue it.
Running Open CTI adapter and Salesforce Voice connector simultaneously
Both will create records on call end. Deactivate the Open CTI adapter before activating Salesforce Voice in production.
Putting screen pop logic in the connector JS
This may work in a single tab, but it breaks on reconnect and multi-tab. Screen pop belongs in an Omni-Channel flow, not the connector.
Building from scratch instead of cloning the demo connector
The demo connector handles dozens of edge cases in the event lifecycle. Always start from it. See Clone Before You Build.
Modeling VoiceCall as a kind of Task
VoiceCall is a richer, voice-native object. Use it directly; let customers decide whether they also want a Task, a Case, or an Opportunity related to it.