Configuring Enhanced Chat Channel Creates metadata XML for Salesforce Messaging for In-App and Web (MIAW). This skill produces a fully configured enhanced chat channel with routing, user verification, pre-chat, and automated response settings ready for Metadata API deployment. Scope - In scope : Creating metadata with Omni-Channel Flow routing, Omni-Channel Queue routing, or Agentforce Service Agent (ASA) routing; enabling User Verification; configuring all channel settings (pre-chat forms, automated responses, consent keywords, file attachments, custom parameters) - Out of scope : Creating t…

; then\n echo \"Error: Derived name '$NAME' violates pattern ^[a-zA-Z][a-zA-Z0-9_]*$\" >&2\n exit 1\nfi\n\nif [ ${#NAME} -gt 80 ]; then\n echo \"Error: Derived name '$NAME' exceeds 80 characters\" >&2\n exit 1\nfi\n\necho \"$NAME\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":676,"content_sha256":"58a084349e2b6264de6fa4a47bcdfdf422e4671f6a17f86551e46e1aee56655a"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Configuring Enhanced Chat Channel","type":"text"}]},{"type":"paragraph","content":[{"text":"Creates ","type":"text"},{"text":"MessagingChannel","type":"text","marks":[{"type":"code_inline"}]},{"text":" metadata XML for Salesforce Messaging for In-App and Web (MIAW). This skill produces a fully configured enhanced chat channel with routing, user verification, pre-chat, and automated response settings ready for Metadata API deployment.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scope","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"In scope","type":"text","marks":[{"type":"strong"}]},{"text":": Creating ","type":"text"},{"text":"MessagingChannel","type":"text","marks":[{"type":"code_inline"}]},{"text":" metadata with Omni-Channel Flow routing, Omni-Channel Queue routing, or Agentforce Service Agent (ASA) routing; enabling User Verification; configuring all channel settings (pre-chat forms, automated responses, consent keywords, file attachments, custom parameters)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Out of scope","type":"text","marks":[{"type":"strong"}]},{"text":": Creating the referenced Omni-Channel Flow/Queue definitions (use ","type":"text"},{"text":"automation-flow-generate","type":"text","marks":[{"type":"code_inline"}]},{"text":"), creating the Embedded Service Deployment (separate metadata type — use ","type":"text"},{"text":"service-digital-engagement-deployment-configure","type":"text","marks":[{"type":"code_inline"}]},{"text":"), creating permission sets for messaging (use ","type":"text"},{"text":"platform-permission-set-generate","type":"text","marks":[{"type":"code_inline"}]},{"text":"), configuring the Embedded Service Code Snippet","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Entry points and transport","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Delegated","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"context.calledFrom == \"service-onboarding\"","type":"text","marks":[{"type":"code_inline"}]},{"text":"): use the approved ","type":"text"},{"text":"values","type":"text","marks":[{"type":"code_inline"}]},{"text":", ask nothing, and return ","type":"text"},{"text":"failed","type":"text","marks":[{"type":"code_inline"}]},{"text":" naming any missing required key. ","type":"text"},{"text":"Standalone","type":"text","marks":[{"type":"strong"}]},{"text":" (no ","type":"text"},{"text":"context","type":"text","marks":[{"type":"code_inline"}]},{"text":"): run Clarifying Questions.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Transport A","type":"text","marks":[{"type":"strong"}]},{"text":" (primary): headless-360 MCP ","type":"text"},{"text":"dispatch","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"dispatch_readonly","type":"text","marks":[{"type":"code_inline"}]},{"text":" on ","type":"text"},{"text":"/headless/metadata","type":"text","marks":[{"type":"code_inline"}]},{"text":". ","type":"text"},{"text":"Transport B","type":"text","marks":[{"type":"strong"}]},{"text":": the ","type":"text"},{"text":"sf","type":"text","marks":[{"type":"code_inline"}]},{"text":" commands below, only where a probe shows Transport A unavailable.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Details: ","type":"text"},{"text":"references/onboarding_contract.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" (§1 entry points, §2 transport, §3 pre-scan, §5 result).","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Clarifying Questions","type":"text"}]},{"type":"paragraph","content":[{"text":"Before generating, ask the user if not already clear (standalone only):","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What is the channel name / label? (used for ","type":"text"},{"text":"masterLabel","type":"text","marks":[{"type":"code_inline"}]},{"text":" and file name)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What routing type? (Omni-Channel Flow, Omni-Channel Queue, User, or Agentforce Service Agent)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What is the routing target? (Flow API name, Queue developer name, User ID, or ASA bot name)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For Flow, User, or ASA routing: What is the fallback queue name?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Should User Verification be enabled? (defaults to ","type":"text"},{"text":"true","type":"text","marks":[{"type":"code_inline"}]},{"text":" per this skill)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Are there pre-chat form fields required? If so, which fields and types?","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Required Inputs","type":"text"}]},{"type":"paragraph","content":[{"text":"Gather or infer before proceeding:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Channel name","type":"text","marks":[{"type":"strong"}]},{"text":": Used for ","type":"text"},{"text":"masterLabel","type":"text","marks":[{"type":"code_inline"}]},{"text":" and the file name (","type":"text"},{"text":"\u003cName>.messagingChannel-meta.xml","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Routing type","type":"text","marks":[{"type":"strong"}]},{"text":": One of ","type":"text"},{"text":"Queue","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"Flow","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"User","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":"AgentforceServiceAgent","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Routing target","type":"text","marks":[{"type":"strong"}]},{"text":": The developer name of the queue, flow, user, or ASA bot","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fallback queue","type":"text","marks":[{"type":"strong"}]},{"text":" (Flow, User, and ASA): The developer name of the fallback queue for escalation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User verification","type":"text","marks":[{"type":"strong"}]},{"text":": Whether to require JWT-based identity verification (default: ","type":"text"},{"text":"true","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Defaults unless specified:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"messagingChannelType","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"EmbeddedMessaging","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"authMode","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"Auth","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"chatAbandonmentTimeout","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"5","type":"text","marks":[{"type":"code_inline"}]},{"text":" (minutes)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"endUserIdleTimeOut","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"5","type":"text","marks":[{"type":"code_inline"}]},{"text":" (minutes)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isAttachmentUploadEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"true","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"maxFileSize","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"5","type":"text","marks":[{"type":"code_inline"}]},{"text":" (MB)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"allowedFileTypes","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"bmp,csv,doc,docx,gif,jpg,pdf,png,tiff,txt,xls,xml","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"anonymousUserJwtExpirationTime","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"360","type":"text","marks":[{"type":"code_inline"}]},{"text":" (minutes, required for UnAuth, range 60-4320)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"verifiedUserJwtExpirationTime","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"60","type":"text","marks":[{"type":"code_inline"}]},{"text":" (minutes, required for Auth, range 60-240)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isAbandonedChatsEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isSaveTranscriptEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isFallbackMessageEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isEstimatedWaitTimeEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isFileAttachmentExtUnrestricted","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isQueuePositionEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isSynchronousChatEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isVoiceModeEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":": ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"All steps are sequential. Do not skip or reorder.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Phase 1 — Gather Context","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify org API version","type":"text","marks":[{"type":"strong"}]},{"text":" — run ","type":"text"},{"text":"scripts/check-api-version.sh 67.0 \u003corg-alias>","type":"text","marks":[{"type":"code_inline"}]},{"text":" and report any errors it returns. If the script fails, generate a ","type":"text"},{"text":"sfdx-project.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" in the metadata output folder with ","type":"text"},{"text":"\"sourceApiVersion\": \"67.0\"","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Collect inputs","type":"text","marks":[{"type":"strong"}]},{"text":" — standalone: per Clarifying Questions. Delegated: from ","type":"text"},{"text":"values","type":"text","marks":[{"type":"code_inline"}]},{"text":". Then probe transport with a read-only ","type":"text"},{"text":"GET","type":"text","marks":[{"type":"code_inline"}]},{"text":" of ","type":"text"},{"text":"MessagingChannel","type":"text","marks":[{"type":"code_inline"}]},{"text":" (contract §2).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Determine file name","type":"text","marks":[{"type":"strong"}]},{"text":" — run ","type":"text"},{"text":"scripts/normalize-channel-name.sh \"\u003cLABEL>\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" and surface any errors it returns.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"3a. ","type":"text"},{"text":"Pre-scan","type":"text","marks":[{"type":"strong"}]},{"text":" — ","type":"text"},{"text":"GET","type":"text","marks":[{"type":"code_inline"}]},{"text":" ","type":"text"},{"text":"MessagingChannel","type":"text","marks":[{"type":"code_inline"}]},{"text":" by the step 3 name (contract §3): none → create; matches and active → no write, ","type":"text"},{"text":"already-configured","type":"text","marks":[{"type":"code_inline"}]},{"text":", skip to Phase 4; matches but inactive → activate only (step 15); differs → announce each change, then write the full document (standalone: ask first).","type":"text"}]},{"type":"ordered_list","attrs":{"order":4,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify routing target exists","type":"text","marks":[{"type":"strong"}]},{"text":" — skip when step 3a ended in ","type":"text"},{"text":"already-configured","type":"text","marks":[{"type":"code_inline"}]},{"text":" or activate-only, so a re-run never creates a queue. Query the org to confirm the referenced routing target exists:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For Queue: ","type":"text"},{"text":"sf data query --query \"SELECT Id, DeveloperName FROM Group WHERE Type='Queue' AND DeveloperName='\u003cQUEUE_NAME>'\" --target-org \u003corg-alias>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For Flow: ","type":"text"},{"text":"sf data query --query \"SELECT Id, ApiName FROM FlowDefinitionView WHERE ApiName='\u003cFLOW_NAME>' AND IsActive=true\" --target-org \u003corg-alias>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For User: ","type":"text"},{"text":"sf data query --query \"SELECT Id, Username FROM User WHERE Id='\u003cUSER_ID>' AND IsActive=true\" --target-org \u003corg-alias>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For ASA: ","type":"text"},{"text":"sf data query --query \"SELECT Id, DeveloperName FROM BotDefinition WHERE DeveloperName='\u003cBOT_NAME>'\" --target-org \u003corg-alias>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Also verify the fallback queue exists (required for Flow, User, and ASA routing)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If any target is not found: standalone — inform the user and ask whether to create it. Delegated — return ","type":"text"},{"text":"failed","type":"text","marks":[{"type":"code_inline"}]},{"text":" naming the missing target; never create it. If the standalone user confirms creating:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For Queue: generate a ","type":"text"},{"text":".queue-meta.xml","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"MessagingSession","type":"text","marks":[{"type":"code_inline"}]},{"text":" as the ","type":"text"},{"text":"queueSobject","type":"text","marks":[{"type":"code_inline"}]},{"text":" type and deploy it before the channel. ","type":"text"},{"text":"A new queue needs a ","type":"text","marks":[{"type":"strong"}]},{"text":"QueueRoutingConfig","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":", or sessions fail with \"Agents are not available. Try again later\" even though the channel deploys and activates.","type":"text","marks":[{"type":"strong"}]},{"text":" Right after the queue deploys, resolve or create one per ","type":"text"},{"text":"service-agentforce-channel-configure","type":"text","marks":[{"type":"code_inline"}]},{"text":"'s ","type":"text"},{"text":"references/queue-resolution.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" Step 4 — do not defer it.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For Flow/User/ASA: inform the user that the flow, user, or bot must be created separately (out of scope for this skill)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read the channel settings reference","type":"text","marks":[{"type":"strong"}]},{"text":" — load ","type":"text"},{"text":"references/channel_settings.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" to understand all available configuration options and their valid values.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Phase 2 — Generate Metadata","type":"text"}]},{"type":"ordered_list","attrs":{"order":6,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read the metadata template","type":"text","marks":[{"type":"strong"}]},{"text":" — load ","type":"text"},{"text":"assets/messaging_channel_template.xml","type":"text","marks":[{"type":"code_inline"}]},{"text":" as the starting structure.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apply routing configuration","type":"text","marks":[{"type":"strong"}]},{"text":" — set ","type":"text"},{"text":"sessionHandlerType","type":"text","marks":[{"type":"code_inline"}]},{"text":" and the corresponding handler field:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Routing Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"sessionHandlerType","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Required Fields","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Omni-Channel Queue","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Queue","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Omni-Channel Flow","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Flow","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"sessionHandlerFlow","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" (fallback)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"sessionHandlerUser","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" (fallback)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Agentforce Service Agent","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AgentforceServiceAgent","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" (fallback) + ","type":"text"},{"text":"sessionHandlerAsa","type":"text","marks":[{"type":"code_inline"}]},{"text":" (bot dev name — required, see v67 note below)","type":"text"}]}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"v67 note — ","type":"text","marks":[{"type":"strong"}]},{"text":"\u003csessionHandlerAsa>","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" is required","type":"text","marks":[{"type":"strong"}]},{"text":" (omitting it fails with \"Missing required Agentforce Service Agent\"); the deploy then binds ","type":"text"},{"text":"SessionHandlerId","type":"text","marks":[{"type":"code_inline"}]},{"text":", no PATCH needed. The bot must be Active first: run ","type":"text"},{"text":"sf agent activate -o \u003corg> --api-name \u003cBotDevName>","type":"text","marks":[{"type":"code_inline"}]},{"text":" and confirm ","type":"text"},{"text":"BotVersion.Status = Active","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apply user verification","type":"text","marks":[{"type":"strong"}]},{"text":" — if enabled, set ","type":"text"},{"text":"embeddedConfig.authMode","type":"text","marks":[{"type":"code_inline"}]},{"text":" to ","type":"text"},{"text":"Auth","type":"text","marks":[{"type":"code_inline"}]},{"text":" and include ","type":"text"},{"text":"\u003cmessagingAuthorizations>","type":"text","marks":[{"type":"code_inline"}]},{"text":". If not enabled, set ","type":"text"},{"text":"embeddedConfig.authMode","type":"text","marks":[{"type":"code_inline"}]},{"text":" to ","type":"text"},{"text":"UnAuth","type":"text","marks":[{"type":"code_inline"}]},{"text":" and omit ","type":"text"},{"text":"\u003cmessagingAuthorizations>","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configure embedded settings","type":"text","marks":[{"type":"strong"}]},{"text":" — populate ","type":"text"},{"text":"\u003cembeddedConfig>","type":"text","marks":[{"type":"code_inline"}]},{"text":" with:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"allowedFileTypes","type":"text","marks":[{"type":"code_inline"}]},{"text":" — comma-separated file extensions (no spaces)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"anonymousUserJwtExpirationTime","type":"text","marks":[{"type":"code_inline"}]},{"text":" — JWT expiration in minutes (required for UnAuth)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"verifiedUserJwtExpirationTime","type":"text","marks":[{"type":"code_inline"}]},{"text":" — JWT expiration in minutes (required for Auth)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"chatAbandonmentTimeout","type":"text","marks":[{"type":"code_inline"}]},{"text":" — minutes before abandoned conversation cleanup","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isAbandonedChatsEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":" — enable abandoned chat detection","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isAttachmentUploadEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":" — file upload support","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isEstimatedWaitTimeEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":" — show estimated wait time","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isFallbackMessageEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":" — fallback when agents unavailable","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isFileAttachmentExtUnrestricted","type":"text","marks":[{"type":"code_inline"}]},{"text":" — allow any file extension","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"isSaveTranscriptEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":" — save conversation transcripts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"maxFileSize","type":"text","marks":[{"type":"code_inline"}]},{"text":" — maximum attachment size in MB","type":"text"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"9a. ","type":"text"},{"text":"Configure session inactivity (optional)","type":"text","marks":[{"type":"strong"}]},{"text":" — ask using the Setup labels and set the top-level fields per ","type":"text"},{"text":"references/channel_settings.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" → \"Setup Prompts: Session Inactivity\".","type":"text"}]},{"type":"ordered_list","attrs":{"order":10,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Configure messaging keywords","type":"text","marks":[{"type":"strong"}]},{"text":" — generate ","type":"text"},{"text":"\u003cmessagingKeywords>","type":"text","marks":[{"type":"code_inline"}]},{"text":" elements:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"OptOut","type":"text","marks":[{"type":"code_inline"}]},{"text":" type with individual ","type":"text"},{"text":"\u003ckeyword>","type":"text","marks":[{"type":"code_inline"}]},{"text":" elements: cancel, end, quit, stop, stopall, unsubscribe","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Help","type":"text","marks":[{"type":"code_inline"}]},{"text":" type with ","type":"text"},{"text":"\u003ckeyword>","type":"text","marks":[{"type":"code_inline"}]},{"text":": help","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apply standard parameters","type":"text","marks":[{"type":"strong"}]},{"text":" — if the user needs standard pre-chat fields, generate ","type":"text"},{"text":"\u003cstandardParameters>","type":"text","marks":[{"type":"code_inline"}]},{"text":" elements with ","type":"text"},{"text":"parameterType","type":"text","marks":[{"type":"code_inline"}]},{"text":". If the channel uses Flow-based routing and the user specifies flow variable mappings, include ","type":"text"},{"text":"\u003cactionParameterMappings>","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"actionParameterName","type":"text","marks":[{"type":"code_inline"}]},{"text":" to map each parameter to a flow input variable.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apply custom parameters","type":"text","marks":[{"type":"strong"}]},{"text":" — if the user needs pre-chat data collection, generate ","type":"text"},{"text":"\u003ccustomParameters>","type":"text","marks":[{"type":"code_inline"}]},{"text":" elements with ","type":"text"},{"text":"name","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"masterLabel","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"parameterDataType","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"externalParameterName","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"maxLength","type":"text","marks":[{"type":"code_inline"}]},{"text":". Always set ","type":"text"},{"text":"parameterDataType","type":"text","marks":[{"type":"code_inline"}]},{"text":" to ","type":"text"},{"text":"String","type":"text","marks":[{"type":"code_inline"}]},{"text":" — the channel accepts no other value (the field's actual type, including Checkbox/Number/dropdown, is set at the deployment level via ","type":"text"},{"text":"formFieldType","type":"text","marks":[{"type":"code_inline"}]},{"text":", not here). If the channel uses Flow-based routing and the user specifies flow variable mappings, include ","type":"text"},{"text":"\u003cactionParameterMappings>","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"actionParameterName","type":"text","marks":[{"type":"code_inline"}]},{"text":" to map each parameter to a flow input variable.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generate the file","type":"text","marks":[{"type":"strong"}]},{"text":" — produce the ","type":"text"},{"text":".messagingChannel-meta.xml","type":"text","marks":[{"type":"code_inline"}]},{"text":" file following the template structure. Place at the path the user specifies, or default to the project's metadata source path under ","type":"text"},{"text":"messagingChannels/","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Phase 3 — Deploy and Activate","type":"text"}]},{"type":"ordered_list","attrs":{"order":14,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write the channel","type":"text","marks":[{"type":"strong"}]},{"text":" — Transport A: ","type":"text"},{"text":"POST","type":"text","marks":[{"type":"code_inline"}]},{"text":" to create, ","type":"text"},{"text":"PUT","type":"text","marks":[{"type":"code_inline"}]},{"text":" the ","type":"text"},{"text":"full","type":"text","marks":[{"type":"strong"}]},{"text":" document to update (a minimal PUT drops ","type":"text"},{"text":"embeddedConfig","type":"text","marks":[{"type":"code_inline"}]},{"text":"); check ","type":"text"},{"text":"results[].success","type":"text","marks":[{"type":"code_inline"}]},{"text":", then re-","type":"text"},{"text":"GET","type":"text","marks":[{"type":"code_inline"}]},{"text":". Transport B:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"sf project deploy start --source-dir \u003cpath-to-messagingChannels-folder> --target-org \u003corg-alias>","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"15a. ","type":"text"},{"text":"ASA routing only — verify the bind landed","type":"text","marks":[{"type":"strong"}]},{"text":" (skip for Queue, Flow, User):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"```bash\nsf data query -o \u003corg> --json \\\n -q \"SELECT SessionHandlerId, FallbackQueueId FROM MessagingChannel WHERE DeveloperName='\u003cCHANNEL_DEV_NAME>'\"\n```\n\nBoth must be non-null; if not, check both handler elements were in the XML and the bot was Active before the deploy.","type":"text"}]},{"type":"ordered_list","attrs":{"order":15,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Activate the channel","type":"text","marks":[{"type":"strong"}]},{"text":" — after a successful write, activate the messaging channel (","type":"text"},{"text":"IsActive","type":"text","marks":[{"type":"code_inline"}]},{"text":" is not part of the metadata). Transport A: sObject update ","type":"text"},{"text":"{\"IsActive\": true}","type":"text","marks":[{"type":"code_inline"}]},{"text":" through ","type":"text"},{"text":"dispatch","type":"text","marks":[{"type":"code_inline"}]},{"text":". Transport B:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"sf data update record --sobject MessagingChannel --where \"DeveloperName='\u003cCHANNEL_NAME>'\" --values \"IsActive=true\" --target-org \u003corg-alias>","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Phase 4 — Validate","type":"text"}]},{"type":"ordered_list","attrs":{"order":16,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Verify against checklist","type":"text","marks":[{"type":"strong"}]},{"text":" — confirm all items in the Verification Checklist below pass before presenting output.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report","type":"text","marks":[{"type":"strong"}]},{"text":" — delegated: return the contract §5 result and stop. Standalone: continue.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Present output","type":"text","marks":[{"type":"strong"}]},{"text":" (standalone) — show the generated file to the user with a summary of configured settings and confirm activation status. Offer next steps:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automated responses","type":"text","marks":[{"type":"strong"}]},{"text":" — ask which messages the user wants using the Setup labels per ","type":"text"},{"text":"references/channel_settings.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" → \"Setup Prompts: Automated Responses\", then redeploy.","type":"text"}]}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Rules / Constraints","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Constraint","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rationale","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File name serves as the channel API name","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No ","type":"text"},{"text":"channelPlatformKey","type":"text","marks":[{"type":"code_inline"}]},{"text":" field in the XML body","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"sessionHandlerType","type":"text","marks":[{"type":"code_inline"}]},{"text":" must match the handler fields present","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Setting ","type":"text"},{"text":"Queue","type":"text","marks":[{"type":"code_inline"}]},{"text":" but populating ","type":"text"},{"text":"sessionHandlerFlow","type":"text","marks":[{"type":"code_inline"}]},{"text":" causes deployment error","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Flow routing requires both ","type":"text"},{"text":"sessionHandlerFlow","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Queue is the mandatory fallback for human escalation","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User routing requires both ","type":"text"},{"text":"sessionHandlerUser","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Queue is the mandatory fallback when user is unavailable","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ASA routing: include both ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"sessionHandlerAsa","type":"text","marks":[{"type":"code_inline"}]},{"text":" in the XML","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"sessionHandlerAsa","type":"text","marks":[{"type":"code_inline"}]},{"text":" is required at v67 — the deploy fails with \"Missing required Agentforce Service Agent\" if omitted; the deploy itself binds ","type":"text"},{"text":"SessionHandlerId","type":"text","marks":[{"type":"code_inline"}]},{"text":", no PATCH needed","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bot must be Active before the metadata deploy that binds ","type":"text"},{"text":"SessionHandlerId","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"API rejects with \"Only active Agentforce Service Agents are supported\" if the bot is inactive","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"masterLabel","type":"text","marks":[{"type":"code_inline"}]},{"text":" max 40 characters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Platform limit on channel labels","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File name must match ","type":"text"},{"text":"^[a-zA-Z][a-zA-Z0-9_]*$","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"API name format enforced by Metadata API","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"allowedFileTypes","type":"text","marks":[{"type":"code_inline"}]},{"text":" is a comma-separated string with no spaces","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Not a nested list or array","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"keyword","type":"text","marks":[{"type":"code_inline"}]},{"text":" elements are individual — one per trigger word","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Not a comma-separated list","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"customParameters","type":"text","marks":[{"type":"code_inline"}]},{"text":" need ","type":"text"},{"text":"name","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"masterLabel","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"parameterDataType","type":"text","marks":[{"type":"code_inline"}]},{"text":", and ","type":"text"},{"text":"externalParameterName","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Incomplete parameters fail silently","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File extension is ","type":"text"},{"text":".messagingChannel-meta.xml","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Metadata API uses this specific extension","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Do not hardcode file paths — respect ","type":"text"},{"text":"sfdx-project.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" package directories","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Customer orgs customize source paths","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Channel must be activated after deployment","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Channels are inactive by default — messages won't route until activated","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"isSynchronousChatEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":" defaults to ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]},{"text":"; can only be ","type":"text"},{"text":"true","type":"text","marks":[{"type":"code_inline"}]},{"text":" for UnAuth channels upon user request","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Platform rejects \"You can't enable Session-Based Chat for verified users\" for Auth channels","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Gotchas","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Issue","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Resolution","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Channel name conflicts with existing channel","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check org for existing channels; file name must be unique","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Queue not found on deploy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Ensure the referenced queue exists and has ","type":"text"},{"text":"MessagingSession","type":"text","marks":[{"type":"code_inline"}]},{"text":" as a ","type":"text"},{"text":"queueSobject","type":"text","marks":[{"type":"code_inline"}]},{"text":" type","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Channel deploys and activates fine, but widget shows \"Agents are not available. Try again later.\" at session start","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"The queue has no ","type":"text"},{"text":"QueueRoutingConfig","type":"text","marks":[{"type":"code_inline"}]},{"text":" — this is silent at deploy time. Check ","type":"text"},{"text":"SELECT QueueRoutingConfigId FROM Group WHERE Id='\u003cQUEUE_ID>'","type":"text","marks":[{"type":"code_inline"}]},{"text":"; if null, resolve/create one per ","type":"text"},{"text":"queue-resolution.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" Step 4","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Omni-Channel Flow not found on deploy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Ensure the referenced flow exists and is active before deploying the channel","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ASA bot reference invalid","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bot must be published and active; use exact developer name from BotDefinition metadata","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ASA channel deploy fails with \"Missing required Agentforce Service Agent\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\u003csessionHandlerAsa>{BotDevName}\u003c/sessionHandlerAsa>","type":"text","marks":[{"type":"code_inline"}]},{"text":" is missing from the XML — it's required at v67, not optional","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ASA channel deployed but ","type":"text"},{"text":"SessionHandlerId","type":"text","marks":[{"type":"code_inline"}]},{"text":" is null after deploy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bot was not Active at deploy time — run ","type":"text"},{"text":"sf agent activate","type":"text","marks":[{"type":"code_inline"}]},{"text":", confirm ","type":"text"},{"text":"BotVersion.Status = Active","type":"text","marks":[{"type":"code_inline"}]},{"text":", then redeploy","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Only active Agentforce Service Agents are supported\" on deploy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bot is inactive — run ","type":"text"},{"text":"sf agent activate","type":"text","marks":[{"type":"code_inline"}]},{"text":" before deploying","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Flow or ASA routing fails without fallback queue","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" is mandatory when ","type":"text"},{"text":"sessionHandlerType","type":"text","marks":[{"type":"code_inline"}]},{"text":" is ","type":"text"},{"text":"Flow","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"AgentforceServiceAgent","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"JWT verification not working","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Connected app and certificate must be configured for the org","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Custom parameters not collected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"name","type":"text","marks":[{"type":"code_inline"}]},{"text":" must be unique per channel","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\u003ccustomParameters>","type":"text","marks":[{"type":"code_inline"}]},{"text":" deploy fails: \"bad value for restricted picklist field\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"parameterDataType","type":"text","marks":[{"type":"code_inline"}]},{"text":" was set to something other than ","type":"text"},{"text":"String","type":"text","marks":[{"type":"code_inline"}]},{"text":". Channel custom parameters are always ","type":"text"},{"text":"String","type":"text","marks":[{"type":"code_inline"}]},{"text":"; set the field's actual type (Number, Checkbox, dropdown) at the deployment level, not here","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Removing a custom parameter: \"can't be deleted as it is referenced elsewhere\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check before deploying, not after.","type":"text","marks":[{"type":"strong"}]},{"text":" Every deployment on this channel whose pre-chat form uses the param must first drop that field and be published (user-approved); remove the param's ","type":"text"},{"text":"actionParameterMappings","type":"text","marks":[{"type":"code_inline"}]},{"text":" in a separate deploy first. See ","type":"text"},{"text":"references/channel_settings.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" §Removing a Custom Parameter","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Automated response / session-inactivity deploy fails","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/channel_settings.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" → \"Automated Responses\", \"Session Settings\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Channel deployed but messages not routing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Channel must be activated after deployment — it defaults to inactive","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"You can't enable Session-Based Chat for verified users\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Set ","type":"text"},{"text":"isSynchronousChatEnabled","type":"text","marks":[{"type":"code_inline"}]},{"text":" to ","type":"text"},{"text":"false","type":"text","marks":[{"type":"code_inline"}]},{"text":" for Auth channels — session-based chat is only valid for UnAuth","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Verification Checklist","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Universal Checks","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Does the file name match ","type":"text"},{"text":"^[a-zA-Z][a-zA-Z0-9_]*$","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Is ","type":"text"},{"text":"masterLabel","type":"text","marks":[{"type":"code_inline"}]},{"text":" 40 characters or fewer?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Is ","type":"text"},{"text":"messagingChannelType","type":"text","marks":[{"type":"code_inline"}]},{"text":" set to ","type":"text"},{"text":"EmbeddedMessaging","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Routing Checks","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Is exactly one ","type":"text"},{"text":"sessionHandlerType","type":"text","marks":[{"type":"code_inline"}]},{"text":" value set (","type":"text"},{"text":"Queue","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"Flow","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"User","type":"text","marks":[{"type":"code_inline"}]},{"text":", or ","type":"text"},{"text":"AgentforceServiceAgent","type":"text","marks":[{"type":"code_inline"}]},{"text":")?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"For Queue routing: is ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" in the XML?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"For Flow routing: is ","type":"text"},{"text":"sessionHandlerFlow","type":"text","marks":[{"type":"code_inline"}]},{"text":" in the XML, plus ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" as fallback?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"For User routing: is ","type":"text"},{"text":"sessionHandlerUser","type":"text","marks":[{"type":"code_inline"}]},{"text":" in the XML, plus ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" as fallback?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"For ASA routing: are both ","type":"text"},{"text":"sessionHandlerQueue","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"sessionHandlerAsa","type":"text","marks":[{"type":"code_inline"}]},{"text":" in the XML?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"For ASA routing: was step 15a run? Are ","type":"text"},{"text":"SessionHandlerId","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":"FallbackQueueId","type":"text","marks":[{"type":"code_inline"}]},{"text":" non-null after the deploy?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Does the routing target reference an existing entity in the org?","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"User Verification Checks","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"If verification is enabled, is ","type":"text"},{"text":"embeddedConfig.authMode","type":"text","marks":[{"type":"code_inline"}]},{"text":" set to ","type":"text"},{"text":"Auth","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"If verification is disabled, is ","type":"text"},{"text":"embeddedConfig.authMode","type":"text","marks":[{"type":"code_inline"}]},{"text":" set to ","type":"text"},{"text":"UnAuth","type":"text","marks":[{"type":"code_inline"}]},{"text":"?","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Embedded Config Checks","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Is ","type":"text"},{"text":"chatAbandonmentTimeout","type":"text","marks":[{"type":"code_inline"}]},{"text":" a positive integer (minutes)?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Is ","type":"text"},{"text":"allowedFileTypes","type":"text","marks":[{"type":"code_inline"}]},{"text":" a comma-separated string with no spaces?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Is ","type":"text"},{"text":"maxFileSize","type":"text","marks":[{"type":"code_inline"}]},{"text":" a value between 1-5 MB?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"If UnAuth, is ","type":"text"},{"text":"anonymousUserJwtExpirationTime","type":"text","marks":[{"type":"code_inline"}]},{"text":" set (default 360, range 60-4320)?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"If Auth, is ","type":"text"},{"text":"verifiedUserJwtExpirationTime","type":"text","marks":[{"type":"code_inline"}]},{"text":" set (default 60, range 60-240)?","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Session Inactivity / Automated Response Checks (only if user requested)","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Checked against ","type":"text"},{"text":"references/channel_settings.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" (Session Settings, Automated Responses)?","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Keyword Checks","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Is there at least an ","type":"text"},{"text":"OptOut","type":"text","marks":[{"type":"code_inline"}]},{"text":" keyword type defined?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Are keywords individual ","type":"text"},{"text":"\u003ckeyword>","type":"text","marks":[{"type":"code_inline"}]},{"text":" elements (not comma-separated)?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Is ","type":"text"},{"text":"language","type":"text","marks":[{"type":"code_inline"}]},{"text":" set on each keyword block?","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Activation Checks","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Was the channel deployed successfully?","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Was the channel activated after deployment (","type":"text"},{"text":"IsActive=true","type":"text","marks":[{"type":"code_inline"}]},{"text":")?","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Expectations","type":"text"}]},{"type":"paragraph","content":[{"text":"Deliverables:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Messaging Channel metadata","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"\u003csource-path>/messagingChannels/\u003cChannelName>.messagingChannel-meta.xml","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"File structure follows the template in ","type":"text"},{"text":"assets/messaging_channel_template.xml","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Cross-Skill Integration","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Need","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Delegate to","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Creating the Omni-Channel Flow for routing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"automation-flow-generate","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Creating permission sets for messaging agents","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"platform-permission-set-generate","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Creating the Embedded Service Deployment","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"service-digital-engagement-deployment-configure","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Creating the ","type":"text"},{"text":"ConversationMessageDefinition","type":"text","marks":[{"type":"code_inline"}]},{"text":" an automated response references","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"conversation-message-definition-builder","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Reference File Index","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"When to read","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/onboarding_contract.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Delegated mode (","type":"text"},{"text":"context.calledFrom == \"service-onboarding\"","type":"text","marks":[{"type":"code_inline"}]},{"text":"), org writes (transport), module registration","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"assets/messaging_channel_template.xml","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Before generating — use as the starting structure","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/channel_settings.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"When configuring channel options beyond defaults","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/check-api-version.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Phase 1 — verify org API version meets the passed minimum (67.0)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"scripts/normalize-channel-name.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Phase 1 — derive file API name from channel label","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"examples/omni_flow_channel.xml","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"To verify output for Omni-Channel Flow routing","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"examples/omni_queue_channel.xml","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"To verify output for Omni-Channel Queue routing","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"examples/asa_agent_channel.xml","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"To verify output for Agentforce Service Agent routing","type":"text"}]}]}]}]}]},"metadata":{"date":"2026-11-02","name":"service-digital-engagement-channel-configure","author":"@skillopedia","source":{"stars":1139,"repo_name":"sf-skills","origin_url":"https://github.com/forcedotcom/sf-skills/blob/HEAD/skills/service-digital-engagement-channel-configure/SKILL.md","repo_owner":"forcedotcom","body_sha256":"60e15b6bb3e7998fc8c50813614989a0664bae9eb76aaef63ec31a2b95824500","cluster_key":"cb5a2ab0fa7cc022325eb30002987a9c259712f78d7c6f8298ef849d205c76a6","clean_bundle":{"format":"clean-skill-bundle-v1","source":"forcedotcom/sf-skills/skills/service-digital-engagement-channel-configure/SKILL.md","text_bytes":49835,"source_commit":"a8a18ce1e4ba12e69b4073eab98ce31bfbd8271e","skills_sh_rank":7562,"attachment_count":8,"text_attachments":8,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"skills/service-digital-engagement-channel-configure/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"integrations-apis","category_label":"Integrations"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"integrations-apis","metadata":{"domains":["Service"],"version":"1.0","cliTools":[{"tool":["sf"],"semver":">=2.0.0"},{"tool":["python3"],"semver":">=3.8"}],"minApiVersion":"67.0","relatedSkills":["automation-flow-generate","platform-permission-set-generate","service-agentforce-channel-configure","service-digital-engagement-deployment-configure"]},"import_tag":"skills-sh-top20k-2026-11","description":"Configures and deploys enhanced chat Messaging Channels for Messaging for In-App and Web (MIAW). Use when the user needs to create, deploy, and activate a messaging channel configured with Omni-Channel Flow, Omni-Channel Queue, User, or Agentforce Service Agent routing. Generates MessagingChannel metadata, deploys it to the target org, and activates the channel with User Verification, pre-chat forms, automated responses, consent settings, and all customizable channel options via Metadata API. TRIGGER when the user mentions messaging channel, MIAW, enhanced chat, in-app messaging, web messaging setup, or references a .messagingChannel-meta.xml file. DO NOT TRIGGER when the user is configuring legacy Live Agent chat, Embedded Service deployments without messaging, or standard Omni-Channel routing rules without a messaging channel."}},"renderedAt":1793672053572}

Configuring Enhanced Chat Channel Creates metadata XML for Salesforce Messaging for In-App and Web (MIAW). This skill produces a fully configured enhanced chat channel with routing, user verification, pre-chat, and automated response settings ready for Metadata API deployment. Scope - In scope : Creating metadata with Omni-Channel Flow routing, Omni-Channel Queue routing, or Agentforce Service Agent (ASA) routing; enabling User Verification; configuring all channel settings (pre-chat forms, automated responses, consent keywords, file attachments, custom parameters) - Out of scope : Creating t…