> For the complete documentation index, see [llms.txt](https://user.netmera.com/netmera-user-guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://user.netmera.com/netmera-user-guide/omnichannel-engagement/app-stories.md).

# App stories

Build the story area in your app once, then create, update, and rotate every story from Netmera widgets without releasing a new app version.

App stories bring the familiar story format, a row of tappable, visual content cards, into your mobile app and put its content under your control in the Netmera Panel. Your development team builds the story area once. Each story is a Netmera widget, so marketing and CRM teams can launch, refresh, and rotate stories on their own schedule, independent of app releases.

Use app stories for campaign launches, new product highlights, onboarding tips, seasonal offers, and any message that works best as a short, visual, swipeable experience.

<figure><img src="https://1642824329-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FX6uilbEAw42gqsudlclY%2Fuploads%2FEiFEMspj8g2fODTaBn3N%2Fapp-stories-overview.png?alt=media&amp;token=3b5fb3a7-9699-4fee-b27a-5f021cec6e52" alt=""><figcaption></figcaption></figure>

### How it works

App stories combine an interface your app owns with content Netmera serves.

<table><thead><tr><th width="180">Layer</th><th width="200">Owner</th><th>Responsibility</th></tr></thead><tbody><tr><td><strong>Story area</strong></td><td>App development team</td><td>Builds the story interface in the app and calls the Netmera SDK method that displays widget content.</td></tr><tr><td><strong>Story content</strong></td><td>Marketing or CRM team</td><td>Designs each story as a widget in the Netmera Panel and keeps its content up to date.</td></tr></tbody></table>

When a user opens a story, the SDK loads the widget linked to that story and displays it in the story area. Because the content lives in Netmera, every content change reaches the app without a new version in the App Store or Google Play.

### Set up app stories

{% stepper %}
{% step %}

#### Implement the SDK method

Your development team adds the SDK method that displays a widget by its URL. Use the method that matches your app's platform.

<table><thead><tr><th width="200">Platform</th><th width="300">Method</th><th>Available from</th></tr></thead><tbody><tr><td><strong>Native iOS (Swift)</strong></td><td><code>Netmera.displayContent(forWidgetURL:)</code></td><td>iOS Swift SDK v4.20.0</td></tr><tr><td><strong>Native Android</strong></td><td><code>Netmera.displayWidget</code></td><td>Android SDK v4.16.0</td></tr><tr><td><strong>React Native</strong></td><td><code>Netmera.displayWidgetContent</code></td><td>React Native SDK v2.3.0</td></tr></tbody></table>

{% tabs %}
{% tab title="Native iOS (Swift)" %}
Display the widget with the SDK's built-in presentation:

```swift
guard let url = URL(string: widgetUrlString) else { return }
Netmera.displayContent(forWidgetURL: url)
```

To render the widget inside your own story container, pass the app's `WKWebView`. Close the container in the `onCloseRequested` closure, which runs when the widget asks to close or opens a link or deeplink:

```swift
Netmera.displayContent(forWidgetURL: url, in: webView) { [weak self] in
    self?.dismiss(animated: true)
}
```

For details, see [Display a widget by URL](https://user.netmera.com/netmera-developer-guide/platforms/ios/new-ios-swift/push-notifications/widget-and-in-app-messages#display-a-widget-by-url).
{% endtab %}

{% tab title="Native Android" %}
Display the widget with the SDK's built-in presentation:

```kotlin
Netmera.displayWidget(url)
```

To render the widget inside your own story container, pass the app's `WebView`:

```kotlin
val webView = findViewById<WebView>(R.id.web_view)
Netmera.displayWidget(url, webView, object : NetmeraWebViewCallback {
    override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean = false
    override fun onPageLoaded(view: WebView, url: String) {}
    override fun onPageCommitVisible(view: WebView, url: String) {}
})
```

For details, see the [Android SDK changelog](https://user.netmera.com/netmera-developer-guide/platforms/android/changelog#v4.16.0).
{% endtab %}

{% tab title="React Native" %}
Display the widget with the SDK's built-in presentation:

```javascript
Netmera.displayWidgetContent('https://...');
```

For details, see [Display widget by URL](https://user.netmera.com/netmera-developer-guide/platforms/react-native/push-notifications/widget-and-in-app-messages#display-widget-by-url).
{% endtab %}
{% endtabs %}
{% endstep %}

{% step %}

#### Create a widget for each story

In the Netmera Panel, create a separate widget for every story you want to show. Design each widget for the size and orientation of the story area in your app, and preview it on mobile before saving.

Reflect the story order and topic in the widget name. A consistent naming pattern makes the stories easy to find on the [Widgets dashboard](/netmera-user-guide/omnichannel-engagement/widgets/build-a-widget/widgets-dashboard.md) and easy to map in the next step. For example:

* App Story – 1. Story – Summer campaign
* App Story – 2. Story – New arrivals
* App Story – 3. Story – Loyalty program

For layout and content options, see [Design widget layout](/netmera-user-guide/omnichannel-engagement/widgets/build-a-widget/design-widget-layout.md) and [Widget elements reference](/netmera-user-guide/omnichannel-engagement/widgets/build-a-widget/widget-elements-reference.md). To add buttons, deeplinks, or follow-up actions inside a story, see [Configure widget actions and validation](/netmera-user-guide/omnichannel-engagement/widgets/build-a-widget/configure-widget-actions-and-validation.md).
{% endstep %}

{% step %}

#### Connect each widget to a story in the app

Collect the URL of each story widget and share it with your development team:

1. Open the [Widgets dashboard](/netmera-user-guide/omnichannel-engagement/widgets/build-a-widget/widgets-dashboard.md).
2. Find the story widget with **Search**.
3. Open the widget's actions menu and select **Copy link**.

The development team passes each URL to the SDK method for the matching story position. This mapping is done once. After that, the story area is connected to its Netmera widgets.

<table><thead><tr><th width="160">Story position</th><th width="280">Widget</th><th>Passed to the SDK method</th></tr></thead><tbody><tr><td>1</td><td>App Story – 1. Story</td><td>URL of the first story widget</td></tr><tr><td>2</td><td>App Story – 2. Story</td><td>URL of the second story widget</td></tr><tr><td>3</td><td>App Story – 3. Story</td><td>URL of the third story widget</td></tr></tbody></table>

{% hint style="warning" %}
The mapping defines how many stories the app shows. Content changes never need a release, but adding a new story position does, unless your development team loads the widget URLs from a remote source.
{% endhint %}
{% endstep %}

{% step %}

#### Manage stories from Netmera

Once the mapping is in place, you run the story area from the Netmera Panel. Open the widget linked to a story, update its content, and save it. The updated story reaches users the next time they open it.

To replace a story with a new campaign, edit the widget that is already mapped to that position. **Duplicate** creates a new widget with a new URL, which the app is not connected to. Use duplicates to keep a copy of a previous story, not to publish the next one.
{% endstep %}
{% endstepper %}

### Measure story performance

Story widgets use Netmera's widget analytics, so you can see how each story performs and which content drives action. Review impressions and interactions in [Analyze widget performance](/netmera-user-guide/omnichannel-engagement/widgets/measure-performance/analyze-widget-performance.md). To track story-specific interactions, such as a product tap inside a story, see [Track custom widget events](/netmera-user-guide/omnichannel-engagement/widgets/measure-performance/track-custom-widget-events.md).

### Why manage stories with Netmera

<table><thead><tr><th width="220">Benefit</th><th>What it means for your team</th></tr></thead><tbody><tr><td><strong>Release-independent content</strong></td><td>Story content is not tied to app versions or release operations. Marketing teams publish on the campaign calendar, not the release calendar.</td></tr><tr><td><strong>Instant updates</strong></td><td>Changes to a story widget reach the stories in the app as soon as the widget is saved.</td></tr><tr><td><strong>Performance insight</strong></td><td>Netmera analytics shows how each story performs, so the strongest content can stay in the strip and weaker stories can be replaced quickly.</td></tr><tr><td><strong>One design toolset</strong></td><td>Stories use the same widget editor, elements, and actions as other Netmera widgets.</td></tr></tbody></table>

### Related pages

* [Widgets](/netmera-user-guide/omnichannel-engagement/widgets.md)
* [Build a widget](/netmera-user-guide/omnichannel-engagement/widgets/build-a-widget.md)
* [Analyze widget performance](/netmera-user-guide/omnichannel-engagement/widgets/measure-performance/analyze-widget-performance.md)
* [Netmera developer guide](https://user.netmera.com/netmera-developer-guide)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://user.netmera.com/netmera-user-guide/omnichannel-engagement/app-stories.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
