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?
- Example apps: iOS, Android
- Integration keys: console "Integration" section
- Invite teammates: "Settings" -> "Team"
- Console guides: console.inappstory.com/docs
- Integration checklist
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?
| Platform | Size |
|---|---|
| Android | 3 MB clean; ~1.5 MB if RecyclerView/WebKit are already present |
| iOS | 2.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?
- Developers host a page with our SDK, installed. e.g.
https://example.com/story/*. This page invokes the story for the visiting user. - Manager enables sharing in project settings with that address:
https://example.com/story/{story}. - Sharing is enabled in app code: Android · iOS · JS · Flutter
- 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?
- Manager creates a promo code in "Settings" -> "Promo codes" and uploads a
.csvlist (one code per line; re-uploading appends). - 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?
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?
- Lifecycle & analytics events: Gathering Statistics - In-app events
- Widget interaction payloads: Stories Widget Events
What does "Average view percentage" mean?
33.3% (1/3) = on average each user watches 1 of 3 slides.
What do the numbers mean?
| Metric | Meaning |
|---|---|
| Impression | Users saw the story (incl. previews) |
| Open | Users opened the story |
| Read | Users saw all slides |
| Click | Users followed a link/button |
| CTR | Impressions → Opens conversion |
| Read Conversion Rate | Opens → Reads conversion |
| Transition Conversion Rate | Opens → 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:
| Type | Result |
|---|---|
| By day | 2 opens (first open per day counts) |
| All time | 1 open (first open ever counts) |
| Non-unique | 7 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?
| Role | Access |
|---|---|
| Manager | Full project rights |
| Editor | Edit & publish all content; no project settings |
| Copywriter | Create content only; sees only their own; can't publish |
| Analyst | Statistics only, no content creation/publishing |
| Developer | Documentation and Integration section (auth keys) |
Can I track changes in story status?
Yes - via a webhook with "Stories status change" target. See Webhooks.