SfSkills Domains Docs GitHub

Home / admin / service-cloud-voice-setup

service-cloud-voice-setup

Use this skill when setting up Service Cloud Voice with Amazon Connect — provisioning the contact center, configuring phone numbers, enabling real-time transcription, and configuring After Conversation Work Time.

Open the skill folder on GitHub


Service Cloud Voice Setup

This skill covers the end-to-end admin setup of Service Cloud Voice using the Salesforce-guided wizard that provisions an Amazon Connect instance, configures Omni-Channel routing for voice, enables real-time transcription, and sets up After Conversation Work Time (ACW). Activate this skill when a team needs to go from a licensed org to agents handling calls in the Service Console.


Before Starting

Gather this context before working on anything in this domain:


Questions to Ask Before Configuring

Ask these before the wizard, not after the first test call. Each one maps to a failure in references/gotchas.md; skipping them produces a contact center that provisions cleanly and routes nothing.

AskWhy it mattersWhat a good answer adds
"Is this Amazon Connect, Partner Telephony, or Bring Your Own Channel for CCaaS?"It fixes ConversationVendorInfo.vendorType, and the guide scopes almost every other field on that type to one model or the other (api_meta.txt L38708-39034)The one legal vendorType value, and which of connectorUrl / integrationClass / agentSSOSupported are even in scope
"How many seconds of wrap-up, and may an agent extend it?"ACW is a required field group on the Voice ServiceChannel, not a toggle — and every value is bounded — 10–3600 seconds, and 1–10 extensionsA deployable hasAfterConvoWorkTimer / afterConvoMaxTime pair, and whether the three extension fields are needed at all
"Do wrap-up times differ per team, or is one number right for everyone?"Channel-level ACW is one setting for the org; per-user ACW on PresenceUserConfig is API 65.0+ and multiplies the records a release must keep consistentA decision between one ServiceChannel field pair and N presence configurations, and the manifest's API version floor
"When was this org created, and has anyone hardened cookies?"isFirstPartyCookieUseRequired defaults to true in newer orgs and is documented as incompatible with Amazon ConnectA MyDomain.settings change deployed ahead of the contact center, instead of a silent softphone failure
"Who owns the S3 bucket the call recordings land in, and what is its lifecycle policy?"For Amazon Connect the audio is not in Salesforce at all (object_reference.txt L308341-308343) — a VoiceCallRecording row proves linkage, not retrievabilityA named AWS owner and a retention policy inside the same change record as the Salesforce config
"Which presence statuses will agents actually pick, and does each one name the Voice channel?"A status with no channels is silently converted to an Away status (api_meta.txt L107966-107970)A status list where every routable status is verifiably routable, before agents are told to go live
"Are transcripts or Einstein features in scope, and who signed off on recording consent?"Transcription depends on AWS-side configuration Salesforce does not validate, and VoiceCallRecording.IsConsented exists because consent is a per-recording factAn explicit AWS prerequisite step in the runbook, and a consent position rather than a default

What a proper configuration adds over just running the wizard: the routing path is deployable and reviewable as source rather than clicked into one org, ACW and presence settings are internally consistent so the deploy cannot half-succeed, and the AWS-side dependencies (cookies, recording storage, media streaming) have named owners instead of being discovered during an incident.


Core Concepts

What a Contact Center Is, in Metadata

The wizard is a UI over ordinary deployable metadata. Knowing the shape is what lets you review a setup, diff two orgs, or move one forward through environments.

ComponentTypeIts jobGuide line
The contact center recordCallCenterThe container. "Represents the Call Center definition used to integrate Salesforce with a third-party computer-telephony integration (CTI) system, a partner telephony system, or partner Contact Center as a Service (CCaaS) system."api_meta.txt L31421-31424
The vendor linkConversationVendorInfoWhich telephony system, and what it supports. vendorType is the fork: Amazon_Connect, BringYourOwnChannelPartner, BringYourOwnContactCenter, ServiceCloudVoicePartnerapi_meta.txt L39028-39034
Agent/queue mappingCallCenterRoutingMapMaps a Salesforce user or queue to the vendor's user or queue; holds the Amazon Connect quickConnect ARN used for transfer availabilityapi_meta.txt L31685-31779
The routing channelServiceChannel (relatedEntityType = VoiceCall)Where Omni-Channel queues the call, and where After Conversation Work Time actually livesapi_meta.txt L107858, L107784-107841
Agent eligibilityServicePresenceStatus + PresenceUserConfigWhether an online agent is routable, and how much they can holdapi_meta.txt L107966-107973, L96998-97001
The feature switchServiceCloudVoiceSettingsenableServiceCloudVoice for Amazon Connect; enableSCVExternalTelephony for Partner Telephonyapi_meta.txt L126885-126900
The call recordVoiceCall (+ VoiceCallRecording)Per-call metadata; VendorType is always ContactCenter for Salesforce Voiceobject_reference.txt L306734, L307500-307509

