Migrate from the Developer Preview API

UI Embedding was first released as a Developer Preview. The generally available version changes the host element, how you pass the app URL, and how the host communicates with the embedded app. If you built an embedding against the Developer Preview, use this guide to move to the generally available component.

The Developer Preview and generally available APIs aren’t compatible. An app built for one doesn’t run under the other without the changes described here.

Important

What Changed 

AreaDeveloper PreviewGenerally Available
Host element<lwc-shell><lightning-ui-embedding>
App URLSet through the shell’s configurationsrc attribute (required, read once at mount)
Host-to-app communicationImperative bridge objectDOM events on the host element and the sf-embedding protocol channel
Lifecycle signalsbridge callbackssf-embedding.component.ready and sf-embedding.component.error DOM events

Update the Host Element 

Replace the Developer Preview host element with lightning-ui-embedding, and move the app URL to the src attribute.

Before (Developer Preview):

1<template>
2  <lwc-shell></lwc-shell>
3</template>

After (generally available):

1<template>
2  <lightning-ui-embedding src="{appUrl}"></lightning-ui-embedding>
3</template>

The src attribute is required and binds the session to a specific app. Salesforce reads it once when the component mounts. Don’t change src, sandbox, or removeSandboxTokens after the component renders. The host rejects a mid-session change with a SESSION_BINDING_MUTATED error.

Replace the Imperative Bridge with DOM Events 

The Developer Preview exposed an imperative bridge object for communication. The generally available version uses DOM events on the host element for lifecycle signals.

Listen for these events on lightning-ui-embedding:

  • sf-embedding.component.ready fires when the embedded app finishes the handshake and is ready.
  • sf-embedding.component.error fires when embedding fails. The event detail includes the phase (configuration or bootstrap), a code, a message, and a retryable flag. See UI Embedding Error Codes.

These event names contain dots, so you can’t bind them declaratively with on* attributes in the template. Add lwc:ref to the embedding element and attach the listeners imperatively in renderedCallback.

1<!-- myEmbeddedApp.html -->
2<template>
3  <lightning-ui-embedding src="{appUrl}" lwc:ref="embedding"></lightning-ui-embedding>
4</template>
1// myEmbeddedApp.js
2import { LightningElement } from "lwc";
3
4export default class MyEmbeddedApp extends LightningElement {
5  appUrl = "https://app.example.com";
6  hasWiredEvents = false;
7
8  renderedCallback() {
9    if (this.hasWiredEvents) {
10      return;
11    }
12    this.hasWiredEvents = true;
13
14    const el = this.refs.embedding;
15    el.addEventListener("sf-embedding.component.ready", this.handleReady);
16    el.addEventListener("sf-embedding.component.error", this.handleError);
17  }
18
19  handleReady = () => {
20    // The embedded app is ready.
21  };
22
23  handleError = (event) => {
24    const { code, message } = event.detail;
25    // Handle the failure.
26  };
27}

Update Data Exchange, Styling, and Resizing 

In the generally available version, the page and the embedded app exchange state through the embedding’s typed channel rather than the Developer Preview bridge. Review these tasks for the current approach:

Next Steps