Skip to main content

FAQ

Quick answers to the most common questions about InAppStory, grouped the same way as the rest of this glossarium - follow the "More" links for the full article on each topic.

Getting started

Documentation?

Are there any tools to help with integration?

There is an integration checklist that will help you quickly find the relevant sections of the documentation for integrating a particular feature, as well as indicate which aspects of the integration are essential for stable operation. The checklist also includes items for verifying that the integration is correct.

Find the checklist here.

Additionaly we have skills for coding agents that can help headstart the integration. It lets you quickly build features and flag potential pitfalls right in the middle of the integration process.

Once installed, simply prompt your AI agent about any InAppStory SDK integration task — the relevant skill triggers automatically:

"How do I set up onboarding stories in InAppStory on iOS?"

"Show me how to pass custom user tags to the Android IAS SDK."

"How do I implement custom Story feeds in React Native?"

You can find the skills and detailed instructions on how to use them here.

How much does the SDK weigh?

PlatformSize
Android3 MB clean; ~1.5 MB if RecyclerView/WebKit are already present
iOS2.8 MB

Basic features

What is a userID?

The ID the app passes to the SDK, used to track per-user story stats (seen/opened/reacted). Must be a string ≤ 255 characters - never personal data (email, phone, document number).

More: User ID · Android · iOS · JS · Flutter

How to pass the content language to the SDK?

Pass it via the lang parameter when initializing the SDK (a locale/language code, e.g. en-US); Flutter uses locale instead.

More: Language · Android · iOS · JS · React · React Native · Flutter

How does sharing work?

  1. Developers host a page with our SDK, installed. e.g. https://example.com/story/*. This page invokes the story for the visiting user.
  2. Manager enables sharing in project settings with that address: https://example.com/story/{story}.
  3. Sharing is enabled in app code: Android · iOS · JS · Flutter
  4. A share button appears on the story panel; tapping it shares https://example.com/story/{story}.

More: Story Sharing

How to set up onboardings?

See Onboardings.

How to enable likes/dislikes or favorites?

Enable in console (Settings -> General -> Extended features for reactions, Settings -> Share for favorites), then enable in the SDK init code.

More: Reactions

Additional features

How do promo codes work?

  1. Manager creates a promo code in "Settings" -> "Promo codes" and uploads a .csv list (one code per line; re-uploading appends).
  2. Editor adds a "Copy" widget to the story, type "Promo code", and picks the code group.

Each viewer gets a unique unused code; a message is shown once codes run out. Track usage on the same "Promo codes" page. Alerts fire in "News" -> "Important" when under 10% of codes remain, and again when they run out.

Can sound be turned on by default?

Android · iOS · Flutter

Integration

How to open a specific app screen from a story?

Override the default link handling behaviour. See Navigation from stories.

Can a story be opened from a push notification?

Yes - put the story ID in the push payload, then call showStory() / showSingle() from your push handler.

More: Opening a single story

How does the "Goods" widget work?

Editor adds a "Goods" widget with a list of SKUs. On swipe-up, the SDK passes those SKUs to the app, which must return product data per the protocol.

More: Widget "Goods"

How to hide the story feed if there's no content?

Uses the same load callback as the List Placeholder guides - just toggle the feed's own visibility instead of (or alongside) a placeholder's.

iOS: create the feed → set its delegate → call create() → on storiesDidUpdated, hide/remove the feed if isContent == false. See List Placeholder (iOS).

Android: see List Placeholder (Android) for the full callback setup.

storiesList.setCallback(object : ListCallbackAdapter() {
override fun storiesLoaded(count: Int, feed: String?) {
storiesList.visibility = if (count == 0) View.GONE else View.VISIBLE
shimmerView.visibility = View.GONE
}

override fun loadError(feed: String?) {
storiesList.visibility = View.GONE
shimmerView.visibility = View.GONE
}
})

Flutter: FeedStoriesWidget exposes the same storiesLoaded(size, feed) callback - hide the widget when size == 0.

JS: the startLoad/endLoad events on StoriesList toggle the feed's visibility around the load itself (not specifically an empty-feed check, but the same mechanism).

Statistics

How to subscribe to SDK events / widget answers?

What does "Average view percentage" mean?

33.3% (1/3) = on average each user watches 1 of 3 slides.

What do the numbers mean?

MetricMeaning
ImpressionUsers saw the story (incl. previews)
OpenUsers opened the story
ReadUsers saw all slides
ClickUsers followed a link/button
CTRImpressions → Opens conversion
Read Conversion RateOpens → Reads conversion
Transition Conversion RateOpens → Clicks conversion

More: Definitions for statistics

What does "uniqueness" mean?

Data is aggregated 3 ways. Example: a user opens a story 5× today and 2× more 24h later:

TypeResult
By day2 opens (first open per day counts)
All time1 open (first open ever counts)
Non-unique7 opens (every open counts)

What is "Activity"?

Tracks user engagement and its trend over Day / Month (30d) / Quarter (120d) / Half-year (280d) / Year (365d):

  • Opened / Didn't open at least one story
  • Read at least one story
  • Liked / Disliked at least one story
  • Added to favorites
  • Shared

Targeting

What is a segment?

A named part of your audience, created in the console from an uploaded .csv list of user IDs, then targeted by name in a story's targeting settings.

More: Targeting with segments

What are tags?

A named user group (e.g. subscriber, vip) created in the console and assigned to stories via targeting. The partner's app/backend decides which tags apply to each user and passes them to the SDK.

More: Targeting with tags

Is content localization possible?

Yes - via tags: create one tag per language (RU, EN, DE), create a per-language copy of the story tagged accordingly, and have the app pass the current language tag when requesting the feed.

More: Targeting with tags

Personalization

How does personalization work?

Via placeholders: editor creates one in the console (e.g. username) → uses it in story text as Hello, %username%! → the app passes a value (username=Alex) to the SDK → user sees Hello, Alex!.

More: Personalization with placeholders · JS · Flutter: setPlaceholders(Map<String, String>)

Appearance

How to change a widget's appearance?

Refer to console docs for more information about each widget's specific settings. Color schemes are customizable, with several presets per widget. Custom color schemes are available as a paid add-on.

How to customize the story cell?

Configured in app code during SDK integration. See How to change widget design.

How to remove the gradient?

How to add a skeleton animation?

Show a placeholder view in place of the feed while it loads, then swap it for the real feed once the load callback fires.

Android · iOS · JS (startLoad/endLoad events) · Flutter (loaderBuilder on FeedStoriesWidget)

More: Skeleton animation (List Placeholder)

Console

What roles exist?

RoleAccess
ManagerFull project rights
EditorEdit & publish all content; no project settings
CopywriterCreate content only; sees only their own; can't publish
AnalystStatistics only, no content creation/publishing
DeveloperDocumentation and Integration section (auth keys)

Can I track changes in story status?

Yes - via a webhook with "Stories status change" target. See Webhooks.