references/metadata-examples.md carries deployable XML for each of these, a package.xml, the deploy order, and the verification SOQL.

Note what this table refutes: Service Cloud Voice contact centers are CallCenter records. The guide's own CallCenterRoutingMap sample carries an arn:aws:connect: agent ARN (api_meta.txt L31774-31776), and VoiceCall.CallCenterId is a lookup to CallCenter (object_reference.txt L306795-306809). What does not apply from the Open CTI era is the legacy adapter workflow — the AppExchange package, the locally hosted adapter URL, and manual user assignment to a call center; see references/llm-anti-patterns.md Anti-Pattern 5, which is correct about the workflow and imprecise about the metadata type.

The Guided Provisioning Wizard

Service Cloud Voice setup begins at Setup > Service Cloud Voice > Contact Centers. The wizard walks through four phases: (1) Contact Center naming and region selection, (2) Amazon Connect instance provisioning (or import of an existing instance), (3) phone number claiming, and (4) Omni-Channel service channel creation. Behind the scenes, Salesforce uses an OAuth 2.0 integration between your org and AWS to create IAM roles, configure the Amazon Connect instance, and install the required Amazon Connect contact flows. Admins do not need to log in to the AWS console for a greenfield provisioning. The wizard handles all trust and permission scaffolding.

If an existing Amazon Connect instance needs to be imported rather than created fresh, the admin must provide the instance ARN and have sufficient AWS IAM permissions to grant Salesforce access. The import path is more fragile — existing contact flows must be manually mapped to Salesforce's expected flow entry points.

UNVERIFIED (2026-09-05): the wizard's four phases, its AWS IAM and contact-flow behaviour, and the claim that no AWS console access is needed for greenfield provisioning are documented on help.salesforce.com and cannot be fetched here. The grounded trace of the same activity is in ConversationVendorInfo: awsAccountKey is "The 12-digit AWS subaccount ID that's automatically provisioned for you when Service Cloud Voice was turned on", awsRootEmail is "The email address used by Salesforce to create the root user for the provisioned AWS subaccount", and awsTenantVersion is "The version number of the SVCTenantStack AWS CloudFormation stack that's deployed… in AWS region 'us-east-1'" (api_meta.txt L38684-38706). Those three fields are the evidence that Salesforce provisions AWS infrastructure on the admin's behalf; the step-by-step screens are not.

Phone Numbers and Contact Flows

During wizard completion, the admin claims one or more phone numbers from Amazon Connect's number inventory. Numbers can be Direct Inward Dial (DID) from available country pools. Each number is associated with a contact flow — a routing program in Amazon Connect that determines how an inbound call is handled before it reaches an agent. Salesforce installs a default "Inbound Flow" contact flow that routes calls to the Omni-Channel queue. Custom contact flows (IVR menus, business hours checks, callback deflection) must be built in the Amazon Connect console after the wizard completes, and then re-associated with the phone number in the Amazon Connect console, not in Salesforce Setup.

Real-Time Transcription

Live transcription of voice calls requires enabling Live Media Streaming on the Amazon Connect instance in the AWS console, under Data Storage > Live Media Streaming. This is separate from post-call recordings. Once live media streaming is enabled in AWS, the admin must return to Salesforce Setup > Contact Centers and enable Call Transcription on the contact center record. Real-time transcription data flows to the VoiceCall record as transcript segments accessible to supervisors via the Service Console. UNVERIFIED (2026-09-05): the Live Media Streaming / Kinesis Video Streams prerequisite and the Salesforce-side Call Transcription toggle are help-only and AWS-only; neither appears in the Metadata API Developer Guide or the Object Reference. What is grounded on the Salesforce side is that VoiceCall.TranscribedLanguage is "automatically populated by the Conversation Intelligence platform" and must not be set by hand (object_reference.txt L307453-307459), and that phone-number masking, when enabled, redacts numbers in transcripts as well as recordings (api_meta.txt L126856-126865). Einstein Real-Time Agent Assist and Einstein Automated Summaries both depend on this stream being active. Without live media streaming enabled at the Amazon Connect level, enabling transcription in Salesforce will silently produce no transcript output.

After Conversation Work Time (ACW)

After Conversation Work Time holds an agent in a wrap-up state after a call ends, preventing new work from being routed to them. In metadata it is a required field group on the Voice service channel, not a toggle on the contact center:

<ServiceChannel xmlns="http://soap.sforce.com/2006/04/metadata">
    <label>Voice Calls</label>
    <relatedEntityType>VoiceCall</relatedEntityType>
    <hasAfterConvoWorkTimer>true</hasAfterConvoWorkTimer>   <!-- requires the next line -->
    <afterConvoMaxTime>120</afterConvoMaxTime>              <!-- 10-3600 seconds -->
    <hasAcwExtensionEnabled>true</hasAcwExtensionEnabled>   <!-- requires the next two lines -->
    <acwExtensionDuration>60</acwExtensionDuration>         <!-- 10-3600 seconds -->
    <maxExtensions>2</maxExtensions>                        <!-- 1-10 -->
</ServiceChannel>

All five are ServiceChannel fields, "Available only for service channels of type Messaging or Voice", with Voice support from API 52.0 (api_meta.txt L107784-107792, L107825-107841, L107852-107856). From API 65.0 the same timer can instead be set per user or profile on PresenceUserConfig (api_meta.txt L96989-96993, L97037-97046). The Object Reference confirms the runtime behaviour from the other end: a call reaching CallDisposition = completed means "the call has ended… If After Conversation Work (ACW) is enabled, that work begins after the call completes" (object_reference.txt L306831-306841).

UNVERIFIED (2026-09-05): the Setup navigation path "Setup > After Conversation Work Time" and the claim that ACW is additionally toggled per contact-center record are help-only. No CallCenter or ConversationVendorInfo field in the Metadata API Developer Guide corresponds to an ACW switch. If a contact-center-level toggle exists in the UI, the deployable source of truth is still the ServiceChannel field group above — configure and review it there. references/gotchas.md Gotcha 4 records the two-surface behaviour as observed; Gotcha 7 records what the guide says.


Common Patterns

Pattern: Greenfield Provisioning via Guided Wizard

When to use: New deployment with no existing Amazon Connect instance. The org has the Voice add-on, Omni-Channel is enabled, My Domain is deployed.

How it works:

  1. Navigate to Setup > Service Cloud Voice > Contact Centers > New.
  2. Follow the wizard: name the contact center, select AWS region closest to the agent population, let Salesforce create a new Amazon Connect instance.
  3. Claim at least one phone number during the wizard. You can add numbers later from the contact center record.
  4. After wizard completion, verify the Voice service channel appears under Setup > Omni-Channel > Service Channels.
  5. Assign the Voice service channel to the appropriate Omni-Channel queue and routing configuration.
  6. Add agents to the queue and assign them the "Service Cloud Voice" permission set.
  7. Test by calling the claimed number from an external phone; the call should appear as a work item in the agent's Omni-Channel widget in the Service Console.

Why not the alternative: Attempting to manually create an Amazon Connect instance in the AWS console and link it afterward skips the automated IAM trust configuration and contact flow installation. This leaves the integration in a broken state where calls route to Amazon Connect but cannot be passed to Salesforce agents.

Pattern: Enabling Real-Time Transcription on an Existing Contact Center

When to use: Voice is already live with basic call routing, but the team wants live transcription for supervisor monitoring or Einstein AI features.

How it works:

  1. In the AWS console, open the Amazon Connect instance linked to the org.
  2. Under Data Storage, enable Live Media Streaming with a Kinesis Video Stream. Select a retention period (minimum 0 hours is acceptable for transcription-only use cases).
  3. Return to Salesforce Setup > Service Cloud Voice > Contact Centers, open the contact center record, and enable Call Transcription.
  4. Assign the "Service Cloud Voice Transcription" permission set to supervisors who should see live transcript panels in the Service Console.
  5. Test by placing a call and confirming the Transcript panel populates in the VoiceCall record in real time.

Why not the alternative: Enabling transcription in Salesforce Setup without first activating live media streaming in AWS produces no error — it simply silently produces no transcripts. The misconfiguration is hard to diagnose because the VoiceCall record is created and the call routes correctly; only the transcript segments are missing.


Decision Guidance

SituationRecommended ApproachReason
No existing Amazon Connect accountUse guided wizard to provision a new instanceWizard handles all AWS IAM trust, contact flows, and OAuth — zero manual AWS work required
Existing Amazon Connect instance in AWSImport path in wizard, provide instance ARNPreserves existing contact flows and numbers, but requires IAM permissions and manual flow mapping
Sandbox testing of voice setupProvision a separate Amazon Connect instance for the sandboxOne Salesforce org per Amazon Connect instance; sharing with production is unsupported
Agents need wrap-up time after callsEnable and configure After Conversation Work TimeACW is the platform-native mechanism; custom presence rules are not needed
Supervisor live monitoring of transcriptsEnable live media streaming in AWS + transcription in SalesforceBoth must be active; Salesforce-only configuration produces no output
Custom IVR or business hours routingBuild contact flows in Amazon Connect console after wizardSalesforce wizard does not expose contact flow editing; all flow logic lives in Amazon Connect
Telephony is not Amazon ConnectSet vendorType to ServiceCloudVoicePartner (or BringYourOwnContactCenter for CCaaS messaging)The enum is restricted to four values; the connector, bridge and integration-class fields are scoped to these models only (api_meta.txt L38708-39034)
One wrap-up time for the whole orgACW fields on the Voice ServiceChannelOne record to keep consistent, and it works on a v62 manifest (api_meta.txt L107784-107841)
Wrap-up time differs per teamACW fields on PresenceUserConfig, assigned by profile or userPer-team control, at the cost of API 65.0+ and N records per release (api_meta.txt L96989-96993, L97063-97072)
Promoting a contact center between orgsRetrieve production, diff, re-point handler and fallback IDsThose fields hold org-specific record IDs and carry "Don't change the value in this field" (api_meta.txt L31575-31619)

  1. Establish the vendor model and read the questions. Answer `## Questions to Ask Before

    Configuringin full. The first answer alone — Amazon Connect vs Partner Telephony vs Bring Your Own Channel for CCaaS — decidesConversationVendorInfo.vendorTypeand which half of that type's fields are even legal (references/metadata-examples.md§2). Record it intemplates/service-cloud-voice-setup-template.md` before touching Setup.

  2. Clear the two prerequisites that fail silently. Confirm Omni-Channel is on (without it none of

    ServiceChannel, ServicePresenceStatus, or PresenceUserConfig will deploy), and retrieve Settings:MyDomain to confirm isFirstPartyCookieUseRequired is false. Deploy that settings change first if it is not — see references/gotchas.md Gotcha 6.

  3. Provision, then retrieve — do not hand-author the contact center. Run the guided setup, then

    pull the result into source so it is reviewable and promotable: sf project retrieve start --metadata CallCenter ConversationVendorInfo ServiceChannel ServicePresenceStatus PresenceUserConfig CallCenterRoutingMap --metadata "Settings:ServiceCloudVoice". The sections/items names inside a live CallCenter are vendor-generated; copy them, never invent them.

  4. Author the routing layer as source. Add or edit the Voice ServiceChannel

    (relatedEntityType = VoiceCall) with its complete ACW field group, a ServicePresenceStatus that names that channel, and a PresenceUserConfig with a real capacity. Use references/metadata-examples.md §4 for the shapes and the 10–3600 / 1–10 bounds.

  5. Lint before you deploy. Run

    python3 skills/admin/service-cloud-voice-setup/scripts/check_service_cloud_voice_setup.py --manifest-dir force-app/main/default. It fails the build on an invalid vendorType, a half-set ACW group, relatedEntity in place of relatedEntityType, a missing Voice channel, a PresenceUserConfig without capacity, Sales Dialer fields in ServiceCloudVoice.settings, and isFirstPartyCookieUseRequired left true. Then sf project deploy validate --manifest manifest/package.xml in the deploy order in references/metadata-examples.md §7.

  6. Handle the AWS-side work as its own change record. Live Media Streaming for transcription and

    the S3 bucket that holds Amazon Connect recordings are outside Salesforce and outside the validator's reach. Assign each an owner, capture the retention policy, and note the transcription prerequisite — the Salesforce toggle alone produces nothing (references/gotchas.md Gotchas 1 and 11).

  7. Verify from the data, not the UI. Place a test call, then run the four diagnostic queries at

    the end of references/examples.md in order. They separate "no handoff at all" from "arrived but unlinked" from "queued but never routed" from "agents never mapped to vendor identities" — the four failures that all present to a user as "the phone doesn't work".

Review Checklist

Run through these before marking work in this area complete:


Salesforce-Specific Gotchas

Non-obvious platform behaviors that cause real production problems:

  1. Live media streaming must be enabled in AWS before transcription works in Salesforce — Enabling Call Transcription on the Salesforce contact center record without first enabling Live Media Streaming in the Amazon Connect AWS console produces no error and no transcript output. Calls route normally; only transcripts are silently missing. Always validate in AWS first.
  2. One Amazon Connect instance per Salesforce org — Salesforce enforces a one-to-one relationship between a Salesforce org and an Amazon Connect instance. Attempting to link the same Amazon Connect instance to a sandbox and production org will fail. Sandboxes must provision their own Amazon Connect instances.
  3. Partial wizard runs leave orphaned AWS resources — If the guided wizard is abandoned mid-flow (e.g., after the Amazon Connect instance is created but before phone number claiming), an Amazon Connect instance remains in AWS with no corresponding active contact center record in Salesforce. These orphaned instances consume AWS service limits. Always complete or roll back wizard runs fully.
  4. Deploying half an ACW field group fails the deploy — hasAfterConvoWorkTimer without a max-time value, or hasAcwExtensionEnabled without both acwExtensionDuration and maxExtensions, is rejected rather than partially applied (api_meta.txt L107825-107841).
  5. A presence status with no channels is silently an Away status — agents pick it, appear online, and are never routed a call (api_meta.txt L107966-107970).

references/gotchas.md carries all eleven with What happens / When it occurs / How to avoid and the guide line behind each.


Output Artifacts

ArtifactDescription
Contact Center recordSalesforce record linking to the Amazon Connect instance; holds transcription and ACW settings
Voice service channelOmni-Channel service channel of type Voice, used for queue and routing configuration
VoiceCall recordCreated per call; stores call metadata, participant info, and transcript segments
After Conversation Work presence statusSystem presence status agents enter automatically after call completion
ConversationVendorInfo componentNames the telephony system and its vendorType; the first thing to check when a contact center behaves like the wrong product
Voice ServiceChannel componentrelatedEntityType = VoiceCall, and the deployable home of the ACW field group
ServicePresenceStatus + PresenceUserConfigDecide whether an online agent is routable and how much work they can hold
CallCenterRoutingMap recordsMap Salesforce users and queues to vendor identities; required for transfer availability
VoiceCallRecording recordsLink rows only — for Amazon Connect the audio itself lives in S3 on your AWS account

Reference Files

FileRead it when
references/metadata-examples.mdWriting, reviewing, or promoting the deployable XML — CallCenter, ConversationVendorInfo, ServiceChannel with ACW, presence config, routing map, settings, package.xml, deploy order, verification SOQL
references/gotchas.mdSomething provisioned cleanly and still does not work: silent transcription, cookies, ACW deploy failures, Away statuses, recordings that are not in Salesforce
references/examples.mdWalking a greenfield or transcription-enablement scenario end to end, or running the four-query diagnostic when calls are not reaching agents
references/well-architected.mdChoosing between the guided wizard and the import path, channel-level vs per-user ACW, always-on vs selective transcription — and for the source list behind every claim here
references/llm-anti-patterns.mdReviewing AI-generated Service Cloud Voice guidance before acting on it
templates/service-cloud-voice-setup-template.mdStarting a build, to record the answers from ## Questions to Ask Before Configuring
scripts/check_service_cloud_voice_setup.pyBefore every deploy, with --manifest-dir pointed at the retrieved source

Dependencies

Package files