# Changelog
Source: https://docs.sprig.com/changelog
# New: Backward navigation for link Surveys
*by Laura Desmond-Black*
We’re happy to share that it is now possible to add a back button to Surveys. Once enabled, it lets respondents taking a Survey navigate back to previous questions and change their answers.
The back button is easy to use: previous answers are preserved as respondents move backward so that once they begin moving forward again they don’t have to re-enter everything. If changing an earlier answer impacts the logic of the survey or future questions, once the respondent begins moving forward, they’ll proceed through the new path smoothly. Dynamic questions or content, like AI Follow-ups and Response Piping, will pick up the new responses and re-generate appropriately.
Ready to add a back button to your Survey? Follow these steps:
* Create or locate an existing Survey
* Open it in edit mode and switch to the **Settings** tab
* Scroll to the **Survey Navigation** section and enable the **Allow backward navigation** toggle
Once the setting is one, the back button will appear in the preview, aligned to the left edge of the content. Respondents can go back through most question types, including Conjoint and MaxDiff.
Want to learn more? Check out [the documentation](https://docs.sprig.com/docs/shared-study-foundations/main-tasks/backward-navigation).
For those of you wondering if this setting will be added to In-Product Surveys, we’re happy to confirm that the answer is yes; it will be coming in October!
# Updated: Link behavior for mobile In-Product Surveys
*by Laura Desmond-Black*
Tapping a link in a Text / URL Prompt question in an In-Product Survey used to send respondents to their phone's default browser, taking them out of your app. That made it easy to lose someone before they finished the study, or for them to get distracted and never come back.
Now, Text/URL Prompt questions in mobile In-Product Surveys can open the browser in the app, making it easy for respondents to get back to what they were doing before taking the survey. This new option lives on the **Settings** tab of the survey when at least one Text/URL Prompt question is present and the platform is set to mobile. In addition to keeping people in their flow, the in-app browser view follows your light and dark theme settings, ensuring the experience feels cohesive no matter your settings.
In-Product Surveys in a draft state at the time of this release or created after this release will be set to have links open in-app by default. In-Product Surveys that were In-Progress or Paused at the time of this release will have the setting for the old link-out behavior on, however they can be switched to the new option at any time. The iOS and Android SDKs with this improvement are already out, updated React Native and Flutter SDKs are coming soon.
Check out [the documentation](https://docs.sprig.com/docs/shared-study-foundations/main-tasks/questions#link-behavior-on-mobile) to learn more!
# New: Images in Response Options
*by Paresh Vakhariya*
*Add images to multiple choice answers*
Attach an image to each answer choice in Single Select and Multi Select questions. Respondents pick between designs, layouts, or products by tapping image cards instead of reading descriptions of them.
* Still a multiple choice question underneath, so skip logic, randomization, and AI Follow-ups work unchanged
* Results show image thumbnails on the Responses page and Data tab, with one-click expand to full size
* Upload JPEG, PNG, or WebP, up to 10MB per option
* If an image ever fails to load, the option falls back to a text row and responses keep collecting
Available on all plans for Surveys. Requires SDK update.
Read the documentation for more details
# New: Carry Forward Logic
*by Laura Desmond-Black*
Ever ask respondents to select which brands or features they use, then want to dig deeper into just the options they selected in the following questions? Carry Forward makes this easy by letting you take a respondent's answers from one question and automatically pull them into a later one, so they're choosing from their own choices instead of starting over. This keeps surveys more relevant and simplifies the survey-taking experience ensuring you get the best, and most, data possible.
What’s available:
* **Source questions:** Multi-Select and Matrix questions
* **Destination questions:** Multiple Choice (single- and multi-select), Rank Order, and Matrix questions
To use Carry Forward options, click the arrow next to the “Add Choice” menu at the bottom of a supported question type, select “**Carry forward responses**” and then select a prior question to pull from. Carry Forward works with Skip Logic, Display Logic, and even Randomization (Sprig ensures the source question always comes before the destination).
Now available for customers on the Enterprise plan. [Learn more](https://docs.sprig.com/docs/sprig-studies/surveys/carry-forward-functionality#carry-forward-functionality) and give it a try in your next Survey, In-Product Survey, or Feedback study!
# Updated: Dark mode for web and mobile In-Product Surveys
*by Laura Desmond-Black*
We’re happy to share that while it’s been possible to add custom dark mode styling to In-Product Surveys for a while, there’s now a default dark theme for teams who want a faster solution.
Previously, if you wanted to display In-Product Surveys with a dark theme, you had to build the CSS yourself. With today’s release, in **Settings** > **Surveys** > **Look & Feel**, there is now a toggle in the **Study Style** section to **Enable Default Dark Mode CSS**. Once on (don’t forget to Save!), the new built-in dark theme will automatically show if a user has their device set to dark mode. Enabling this setting will also reveal a toggle in the Study Builder preview that allows you to switch between light and dark themes so you can easily see how a survey looks in either theme. Note: this setting will result in the preview reacting to your computer’s own setting which means it might be in dark mode before you even try the toggle!
Once enabled, the built-in dark theme will apply to all web and mobile In-Product Surveys, as well as Feedback studies.
Ready to customize Sprig’s default dark theme to match your app’s look? Take a look at [the updated documentation](https://docs.sprig.com/docs/developer-center/styling/dark-mode) to get started today!
# New: Send Sprig Data/Responses/Reports to AI Tools
*by Paresh Vakhariya*
*Send your Sprig data to ChatGPT, Claude, or Cursor in one click*
Send to AI Tools adds a button on study Data, Responses, and AI Study Reports that opens the content in the AI tool of your choice, pre-loaded as a prompt. No more screenshotting charts, exporting CSVs, or pasting responses block by block.
* Runs on the Sprig MCP connector: sign in with your Sprig account once per tool, then every send is one click. The connection is read-only
* You can pull Sprig data: compare studies, fetch more responses, trend a metric
* Admins control Sprig MCP connections for your Sprig account
Available on all Enterprise plans. Read the details in the docs.
# New: Validated Text Questions
*by Laura Desmond-Black*
Collect text responses that are ready to use the moment they arrive. With the new Validated Text question type, a respondent's answer is checked against a required format before they can proceed, so you spend less time cleaning up phone numbers with missing zip codes or numbers that accidentally gained a letter
Choose from built-in formats for email addresses, phone numbers, URLs, and numeric entries, or define your own format with a custom regular expression. If a response doesn't match, respondents see an error message explaining what to fix, and that message can be customized and translated like other study copy.
Validated Text questions work for both required and optional questions. When optional, respondents can leave the question blank, but any text they do enter must pass validation.
Available now for all customers and all study types that support questions. Check out [the documentation](https://docs.sprig.com/docs/shared-study-foundations/main-tasks/questions#validated-text) to learn more and use it in your next survey!
# New: Exclude Responses from Analysis
*by Laura Desmond-Black*
Have a response that isn’t useful? Now you can easily exclude it from the in-app analysis.
To take advantage of this new option, navigate to the **Responses** tab of a survey, locate the response you want to exclude, and click the `…` menu in the upper right corner of the response. You’ll see a new “**Exclude from analysis**” option in the dropdown menu. Select it to hide the response from question summaries on the Data tab of the survey and the AI Study Report.
Once it’s hidden you’ll see an indicator on the response so it’s easy to tell what's happened with it. You can undo the exclusion if needed by heading back to the same menu. Enjoy cleaner data, with less effort.
# New: Email distribution from Sprig
*by Laura Desmond-Black*
Get your survey in front of the right people without spinning up a separate email tool. With Sprig's email distribution functionality, you can send your survey to a list of contacts using your own domain, customize the email's content, and review open rates.
Sprig's email distribution supports the needs of enterprises by allowing you to:
* Upload a Contact List once and reuse it across future Email Runs and Surveys.
* Personalize the email message with recipient data uploaded through the CSV, insert your survey link in one click, and take branding to the next level with a full HTML editor.
* Meet unsubscribe requirements with automatically included unsubscribe links that route recipients to a branded page.
* Schedule emails to go out on survey launch or at a later time. Add additional Email Runs to the same survey at any time, each tracked separately for sends, opens, and response rates.
Available now for use with link Surveys and customers on the Enterprise plan. [Learn more](https://docs.sprig.com/docs/sprig-studies/surveys/delivering-surveys-by-email) or reach out to your Customer Success Manager to get started!
# New: Conjoint questions for Surveys
*by Laura Desmond-Black*
Want to know what your users would actually choose, not just what they say they prefer? Now you can find out quickly with Sprig's new [Conjoint question](https://docs.sprig.com/docs/shared-study-foundations/main-tasks/questions#conjoint). Show respondents realistic combinations of features and ask them to pick one, just like a real purchase decision, so you can understand the components of the package that matter most.
Use Conjoint questions for pricing and packaging research, understanding willingness to pay, and estimating relative feature importance.
With Sprig's Conjoint you can:
* Build your own experiment: define features and levels, choose how many options appear per task and how many tasks each respondent will complete.
* Optionally randomize the order of features across respondents to avoid bias.
* Exclude unrealistic combinations with Exclusion Groups, and optionally add a “None of these” choice for more realistic results.
Results are summarized for quick scanning, broken out by feature and level. Alternatively, export full response-level data as a CSV for deeper analysis or send it over to your favorite LLM using [Sprig's MCP](https://docs.sprig.com/docs/native-ai/sprig-mcp).
Available now for Surveys and customers on the Enterprise plan.
# New: Sprig Panels
*by Laura Desmond-Black*
Need feedback from outside your existing user base?
With [Sprig Panels](https://docs.sprig.com/docs/sprig-studies/surveys/delivering-surveys-using-sprig-panels), you can recruit verified participants and deliver your survey to them without leaving Sprig. Reach fresh audiences for concept testing, brand perception research, and more, without over-surveying your own users.
Target exactly who you need with 300+ recruitment criteria, from location and job title to industry and income, with live audience size and cost estimates as you build.
Sprig calculates and handles incentive payouts automatically, so there’s no manual tracking or spreadsheets.
Run multiple panels on a single survey to reach different audience segments at once.
Available now for Surveys and customers on the Enterprise plan. Reach out to your Customer Success team to get started.
# AI File Upload: now with more survey options
*by Paresh Vakhariya*
The AI File Upload Builder now imports more question types, more study types, and more of your survey/display logic, so the draft Sprig builds matches your document even more closely. Upload a PDF or Word doc and get a launch-ready survey with skip logic, display logic, randomization, and required questions already in place.
## New
* **Voice and video questions.** Include voice or video questions in your document and Sprig builds them into the draft, ready for respondents to answer by speaking or on camera.
* **AI Dynamic Questions and AI Follow-Ups.** Specify either in your document and Sprig configures them during import, so your survey adapts in real time from the first launch.
* **Consent and legal questions.** Capture respondent consent or legal acknowledgment as part of your imported survey.
* **Display logic.** Add "DISPLAY LOGIC:" notes next to questions to show them only when a condition is met. Sprig brings the logic in exactly as written.
* **MQSP and IPS support.** Upload documents for Multi-Question Single Page studies and In-Product Surveys, not just standard Surveys. When your document explicitly specifies IPS, Sprig defaults to building an In-Product Survey.
## Improved
* **Rate every draft.** Use the new up/down vote buttons on file upload output to tell us how the draft turned out. Your feedback directly improves the builder.
* **Refreshed interface.** The builder now matches Sprig's new design system.
* **Easier review.** The Design Agent pane and survey editor scroll independently, and the pane auto-scrolls to reveal the latest Design Agent messages.
* **More accurate imports.** Upgraded the underlying model and refined the question and study schemas for cleaner, more reliable drafts.
## Fixed
* File caching that could serve an older version of your uploaded document
* "END" skip logic terminology not being picked up, leaving fields blank
* Question numbering off by one
* Single select questions incorrectly converting to text prompts
# New: AI Translations
*by Paresh Vakhariya*
Great news! Now, you can translate your entire survey with AI, every question, description, choice, and button label, in seconds.
No more exporting CSVs, routing files to translators, and waiting days to launch global research.
To use AI Translations, select **Add language** in the Language card of your study's Questions tab, choose your language(s), and select **Translate with AI**. Review and edit any translation inline, then set your language targeting and launch.
If you update your survey, regenerate translations anytime. Note that regenerating replaces all existing translations, including manual edits.
# New: Response-based Quotas for Surveys
*by Laura Desmond-Black*
Get exactly the responses you need by setting response-based quotas for Surveys.
Create up to three screener questions that can be used to define user segments that you want to collect data for. Set targets for each segment. Use quotas to filter the responses collected.
Check out [the documentation](https://docs.sprig.com/docs/sprig-studies/surveys/quotas-for-surveys) so you can use them in your next Survey!
# New: Add an image to a question
*by Laura Desmond-Black*
Great news! You can now add an image or gif to a question and easily test a new logo, name, or UI element.
It's easy to get started: look for the **Add Media** button near the "Required" toggle in the question header; it's available for most question types. Follow the file type and size requirements and preview and test the survey as usual. If you prefer not to use this, Admins can always disable it in Settings > Surveys > Configure. [Learn more](https://docs.sprig.com/docs/shared-study-foundations/main-tasks/add-an-image-to-question) to get started today!
Available for Surveys and In-Product Surveys on mobile and web.
Note: The Admin setting was initially off by default. This was changed to being on by default on July 10th.
# New: Hide custom branding on surveys
*by Laura Desmond-Black*
Now you can hide your logo and brand color when sharing a Survey. To turn off custom branding, navigate to the **Settings** tab within a Survey (make sure to be in Edit mode), scroll down to the **Survey Branding** section and select the **Hide Branding** option.
Available to customers on the Enterprise plan.
# New: Surveys have an updated look
*by Laura Desmond-Black*
Based on your feedback we’ve updated the respondent experience for Surveys to make it even easier to get rich, rapid responses with a beautiful, easy-to-read experience.
## What’s changed
* The forward button is now closer to questions and larger so it requires less mouse movement to access.
* Autofocus has been removed from pages with multiple questions so respondents can drive their own progress.
* Situations where there was both a forward button in the question and a page-level forward button have been eliminated.
* Text/URL questions in Surveys no longer have the “No button” option as it’s no longer necessary.
* The number of buttons that show on a page with multiple questions has been reduced; they’re still visible when AI Follow-up or AI Dynamic questions are present.
* The display of Matrix questions has been improved.
* They’ll now expand horizontally if there’s space - no more horizontal scrolling.
* If the viewport is too narrow, the question will automatically switch to an accordion layout.
# New: Create Surveys from your AI client with MCP
*by Paresh Vakhariya*
You can now create Sprig studies directly from Claude, ChatGPT, or any connected AI client using Sprig MCP. Describe your research goal in plain language and your AI client drafts the study, configures the questions, and them prompt it to save it to Sprig as a draft ready for your review.
Studies created via MCP are always saved as drafts first. Launching requires a manual action from you in the Sprig UI.
**Example prompts to get started:**
"Create a 5-question onboarding study to understand why users drop off before completing setup."
One a survey has been generated you can prompt it to create a study within Sprig.
See [Create a Sprig study from your AI client](https://sprig.mintlify.app/docs/native-ai/sprig-mcp-create-study) for setup instructions and prompt tips.
# New: AI Follow-ups for more Question Types
*by Paresh Vakhariya*
## What's new in this release
Add AI follow-up questions to
* Ratings (number, smiley, star)
* Multiple choice (single and multi-select)
* NPS
* Matrix, and
* Rank order questions so any of these can probe for the "why" behind a response, not just open text.
Also, you can now also run **skip logic** on a parent question while AI follow-up is enabled. Skip logic runs after the parent question: if a response matches a rule, the AI follow-up is skipped and the respondent routes to the designated question (or the survey ends). Previously you had to choose one or the other.
# Sprig MCP is now available
*by Paresh Vakhariya*
Connect your Sprig workspace to AI tools using the Model Context Protocol (MCP). Your studies, responses, segments, and Agent Context are now accessible as live context in Claude, Claude Code, ChatGPT, Cursor, Gemini CLI, GitHub Copilot, and more.
## What's new
**Sprig MCP server** Exposes your Sprig workspace data as callable tools via a standard MCP endpoint at `https://mcp.sprig.com/mcp`
Any MCP-compatible AI client can connect and query your data directly.
**3 tools available at launch**
| Tool | What it does |
| :- | :- |
| `Retrieve Surveys` | Returns all studies in your workspace |
| `Retrieve Responses` | Fetches responses for a given study |
| `Retrieve Themes` | retrieve themes, along with the responses that are associated with each theme |
**OAuth authorization** Connections use OAuth 2.0. No API keys to manage. Admins authorize once at the workspace level; members connect their individual accounts with a single click.
**Admin and member controls** Workspace admins connect Sprig for their org. Members authorize their own accounts independently. Access is scoped to each user's existing workspace permissions.
## Supported clients at launch
Anthropic: Claude, Claude Code, Claude Cowork
OpenAI: ChatGPT, Codex
Google: Gemini CLI
Microsoft: GitHub Copilot
Code editors: Cursor
## What you can do
Pull Sprig data directly into any connected AI client without exporting or copy/pasting:
* Summarize study results and surface top themes
* Compare responses across studies or time periods
* Analyze how responses differ across user segments
* Generate research summaries, readouts, and hypotheses
* Look up any study by name or ID
**MCP to MCP workflows** When Sprig and another tool are both connected to the same AI client, you can act on Sprig data in other systems automatically.
e.g. Create Linear or Jira tickets from feedback themes, write research summaries into Notion or Confluence, log NPS signals to HubSpot or Salesforce, and export responses to Google Sheets.
## How to connect
Go to **Settings → Agents → Sprig MCP** to get your MCP server URL and follow the setup steps for your AI client.
## New: AI Study Report
*by Laura Desmond-Black*
Use Sprig's Synthesize Agent to quickly go from raw responses to a structured report that can easily be edited, downloaded, or shared with team members. Spend less time on manual analysis and more time ensuring insights are able to influence critical decisions.
Influence the content of the AI Study Report by adding [Agent Context](/docs/native-ai/synthesize-agent/agent-context) to ensure the report accurately reflects your goals and the particular focus area for the study. Reports are generated based on the Agent Context, the study's raw responses, and AI Insights generated for the study.
Reports follow research best practices with an executive summary, and sections for key insights, strengths, and opportunities. Meaningful quotes from open text questions are included to add depth to findings.
Editors can generate reports for in-progress studies that have 10 or more responses, or completed studies.
AI Study Reports are available for customers on the Enterprise plan for Surveys, In-Product Surveys, and Feedback studies. [Learn more](/docs/native-ai/synthesize-agent/ai-study-reports) about generating a report for your next study!
**Note**: this feature is being released in stages so you may not see it yet. We expect rollout to be complete by early May.
## AI Dynamic Questions
*by Paresh Vakhariya*
**AI Dynamic Questions** Enterprise tier only
Surveys now adapt in real time. AI Dynamic Questions (utilizing the Field Agent) automatically generate relevant open text question based on what each respondents prior questions/responses
* Add an AI Dynamic Question anywhere in your study. You can also add a custom (optional) prompt to each question.
* AI reads all prior questions and responses, then generates a short, neutral follow-up using NLP signals like sentiment, intent, and keywords. If it can't generate safely or quickly, the question is skipped.
* Results appear in Reports alongside your standard responses.
* **Question styles:** Clarification · Depth · Context · Impact · Sentiment · Keyword
* **Safeguards:** Moderation filters block PII, bias, and unsafe content. Skip logic and quotas are always respected.
* **Available on:** In-product surveys, surveys, and feedback button: Enterprise plans only. No limit on the number of AI Dynamic Questions per study.
**What AI uses to generate questions**
* Team context (if available)
* Agent context pka Study Goals (if provided)
* All prior questions and responses
* Question prompt (if entered)
* NLP signals: intent, sentiment, topics, and entities
💡 Start with 1–2 AI Dynamic questions per survey to add depth without increasing respondent fatigue.
## Prototype Testing Enhancements
*by Laura Desmond-Black*
For those of you who use Sprig to test new ideas and concepts, we have two enhancements to share:
1. You can now include **published** Figma Make and Lovable prototypes in Surveys. Get feedback on these highly dynamic prototypes just like you can for more traditional prototypes by placing them within a broader survey that might include multiple ideas. [Learn more](/docs/sprig-studies/prototype-studies/index).
2. For those who share AI-generated prototypes directly with users, we've validated that you can install the Sprig SDK into the prototypes themselves so that Feedback studies or In-Product Surveys can be part of the experience. Results show in Sprig just like when you launch studies in your live apps. Now you no longer have to rely on manual, in-person, or ad-hoc processes to get feedback on these vibe-coded ideas. [Learn more](/docs/sprig-studies/prototype-studies/index#embed-sprig-in-product-surveys-within-ai-generated-prototypes).
Happy testing!
# AI Follow-up Question
*by Paresh Vakhariya*
AI Follow-Up automatically generates personalized, open-ended probes based on a respondent’s specific answer, capturing richer detail without manual programming.
## Key Features
* Supports Open Text questions; currently unavailable for Voice/Video. More question types to have AI Follow-up questions soon.
* Users must choose between AI Follow-Up or Skip Logic per question.
* Skips automatically if a relevant or safe question cannot be generated quickly.
## Why use AI follow-up questions?
* AI follow-up questions help turn vague feedback into specific, actionable insights by probing for clarity, examples, and root causes.
* They mimic a live interviewer at scale, improving response quality without adding researcher workload.
## How to Use
* Enable via the toggle in Study Setup for any Open Text question.
* Context used: Uses study goals, previous responses, and NLP signals (sentiment, intent) to tailor probes.
* Generates questions focused on clarification, impact, sentiment, or depth.
* Results: View both the AI-generated probe and the respondent’s answer in the Results tab.
## Best Practice
* Use 1–2 AI Follow-Up questions per survey to balance deeper insights with respondent experience.
# New: Display Logic
*by Laura Desmond-Black*
Display Logic is now available for Surveys, In-Product Surveys, and Feedback studies for customers on the Enterprise plan 🎉
Now you can easily configure questions to show when a respondent meets specific criteria based on their prior responses in the survey or user attributes you've stored in Sprig, like their plan or region. This allows you to ask customers a question with options that are relevant to them (Mets, Jets, or Nets for those in New York and Bears, Cubs, and Bulls for those in Chicago) which will lead to higher engagement and richer data.
Check out [the documentation](/docs/shared-study-foundations/main-tasks/survey-logic#display-logic) to learn more about setting up Display Logic.
# New: Attribute Piping
*by Laura Desmond-Black*
Generic questions are out; tailored experiences are in. Starting today, you can use the attribute data you already store in Sprig to customize your survey questions and descriptions in real-time.
**Why this is great:** more context for respondents means higher completion rates and higher quality responses. Instead of asking, "How much value do you feel like you're getting from your paid plan?" ask, "How much value do you feel like you're getting from your **Enterprise** plan, **Sarah**?"
**How it works:** Just like Response Piping, reference any attribute stored in Sprig directly within the question or description text.
**Availability:** Attribute Piping is available for customers on the Enterprise plan across In-Product Surveys, Surveys, and Feedback studies.
👉 [See how to set it up](/docs/shared-study-foundations/main-tasks/survey-logic#attribute-piping)
# Display Limits for Choice Randomization
*by Laura Desmond-Black*
With this release customers on the Enterprise plan gain an additional configuration option when randomizing the choices offered to respondents in Multiple Choice: Multi-Select and Matrix questions.
Now when setting choices to display in a randomized order in these questions there will be an option to limit the number of choices displayed. For example, if you have a list of 20 themes that you'd like respondents to select from but you don't want them to become overwhelmed with the full list, you can choose to limit the number of choices displayed to only 6 or 8.
See [our Help Center documentation](/docs/shared-study-foundations/main-tasks/survey-logic#randomize-the-order-of-response-options-in-questions) to learn more.
# Date filters for CSV Exports
*by Laura Desmond-Black*
Do you ever wish you could export survey response data for a specific timeframe?
Well, now you can! You can now choose a timeframe when requesting a CSV export so you can jump into analysis faster. Choose between preset or custom timeframes. If your survey has more responses than are supported for CSV exports (950,000) you can reduce the number of responses using the new filters and continue with your work. [Learn more.](/docs/shared-study-foundations/export-survey-data#/)
# New Question Type: MaxDiff
*by Laura Desmond-Black*
MaxDiff questions are here! 🎉 🥳
Gather detailed insights from respondents as you consider how to prioritize improvements or refine brand messaging with intuitive researcher and respondent experiences. Use the recommended setting to configure the question quickly or define your own experiment structure with the custom setting. Get a sense for how respondents feel about what you're asking them to rate using the built-in best-worst summary or download the CSV to run your own analysis. Check out [the documentation](/docs/shared-study-foundations/main-tasks/questions#maxdiff) to learn more.
# Conversational Surveys
*by Paresh Vakhariya*
We have introduced Conversational Surveys: a new, chat-style survey experience that makes responding feel more natural and engaging.
Instead of displaying multiple questions on a single page, Conversational Surveys present questions one at a time, creating a smooth, dialogue-like flow. Respondents interact as if they’re in a friendly conversation, leading to a more human, immersive, and enjoyable experience.
Check out [Conversational surveys](/docs/shared-study-foundations/main-tasks/conversational-surveys#/) to learn more about using this new functionality in your surveys!
# Validation for Multiple Choice Multi-Select questions
*by Laura Desmond-Black*
We've added new validation options for Multiple Choice Multi-Select questions so that you can capture exactly the data you need from respondents. There are now three settings for validating responses to these questions:
* Unlimited - Respondents can select as many choices from the list as they'd like.
* Maximum - Set an upper limit for how many choices respondents can select.
* Range - Set both lower and upper limits for how many choices respondents can select.
Check out [the documentation](/docs/shared-study-foundations/main-tasks/questions#response-validation-options) to learn more about using this new functionality in your surveys!
# Surveys are out of beta
*by Laura Desmond-Black*
We're pleased to announce that Surveys have reached general availability!
Over the course of the 3 month beta we added tons of new functionality including page-level Randomization, Rank Order questions, multiple questions per page, and Response Piping. We loved seeing how quickly you incorporated these new capabilities into your surveys and and appreciate all of the feedback you shared as you tested and launched surveys.
While the beta is over, we're just getting started--we have many releases planned for the next few months including:
* **Conversational Respondent UI**: A modern, chat-style survey experience that feels more human and drives better response rates. Choose when to deliver surveys in this format or the standard format with a per-study setting.
* **MaxDiff questions**: Quickly get detailed information about your users' preferences with an easily configurable question.
* **AI Study Builder:** Upload your research plan and generate a complete survey in moments.
Wondering what happens now that the beta is over? Starting November 1st, access to Surveys will be limited to 25 responses per month for customers who don't have Surveys in their contract. If you're interested in continuing to send Surveys, reach out to our [Sales team](https://sprig.com/sales-demos) or your Customer Success Manager!
# New: Response Piping
*by Laura Desmond-Black*
Response Piping is now available for In-Product Surveys, Surveys, and Feedback studies.
Now you can provide a highly-personalized experience for respondents and ensure they get the most relevant survey-taking experience possible, which will result in increased response rates and better response data for you.
Check out [the documentation](/docs/shared-study-foundations/main-tasks/survey-logic#response-piping) to learn more and include it in your next survey!
# Introducing: Rank Order Questions
*by Laura Desmond-Black*
Now available for In-Product and Surveys: Rank Order Questions 🎉
With this new question type, you can see exactly how your users rank multiple options. That clarity helps you make confident, data-driven decisions. No more guessing which features, messages, or experiences matter most.
Rank Order questions are available today in Surveys. To use them with In-Product surveys you'll need the latest version of the web SDK which was released yesterday. Native mobile SDKs will be available by the end of the week, and React Native and Segment.io SDKs will be available next week. Check the [Changelog](/docs/developer-center/sdk-changelog/index) for updates. Also available are [new CSS classes and styles](/docs/sprig-studies/in-product-surveys/microsurvey-look-and-feel) so Rank Order questions can match your brand.
Learn more about setting up Rank Order Questions in [Help Center](/docs/shared-study-foundations/main-tasks/questions#rank-order).
# Sprig Mobile Replays: Capture WKWebView views and SwiftUI text and images
*by Laura Desmond-Black*
Starting with iOS SDK version 4.24.7, you can opt-in to capturing WKWebView views as well as SwiftUI text and images so that more content from your app is visible in Replays. These options can be found in Settings > Replays > Configure > iOS.
These new settings give you the ability to capture more content from iOS apps while also respecting any selections you've made from the Basic, Moderate, and Strict privacy options.
# Randomization for pages and questions
*by Laura Desmond-Black*
We’ve added the ability to [randomize](/docs/shared-study-foundations/main-tasks/questions#randomization) pages and questions within Surveys. Now you can:
* Randomize all the pages and questions in a survey with one click (and undo it with one click too)
* Pin specific questions so they stay in place
* Easily see which questions are randomized or pinned with new indicators that show next to question and page titles
To try it, look for the new “Randomize” button in the Action Bar at the top of the Study Editor, it'll appear once the survey has at least one question.
We’ve also added this functionality to Feedback and In-Product Surveys–look for the same button in the Action Bar.
# Surveys: Beta now open
*by Laura Desmond-Black*
The beta for Long-From Surveys is now open to all customers on paid plans. From now until October 15, 2025 you can use Long-From Surveys, up to 2,500 responses/month, for free. Share longer surveys, with multiple questions per page with your user base wherever you can embed a link. Send personalized surveys in multiple languages, with logic that ensures respondents answer the right questions. Get insights quickly from Sprig AI, the same way you can for In-Product Surveys. Check out [the documentation](/docs/sprig-studies/long-form-surveys/index) to learn more.
# Easily Collaborate With Direct Response Sharing in Slack
*by Maha Chaudhry*
It’s now easier to share Sprig insights with your team. Slack notifications for new responses include direct links to specific feedback so you can quickly dive in. In the Sprig app, the Responses tab also features a new Share Response dropdown option, making it simple to send individual responses to your teammates. [Set up your Slack integration](https://app.sprig.com/integrations/collaboration/slack), or [try sharing a response today](https://app.sprig.com/studylist/all).
## Get More Actionable Themes With Improved Replays AI
*by Maha Chaudhry*
AI Analysis for Replays just got a powerful upgrade. Sprig AI now processes more clips more often and with greater accuracy. Your themes are now richer, more actionable, and always reflect the latest trends in your users' behavior. [Check out the improved AI themes in your Replays.](https://app.sprig.com/studylist/all)
## Detect Friction At Scale With Frustration Signals for Always-On Replays
*by Maha Chaudhry*
Frustration Signals are now in beta for Always-On Replays. Sprig automatically flags sessions with rage and dead clicks, making it easier to identify points of friction and take action to improve the user experience.
## Surface the Highest-Signal Sessions With Daily Clip Limits
*by Maha Chaudhry*
You can now set a daily cap on Always-On Replay clips by product and environment, giving you more control over volume and helping your team stay focused on the sessions that matter most. By reducing noise, you can more easily prioritize high-signal behavior and uncover actionable insights faster. [Head to the Configure tab within your Heatmaps & Replays settings to try it out.](https://app.sprig.com/settings/heatmaps-replays-configure)
## Reveal Friction Automatically with AI-Powered Always-On Replays
*by Maha Chaudhry*
Understand how users move through your product and spot friction faster with AI-Powered Always-On Replays. Sprig AI automatically recreates sessions, organizes behaviors into clear flows, and highlights key pain points. Plus, built-in advanced privacy controls make it easy to mask sensitive fields and customize exclusions. [Explore AI-Powered Always-On Replays by heading to the Behavior tab in your Sprig account.](https://app.sprig.com/behavior/pages) *(Requires Sprig SDK update)*
## Earn \$250 for Every Qualified Referral to Sprig
*by Maha Chaudhry*
[**Sprig’s Referral Program**](https://sprig.com/customer-referral-program?utm_source=new-in-sprig) makes it easy to share Sprig with your network—and get rewarded for it.
If you know someone who’d benefit from Sprig's product experience platform, [**refer them to our team**](https://sprig.com/customer-referral-program?utm_source=new-in-sprig). Whenever your referral leads to a qualified meeting, we’ll send you a \$250 gift card as a thank-you.
Here’s how it works:
1. **Submit a qualified referral**
* Your referral must meet all of the following:
* Role: UXR or Product Design, manager level+
* Company: 150+ employees, U.S.-based
* Budget: Can purchase Sprig Enterprise
* Sales status: Not in an active deal with Sprig
1. **Receive your bonus**
* Payout timing: After an annual contract is signed
* Bonus amount: \$250 via digital gift card
* Referral limit: Unlimited—get rewarded for each qualified referral
* Payout method: Sent via Sendoso
[**👉 Click here to refer a contact here**](https://sprig.com/customer-referral-program?utm_source=new-in-sprig)
## Uncover Friction Points with Frustration Signals in Sprig Replays
*by Maha Chaudhry*
Quickly spot friction points in your product with **frustration signals** in Sprig Replays. Now, Sprig can detect and highlight **dead clicks** (clicks that have no effect on a page) and **rage clicks** (multiple rapid clicks in one area) within a user's session. By surfacing these moments of user frustration, you can take immediate action to streamline workflows, reduce user pain points, and improve conversion rates. [Go to any Replay study and play back the session clips to see any frustration signals in your user's experience.](https://app.sprig.com/studylist/all)
## Unlock Continuous User Insights with Always-On Replays
*by Maha Chaudhry*
Get continuous, real-time insights into user behavior across your product with Always-On Replays. This feature (currently in beta) automatically reproduces user sessions across your product without any manual setup, enabling you to surface behavioral patterns and usability pain points passively. If you want to try Always-On Replays firsthand, [request access to our beta program today](https://a.sprig.com/U0pjVmZxLTdRUX5zaWQ6MzhiYjM0OGMtMWZjZC00Y2U4LWIwMzktYjFlNmQ0N2QzZDdl)! *(Sprig SDK update required)*
## Reproduce Users’ App Journey with Replays for Mobile
*by Maha Chaudhry*
Understand how users navigate your mobile app and uncover opportunities to improve the experience with Sprig Replays for iOS, Android, and React Native. Replays for Mobile lets you reproduce key moments from the user journey, helping you identify friction points, validate changes, and prioritize new features for your mobile experience. To try it out, [create a new Replay study and select Mobile App under Delivery Platform](https://app.sprig.com/create). *(Sprig SDK update required)*
# Account Passwords & Management
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/changing-account-passwords
## Password Requirements
Sprig passwords must meet the following requirements:
* Minimum length: 10 characters
* Must contain:
* At least one uppercase letter (A-Z)
* At least one lowercase letter (a-z)
* At least one number (0-9)
## Changing Passwords
To change the password to your Sprig account:
Click the account menu.
Click Log Out.
Click Forgot Password.
Type in your email.
Click Send password reset email.
Follow the instructions in the email you receive to reset your Sprig password.
Note: If you login to Sprig using the Sign in with Google option or the Sign in with SSO option, you will need to change your password with Google or the Identity Provider your company uses for Single Sign-On.
# Login & Provisioning
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/index
How to help your team sign up for Sprig
Sprig believes that product experience insights are the most powerful when an entire team is empowered to learn from them and take action. That's why we offer unlimited seats, so there are no additional costs to collaborate with your colleagues. Consider inviting team members to your Sprig account from Product, Design, User Research, and Engineering, as well as Marketing, Customer Success, Support, and Sales.
## Ways of adding users to Sprig:
You can add team members to Sprig:
* [manually](/docs/account-and-settings/account-and-login/manually-adding-users)
* through [domain-based team discovery](/docs/account-and-settings/account-and-login/team-discovery)
* or through [Single Sign-On](/docs/account-and-settings/account-and-login/sso-1/index)
## Ways of authenticating users in Sprig:
* Standard username and password (default)
* Authentication with your companies identity provider (IdP) through single-sign-on (SSO)
* [Auth0](/docs/account-and-settings/account-and-login/sso-1/auth0)
* [Google Workspace](/docs/account-and-settings/account-and-login/sso-1/google-workspace)
* [KeyCloak](/docs/account-and-settings/account-and-login/sso-1/keycloak)
* [Microsoft Entra ID](/docs/account-and-settings/account-and-login/sso-1/microsoft-entra-id)
* [Okta](/docs/account-and-settings/account-and-login/sso-1/okta)
* [OneLogin](/docs/account-and-settings/account-and-login/sso-1/onelogin)
# Manually Adding Users
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/manually-adding-users
To manually add a team member to Sprig:
1. Click [**Settings > Team**](http://app.sprig.com/settings/team), then click **+ Add Member**.
2. In the modal that opens, enter the team member's name, email address, and the [role](/docs/account-and-settings/team-management-roles/roles-permissions) you want them to have. Click Save.
Note: Users with the Admin role can add team members at any role level. Users with other roles can add team members at their role level or below.
## Activating your Account
The new member will receive a verification email from Sprig. In the verification email, they should click **Activate your account** to be redirected to Sprig, where they will set a password for their account.
If they do not receive an email, ask them to check their spam/junk folder. If they still can't locate the email, please contact [support@sprig.com](mailto:support@sprig.com).
In the verification email, new members should click **Activate your account** to be redirected to Sprig and set a password for their account.
# Auth0
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/sso-1/auth0
To enable SSO with Auth0, complete the following:
1. Contact [support@sprig.com](mailto:sso@sprig.com) to claim the email domain(s) that your SSO users will use to sign in.
2. Log into your Sprig account and navigate to **Settings >** [**Single Sign-On**](https://app.sprig.com/settings/sso).
3. Select the **SSO Enabled** option, and click **Save**.
4. An **Important Values** section should appear. Copy the value of the **Entity URI** field into the **Issuer URL** field in the **Your Identity Provider** section, and click **Save**. Take note of the Entity URI and the ACS URL values provided. You will use them to configure your Auth0 integration in later steps.
5. Log into your Auth0 admin account. Navigate to the Applications page and click "Create Application."
6. In the "Name" field, enter "Sprig" or whatever you would like the application to be called, select "Single Page Web Application and click Create.
7. Navigate to the Addons tab and click "SAML2 WEB APP."
8. On the Usage tab:
1. Copy the Issuer value and paste it into the Issuer URL field in the Sprig dashboard.
2. Copy the Identity Provider Login URL value and paste it into the Entry Point URL field in the Sprig dashboard.
9. Copy the ACS URL from the Sprig dashboard and paste it into the Application Callback URL field on the Settings tab in the Auth0 admin account.
10. In the Settings field, replace the default payload with the following, filling in the `recipient` and `destination` values with the ACS URL. At the bottom of the modal, click Enable.
```
{
"audience": "https://app.userleap.com/saml", // Entity URI
"recipient": "", // ACS URL
"destination": "", // ACS URL
"nameIdentifierProbes": [
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
],
"signatureAlgorithm": "rsa-sha256",
"mapUnknownClaimsAsIs": true,
"includeAnyClaimInAssertion": false,
"mappings": {
"name": "name"
}
}
```
11. Click on Settings > Advanced Settings > Certificates.
1. Copy the contents of the Signing Certificate, paste it into the X.509 Certificate field in the Sprig dashboard, and click Save.
12. At the top of the Application page, copy the Client ID. It will be used in step 14.
13. In the left-hand sidebar, click on Actions > Triggers > post-login > Create Action.
1. In the "Name" field, enter "Map SAML Attributes" or whatever you would like the action to be called.
2. Trigger should already be populated with "Login / Post Login."
3. For Runtime, choose "Node 22." Click Create.
14. In the new action, paste the following code into the code editor. Make sure to replace `CLIENT_ID` with the Client ID from step 12. Click Deploy.
```
exports.onExecutePostLogin = async (event, api) => {
if (event.client.client_id === 'CLIENT_ID') {
// Get name
const fullName = event.user.name || "";
// Get role from metadata
let userRole = (event.user.app_metadata && event.user.app_metadata.role)
? event.user.app_metadata.role
: 'viewer';
// Set name and role attributes to be mapped to Sprig
api.samlResponse.setAttribute('name', fullName);
api.samlResponse.setAttribute('role', userRole.toLowerCase());
}
};
```
15. Now that the SSO integration is set up, a `role` will need to be added to the profile of users who will use SSO to login to Sprig. If a role is not added to a user, it will default to `viewer` when they login for the first time. The available roles are `admin`, `developer`, `editor`, `editor-lite`, and `viewer`. For more information about the access permissions associated with each role, see our documentation on [Member Permissions](/docs/account-and-settings/team-management-roles/roles-permissions).
1. To add a role to a user, click on User Management > Users and click on a particular user. Under "App Metadata (app\_metadata)," enter the role as follows:
When using the Auth0 SSO integration, Sprig member permissions are controlled by Auth0. Any role changes will need to be made within the Auth0 admin account.
Users that are assigned to the Auth0 application integration will now be able to sign in using the Sprig [SSO login page](https://app.sprig.com/login/sso).
# Google Workspace
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/sso-1/google-workspace
To enable SSO with Google Workspace, complete the following:
1. Contact [support@sprig.com](mailto:sso@sprig.com) to claim the email domain(s) that your SSO users will use to sign in.
2. **Set up SSO with Google Workspace:** log in to the Google Admin console and navigate to Apps > Web and mobile apps > Add app > Add custom SAML app
3. Proceed through the custom SAML app creation steps, first entering an App Name and description.
4. **Download Metadata:** In the "Google Identity Provider details" window, download the IDP metadata file or copy the SSO URL, Entity ID, and Certificate
5. Log in to your Sprig account and navigate to **Settings >** [**Single Sign-On**](https://app.sprig.com/settings/sso).
6. Select the **SSO Enabled** option, and click **Save**.
7. Navigate to the **Your Identity Provider** section at the bottom of the page.
8. Set the value of **Entry Point URL** to be the **SSO URL** from your Google metadata
9. Set the **Issuer URL** to be the same value as the **Entity URI** from the **Important Values** section (this should be [https://app.userleap.com/saml](https://app.userleap.com/saml)).
10. Finally, copy the Certificate from your Google metadata into your Sprig SSO settings and click **Save**.
11. Take note of the **Entity URI** and the **ACS URL** values provided by the **Important Values** section, as you will use them in your Google Workspace client configuration.
12. Back in your Google Workspace SAML App setup, enter the **Important Values** from your Sprig SSO settings.
# Single Sign-On (SSO)
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/sso-1/index
Sprig supports Single Sign-On (SSO) via SAML 2.0. This allows you to integrate with most SAML-compliant Identity Providers (IdPs).
Note: SAML SSO is available for customers on Sprig Enterprise plans.
Use the links below to find configuration guides for popular IdPs:
* [Auth0](/docs/account-and-settings/account-and-login/sso-1/auth0)
* [Google Workspace](/docs/account-and-settings/account-and-login/sso-1/google-workspace)
* [KeyCloak](/docs/account-and-settings/account-and-login/sso-1/keycloak)
* [Microsoft Entra ID](/docs/account-and-settings/account-and-login/sso-1/microsoft-entra-id)
* [Okta](/docs/account-and-settings/account-and-login/sso-1/okta)
* [OneLogin](/docs/account-and-settings/account-and-login/sso-1/onelogin)
# Keycloak
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/sso-1/keycloak
To enable SSO with KeyCloak, complete the following:
1. Contact [support@sprig.com](mailto:sso@sprig.com) to claim the email domain(s) that your SSO users will use to sign in.
2. Log into your Sprig account and navigate to **Settings >** [**Single Sign-On**](https://app.sprig.com/settings/sso).
3. Select the **SSO Enabled** option, and click **Save**.
4. An **Important Values** section should appear. Copy the value of the **Entity URI** field into the **Issuer URL** field in the **Your Identity Provider**, and click **Save** button for both sections. Take note of both values provided by the **Important Values** section, as you will use it in your KeyCloak client configuration in the next step.
5. Log into your KeyCloak administration console. Navigate to the **Clients** page. Click **Create** and an **Add Client** page should appear. In the **Add Client** page enter the Entity URI from Step 4 into the **Client ID** field, and select **SAML** for the **Client Protocol**. Click **Save**.
6. A new configuration page for the newly created Sprig client should appear. Click on the **Settings** tab. Switch the **Enabled** and **Sign Document** toggles to the ON position. All other toggles should be OFF. Select **RSA\_256** for the Signature Algorithm, and enter the ACS URL from Step 4 into the **Valid Redirect URIs** field. The values of all other fields can be as the default value or blank. Click the **Save** button.
7. Click on the **Mappers** tab for the Sprig client you created. Add two mappers that will evaluate the values that will be used by the Sprig application for each user’s name and role. The SAML attribute names must be \_name\_and *role*, respectively. Name values must be less than 255 characters, and valid values for role are *admin*, *developer*, or *viewer*. Sprig roles are described [here](/docs/account-and-settings/team-management-roles/roles-permissions).
8. Click on the **Realm Settings** tab on the left. Click on the **Keys** tab in the Realm page under which your Sprig client was created. On that page, under the **Active** tab you should see a set of rows for each key. Find the one that has type RSA and click on the **Certificate** button on the right side of the row. A long string value should appear. Enter this value into the **X.509 Certificate** field in the **Your Identity Provider** section of the Sprig [SSO Settings Page](https://app.sprig.com/settings/sso). Click **Save**.
Users that are assigned to the KeyCloak application integration will now be able to sign in using the Sprig [SSO login page](https://app.sprig.com/login/sso).
# Microsoft Entra ID
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/sso-1/microsoft-entra-id
To enable SSO with Microsoft Entra ID, complete the following:
1. Contact [support@sprig.com](mailto:sso@sprig.com) to claim the email domain(s) that your SSO users will use to sign in.
2. Log into your Sprig account and navigate to **Settings >** [**Single Sign-On**](https://app.sprig.com/settings/sso).
3. Select the **SSO Enabled** option, and click **Save**.
4. An **Important Values** section should appear. Copy the value of the **Entity URI** field into the **Issuer URL** field in the **Your Identity Provider** section, and click **Save**. Take note of the Entity URI and the ACS URL values provided by the **Important Values** section, as you will use them in your Microsoft Entra ID client configuration.
5. Log into your Microsoft Entra admin center. Navigate to the Enterprise app page. Click “+ New application” at the top of the page and then “+ Create your own application” in the window that opens on the right.
6. In the “What’s the name of your app?” field, enter “Sprig” or whatever you would like the application to be called, and select “Integrate any other application you don’t find in the gallery (Non-gallery)” and click Create.
7. Under “Set up single sign on,” click “Get started” and choose SAML.
8. In the Basic SAML Configuration section, click Edit, and:
1. Paste the Entity URI from the Sprig dashboard into the Identifier (Entity ID) field
2. Paste the ACS URL into the Reply URL (Assertion Consumer Service URL) field.
9. Copy the Login URL from section 4 in the Microsoft Entra admin center and paste it into the Entry Point URL field in the Sprig dashboard.
1. Then, click download next to Certificate (Base64) from section 3 in the Microsoft Entra admin center to download the X.509 certificate.
2. Open the downloaded certificate in a text editor.
3. Copy the contents of the certificate, paste it into the X.509 Certificate field in the Sprig dashboard, and click Save.
10. Back in the Microsoft Entra admin center, navigate to the “Users and groups” page to add users or groups to the application. The users or groups that you add will determine which users will be able to use SSO to login to Sprig.
Users that are assigned to the Microsoft Entra ID application integration will now be able to sign in using the Sprig [SSO login page](https://app.sprig.com/login/sso).
# Okta
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/sso-1/okta
To enable SSO with Okta, complete the following:
1. Contact [support@sprig.com](mailto:support@sprig.com) to claim the email domain(s) that your SSO users will use to sign in.
2. Log into your Sprig account and navigate to the **Settings >** [**Single Sign-On**](https://app.sprig.com/settings/sso).
3. Select **SSO Enabled** and click **Save**.
4. An **Important Values** section should appear. Take note of the values provided. You will use them to configure your Okta integration in Step 10.
5. Log into your Okta account and go to the **Admin** section. Open the side menu with the hamburger button in the top left corner, and navigate to **Applications > Applications**.
6. Click on **Create App Integration**.
7. A modal window should appear. Select **SAML 2.0** for the sign-in method. Then click **Next**.
8. Enter **Sprig** for the App Name, and click **Next**.
9. The next screen is where you will input the SAML settings. Use the values you were provided on the Sprig SSO settings page in Step 4 to enter the **ACS URL** into the **Single sign on URL** field, and the **Entity URI** into the **Audience URI (SP Entity ID)** field. Select **EmailAddress** from the **Name ID format** dropdown, then select **Email** from the **Application username** dropdown. Do not edit the checkboxes under the **Single sign on URL** field.
10. In the attributes section add an attribute so that there are two. Enter “name” and “role” for the **Name** fields. Leave the **Name format** fields as **Unspecified**. In the **Value** fields enter [Okta Expression Language](https://developer.okta.com/docs/reference/okta-expression-language/) expressions that will provide the name and role for your Sprig users. The “role” field needs to evaluate to one of: `admin` , `editor` , `developer` , or `viewer` . Sprig roles are described [here](/docs/account-and-settings/team-management-roles/roles-permissions). If you are not sure what to enter here you can add `String.join(" ", user.firstName, user.lastName)` for **name** and `admin` for **role**.
11. Leave the **Group Attribute Statements** section blank. Scroll down to the bottom of the page and click **Next**.
12. Fill out the necessary fields in the **Feedback** section and click **Finish**.
13. You should now be taken to your new app’s integration page. Make sure you're on the **Sign On** tab, then scroll down and click **View SAML Setup Instructions**
14. A new tab will open with configuration values. You will be using these values to configure Sprig SSO in the next step.
15. Navigate to the Sprig [SSO Settings Page](https://app.sprig.com/settings/sso). Copy the values from the previous step into the corresponding fields in the “Your Identity Provider” section
* **Identity Provider Single Sign-On URL → Entry Point URL**
* **Identity Provider Issuer → Issuer URL**
* **X.509 Certificate → X.509 Certificate**
16. Click the **Save** button in the **Your Identity Provider section**. You now can assign users in the **Assignments** tab of your Okta application integration.
Users that are assigned to the Okta application integration will now be able to sign in using the Sprig [SSO login page](https://app.sprig.com/login/sso).
# OneLogin
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/sso-1/onelogin
To enable SSO with OneLogin, complete the following:
1. Contact [support@sprig.com](mailto:sso@sprig.com) to claim the email domain(s) that your SSO users will use to sign in.
2. Log in to Sprig and go to [Settings > Single Sign On](https://app.sprig.com/settings/sso).
3. Select **SSO Enabled** option, and click **Save**.
4. An *Important Values* section will appear. Take note of the values provided. You will use them to configure your OneLogin integration in step 8.
5. Log in to your OneLogin account and go to the **Administration** section. Navigate to the **Applications** page.
6. Click the **Add App** on the right side of the page. In the search field, enter *Saml Custom Connector*. Choose SAML Custom Connector (Advanced) provided by *OneLogin Inc*:
7. In the **Display Name** field, enter a name and click **Save**.
8. Click **Configuration**. Use the *Important Values* you were provided in step 4 to cut and paste the *Entity URI* into the **Audience (EntityID)** field, and the *ACS URL* into both the **ACS (Consumer) URL Validator** field and the **ACS (Consumer) field**.
9. Click **Parameters**. Click to add a parameter.
10. Enter `name` in the Field name field. Select the **Include in SAML assertion** option. Click **Save**.
10. In the **Value** drop-down list select **Name**.
12. Click again on **Parameters**. Click to add another parameter.
13. Enter `role` in the **Field name** field. Select the **Include in SAML assertion** option. Click **Save**.
14. In the **Value** drop-down list select **- Macro -** . Either enter `admin` , `editor`, `developer` , or `viewer` in the field. Sprig roles are described [here](/docs/account-and-settings/team-management-roles/roles-permissions). Roles can be configured on a per-user basis using [user attribute macros](https://onelogin.service-now.com/kb_view_customer.do?sysparm_article=KB0010609). If you don’t have the appropriate attribute configured for users yet, you can choose “- Macro -” again and enter `admin`, and all assigned users will receive “admin” permissions.
15. You will configure the SAML settings. Click on the **SSO** tab. In the SAML Signature Algorithm dropdown, select **SHA-256**.
16. Navigate to the Sprig's [**Settings>Single Sign-On**](https://app.sprig.com/settings/sso). Copy the values from the SSO tab in the previous step into the corresponding fields in the **Your Identity Provider** section:
* **Issuer URL → Issuer URL**
* **SAML 2.0 Endpoint → Entry Point URL**
15. Now in the OneLogin **SSO** tab, click **View Details** link under the **X.509 Certificate** field. A new page will appear. Copy the text inside the X.509 Certificate field and paste it into the **X.509 Certificate** field in Sprig's [**Settings>Single Sign-On**](https://app.sprig.com/settings/sso). Click “Save”.
Users that are assigned to the OneLogin application integration will now be able to sign in using the Sprig [SSO login page](https://app.sprig.com/login/sso).
# Domain-Based Team Discovery
Source: https://docs.sprig.com/docs/account-and-settings/account-and-login/team-discovery
Allow team members to automatically join your Sprig workspace
Domain-based team discovery is an easy way to help your team get started in Sprig, allowing your colleagues to automatically join your team based on their email domain. Alternatively, if your company uses single sign-on (SSO) and you have a Sprig Enterprise plan, you can use SAML-based SSO instead. For more information, visit [Single Sign-On (SSO)](/docs/account-and-settings/account-and-login/sso-1/index).
# Getting Started with Team Discovery
Please contact [support@sprig.com](mailto:support@sprig.com) to add your domain as a discoverable domain for your team. Once that's done, navigate to [Settings > Domains](https://app.sprig.com/settings/domains) in your team Admin account and confirm the domain was added. There, you can:
1. Set the default role new users will have.
1. We recommend Editor to empower your colleagues to create and launch studies, as well as create new dashboards, but feel free to choose any role depending on your team's needs. You can see and adjust role permissions for each user in [Settings > Team > Members](https://app.sprig.com/settings/team).
2. Determine whether users with matching email domains can automatically join your team or whether they must issue a request for you to approve or reject.
Note: Team discovery only supports one domain.
# Team Discovery as a New Sprig User
## Automatically Join a Team
*If **"Immediately"** is selected as the access setting for your team:* When a colleague with a matching domain signs up for Sprig at [app.sprig.com/signup](https://app.sprig.com/signup) or any redirect from an authenticated dashboard page, they'll be prompted to join your team before setting up their password. They'll automatically see your team's account dashboard when they log in to Sprig.
## Request to Join a Team
*If **"Require Approval"** is selected as the access setting for your team:* When a colleague with a matching domain signs up for Sprig, they'll be prompted to "Request to join" your team. Then, team Admins will be sent an email notification about the request, which they'll be able to approve from [Settings > Team > Members](https://app.sprig.com/settings/team) in the Sprig dashboard. The new team member will then be notified via email that their request to join has been approved, and they'll see your team's account dashboard when they log in to Sprig.
# Admin Configuration
Source: https://docs.sprig.com/docs/account-and-settings/configure
In [**Settings > Configure**](https://app.sprig.com/*/settings/configure), you can:
* Change the Product Name.
* Configure whether or not to Auto Accept Events.
* For web-based single-page applications, dismiss the study on page change.
* Define the Recontact Waiting Period.
* Allow Manual Study Display from the command line.
* Control Open Text Question footer content across all surveys as new questions are added and surveys are edited.
## Product Name
Use this option to change the name of the product.
## Auto Accept Events
Sprig will automatically accept unregistered events from your websites or apps to your list of triggered events.
## Dismiss on Page Change
For web-based single-page applications (SPA), there is an option to dismiss (close) the study on page change. Note: after the waiting period, for page URL-based events, the study is only shown if the page URL still exactly matches the URL as originally defined.
For mobile applications, this operates the same way. The study will not show to the user if their app view changes.
## Recontact Waiting Period
[Recontact Waiting Period](/docs/sprig-studies/in-product-surveys/survey-creation/resurvey-waiting-period) sets the minimum number of days across all In-Product Surveys to wait before delivering a study to the same person.
## Allow Manual Study Display
Enable the manual [displaySurvey](/docs/Installation/introduction-web/web-javascript#browser-console) function for testing purposes, which makes studies publicly accessible by numeric ID.
## Set Open Text Question Footer
This setting allows you to automatically add standard footer content to all Open Text Questions that appear in In-Product Surveys, Surveys, and Feedback studies. This helps ensure consistency across surveys, saves time, and makes it easy to include important reminders such as not to share personally identifiable information in responses.
### How it works
Once you save text in this field, all new and edited Open Text Questions will get this content automatically. This applies to surveys regardless of their state, for example, if you edit an in-progress study after enabling this setting, any existing footer content for Open Text Questions in the study will be replaced with content from this setting. Once this setting is enabled, editing footer content from within a survey will be disabled. The content can be translated along with the rest of the survey content using the standard [multi-language functionality](/docs/shared-study-foundations/main-tasks/multi-language-support).
To stop applying footer content automatically, delete all of the content from this setting and save. Footers for Open Text Questions will retain the last version of the content from the setting but it will be editable from within each survey again.
# Plans and Billing
Source: https://docs.sprig.com/docs/account-and-settings/plans-teams-and-billing
As of June 2024, Sprig is rolling out a new pricing & usage model based on individual study units (Survey responses, Feedback responses, Replay clips, and Heatmap captures) and Monthly Unique Users to support a broader diversity of customers better. Learn more [here](https://dash.readme.com/project/userleap/v6.0/docs/usage-muu)
# Plans
Sprig supports three plans: Free, Starter, and Enterprise. The Sprig [Website](https://sprig.com/plans#feature_table) provides more details on the differences between the three plans. You can verify your current Plan by going to the [Settings > Plans](https://app.sprig.com/settings/plans) page in the Sprig app.
The main differences between the three plans are Product Access, the number of individual study units (Survey responses, Feedback responses, Replay clips, and Heatmap captures), and Monthly Unique Users - for [legacy plans](/docs/account-and-settings/usage-muu/usage) this is Study Credits and Monthly Tracked Users (MTUs) - you can use each month, as well as the delivery platforms available to you. The Enterprise Plan also features greater design customization options and increased customer support.
[Plan changes: FAQ](/docs/account-and-settings/plans-teams-and-billing#plan-changes-faqs-1)
## Enterprise Plan
The **Enterprise Plan** is designed for organizations scaling their product development, so it can be completely tailored to your needs. Depending on your contract, your package includes access to products, individual study units (Survey responses, Feedback responses, Replay clips, and Heatmap captures), and a Monthly Unique Users (MUU) bundle.
The Enterprise Plan gives you access to all Delivery Methods (Mobile or Web), custom limits for Surveys, Replays, Heatmaps and Feedback, GPT-powered AI Analysis, API access, and customizable study look and feel. Plan pricing varies based on needs.
## Starter Plan
The [**Starter Plan**](https://sprig.com/plans) is designed for professionals and teams collecting user insights from a small user base.
The Starter Plan provides (monthly):
* Replays: 400 Clips
* In-Product Surveys: 200 Responses
* Surveys: 100 Responses
* Heatmaps: 1000 Captures
* Feedback: 100 Responses
* Up to 50k MUUs
* Mobile Delivery is available as an add-on
Additionally, it provides access to native [integrations](https://sprig.com/integrations/featured) with top-rated panel providers. Check out the [Plans and Pricing page](https://sprig.com/pricing#feature_table) for more details.
## Free Plan
The [**Free Plan**](https://sprig.com/plans) is designed for individuals and teams just getting started with capturing quick and easy user insights.
The Free Plan provides (monthly):
* Replays: 50 Clips
* In-Product Surveys: 25 Responses
* Surveys: 25 Responses
* Heatmaps: 100 Captures
* Feedback: 10 Responses
* Up to 5k MUUs
Consider upgrading to a Starter or Enterprise Plan if you'd like Surveys, mobile-delivered surveys, integrations, as well as more robust Sprig AI Analysis. To upgrade, click [here](https://sprig.com/trial) to book a call.
# Overage Enforcement
Limits are enforced across the two primary billing dimensions:
* Study Units - Replay Clips, Heatmap Captures, Survey Responses, and Feedback Responses
* MUUs
Overage enforcement can behave differently, based on your plan type
**Free & Starter Plans**: Hard Limits
* Study Units: Studies of the particular type will stop collecting user data
* MUUs: All study types will stop collecting data
**Enterprise Plans**: Two-month grace period before Hard limits are invoked (see Hard Limit behavior above)
Your usage resets at the beginning of the calendar month after which any *In Progress* study will resume collecting data.
## Teams and Products
The Team contains all the Members or users who can access the Sprig app with their email addresses. The Team is often described as your Sprig account. The Plan you choose and the Billing each month are associated with the Team. You can add multiple Products to a Team. All Products in a Team are accessible to Members of that Team. You cannot share Member information or any other information between Teams. Sprig determines which Team you are placed into based on your login credentials. You will need a different email if you want to log into other Teams.
Some customers may decide to have all their Products in one Team. Other customers may choose to have multiple Teams with multiple Products. Before adding a Team or a Product, contact us so that we can review the options to determine if you should create a new Team or join an existing Team. If you need help locating your company's Sprig app, contact Sprig at [support@sprig.com](mailto:support@sprig.com).
## Billing
Sprig's billing is based on the number of individual study units (Survey responses, Feedback responses, Replay clips, and Heatmap captures) and Monthly Unique Users in your contract. Please note that your team may incur additional charges if you exceed your allotted usage for MUUs in a given calendar month. You can view your team's billing information by navigating to [Settings > Plans](https://app.sprig.com/settings/plans).
Sprig will invoice your company according to the service terms expressed in the agreement. For all billing questions, please contact [**support@sprig.com**](mailto:support@sprig.com).
# Plan Changes FAQs
### How can I upgrade?
Free and Starter Plan customers who are interested in upgrade options can [click here](https://app.sprig.com/pricing/) to explore our plans or go to [Settings > Plans](https://app.sprig.com/settings/plans) to set up a consultation with a Sprig Specialist.
Enterprise Plan customers can contact your account team or email Sprig Support at [support@sprig.com](mailto:support@sprig.com) if you have questions or would like to upgrade your plan to add Surveys, Replays, or Heatmaps.
### How can I downgrade?
If you want to discuss downgrade options, please email Sprig Support at [support@sprig.com](mailto:support@sprig.com).
### How can I cancel my Starter Plan?
To cancel your Starter plan, head to Settings > Billing & Plans > Manage plan and log into the billing system with the email used to set up billing. From there, you will be able to cancel your plan.
Your plan will revert to a Free Plan after the current billing cycle ends.
# Team Management & Roles
Source: https://docs.sprig.com/docs/account-and-settings/team-management-roles/index
Sprig believes that product experience insights are the most powerful when an entire team is empowered to learn from them and take action. That's why we offer unlimited seats, so there are no additional costs to collaborate with your colleagues.
This section covers:
* Organizing [Sprig product workspaces and understanding environments](/docs/account-and-settings/team-management-roles/products-and-environments)
* [Sprig roles and user permissions](/docs/account-and-settings/team-management-roles/roles-permissions)
# Products and Environments
Source: https://docs.sprig.com/docs/account-and-settings/team-management-roles/products-and-environments
## Products
If you have multiple services, products, or websites and would rather assign a single domain for each product, you might consider adding additional *Products* to Sprig. *Products* have distinct data flows, studies, and events in one environment. Adding a Product to Sprig is supported on Enterprise Plans.
### Adding a Product
Adding a Product to Sprig is supported on Enterprise Plans only and allows you to partition your account to support multiple Products.
Limits such as MUUs, Survey Responses, Feedback Responses, Heatmap Captures, and Replay Clips are partitioned *per Product* and are unable to be allocated across Products.
Contact [support@sprig.com](mailto:support@sprig.com) to add a product to your Sprig account.
#### Things to Consider
Sprig identifies users by a unique identifier, `visitorids`, and then determines whether or not they should be eligible to receive another Sprig study. Users that are tracked through the new product are treated as **new users** and will carry unique `visitorids`. So in this case it is possible for the same user to receive more than one study within the same day.
**Warning:** Warning
As with environments, you cannot share user identities across product boundaries
### Workflow
Select **Account > Product > + Add New Product**.
### Deleting a Product
Deleting a product requires contacting Sprig customer support. Contact [support@sprig.com](mailto:support@sprig.com) to remove a product from your Sprig account.
## Environments
There are 2 environments for each product in your Sprig account: the Development and Production environment. These have distinct data flows, studies, and events in one environment cannot be used in or moved to the other environment.
In the following example, the current Environment, **Production**, is shown under the Product name in the **Account** menu.
To change from the Production to Development Environment, select **Account > Environment**, then select **Development**.
### Development and Production
The Development and Production environments have two distinct but similar purposes.
The purpose of your development environment is to test study delivery and appearance. The environment operates and appears like the production environment, with some exceptions.
The Production environment is where you should keep all studies you intend to collect data from. The production environment has fully functioning recontact periods, so after a visitor is shown a study, they will not receive another until the default period expires or the override period for the study is completed. For more information, see [Recontact Waiting Period](/docs/sprig-studies/in-product-surveys/survey-creation/resurvey-waiting-period).
The main differences between the Development and Production environments are:
1. There is no Recontact Period in the Development environment. This is intended to allow for rapid testing of Events and Question logic.
2. Studies launched in the Development environment do not count against your monthly limit. This allows additional launches during testing cycles.
### SDKs
In addition, when setting up an [SDK](/docs/developer-center/sprig-sdk/features-by-sdk-version#sdk-diagnostics) based event, be aware that the Production and Development IDs are different. They must be correctly configured with the corresponding ID for that environment to receive events. You can find the IDs at:
* **Integrations > JavaScript >Get Code**
* **Integrations > iOS > Get Environment ID**
* **Integrations > Android > Get Environment ID**
The Production and Development IDs are the same for JavaScript, iOS, and Android.
# Roles & Permissions
Source: https://docs.sprig.com/docs/account-and-settings/team-management-roles/roles-permissions
How to help your team sign up for Sprig
## Sprig Permission Sets
Sprig offers 5 different access permissions, listed below ranked from highest to lowest access:
1. Admin
2. Developer
3. Editor
4. Editor Lite
5. Viewer
For more information on user roles & permissions, see below:
| | Admin | Developer | Editor | Editor Lite | Viewer |
| :- | :- | :- | :- | :- | :- |
| **SSO** | | | | | |
| Log In using SSO | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Dashboards Page** | | | | | |
| Create New Dashboard | ✅ | ❌ | ✅ | ✅ | ❌ |
| Edits to Dashboards Page | ✅ | ✅ | ✅ | ✅ | ❌ |
| View Pinned Results | ✅ | ✅ | ✅ | ✅ | ✅ |
| Use Help Chat | ✅ | ✅ | ✅ | ✅ | ❌ |
| **Studies Page** | | | | | |
| View Studies | ✅ | ✅ | ✅ | ✅ | ✅ |
| Edit Studies | ✅ | ✅ | ✅ | ✅ | ❌ |
| View Study Results | ✅ | ✅ | ✅ | ✅ | ✅ |
| View Study Templates | ✅ | ✅ | ✅ | ✅ | ✅ |
| Create a Study | ✅ | ✅ | ✅ | ✅ | ❌ |
| Launch a Study | ✅ | ✅ (Dev Env only) | ✅ | ❌ | ❌ |
| Edit Live Survey | ✅ | ✅ (Dev Env only) | ✅ | ❌ | ❌ |
| Pause a Study | ✅ | ✅ | ✅ | ✅ | ❌ |
| Complete a Study | ✅ | ✅ | ✅ | ✅ | ❌ |
| **Users Page** | | | | | |
| Access Users Page | ✅ | ✅ | ✅ | ✅ | ✅ |
| View Visitor Timeline | ✅ | ✅ | ✅ | ✅ | ✅ |
| Contact User | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Events Page** | | | | | |
| View Events | ✅ | ✅ | ✅ | ✅ | ✅ |
| Add an Event | ✅ | ✅ | ✅ | ✅ | ❌ |
| Edit/Delete Event | ✅ | ✅ | ✅ | ✅ | ❌ |
| Filter Events | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Settings / Look & Feel** | | | | | |
| Edit Product Name | ✅ | ✅ | ❌ | ❌ | ❌ |
| Add/Change Logo | ✅ | ✅ | ❌ | ❌ | ❌ |
| Add/Change Brand Color | ✅ | ✅ | ❌ | ❌ | ❌ |
| Adjust Study Placement | ✅ | ✅ | ❌ | ❌ | ❌ |
| Remove Signature | ✅ | ✅ | ❌ | ❌ | ❌ |
| **Settings / Integrations** | | | | | |
| Add and Configure Integrations | ✅ | ✅ | ✅ | ❌ | ❌ |
| **Settings / Team** | | | | | |
| Add Team Member\* | ✅ | ✅ | ✅ | ✅ | ✅ |
| Edit Team Member | ✅ | ❌ | ❌ | ❌ | ❌ |
| Configure SSO | ✅ | ✅ | ❌ | ❌ | ❌ |
| Manage Billing | ✅ | ❌ | ❌ | ❌ | ❌ |
\*Admins can add any role. Other roles can only add their level or below.
If you have any questions please email us at [**support@sprig.com**](mailto:support@sprig.com) or use the in-product help chat.
# Usage
Source: https://docs.sprig.com/docs/account-and-settings/usage-muu/index
Learn about how Sprig tracks usage and how it impacts your plan limits
In June 2024, Sprig moved a new pricing and usage model based on individual Study Units (responses, clips and Heatmap captures) and Monthly Unique Users to better support a broader diversity of customers.
If you are still on the legacy MTU & study model plan, please see relevant information [here](https://docs.sprig.com/docs/account-and-settings/usage-muu/usage#study-usage).
# Overview
Sprig's Enterprise billing and usage model has two main components:
* A platform fee that incorporates monthly usage
* as measured by Monthly Unique Users
* Product access & per product bundles
# Product Usage
## How is Survey, Replay, Heatmap, and Feedback Usage tracked?
* **Replay Clips:** The number of Replay clips captured in a calendar month. Clips can be captured as part of standalone Replay studies, or captured alongside Feedback and Survey responses, or Heatmap captures
* **Heatmap Captures:** Heatmap usage is tracked based on the number of visitor captures in a Heatmap report in a calendar month. A capture is a visitor that visited the page on which the study is configured and had their clicks or scrolls recorded in the study
* **Feedback:** The number of Feedback responses collected in a calendar month. A response is counted if a visitor answers at least one question of your Feedback study. Feedback responses are tracked separately from Survey responses
* **Surveys:** The number of Survey responses collected in a calendar month. A response is counted if a visitor answers at least one question of your survey
Your monthly usage allowance for each study type will be renewed at the start of each calendar month.
# Monthly Unique Users (MUU) Usage
## What is an MUU?
Monthly Unique Users (MUUs) are a measure of the number of unique Visitors within a month that have visited your web page or interacted with your application. It is important to note that an MUU is not necessarily a person that has seen a Survey or Feedback Study, or been captured as part of a Replay or Heatmap.
MUUs are an important factor in billing, as exceeding your monthly usage limit may result in being unable to launch additional studies or your active studies being unable to collect responses. Enterprise Plans offer a customizable number of MUUs, Starter Plans & Free plans currently subscribe to our [Legacy MTU model.](https://dash.readme.com/project/userleap/v6.0/docs/usage)
To estimate how many MUUs you'll need for your Sprig plan, you can use your monthly active user (MAU) count from your product analytics tool as a starting point. If you would like to increase your MUU limits or upgrade your plan, please reach out to [Sales](https://sprig.com/sales-demos)
**Note:** Certain customers may be grandfathered into a [MTU model](/docs/account-and-settings/usage-muu/usage)
## How is MUU usage tracked and how can I monitor usage?
MUU allocation is shared across all [Products](/docs/account-and-settings/team-management-roles/products-and-environments) within a Team and across all [Environments](/docs/account-and-settings/team-management-roles/products-and-environments#environments). To monitor your team's MUU usage throughout the month, head over to [Settings > Usage](https://app.sprig.com/settings/usage) in the Sprig app. Additionally, you will be proactively alerted at various usage milestones as you approach MUU limits.
Accurate tracking requires a common identity provided for each unique visitor. Users tracked without a common ID, such as anonymous visitors to a website, may be counted multiple times for each session. See the [Installation Guide](/docs/Installation/introduction-web/index) for more information.
## When do monthly MUU usage limits reset?
Your monthly usage allowance for studies will be renewed at the start of each calendar month.
## How can I reduce my team's MUU usage?
If you're looking to avoid MUU overages, consider one or more of the following options:
1. Track User IDs: Manage user identity consistently to limit the number of “anonymous” users who may be counted multiple times during a month. This is especially important if you’re using Sprig SDK with other Integrations like Segment or Google Tag Manager. See [installation guide](/docs/Installation/introduction-web/index) for best practices.
2. Upgrade your plan and/or Increase MUU limits by talking with [Sales](https://sprig.com/sales-demos)
3. MUU Sampling: (Not recommended) Admins can request Sprig Customer Success to implement sampling to control the amount of traffic sent to Sprig from your App.
# Overage Enforcement
Limits are enforced across the two primary billing dimensions:
* Study Units - Replay Clips, Heatmap Captures, Survey Responses, and Feedback Responses
* MUUs
Overage enforcement can behave differently, based on your plan type
**Free & Starter Plans**: Hard Limits
* Study Units: Studies of the particular type will stop collecting user data
* MUUs: All study types will stop collecting data
**Enterprise Plans**: Two-month grace period before Hard limits are invoked (see Hard Limit behavior above)
Your usage resets at the beginning of the calendar month after which any *In Progress* study will resume collecting data.
# Other Usage FAQs
## Can I allocate MUUs across products or environments?
MUUs are provisioned by [product](/docs/account-and-settings/team-management-roles/products-and-environments) and admins are unable to selectively allocate MUUs across products. Please reach out to Support if you are interested in adding an additional Sprig Product to your Team.
## Why is my MUU count different from that provided by other tools?
Each tool counts users under different conditions. Different ingestion methods and data processings will naturally generate different results. As a reminder, Sprig tracks MUUs that due to qualifying occurrences in app or are exposed to a link survey.
## Is there a limit to the number of Events & Attributes I can collect about Users?
While you might be tempted to send any and all of your user Events & Attributes over to Sprig, there are some limitations that you'll want to keep in mind.
Sprig allows for a maximum average of 100 Events & Attributes per MUU on a monthly basis. If this limit is exceeded, a Sprig customer success person will reach out to discuss how you can reduce the number of Events & Attributes per MUU.
# Usage - Legacy MTU & Study Model
Source: https://docs.sprig.com/docs/account-and-settings/usage-muu/usage
Learn about how Sprig tracks usage and how it impacts your account limits
In June 2024, Sprig moved a new pricing and usage model based on individual Study Units (responses, clips and Heatmap captures) and Monthly Unique Users to better support a broader diversity of customers. Learn [more](https://docs.sprig.com/docs/account-and-settings/usage-muu/index).
# Study Usage
## How is my Study usage tracked?
Any study (Heatmap, Replay, Survey or Feedback) that receives one or more pieces of user data (capture, replay clip, Survey response or Feedback response) in a calendar month is considered is considered *Active* and will counts towards your Active Monthly Study limit. Only studies launched in Production environments count towards your monthly limits
An in product survey, feedback study or heatmap study with an attached Replay will only be counted as an active survey
## When do monthly Active Study usage limits reset?
Your monthly usage allowance for studies will be renewed at the start of each calendar month. You can see your team's Turnover Date in the Sprig app by going to [Settings > Usage](https://app.sprig.com/settings/usage).
# Monthly Tracked Users (MTUs) Usage
## What is an MTU?
Monthly Tracked Users (MTUs) is a measure of the number of unique Visitors within a month that have visited your web page or interacted with your application *and you've decided to send their events/attributes to Sprig*. It is important to note that an MTU is not necessarily a person that been captured in a study.
MTUs are an important factor in billing, as exceeding your monthly usage limit may result in being unable to launch additional studies or your active studies being unable to collect responses. Enterprise Plans offer a customizable number of MTUs, Starter Plans have a hard limit of 25,000 MTUs, and Free Plans have a hard limit of 5,000 MTUs.
To estimate how many MTUs you'll need for your Sprig plan, you can use your monthly active user (MAU) count from your product analytics tool as a starting point. If you would like to increase your MTU limits or upgrade your plan, please reach out to [Sales](https://sprig.com/sales-demos)
## How is MTU usage tracked and how can I monitor usage?
MTU allocation is shared across all [Products](/docs/account-and-settings/team-management-roles/products-and-environments) within a Team and across all [Environments](/docs/account-and-settings/team-management-roles/products-and-environments#environments). To monitor your team's MTU usage throughout the month, head over to [Settings > Usage](https://app.sprig.com/settings/usage) in the Sprig app. Additionally, you will be proactively alerted at various usage milestones as you approach MTU limits.
[Settings > Usage](https://app.sprig.com/settings/usage) allows you to display usage by user identify (anonymous vs identified) or platform.
To avoid exceeding your MTU limit, it is critical to practice good user identity hygiene to understand where, when, and how you want to track users.
Accurate tracking requires a common identity provided for each unique visitor. Users tracked without a common ID, such as anonymous visitors to a website, may be counted multiple times for each session. See the [Installation Guide](/docs/Installation/introduction-web/index) for more information.
## What are Events & Attributes?
[Events](/docs/shared-study-foundations/events/index) - Events are behaviors tracked in your application about a user and are used to trigger (display) studies after the user performs a specific action (e.g. *Dashboard - Clicked - Download CSV*)
[Attributes](/docs/shared-study-foundations/attributes) - Attributes are information tracked about a user and are used to refine the target users and filter the response data. Example attributes include (*language, role, plan\_type, browser etc)*
## How do Events & Attributes impact MTU accounting?
Tracking events that are not triggers for an active survey could lead to users that are counted as an MTU:
* For example, if you are tracking the event *Dashboard - Clicked - Download CSV* but you don't have an active survey that will trigger on that event, you will still accumulate MTUs from users that trigger the event.
Additionally, Sprig allows for a maximum average of 100 Events & Attributes per MTU on a monthly basis.
As of September 1st, 2023, Sprig no longer counts an MTU due to attribute setting towards visitor limits. Counts reflected in your Usage charts prior to that date reflect accounting by the previous accounting system whereby MTUs could be attributed to event triggering, attribute setting or study seen.
Some customers will be kept on the legacy MTU counting system. Please reach out to your customer success rep with any questions.
## When do monthly MTU usage limits reset?
Your monthly usage allowance for MTUs will be renewed on your Turnover Date each month. You can see your team's Turnover Date in the Sprig app by going to [Settings > Usage](https://app.sprig.com/settings/usage).
## How can I reduce my team's MTU usage?
If you're looking to avoid MTU overages and want to reduce your MTU count, consider one or more of the following options:
1. Track User IDs: Manage user identity consistently to limit the number of “anonymous” users who may be counted multiple times during a month. This is especially important if you’re using Sprig SDK with other Integrations like Segment or Google Tag Manager. See [installation guide](/docs/Installation/introduction-web/index) for best practices.
2. Archive unused Events: Events you’ve asked Sprig to track could result in a qualifying event that may count towards your MTU usage. Navigate to [Events](https://app.sprig.com/events) to view and archive unused Events.
3. Upgrade your plan and/or Increase MTU limits by talking with [Sales](https://sprig.com/sales-demos)
4. [MTU Sampling](/docs/account-and-settings/usage-muu/usage#mtu-sampling): (Not recommended) Admins can request Sprig Customer Success to implement sampling to control the amount of traffic sent to Sprig from your App.
# Other Usage FAQs
## What are some reasons that my MTUs are higher than expected?
**There could be a few reasons why you might be seeing higher MTUs usage than expected:**
* MTUs can include visitors that are not exposed to a study based on satisfying visitor tracking events. See How do Events & Attributes impact usage?
* Sprig generated visitor IDs are not correctly being coupled with the unique user IDs assigned to users within your platform’s internal authentication framework resulting in multiple MTUs for the same users. See [Installation Guide](/docs/Installation/introduction-web/index) for best practices for user ID management.
* Though it is rare, a user can be counted multiple times towards MTU limits. This can happen when a user accesses your website or application from one browser, but later opens your app anonymously on a different device or platform. Double counting can also happen if a user has two unlinked user IDs and uses both of them in a single month.
## Can I allocate MTUs across products or environments?
At this time, admins are unable to selectively allocate MTUs across products or environments. We recommend monitoring MTU usage throughout the month. You can filter Usage charts by Product under Settings > Usage.
## Why is my MTU count different from that provided by other tools?
Each tool counts users under different conditions. Different ingestion methods and data processings will naturally generate different results. As a reminder, Sprig only tracks MTUs that due to qualifying occurrences in app or are exposed to a link survey.
## Is there a limit to the number of Events & Attributes I can collect?
While you might be tempted to send any and all of your user Events & Attributes over to Sprig, there are some limitations that you'll want to keep in mind.
Sprig allows for a maximum average of 100 Events & Attributes per MTU on a monthly basis. If this limit is exceeded, a Sprig customer success person will reach out to discuss how you can reduce the number of Events & Attributes per MTUs.
## What happens when I hit my Study Limits?
For Free and Starter Plans, your active studies will continue to collect responses, but you will be unable to launch additional studies. Enterprise customers will be able to launch studies, but will be contacted by Success/Sales to discuss plan upgrade options.
## What happens when I hit my MTU Limits?
For Free and Starter Plans, you will be unable to launch additional studies and your active studies will no longer collect responses. Enterprise customers will be able to launch studies and collect responses, but will be contacted by Success/Sales to discuss plan upgrade options.
# Android Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/android-changelog
**How to read this changelog:** [Understanding SDK changelog urgency and impact](/docs/developer-center/sdk-changelog)
## v2.30.1
**Recommended if you use:** Session Replays
* add: \[impact: performance] `turnOffSessionReplayCapture()` turns session replay off for the rest of the app session. It replaces `stopRecording()`, now deprecated, which no longer stops only the recording in progress.
* fix: \[impact: performance] Session replay now stops for the rest of the app session under sustained memory pressure or when capture costs the main thread more than the configured threshold, rather than restarting on the next request.
## v2.30.0
**Recommended if you use:** URL Prompt Question Type
* chore: Updated the bundled Web SDK to [v2.53.0](https://docs.sprig.com/docs/developer-center/sdk-changelog/web-changelog#v2-53-0), which carries survey enhacements into this release.
* add: \[impact: behavior] Added the ability to launch an in-app web browser for URL Prompt question types.
* add: Added new lifecycle event displayInAppBrowser which fires when the in-app experience is triggered.
## v2.29.0
**Recommended if you use:** survey lifecycle events, or apps with multiple Activities
* chore: Updated the bundled Web SDK to [v2.51.0](/docs/developer-center/sdk-changelog/web-changelog#v2-51-0), which carries its survey and Session Replay fixes into this release.
* add: \[impact: behavior] Refactor of the survey lifecycle events for better accuracy with the addition of the new surveyReturned event, the removal of surveyWillPresent, a change to when the surveyAppeared emits and the addition of the new surveyDidNotAppear event.
* add: Passing the surveyId of the previous survey when a previousSurveyReady state is returned.
* fix: \[impact: performance] Memory leak fix for multiple Activities.
## v2.28.0
**Recommended if you use:** Session Replay
* add: Wireframe session replay recording (optional)
## v2.27.2
* chore: Updated WebSDK to v2.49.0
## v2.27.1
* chore: Removal of unnecessary library dependency
* chore: Logging improvements
## v2.27.0
* chore: Updated WebSDK to v2.48.2
## v2.26.2
* chore: Changes to error logging
## v2.26.1
* add: Updated WebSDK to v2.46.1
* fix: Single select answer selection color for Conversational UI in Dark Mode
## v2.26.0
* add: Updated WebSDK to v2.46.0
* fix: Survey sliding animation issue with text field questions under Material 1.10+
## v2.25.0
* add: Updated WebSDK to v2.45.0
* add: JIT survey web view creation for improved long-term reliability
* fix: Survey text fields were covered by the keyboard in certain React Native environments
* chore: Error logging optimizations
## v2.24.0
* add: Updated WebSDK to v2.44.0
* add: New function to override device light/dark mode in surveys
* fix: Ensure light/dark mode is always enabled for current activity
* fix: Certain lifecycle events are no longer reported twice
* chore: The surveyId in SprigSurveyResult is no longer optional, keeping in parity with iOS
## v2.23.0
* add: Updated WebSDK to v2.43.0
* add: Survey ID provided in track callbacks via new SprigSurveyResult
* add: New PREVIOUS\_SURVEY\_READY state to indicate pending surveys
* add: New SURVEY\_STATE\_RETURNED and SURVEY\_COMPLETED lifecycle events
* add: Light/dark mode support with custom CSS
* fix: Pending surveys now cause newly tracked surveys to be ignored
## v2.22.1
* fix: Conversational UI surveys having incorrect height in landscape
## v2.22.0
* add: Updated WebSDK to v2.41.3
* add: Support for the new AI Follow-up question type
* add: Display Logic support
## v2.21.3
* fix: Ensures the active UI context is used for surveys in multi-activity apps
* fix: Corrects a bounded memory leak during configuration
## v2.21.2
* fix: Delays set for surveys had stopped working
* fix: Surveys were getting cut off in landscape mode
## v2.21.1
* fix: Memory leak with ConnectivityManager
## v2.21.0
* add: Updated WebSDK to v2.40.3
* add: Support for Attribute Piping
## v2.20.0
* add: Ability to pause and unpause displaying of surveys
* add: Dismissing active surveys also dismisses any pending surveys
## v2.19.7
* add: Keyboard height override
## v2.19.6
* add: Call to configure is now thread and coroutine safe
* fix: Crash that could occur during replays with complex composite views
## v2.19.5
* add: Launch time configuration
## v2.19.4
* add: Updated WebSDK to v2.39.3
* add: Support for new Conversational Survey format
* add: Support for SURVEY\_WILL\_PRESENT lifecycle event
* add: Support for SURVEY\_PRESENTED lifecycle event
* add: Support for SURVEY\_WILL\_CLOSE lifecycle event
* add: Support for SURVEY\_CLOSED lifecycle event
* add: Support for SURVEY\_HEIGHT lifecycle event
* fix: Removed SURVEY\_DIMENSIONS lifecycle event no longer being emitted
## v2.19.3
* fix: Passing an Activity when presenting surveys is now optional
## v2.19.2
* fix: Corrected the stopRecording function
* fix: Addressed a minor memory leak
## v2.19.1
* fix: Memory leak when presenting surveys from multiple activities
## v2.19.0
* add: Updated WebSDK to v2.37.1
* add: Support for new Rank Order question type
* add: Response piping support
* fix: Improved keyboard behavior for text input questions
* fix: Improved survey dismiss behavior under certain app state changes
* fix: Improved Android activity management for multiple app activities
## v2.18.5
* add: Updated WebSDK to v2.34.0
* add: New property to add space on screen below surveys
* fix: Improved keyboard behavior for text input questions
* fix: Improved survey dismiss behavior under certain app state changes
## v2.18.4
* fix: Improved low-memory handling for session replays
## v2.18.3
* fix: Crash that could occur during replays and device rotation
* fix: Surveys are now masked during replays
## v2.18.2
* add: Made the SDK version available to host applications
* fix: Improved replay masking performance
## v2.18.1
* add: Modals are now included in session replay recordings
## v2.18.0
* add: Additional Sprig lifecycle events available to monitor
* add: Web views are now included in session replay recordings
* fix: Session replay attached to surveys are only uploaded after a question has been answered
* fix: Increase display size of tap gesture
* fix: Start-up performance optimizations
## v2.17.8
* fix: Fix for survey closing on screen rotation.
## v2.17.7
* fix: Fix for bug that was keeping surveys displayed after the user tapped close.
## v2.17.6
* fix: Improve memory performance by recycling bitmaps, only start Session Replay when event tracked
## v2.17.5
* fix: update SURVEY\_CLOSED callback to provide initiator 'close.click' if dismissed by tapping out of study
## v2.17.4
* add: support for matrix questions
* fix: clear activity reference in onActivityPaused
## v2.17.3
* fix: application context fallback for WebView when activity context is unavailable
## v2.17.2
* add: reactFragmentActivity to configure method to better support React Native
## v2.17.1
* fix: Prevent web sdk reset on initial load
* chore: Improved internal logging
* chore: Update web sdk to 2.30.1
## v2.17.0
* add: Session Replay support
## v2.16.6
* chore: Update web sdk to 2.28.1
## v2.16.5
* fix: Escape single quotes in event names
## v2.16.4
* add: None of the Above question option for MCMS questions
## v2.16.3
* add: `x-ul-package-version` header to report mobile SDK plugin versions
* fix: Add network status listener to handle disconnects
## v2.16.2
* fix: reduce delay in subsequent survey presentations
* fix: hold weak reference to provided activity for improved memory management
## v2.16.0
* add: Add `dismissActiveSurvey()` function to dismiss any visible surveys
* add: Add a `QUESTION_ANSWERED` event that is emitted after the user answers a question
* chore: Update LICENSE
## v2.15.2
* fix: Improve right-to-left language formatting
## v2.15.1
* fix: Load `shouldDismissOnPageChange` before notifying listeners that the SDK is ready
* fix: Resolve race condition with `shouldDismissOnPageChange` when event is tracked before the SDK is ready
* fix: `setPreviewKey` was not working because of old web sdk version
* chore: Update web sdk to 2.24.4
## v2.15.0
* fix: Prevent a crash if loading the bundled JS fails. Only fixes the crash on Android 26+
* add: Add support for SDK event listeners
* add: Add `setPreviewKey` method deep linking
* chore: Update the test app to allow setting the user ID and properly log the user out
## v2.14.0
* add: Add a callback to `EventPayload` that allows surveys to be suppressed
* chore: Update web sdk to 2.24.0
## v2.13.1
* fix: Handle multiple events being tracked with \`dismissOnPageChange\`\` in user navigation
* chore: Update web sdk to 2.23.2
## v2.13.0
* add: Add support for \`dismissOnPageChange\`\` to not show surveys after navigation
* chore: Update web sdk to 2.21.7
## v2.12.1
* fix: Prevent the SDK from crashing when running on a known bad version of Chrome
* chore: Update web sdk to 2.21.6
## v2.12.0
* fix: Update the publishing action to use the correct publishing plugin
* add: Add new optional parameter to configure function
* chore: Update gradle plugin version to 7.2.0
* chore: Updated auto publishing steps in automation
* chore: Update web sdk version to 2.21.3
## v2.11.0
* fix: Prevent a crash when attempting to show a second survey with an initial survey still showing
## v2.10.0
* fix: Gracefully handle process death
* add: Optimizely Integration
* chore: Updated web sdk to 2.20.0
## v2.9.0
* chore: Updated web sdk to 2.19.5
## v2.8.0
* fix: Handle no callback provided on track event
* add: Support for required questions
* chore: Updated web sdk to 2.19.1
## v2.7.0
* add: Support event properties
## v2.6.10
* chore: Updated web sdk to 2.17.5
## v2.6.9
* chore: Updated Material and AppCompat libraries
## v2.6.8
* chore: Improved release automation
## v2.6.7
* fix: Check that activity is active before presenting survey
## v2.6.6
* chore: Updated web sdk to 2.17.2
## v2.6.5
* fix: Gracefully handle empty attributes
## v2.6.4
* add: Support for identifyAndSetVisitorAttributes
* add: Support Other Specify and rating scale questions
* chore: Updated web sdk to 2.17.1
## v2.6.3
* add: setPartnerAnonymousd, setVisitorAttributes and removeVisitorAttributes
* fix: Edge case where queued up function calls were being cleared near initialization
## v2.6.2
* chore: Updated web sdk to 2.16.20
## v2.6.1
* fix: Set webview background color to transparent
* fix: Reset webview after presenting a survey
* add: Handle device rotation
* chore: Removed coroutine dependencies
## v2.6.0
* chore: Updated LICENSE
* chore: Updated web sdk to 2.15.5
# Flutter Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/flutter-changelog
# SDK Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/index
Explore records of changes made to your specific Sprig SDK platform, including bug fixes, new features, etc.
Changelogs:
1. [Web Changelog](/docs/developer-center/sdk-changelog/web-changelog)
2. [Android Changelog](/docs/developer-center/sdk-changelog/android-changelog)
3. [iOS Changelog](/docs/developer-center/sdk-changelog/ios-changelog)
4. [React Native Changelog](/docs/developer-center/sdk-changelog/react-native-changelog)
5. [Flutter Changelog](https://pub.dev/packages/sprig_flutter_plugin/changelog)
6. [Segment iOS Changelog](https://github.com/UserLeap/analytics-swift-sprig/releases)
7. [Segment Android Changelog](https://github.com/UserLeap/analytics-kotlin-sprig/releases)
8. [Segment React Native Changelog](https://github.com/UserLeap/analytics-react-native-plugin-sprig/releases)
## Understanding SDK changelog urgency and impact
Sprig SDK release notes use three related signals so you can decide whether and how soon to upgrade:
| Signal | Answers | Where it appears |
| :- | :- | :- |
| **Recommended if you use** | Does this release affect me at all? | Once per release, directly under the version number (August 2026 onward) |
| **Upgrade urgency** | How soon should I upgrade? | Once per release |
| **Impact** | What happens if I stay on the old version? | On meaningful change bullets, and as a short summary on higher-urgency releases |
They often move together, but they are not the same. **Recommended if you use** describes who is affected. **Impact** describes the blast radius. **Urgency** describes when to act.
New features appear frequently. A new feature alone does **not** usually mean you must upgrade.
Here is where each signal appears on an SDK changelog:
1. **Recommended if you use** — who the release applies to, shown under the version number.
2. **Upgrade urgency** — Critical, High, or Low, shown once per release.
3. **Impact tag** — security, behavior, or performance, shown on the change it affects.
### Recommended if you use
Releases carry one **Recommended if you use** line under the version number, naming the features, question types, or integration surfaces that release touches. It is a filter, not a rating: if nothing in that line is part of your setup, the release almost certainly does not need your attention.
| Example line | Read it as |
| :- | :- |
| **Recommended if you use:** Session Replay | Only relevant if you have Session Replay enabled |
| **Recommended if you use:** Carry Forward, Validated Text questions, or Feedback studies | Relevant if any one of the three applies to you |
| **Recommended if you use:** Session Replay in SwiftUI apps on iOS 26 or later | Narrowed to a platform and integration method, not just a feature |
| **Recommended if you use:** all customers | No filtering; everyone should upgrade |
Pair it with urgency: the line tells you **whether** a release applies, and urgency tells you **when** to act on it.
This line is published on releases from August 2026 onward. Older releases do not carry it, so for those, fall back to the change bullets and impact tags.
### Upgrade urgency
Every release has one urgency rating. If a release includes several changes, the rating reflects the **most serious** change in that release.
| Urgency | Meaning | What you should do |
| :- | :- | :- |
| **Critical** | Security exposure; data loss or corruption; crash; a generally available feature fully broken | Upgrade as soon as practical |
| **High** | Incorrect survey logic or progression; host-app or host-page regression; a major feature broken for many customers | Upgrade in your next planned release window |
| **Low** | Visible defects with a workaround or a narrow blast radius; polish; opt-in or coming-soon features | Upgrade when convenient |
#### Examples
| Change | Urgency | Why |
| :- | :- | :- |
| XSS prevention on Button URLs | Critical | Security exposure |
| Consent/legal or Skip Logic evaluation corrected | High | Wrong questions may have been shown; collected responses may be affected |
| SDK overwrites host page body background | High (web embeds) | Can break styling on your site |
| Dependency updates with no practical embed exposure | Low | Hygiene; low need to act immediately |
### Impact tags
Impact tags highlight changes that affect **behavior, data quality, security, host integration, or noticeable performance**. Most changelog bullets have **no** impact tag. That usually means polish or presentation.
| Tag | Means the change involves… | Example |
| :- | :- | :- |
| `[impact: security]` | XSS, CSP, embed isolation, or actionable security dependency fixes | Prevent XSS for Button URLs |
| `[impact: behavior]` | Wrong survey flow; missing or wrong questions; response capture; host-app or host-page breakage; crashes | Consent/legal Skip Logic correction |
| `[impact: performance]` | Replay/heatmap performance, memory, battery, extra network calls, or UI freezes | Duplicate replay captures prevented |
| *(no tag)* | Spacing, alignment, hover states, copy, or presentation | Alignment of selection boxes in Multiple Choice |
Some releases also include a one-line **Impact** summary, for example:
**Impact:** Surveys with Skip Logic could advance incorrectly. This release corrects evaluation for consent/legal and Multiple Choice logic.
That sentence is written for **Critical**, **High**, and **Low** releases.
### Impact vs urgency
| | **Impact** | **Urgency** |
| :- | :- | :- |
| Question | What happens if I don’t upgrade? | How soon should I upgrade? |
| About | Nature of the change and the blast radius | When to act |
| Values | security / behavior / performance / none | Critical / High / Low |
The same change can matter differently depending on how you use the SDK:
* A body-background fix may be **High** for web page embeds, but less urgent inside a native WebView.
* A self-host packaging change may be **High** for customers who mirror SDK assets, and **Low** if you load from the Sprig CDN.
### New features
Sprig releases new functionality frequently, upgrade when you want to take advantage of improvements:
* Plain `add:` entries (new question types, capabilities marked coming soon, features you must enable) are usually **Low**.
* Upgrade for a feature when *you* want that capability, the timeline is up to you.
* If a release mixes a new feature with a meaningful fix, follow the **urgency** and **impact** of the fix.
### How to use this when upgrading
1. Scan **Recommended if you use** on releases newer than your current version, and skip the ones that name nothing you use.
2. Read **Upgrade urgency** on the releases that remain.
3. Skim **Impact tags** (security, behavior, performance) and the Impact summary on Critical and High releases.
4. Plan **Critical/High** upgrades into your next release window.
# iOS Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/ios-changelog
**How to read this changelog:** [Understanding SDK changelog urgency and impact](/docs/developer-center/sdk-changelog)
## v4.36.1
**Recommended if you use:** Surveys on iPad
* fix: Fix for survey layout issue when resizing the host app on iPad.
## v4.36.0
**Recommended if you use:** URL Prompt question type
* chore: Updated the bundled Web SDK to [v2.53.0](/docs/developer-center/sdk-changelog/web-changelog#v2-53-0), which carries survey enhacements into this release.
* add: \[impact: behavior] Added the ability to launch an in-app web browser for URL Prompt question types.
* add: Added new lifecycle event displayInAppBrowser which fires when the in-app experience is triggered.
## v4.35.0
**Recommended if you use:** survey lifecycle events
* chore: Updated the bundled Web SDK to [v2.51.0](/docs/developer-center/sdk-changelog/web-changelog#v2-51-0), which carries its survey and Session Replay fixes into this release.
* add: \[impact: behavior] Refactor of the survey lifecycle events for better accuracy with the addition of the new surveyReturned event, the removal of surveyWillPresent, a change to when the surveyAppeared emits and the addition of the new surveyDidNotAppear event.
* add: Passing the surveyId of the previous survey when a previosSurveyAvailable state is returned.
## v4.34.0
**Recommended if you use:** Session Replay in SwiftUI apps on iOS 26 or later
* add: Added SwiftUI support for text and image capture in session replays when running on iOS26 or above.
## v4.33.1
* chore: Updated WebSDK to v2.49.0.
## v4.33.0
* chore: Updated WebSDK to v2.48.2.
* add: questionAnswered lifecycle event added.
## v4.32.3
* chore: Changes to error logging.
## v4.32.2
* chore: Removed WebSDK logging.
## v4.32.1
* chore: Updated WebSDK to v2.46.1.
## v4.32.0
* chore: Updated WebSDK to v2.46.0.
## v4.31.0
* chore: Updated WebSDK to v2.45.0.
* fix: Fix for issue that was causing a white bar at the bottom of surveys when in dark mode.
* fix: Fix for survey height and animation issues.
## v4.30.0
* chore: Updated WebSDK to v2.44.0.
## v4.29.0
* chore: Updated WebSDK to v2.43.0.
## v4.28.0
* chore: Updated WebSDK to v2.42.1.
* add: Returning new previousSurveyReady survey state.
* add: Logging enhancements.
## v4.27.3
* add: Added additional survey state logging.
## v4.27.2
* add: Additional debug logging for surveys.
## v4.27.1
* fix: For for sliding surveys when the keyboard is displayed.
## v4.27.0
* chore: Updated WebSDK to v2.41.3.
* add: Updates to survey transition animations.
* add: Support for Display Logic.
## v4.26.2
* chore: Changed the minimum supported iOS version to 15.0.
## v4.26.1
* add: Survey animation enhancements.
* add: Updated WebSDK to v2.40.3.
## v4.26.0
* add: Support to pause and unpause surveys.
## v4.25.2
* add: Updated WebSDK to v2.39.3.
* add: Support for Conversational surveys.
## v4.25.1
* add: Updated WebSDK to v2.37.1.
* chore: Changed the mimimum supported iOS version to 16.0.
* fix: Fixed issue where backgrounds for tab bars and alert views did not display in replays for iOS26
## v4.25.0
* add: Updated WebSDK to v2.36.1.
* add: Support for new Rank Order question type.
* add: Response piping support.
* add: Removal of native modals coming from WKWebViews in Sprig replays.
* fix: Visual and stability improvements to the Sprig Replays experience.
* fix: Fix for surveys partially loading.
## v4.24.7
* add: Updated WebSDK to v2.34.0.
* add: Added the ability to capture SwiftUI text and images as images for Session Replays.
* add: Added the SDK version to the debug logging output.
* fix: Removed surveyDimensions lifecycle event that was not being emitted.
* fix: Change to the way images are fed to the video writer for Session replays rendering.
## v4.24.6
* fix: Fix for issue that prevented surveyClosed event from firing.
* fix: Fix for issue where SDK would crash if passed a non String, Int or Bool value in the properties of a track event call.
## v4.24.5
* fix: Fix for issue that was causing irregular survey height for initial question.
* fix: Fix for issue where surveys would become partially dismissed if the keyboard was initially showing.
* add: Made the SDK version available to host applications.
* add: Added the ability for host applications to subscribe to a logging event for more detailed messages from the SDK.
## v4.24.4
* fix: Changed logic in replays to only truncate text if it is masked.
## v4.24.3
* fix: Fix for issue where dismiss on page change was executed when the current view controller could not be retrieved.
* fix: Fix for issue where two track events in rapid succession could cause a survey to dismiss.
* fix: Fix for issue where a session replay could be stopped if the user quickly answered a question and then closed the survey.
## v4.24.2
* add: Uploading of partial session replay clips after capture has been stopped due to time on main thread exceeding the threshold.
## v4.24.1
* add: Added new trackAndPresent and present public functions that allow client apps to present surveys without passing in a view controller.
* add: Added retrying to configure the SDK when there is not initially connectivity.
* add: Added respecting of content mode for images in session replays.
* fix: Added masking of images captured by the device camera in session replays.
* fix: Fixed issue that was preventing the passed block from being called when calling trackAndPresent.
## v4.24.0
* add: Allow capturing of WKWebViews in session replays when unmasked.
* fix: Prevent potential retain cycle if track event is called but config is never called.
* fix: Fix for scenario where dismissing a second survey stops session replay capture triggered from an initial survey.
## v4.23.10
* add: Support for the new session replay privacy controls (basic / moderate / strict / mask classes / unmask classes).
* fix: Fix race condition which prevents surveys from displaying when calling presentSurvey after a delay
## v4.23.9
* fix: Fix for bug that was keeping surveys displayed after the user tapped the close button.
## v4.23.8
* fix: Fix for race condition that could potentially cause blank surveys.
## v4.23.7
* fix: Fix for session replays ignoring max duration value from server.
## v4.23.6
* fix: Fix for session replays rendering issue.
## v4.23.5
* add: Baseline support for SwiftUI in session replays.
## v4.23.4
* fix: Fixed issues with session replays.
## v4.23.3
* Interface fix
## v4.23.2
* add: Functionality for React Native iOS replays
## v4.23.1
* fix: Fix for threading issue triggered by config being called multiple times
## v4.23.0
* add: Support for accordion display matrix questions.
## v4.22.3
* add: Check for available disk space before initiating session replay.
## v4.22.2
* add: Support for rendering of server images in session replays.
* fix: Fix for crash when calling multiple SDK functions from background threads.
## v4.22.1
* add: Session Replay fidelity enhancements around tinting symbols and text layout.
## v4.22.0
* add: Stability and performance enhancements for Session Replays.
## v4.21.9
* fix: Support survey delays greater than 2 seconds due to WebView limitations
## v4.21.8
* fix: Added thread validation when calling track event.
## v4.21.7
* add: Replays: Added the ability to change SPS in the server config.
## v4.21.6
* add: Replays: Added the ability to mask views based on class names.
* fix: Replays: Stop touch capture on keyboard when displaying.
## v4.21.5
* add: Ability to turn off session replay capture.
* fix: Duplicate event listener callbacks fixed.
## v4.21.4
* add: Privacy Manifest.
* fix: Added logic to dimiss active survey if it is never presented.
## v4.21.3
* fix: Revert top level UIViewController check.
## v4.21.2
* fix: Small bug fixes.
## v4.21.1
* fix: Fix for endpoint issue.
## v4.21.0
* add: Session replays.
* fix: Prevent config from happening if it has already been called.
* fix: Escape single quotes in eventName.
## v4.20.2
* add: `x-ul-package-version` header to report mobile SDK plugin versions
* fix: set default `cssString` in getBackgroundColor to prevent regex match failing
## v4.20.1
* fix: Added missing JS files
## v4.19.2
* fix: calling track() from background thread would sporadically cause a SIGSEGV
* chore: still on web sdk 2.24.4
## v4.19.1
* fix: `setPreviewKey` was not working because of old web sdk version
* chore: update web sdk to 2.24.4
## v4.19.0
* add: add `setPreviewKey` interface method for customer to set previewKey via deep link
* fix: execution order of custom lifecycle event handlers
* fix: dismissOnPageChange event race condition for events fired before `sdkReady`
* fix: Webview bottom background color based on custom styles configured for survey
* chore: update web sdk to 2.24.2
## v4.18.0
* add: support for isOverride flag to allow overriding experiments while integrating with Optimizely
* add: support for survey lifecycle events
## v4.17.0
* add: added a showSurveyCallback to allow dynamically manage whether to show the survey or not
* fix: fixed a issue that results in a UI blocking routine introduced from 4.15.0
* chore: update web sdk to 2.24.0
## v4.16.0
* add: add integrateOptimizelyExperiments in the public SprigAPI
* chore: update to web sdk 2.23.2
## v4.15.0
* add: add dismissOnPageChange functionality to iOS
* add: add private interface methods for importing LaunchDarkly flag to variation index mapping
* chore: update to web sdk 2.23.0
## v4.14.0
* add: add additional interface for boolean and number types for setVisitorAttribute
* fix: fix an issue preventing scrolling after answering an open text question
* chore: update to web sdk 2.21.7
## v4.13.0
* add: Add new optional parameter to configure function
* chore: remove storage.swift
* chore: add ios legacy build automation
* chore: update to web sdk 2.21.3
## v4.12.1
* New EventPayload object to simplify calling track methods available for ObjC projects
* Allows public methods (excluding displaySurvey and other UI methods) to be called from a background thread
* Uses web 2.19.7
## v4.12.0
* New EventPayload object to simplify calling track methods
* Uses web 2.19.7
## v4.11.1
* Fixed an issue in text url prompt that prevents opening in external browser
## v4.11.0
* Added mobile trigger delay and optimizely integration
* Bug fixes and improvements
## v4.10.0
* Added required questions in the sdk
* Bug fixes and improvements
## v4.9.0
* Added event properties in the sdk
* Bug fixes and improvements
## v4.8.6
* Built using xcode 14. Bitcode is removed in xcode 14, please update your build environment for compatibility. Xcode 13 compatible builds will be available in a later release.
* Bug fixes and improvements
## v4.8.5
* Bug fixes and improvements
## v4.8.4
* Added a public api method trackAndPresentWithEventName that allows presenting survey immediately after tracking an event
* Bug fixes and improvements
## v4.8.3
* Added a public api method setVisitorAttributes that allows setting user id and partner anonymous id
## v4.8.2
* Added a public api method to track event with optional parameters userId and partner anonymous id
* Gracefully handle configure from being called multiple times
## v4.8.1
* Added an additional public api for setting the anonymous id from partner's integration
## v4.8.0
* Added support for new question types, functionalities and bug fixes
* removed presentDebugSurvey
* deprecated the NSNumber visitorIdentifier in preference to the String visitorIdentifierString
## v4.7.0
* license update
* bug fixes and improvements
## v4.6.0
* support SPM
## v4.5.0
* built sdk using xcframework
## v4.4.4
* fixed an sdk versioning issue that omitted the change in 4.4.3
## v4.4.3
* removed arm64 from excluded architecture to support simulator builds
## v4.4.2
* Fixed reported SDK version
* Security improvements
## v4.4.1
* Built with Xcode 13.0 (13A233)
## v4.4.0
* New Sprig namespace, you can now import and use the Sprig singleton
* Built with Xcode 12.5.1 (12E507)
## v4.4.0-beta
* New Sprig namespace, you can now import and use the Sprig singleton
* Built with Xcode 13.0 beta (13A5155e)
## v4.3.0-beta
* Built with Xcode 13.0 beta (13A5155e) which fixes the "Unable to use malformed module source info" build error
## v4.3.0
* Added support for text url prompt, a new question type that allows external link with informational title and body text.
## v4.2.1
* Fixes bug: When visitor id changes when a survey is in progress, the responses for that survey should be associated with the visitor id at the time the survey was delivered.
## v4.2.0
* Added support for multiple choice multi-select skip logic
## v4.1.1
* Bug fixes and improvements
## v4.1.0
* Added the ability to dynamically control the question text and thanks card text from dashboard settings
## v3.2.0
* Support visitorId as string type
* Improved network performance when app is backgrounded
## v3.1.1
* Included i386 architecture to framework
## v3.1.0
* Added setVisitorAttributes(\_ attributes: \[String: String]) which allows setting multiple attributes at a time, saving network round trips
* Added removeVisitorAttributes(\_ attributes: \[String])
## v3.0.0
* Updated UserLeap class to be visible to Objective-C projects
* UserLeap.visitorIdentifier type has been changed from Int? to NSNumber?
* Reachability class which was erroneously public is now private
* Calling UserLeap init() is no longer allowed, please access through the singleton shared method
## v2.3.3
* Build with Xcode 12A6163b
## v2.3.3
* Fixed bug with multiple choice routing logic
* Built with Xcode 12 beta 2, Swift 5.3
## v2.3.2
* Improved implementation of UserLeap.shared.setLocale()
## v2.3.1
* Added UserLeap.shared.setLocale() so clients can override static text localization
## v2.3.0
* Added localization for ja, ko, fr, ru, zh, de, hi
## v2.2.0
* Allow visitors to see and respond to the same survey if the customers wants (done through the dashboard)
## v2.1.0
* Added NPS question type support
## v2.0.0
* Change framework name to UserLeapKit so it doesn't conflict with class UserLeap
## v1.1.0
* Enabled Module Stability
* Added disableNetworkAccess parameter
## v1.0.2
* Bump, no changes
## v1.0.1
* Fixed: Presenting the debug survey before the SDK finishes initializing can cause non-main-thread UI operations
## v1.0.0
* The first version
# React Native Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/react-native-changelog
**How to read this changelog:** [Understanding SDK changelog urgency and impact](/docs/developer-center/sdk-changelog)
## v4.4.0
**Recommended if you use:** URL Prompt question type
* chore: Updated the bundled iOS SDK to [v4.36.1](/docs/developer-center/sdk-changelog/ios-changelog#v4-36-1) and Android SDK to [v2.30.1](/docs/developer-center/sdk-changelog/android-changelog#v2-30-1)
* add: \[impact: behavior] Added the ability to launch an in-app web browser for URL Prompt question types.
* add: Added new lifecycle event displayInAppBrowser which fires when the in-app experience is triggered.
## v4.3.0
**Recommended if you use:** survey lifecycle events
* chore: Updated the bundled iOS SDK to [v4.35.0](/docs/developer-center/sdk-changelog/ios-changelog#v4-35-0) and Android SDK to [v2.29.0](/docs/developer-center/sdk-changelog/android-changelog#v2-29-0)
* add: \[impact: behavior] Refactor of the survey lifecycle events for better accuracy with the addition of the new surveyReturned event, the removal of surveyWillPresent, a change to when the surveyAppeared emits and the addition of the new surveyDidNotAppear event.
* add: Passing the surveyId of the previous survey when a previousSurveyReady state is returned.
## v4.2.0
**Recommended if you use:** Session Replay
* chore: Updated the bundled iOS SDK to [v4.34.0](/docs/developer-center/sdk-changelog/ios-changelog#v4-34-0) and Android SDK to [v2.28.0](/docs/developer-center/sdk-changelog/android-changelog#v2-28-0), adding SwiftUI Session Replay capture on iOS 26 and wireframe replay recording on Android
## v4.1.1
* chore: Upgrade iOS SDK to 4.33.1
* chore: Upgrade Android SDK to 2.27.2
* fix: Fix for crash on iOS related to Sprig lifecycle events.
## v4.1.0
* chore: Upgrade to React Native New Architecture.
* add: Support for Sprig events.
## v4.0.0
* chore: Upgrade to React Native .85 and React 19.2.3.
## v3.3.0
* chore: Upgrade to React Native .83 and React 19.2.
## v3.2.1
* chore: Upgrade iOS SDK to 4.32.3
* chore: Upgrade Android SDK to 2.26.2
## v3.2.0
* chore: Upgrade iOS SDK to 4.32.2
* chore: Upgrade Android SDK to 2.26.1
## v3.1.0
* chore: Upgrade iOS SDK to 4.30.0
* chore: Upgrade Android SDK to 2.24.0
* Fix: Text not being reflected in session replays.
## v3.0.0
* chore: Update React Native to .81.
* fix: Removed support for lifecycle events.
## v2.21.0
* chore: Upgrade iOS SDK to 4.29.0
* chore: Upgrade Android SDK to 2.23.0
## v2.20.0
* chore: Upgrade iOS SDK to 4.27.3
* chore: Upgrade Android SDK to 2.22.1
## v2.19.2
* chore: Upgrade iOS SDK to 4.26.2
* chore: Upgrade Android SDK to 2.21.2
## v2.18.9
* chore: Upgrade iOS SDK to 4.25.2
* chore: Upgrade Android SDK to 2.19.5
## v2.18.8
* chore: Upgrade Android SDK to 2.19.3
## v2.18.7
* chore: Upgrade iOS SDK to 4.25.1
* chore: Upgrade Android SDK to 2.19.0
## v2.18.6
* chore: Upgrade iOS SDK to 4.24.7
* chore: Upgrade Android SDK to 2.18.4
## v2.18.5
* chore: Upgrade iOS SDK to 4.24.3
* chore: Downgrade Android SDK to 2.17.8
## v2.18.4
* chore: Upgrade iOS SDK to 4.24.1
* chore: Upgrade Android SDK to 2.18.0
## v2.18.3
* chore: Upgrade iOS SDK to 4.23.10
* chore: Upgrade Android SDK to 2.17.8
## v2.18.2
* chore: Upgrade iOS SDK to 4.23.7
* chore: Upgrade Android SDK to 2.17.6
## v2.18.1
* chore: Upgrade iOS SDK to 4.23.7
* chore: Upgrade Android SDK to 2.17.6
## v2.18.0
* add: Session replay functionality.
## v2.17.1
* fix: new arch crash
* chore: Upgrade iOS SDK to 4.23.0
## v2.17.0
* add: Matrix question support
* chore: Upgrade Android SDK to 2.17.4
## v2.16.2
* chore: Upgrade iOS SDK to 4.22.1
* chore: Upgrade Android SDK to 2.17.3
## v2.16.1
* chore: remove method overloads from Android code
* chore: Upgrade Android SDK to 2.17.2
## v2.16.0
* add: Session Replay support for React Native
* chore: Upgrade iOS SDK to 4.21.8
* chore: Upgrade Android SDK to 2.17.0
## v2.15.6
* chore: Upgrade iOS SDK to 4.21.4
## v2.15.5
* chore: Upgrade Android SDK to 2.16.5
* chore: Upgrade iOS to 4.21.1
## v2.15.4
* add: `x-ul-package-header` support for plugins
* chore: Upgrade Android to 2.16.4
* chore: Upgrade iOS to 4.20.1
* chore: Update LICENSE
## v2.15.3
* fix: Calling iOS track() from background thread would sporadically cause a SIGSEGV
* chore: Upgrade iOS to 4.19.2
## v2.15.2
* chore: Bumped because 2.15.1 was incorrectly published
## v2.15.1
* add: `setPreviewKey` method to enable test a study on React Native
* chore: Bumped iOS version to 4.19.1
* chore: Bumped Android version to 2.15.1
## v2.15.0
* fix: (ios) Fix an issue preventing scrolling after answering an open text question
* fix: (android) Prevent the SDK from crashing when running on a known bad version of Chrome
* fix: (ios) Fixed a issue that results in a UI blocking routine introduced from 4.15.0
* add: (ios) Add additional interface for boolean and number types for setVisitorAttribute
* add: (ios/android) Add `dismissOnPageChange` functionality to iOS and android
* add: (ios) Add private interface methods for importing LaunchDarkly flag to variation index mapping
* add: (ios) Add integrateOptimizelyExperiments in the public SprigAPI
* add: (ios) Added a showSurveyCallback to allow dynamically manage whether to show the survey or not
* add: Add a callback to `EventPayload` that allows surveys to be suppressed
* chore: Updated the example app to be able to depend on the local ios build
* chore: Bump ios version to 4.17.0 and Android version to 2.14.0
## v2.14.1
* chore: Improved release process
## v2.14.0
* chore: Improved release process
## v2.13.0
* chore: Updated iOS version to 4.12.1
* chore: Updated Android version to 2.9.0
## v2.12.1
* chore: Updated iOS Version to 4.11.1
## v2.12.0
* fix: Fix stringifying attributes
## v2.11.0
* chore: Updated iOS Version to 4.11.0
## v2.10.0
* add: Support event properties
* chore: Updated Android Version to 2.8.0
## v2.9.0
* chore: Updated iOS version to 4.9.0
* chore: Updated Android Version to 2.7.0
## v2.8.4
* add: Improved typings
## v2.8.3
* fix: More permissive react and react-native version peerDependencies
## v2.8.2
* chore: Updated iOS Version to 4.8.6
* chore: Updated Android Version to 2.6.10
## v2.8.1
* chore: Updated react-native peer dependency to 0.68.2
## v2.8.0
* chore: Updated react-native peer dependency to 0.67.4
## v2.7.0
* fix: Removed RCTBridgeModule.h import for expo compatibility
* chore: Updated Android Version to 2.6.0
## v2.6.0
* chore: Updated LICENSE
* chore: Updated iOS Version to 4.7.0
# Segment Android Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/segment-android-changelog
# Segment iOS Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/segment-ios-changelog
# Segment React Native Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/segment-react-native-changelog
# Web Changelog
Source: https://docs.sprig.com/docs/developer-center/sdk-changelog/web-changelog
**How to read this changelog:** [Understanding SDK changelog urgency and impact](/docs/developer-center/sdk-changelog)
## v2.54.0
* chore: Upgrade Session Replay recorder (@rrweb/record) to v2.1.4
* chore: Update dependencies to address security vulnerabilities
## v2.53.0
* add: Option to display links in-app instead of in the mobile browser for In-Product Surveys (coming soon)
* add: Setting for allowing backwards navigation in Surveys and In-Product Surveys (coming soon)
* add: Rich text formatting available for Thank you screens (coming soon)
## v2.52.0
* add: Images for response options in Multiple Choice Multi-Select questions (coming soon)
## v2.51.3
**Recommended if you use:** Default Dark mode theme
* fix: \[impact: behavior] Dark mode default text color
## v2.51.2
**Recommended if you use:** Carry Forward
* fix: Carry Forward polish
## v2.51.1
**Recommended if you use:** Session Replay
* fix: \[impact: performance] Session Replay memory leak for link\[rel="preload"] elements
## v2.51.0
**Recommended if you use:** Validated Text questions, Feedback studies
* add: Carry Forward functionality (coming soon)
* add: Validated Text question enhancements (coming soon)
* fix: Improve presentation of the Feedback button border
## v2.50.0
* add: Add new Validated Text question type (coming soon)
## v2.49.1
* add: Allow custom text for Conjoint question "None of the above" option
* fix: UI adjustments for Conjoint questions
## v2.49.0
* add: Conjoint question type (coming soon)
* add: Dark mode support (coming soon)
* fix: In-Product Survey border issue with host application CSS
## v2.48.2
* fix: Improve presentation of NPS and Likert questions that use stars or smileys
## v2.48.1
* fix: Update alignment of selection box in Multiple Choice Single and Multi-Select questions
* fix: Improve presentation of NPS and Likert questions on mobile
* fix: Adds border radius to images in questions
* fix: Improve disabled/hover button colors and shade
## v2.48.0
* add: Update layout and navigation of Surveys
* fix: "Other" error state in Multi-Choice questions
* fix: Fixes for the setting to hide custom branding on Surveys
* fix: Alignment for answer options when they go beyond 1 line in Multiple Choice questions
* fix: Moved the survey close button for In-Product Surveys to accommodate images
* fix: Conversation format minor visual fixes
## v2.47.0
* add: Support for Survey Quotas (coming soon)
* add: Support for Image in Question (coming soon)
* add: Option to hide branding on Surveys (coming soon)
* fix: Remove CTAs on answered questions in Conversation surveys
* fix: Matrix questions in Surveys now expand horizontally if space is available when on desktop
* fix: In-Product Surveys now advance correctly honoring both Display Logic and AI Follow-up questions
## v2.46.1
* fix: Body background color is not transparent for SDK
## v2.46.0
* add: Display optional persona text beneath questions in Conversational surveys
* add: AI Follow-up Questions added to Rating scale, Single select, Multi select, NPS, Matrix, Rank Order questions
* add: Skip Logic now available for questions that have AI Follow-up Questions attached
* fix: Increased font size for text inputs in Conversational Surveys
* fix: Placeholder for Display Logic questions with attributes in the side-by-side preview
* fix: Likert/Rating Scale question visual and usability issues
## v2.45.0
* add: Support for complex logic evaluation in Display Logic and Skip Logic
## v2.44.1
* fix: Matrix question accordian format - page jumping when user interacts with list
* fix: Mobile hover state for Rating Scale questions
* fix: Rating Scale question responsiveness
* fix: Conversation format - AI Follow-up question format for submitted Open Text questions
* fix: Conversation format - Input styling for "Other" option in Multiple Choice Multi-Select questions
## v2.44.0
* add: AI Dynamic Questions
* fix: Conversational format close button padding
* fix: "Powered by Sprig" footer padding on In-Product Surveys
* fix: Race condition for Session Replay scheduling
* chore: Update vulnerabilites in transient dependencies
## v2.43.0
* fix: Consent/legal Skip Logic check correction
* fix: Multiple Choice Skip Logic correction
* fix: Multiple Choice Display Logic for skipped values
## v2.42.1
* fix: Survey padding on wide monitors
* fix: Display Logic for AI Follow-up Questions
* fix: Send "previous survey ready" event instead of "no survey" event when a survey is open
* fix: Performance enhancements for AI Follow-up Questions
* chore: Update vulnerabilities in transient dependencies
## v2.42.0
* fix: Last question too close to the bottom in Long-Form Surveys with multiple questions on a page
* fix: Rank order not auto-advancing to next question Long-Form Surveys with multiple questions on a page
* fix: Preview mode for AI Follow-up Questions
* chore: Remove calls to `window` in `Sprig.configure`
## v2.41.3
* fix: Captcha footer overlaps with "Powered by Sprig" line
* fix: AI Follow-up Questions not always presented
## v2.41.2
* add: Translation for "Other" options placeholder text
* fix: Study preview behavior for In-Product Surveys
* fix: Endpoint for preview of AI Follow-up Questions in In-Product Surveys
## v2.41.1
* fix: Alignment of Video/Voice buttons in Conversational UI
* fix: AI Follow-up question type fix for preview.
* fix: Spacing for LFS surveys with prototype URLs for mobile.
## v2.41.0
* add: Display Logic for attributes and Long-Form Surveys
* add: Support for the new AI Follow-up question type
## v2.40.4
* add: Re-initialization for Dashboard Previews
* fix: Conversational UI not loading or reset in Previews
## v2.40.3
* fix: Rank Order Question footer for Conversational UI for Android
## v2.40.2
* fix: Global scope environment creep
* fix: Mobile specific SDK builds
## v2.40.1
* add: Display Logic for surveys
* fix: Fix survey height for missing question types
## v2.40.0
* add: Attribute Piping for In-Product Surveys and Feedback Studies
* add: Make Long-Form Survey footer on mobile non-sticky
* fix: Fix survey height race condition
## v2.39.4
* add: Display asterisk for required Long-Form Survey questions
* add: Support `addResponseGroupMeta` config that allows adding metadata before submits
* add: Support `enableCspTrustedTypes` config that allows compatibility with CSP trusted-types directives
* fix: Add support for Android Play and Apple App Store links in Text/URL questions
* fix: Layout and interactions for MaxDiff questions on mobile (Long-Form Surveys only)
* fix: Layout of Long-Form Surveys on mobile
* fix: Matrix question accordions now collapse correctly on desktop
* fix: Prototype url not visible on mobile due to insufficient bottom padding on mobile
## v2.39.3
* fix: Fix continue button for rank order question
## v2.39.2
* fix: Build new deployment
## v2.39.1
* fix: Drag and drop for Web, iOS, and Android web
* fix: Conversational UI matrix, consent, text/URL question type fixes
* fix: Minor conversational UI fixes
## v2.39.0
* add: Conversational Surveys for Long-Form Surveys, In-Product Surveys, and Feedback Surveys
* fix: skip logic question type comparison
## v2.38.1
* chore: new combined release of sprig browser and sprig bundled
## v2.38.0
* add: MaxDiff Question Type (Long-Form Surveys only)
* fix: Open Text button behavior for non-required questions in Long-Form Surveys
## v2.37.1
* fix: Skip logic optimization for Long-Form Surveys
## v2.37.0
* add: Validation logic to Multiple Choice Multi-Select questions
* fix: Session Replay performance improvement
## v2.36.1
* fix: Consent legal card response piping fix
* fix: Better tracking for clicks of non-html elements in heatmaps
* fix: Whitespace regex for response piping
* fix: Improvements for drag and drop experienece in rank order questions on mobile
## v2.36.0
* add: question response piping for all survey types
* fix: add footer to open text questions in Long-Form Surveys
* fix: moved footer for open text questions above button for In-Product Surveys
## v2.35.0
* add: New Rank Order question type support
* add: Visual enhancements for Rating Scale and Text/URL questions
* add: Configuration for outstanding IndexedDB transactions limit for fine-grained memory control in Session Replay
* add: Long-form survey support
* fix: Ensure matrix usability on various screen widths/configurations
## v2.34.0
* add: Support pause/resume session replay functionality
## v2.33.3
* fix: Fix uncaught ResizeObserver error on closing survey
* fix: Extraneous network calls should not be made from subsequent surveys
* fix: Remove console.error invocations when IndexedDB operations fail
## v2.33.2
* fix: displaySurvey was not working in some cases
* add: Support for recording cross origin iframes
## v2.33.1
* fix: Race condition uploading heatmaps on page change.
* fix: Prevent SDK from sometimes unnecessarily uploading empty always-on replays
## v2.33.0
* add: Always-on replay support
## v2.32.11
* fix: consecutive mc dropdown would freeze screen
* fix: Video response questions would size incorrectly
* fix: Heatmaps on MPA was not uploading after page navigation
## v2.32.10
* fix: Prevent XSS for Button URLs
* fix: Check for IndexedDB supported by browser
## v2.32.9
* add: New config setting forceDirectEmbed
* fix: Fix for using the sdk in a sandboxed iframe
## v2.32.7
* fix: Sizing issue in sandboxed iframed and after matrix questions.
## v2.32.6
* fix: Address sizing issue, make question body scrollable
## v2.32.5
* fix: Properly compare past URLs for sandboxed instances
* fix: Revert question restyling
## v2.32.4
* fix: Fix dev environment banner overlap, open text centering, close button alignment
## v2.32.3
* chore: Add logs to checkPendingHeatmapsUrl
* fix: Don't resend attributes already sent in existing session
* fix: Fix skipping unanswered multiple choice single select questions if it has "answered" skip-logic rules
* fix: Fixes issue with clicks not being recorded for some elements on mobile safari.
* fix: Make question body scrollable, fix header and footer positions
* fix: Upload ready Heatmaps on initialization
## v2.32.2
* fix: Use trackPageUrl provided URL for sandboxed installations
* fix: Remove deprecated Upchunk console warning
## v2.32.1
* fix: add webpackIgnore for dynamic replay library import
## v2.32.0
* add: Support for mobile web and accordion display matrix questions.
## v2.31.6
* chore: updates import of rrweb to use dynamic import and removes usage of window\.Sprig.replayNonce
## v2.31.5
* chore: Improve debugging logs
## v2.31.4
* fix: Handle missing survey id when creating iframe
## v2.31.3
* fix: Address some indexedDB quota issues
* fix: Don't emit survey.willClose if no survey is displayed
* add: survey.id to more survey lifecycle events
## v2.31.2
* fix: Enable DOM metric thresholds even when not sampling for reporting
* fix: Improve replay storage error capturing
* fix: Prevent resize observer infinite loop
## v2.31.1
* fix: Update style instead of creating a new element if one already exists
* fix: Use Promise.all in replay cleanup for wider compatibility
## v2.31.0
* add: Renamed IndexedDB table and adds new store indices
* fix: Return early in initialization of recording fails to start
* refactor: Replaces IndexedDB package and shrink bundle size by half
## v2.30.4
* add: New performance metrics
## v2.30.3
* fix: take full snapshot to minimize look-back in heatmaps
## v2.30.2
* fix: track seen event only when survey view is visible
* fix: removed open text aria-label, added describedby
* fix: improve nps and rating scale button semantics
* fix: update styling for mobile feedback button studies
## v2.30.1
* add: preview banner to call out when viewing a preview mode study
* add: replayLibraryURL and upchunkLibraryURL config options enabling self-hosted dependencies
* fix: metadata href returning empty string
* refactor: Separates replay module with its own entry point.
## v2.30.0
* fix: NPS question iframe height after Matrix question
* add: trackPageView sends URL to view
* add: Add heatmaps capture when object received from events
* add: Sprig\_Scroll custom replay event
## v2.29.0
* add: Add method to customize feedback surveys
## v2.28.1
* fix: View CSS should accept from product config instead of global value
## v2.28.0
* add: FeedbackButtonLoaded lifecycle event
* add: hideRecordPrompt option for Video & Voice questions
* fix: Memory leak when closing survey
* fix: Improve Feedback animation and UI
* fix: Rebuild replay Dexie approach, improve cleanup
* chore: Reduce size of the view bundle
## v2.27.0
* add: Support for multiple choice questions with dropdown
* add: Support for rich text headers, descriptions and open text footers
* add: Show feedback button when received from pageURL event
* add: Call events/batch if survey opened while event tracked
* add: Adds properties accessible to mobile sdks for metrics reporting
* fix: Stop logging error when window\.parent.Intercom is inaccessible
* fix: Live preview restarts on first question when survey finished/closed
* chore: Add size limit validator to the build process
## v2.26.6
* fix: Mark Intercom data argument optional
## v2.26.5
* add: Clean up custom event info for replay analysis
* fix: setAttribute types to match what Sprig accepts for attribute values
* chore: Improve sentry error reporting
## v2.26.4
* add: SDK performance metrics
* add: Timed code block metrics
* add: Replay killswitch from performance limits
## v2.26.3
* add: Adds SDK logging
* fix: Add back support for cjs exports
* fix: Responsive display in sandboxed iframe
* fix: Show gradient and arrow when matrix has columns offscreen
* fix: Handle undefined tagName
* chore: Allow local cdn configurations
## v2.26.2
* add: none of the above multiselect option support
* fix: Add bundled version to the headers for diagnostics
* fix: Check browser quota before collecting replay events
* fix: Update thank you card footer styling
* fix: Fix build issues
* fix: Fix mobile SDK scaling in preview
* fix: Add right padding to matrix questions
* chore: Strip un-needed code from the sprig bundled package
* chore: Adds replay config info to sdk events
* chore: Port tests to different testing framework
* chore: Remove old testing framework
* chore: Better error reporting
* chore: Shrink down size for the shim bundle
## v2.26.1
* fix: Retrieve parent href if available, or fallback to view frame href
## v2.26.0
* fix: Requests canceled before being resolved when survey has been finished
* fix: Make SDK window height and width have smoother transition inbetween cards
* fix: Do not save html attributes in replay data
* add: Adds more custom event info for replay analysis
* chore: Remove cjs exports for build
## v2.25.1
* fix: Undo view parent href change to fix link preview
## v2.25.0
* add: Add new Matrix question type card
* add: Support SVG elements in no code CSS selector events
* add: surveyId to SurveyPresented and SurveyAppeared payloads
## v2.24.11
* chore: Update LICENSE
## v2.24.10
* fix: Pass headers in \_completeSessionReplay
* fix: Do not send trackPageUrl events when no url events are configured
## v2.24.9
* fix: More improvements to RTL formatting
* fix: Add try-catch to replay recordCustomEvent
## v2.24.8
* add: Add support for previewing language translations if passed through the SDK config
* add: Improves formatting/layout of RTL languages
## v2.24.7
* fix: Prevent retries requests when prior SDK request violates CSP
* add: Update Sprig brand logos for free plans
## v2.24.6
* fix: revert "add rrweb & upchunk to the bundle"
* add: Add public function \_generateVideoUploadUrl to allow mobile to generate URL
* add: Add public function \_completeSessionReplay to allow mobile to send completed mobile session replays
* add: Return surveyId and responseGroupUid after displaying questions
## v2.24.5
* chore: add rrweb & upchunk to the bundle
## v2.24.4
* fix: Fixes error from tracking custom events without recording active
* fix: QuestionAnswered event wasn't emitting because we weren't using the internal binded event emitter
* add: Exposes trackPageView function for triggering no-code events
* chore: Fix trackPageView error stacktrace and send page view storage in extraInfo parameter instead
## v2.24.3
* fix: Fixes bug with corrupted replays in Chrome when duplicating tabs
* fix: Fixes bug that caused replays to lose up to the most recent 30 seconds of data.
* fix: Improve accuracy of replay durations
* fix: During survey dismiss, remove survey container from its parent node, instead of document body
* chore: Add skip button css for voice + video skip button
* add: Pass userAgent info along with replay
* add: Inject custom sprig events into replay
* add: Upload replay events for IPS after question has been answered
* add: Emits question and its response after question submission
## v2.24.2
* fix: improved showSurveyCallback to send tracked events during the callback to the batch endpoint
* chore: centered text prompt question card to center buttons
* chore: updated the build/release process to upload source-maps to sentry
## v2.24.1
* fix: prevent additional pendingCaptures while waiting
* fix: batch events fetch to reduce memory load
* fix: catch uncaught transaction errors
* chore: updated testing env to test replay image capture
## v2.24.0
* fix: add and remove event listener for survey fading out
* add: Accepts new skip logic format
* add: New comparator types for mcss, mcms, and open text questions
## v2.23.6
* fix: wrap deletes and chunkUpload fetch in transactions
## v2.23.5
* fix: block reporting specific errors, return earlier in initializeReplay
## v2.23.4
* fix: remove non-actionable error report of storage init failure
## v2.23.3
* fix: capture failures when initializing indexedDB for replayStorage
* fix: delete previous db if found
## v2.23.2
* fix: send previewKey during /history and /submit endpoint calls
* fix: use Dexie for IndexedDB interactions, update tests
## v2.23.1
* fix: Add catches to indexDB interactions
* add: Accept Optimizely client to add notification listener
## v2.23.0
* fix: Renames rrweb script
* fix: Fixes shorter-than intended recordings
* add: Send replayDuration on replay upload
* add: Ability to integrate LaunchDarkly with Sprig SDK
* add: Track events with LaunchDarkly metadata, if integration is enabled
* add: Adds storage usage information to error reports
* add: Support for "after" and "before and after" replay captures
## v2.22.4
* fix: Prevent uploads of replays below duration threshold
* fix: Improves usage of indexedDB storage for replay info. Better handles storage limit errors
* add: Attempt to compress replays before uploading
## v2.22.3
* fix: Prevent uploads of replays below duration threshold
* fix: Fix whitespace calculation to include border and margin space
* fix: Emit the calculated height instead of the client height on SURVEY\_HEIGHT event
* fix: fix an issue when selector is invalid and sdk fails to process the no code events
## v2.22.2
* fix: Fix negative whitespace calculation for frame height
## v2.22.1
* fix: Improve performance of replay capture
* fix: Clear replay data when user logs out or visitor ID changes
* add: Add Electron support to open external url based on user's default browser
## v2.22.0
* fix: Handle invalid regex gracefully
* fix: Prioritize locally set config over dashboard provided config
* add: Session Replay: Controller and network/upload module. replaySettings config object. Capture session.
* add: Ability to test a new or draft study's trigger logic
* add: Add Electron support to open external url based on user's default browser
## v2.21.7
* fix: Prevent unintentionally skipping question if user cancel screen or AV permission mid-question
* fix: Set properties like UPDATES synchronously in sprig initialization
* fix: Handle invalid regex gracefully
## v2.21.6
* fix: Prevent share screen button to be clicked on multiple times
* add: Enable optional survey callback function when tracking events for an eligible survey to determine whether or not survey should be shown to visitor
* add: Add skip button on Start Task page for recorded tasks if the question is optional
## v2.21.5
* fix: Update typings generation to handle external modules
* chore: Cleaned up some browser package descriptions
* chore: Improve typings generation and validation
## v2.21.4
* fix: Updated typings for Sprig.dismissActiveSurvey() call to allow for no arguments
* fix: Fixed typings for previewSurvey and added fix for module resolution NodeNext
## v2.21.3
* fix: Progress bar on surveys was incorrect in some situations
* chore: skip rc tag creation if the release tag is already public
* chore: CSP blocked websocket / devserver connection which disable hot reloading
* chore: update the release merge to main process to run only when there's newer diffs than dev
* chore: added LICENSE.md and CHANGE\_LOG.md to sprig-browser as a build step
## v2.21.2
* chore: Cleaned up android automation errors and outdated files
* chore: Updates to build and release automation
* chore: Removed redundant styles.css file
## v2.21.1
* fix: styles.css was missing
## v2.21.0
* fix: Progress bar indicator showed incorrect progress
* fix: Consent legal red highlight did not show
* fix: "View Document" button missing on mobile surveys
* fix: Link preview wasn't showing properly
* add: Allow Text URL question type to have skipped button customized text
* chore: Periodically check for webcam/audio permissions when applicable
## v2.20.1
* fix: "Seen" event was not being sent which affected resurvey window
## v2.20.0
* add: UI framework rewritten to Preact 10.11.2 (from Hyperapp)
## v2.19.7
* fix: Check Optimizely.get() function is defined before invoking
## v2.19.6
* fix: When SDK is disabled, should return a valid config object
## v2.19.5
* fix: Surveys were not showing for NPM installs because of a faulty event listener
## v2.19.4
* fix: Pressing the spacebar was toggling Other:specify question types
## v2.19.3
* fix: When a survey with a delay is delivered, use the events/batch endpoint so subsequent events do not trigger surveys
## v2.19.2
* add: Support nonce for style tags
## v2.19.1
* fix: Voice & Video skip logic wasn't working because of faulty comparison
## v2.19.0
* add: Support required questions
## v2.18.3
* add: If enabled, read the Optimizely singleton and include experiments when tracking events
## v2.18.2
* fix: Provide default for event properties
## v2.18.1
* chore: Include preview mode in request headers
## v2.18.0
* add: Support event properties
## v2.17.5
* fix: Improve ontouchstart and ontouchend handling for multiple select options
## v2.17.4
* fix: Add wordbreak for very long words
* fix: Remove height restriction for multiple choice questions with lots of options
## v2.17.3
* fix: Likert number turned white on Safari browser after completing a likert star question
## v2.17.2
* fix: Prevent touchend() from being called twice which skipped a question on Android
## v2.17.1
* fix: Remove visual flicker in select components
* chore: Remove unused import
## v2.17.0
* add: Support for 'Other' options with text entry for single-select and multi-select questions
## v2.16.28
* add: Support likert question with stars and smiley labels
## v2.16.27
* fix: Recorded tasks events were not being emitted for websurveys
## v2.16.26
* fix: Properly destroy event listeners to better support multiple surveys showing in a single session
## v2.16.25
* add: Allow text entry for Consent/Legal questions
## v2.16.24
* fix: Revert change that made select box in Consent/Legal questions not selectable
## v2.16.23
* add: Allow Option (Specify) to be configurable
* chore: Disable error reporting with response JSON parsing fails
## v2.16.22
* chore: Automatically convert attributes with email key to !email
## v2.16.21
* add: Support 7-pt likert and more options
## v2.16.20
* add: Height update notification to event listeners
## v2.16.19
* fix: SDK installed via NPM had incorrect document heights
* add: Github actions support for deploying SDKs
## v2.16.18
* fix: Reset scroll position when moving to next question
* add: Internal SURVEY\_COMPLETED event for event listeners
## v2.16.17
* add: `showQuestionIdx` int into SDK config to show a specific question index (if exist)
* add: `useDesktopPrototype` boolean into SDK config to use the desktop version of embedded questions for link/email platforms
## v2.16.16
* fix: Transitioning from a "Screen only" permissions question to a "Screen + Audio" permission wasn't being detected properly
* fix: Stream wasn't terminating properly when going from a "Screen + Audio" to a "Screen + Audio + Video" question
## v2.16.15
* chore: Add `npm install` to build script
## v2.16.14
* fix: Autosizing of open text questions wasn't working properly on NPM installs
## v2.16.13
* fix: Wrong questionId was being passed to video player event listeners during response submission
* add: "View Prototype" button to recorded question type
## v2.16.12
* add: Upload spinner for video uploads
* add: Show permissions request when permissions type changes between questions
## v2.16.11
* fix: avStream wasn't stopping when it was the last question
* fix: Record UUID was not being updated properly
* fix: Subsequent recording questions weren't working
* fix: Various polishes and tweaks
## v2.16.10
* fix: Skip logic for recorded task when user gives up
## v2.16.9
* fix: Text entry boxes would lose focus shortly after being displayed
## v2.16.8
* fix: Video codec issue that was not working on safari/firefox
* fix: Video permission screen state transition now will skip to the next page for audio only, and will always show the video preview even if permission is previously given
* add: Upload card before thank you card when videos are uploading
* add: "Try again" button for retry permissions
## v2.16.7
* fix: Skip logic for multiple choice questions wasn't working
## v2.16.6
* fix: Addressed several issues with consecutive recorded task states
* add: Recorded task now can record and uploads multiple tasks with different permission settings
## v2.16.5
* add: Internal events for recorded task permission screen and recorded task start
## v2.16.4
* add: Log analytics events for video recorder
## v2.16.3
* fix: Add passthrough data to provide required fields
* fix: Fix check for video tracks
# Features by SDK Versions
Source: https://docs.sprig.com/docs/developer-center/sprig-sdk/features-by-sdk-version
## SDK Overview
Ensure that the Sprig SDK is up to date to take advantage of new features and bug fixes
**Note:** In the case of mobile SDKs, your end-users will need to update to the version of your mobile app that includes the SDK with the Sprig functionality you want to be available. Usually this means that you will need to release an updated version of your app on the Apple App Store or Google Play.
For more details about what's included in each version, see our [SDK Changelogs](https://docs.sprig.com/docs/developer-center/sdk-changelog/index).
## Features and SDK Versions
Not all product updates require updating SDKs but certain functionality, especially related to Replay recording, question types, and the survey-taking experience, usually does.
#### SDK Versions by Feature
Make sure to scroll to the right to see all major SDK types.
| Feature | Date | Web SDK | iOS SDK | Android SDK | React Native SDK | Flutter |
| :- | :- | :- | :- | :- | :- | - |
| Use in-app browser for links | Sept 2026 | v2.53.0 | v4.36.0 | v2.30.0 | Coming soon | Coming soon |
| Rich text on thank you cards | Sept 2026 | v2.53.0 | v4.36.0 | v2.30.0 | Coming soon | Coming soon |
| Carry Forward | Aug 2026 | v2.51.0 | v4.35.0 | v2.29.0 | v4.3.0 | 0.10.0 |
| Validated Text | Aug 2026 | v2.51.0 | v4.35.0 | v2.29.0 | v4.3.0 | 0.10.0 |
| Built-in Dark Mode (default CSS) | July 2026 | v2.49.0 | v4.33.1 | v2.27.2 | v4.33.1 | v0.9.1 |
| Image in Question | June 2026 July 2026 (mobile) | v2.48.0 | v4.33.0 | v2.27.0 | v4.1.1 | v0.8.0 |
| Updated question styling for Surveys, Feedback studies, and IPS | June 2026 July 2026 (mobile) | v2.48.0 | v4.33.0 | v2.27.0 | v4.1.1 | v0.8.0 |
| AI Follow-ups for more question types | June 2026 | v2.46.0 | v4.32.0 | v2.26.0 | v3.2.0 | v0.8.0 |
| Updated Conversation format styling | June 2026 | v2.46.0 | v4.32.0 | v2.26.0 | v3.2.0 | v0.7.0 |
| Complex Display Logic | May 2026 June 2026 (RN) | v2.45.0 | v4.31.0 | v2.25.0 | v3.2.0 | v0.7.0 |
| AI Dynamic Questions | April 2026 | v2.44.0 | v4.30.0 | v2.24.0 | v3.1.0 | v0.6.0 |
| AI Follow-up Questions | February 2026 | v2.41.0 | v4.27.0 | v2.22.0 | v2.20.0 | v0.4.0 |
| Display Logic | February 2026 | v2.41.0 | v4.27.0 | v2.22.0 | v2.20.0 | v0.4.0 |
| Attribute Piping | Jan 2026 (web) Feb 2026 (mobile) | v2.40.0 | v4.26.1 | v2.21.0 | v2.19.2 | v0.3.1 |
| Conversational Surveys | November 2025 | v2.39.1 | v4.25.2 | v2.19.4 | v2.18.9 | - |
| Validation for Multi-Select | October 2025 | v2.37.0 | v4.25.0 | v2.19.0 | v2.18.7 | - |
| Response Piping | Sept 2025 (web) Oct 2025 (mobile) | v2.36.0 | v4.25.0 | v2.19.0 | v2.18.7 | - |
| Rank Order Questions | Sept 2025 (web) Oct 2025 (mobile) | v2.35.0 | v4.25.0 | v2.19.0 | v2.18.7 | - |
| Always On Replays | Mar 2025 | v2.33.0 | Not supported | Not supported | Not supported | Not supported |
| Survey Card Styling Updates | Nov 2024 | v2.32.4 | v4.23.1 | v2.17.5 | v.2.18.1 | - |
| Matrix Accordion | Oct 2024 | v2.32.0 | v4.23.0 | v2.17.4 | v2.17.0 | - |
| Mobile Session Replays | Aug 2024 (iOS/Android) Dec 2024 (RN) | N/A | v4.22.2 | v2.17.6 | v2.18.0 | Not supported |
| Heatmaps GA | Sept 2024 | v2.30.3 | Not supported | Not supported | Not supported | Not supported |
| CSS Styling (Feedback) | Late May 2024 | v2.29.0 | Not supported | Not supported | Not supported | Not supported |
| Study Creation Improvements | May 2024 | v2.28.0 | v4.21.7 | v2.16.6 | v2.16.0 | - |
| Feedback Studies | April 2024 | v2.27.0 | Not supported | Not supported | Not supported | Not supported |
| None of the Above (Multi-Select) | January 2024 | v2.26.2 | v4.20.2 | v2.16.3 | v2.15.4 | - |
| Replay Analysis | January 2024 | v2.26.0 | Not supported | Not supported | Not supported | - |
| Matrix Questions | January 2024 | v2.25.1 | Not supported | Not supported | Not supported | - |
| Test a Study | June 2023 (web) Oct 2023 (mobile) | v2.22.0 | v4.19.1 | v2.15.0 | v2.15.2 | - |
| Advanced Skip Logic | July 2023 | v2.24.0 | v4.17.0 | v2.14.0 | v2.15.0 | - |
| Replay "Before/After" | May 2023 | v2.23.0 | Not supported | Not supported | Not supported | - |
| Session Replay | April 2023 | v2.22.0 | Not supported | Not supported | Not supported | - |
| Mobile Trigger Delay | October 2022 | N/A | v4.11.0 | v2.9.0 | v2.12.0 | - |
| Required Questions | October 2022 | v2.19.1 | v4.10.0 | v2.8.0 | v2.10.0 | - |
| Event Properties | October 2022 | v2.18.2 | v4.9.0 | v2.7.0 | v2.10.0 | - |
| Rating Scale | September 2022 | v2.17.3 | v4.8.5 | v2.6.4 | v2.8.0 | - |
| Other (Specify) Option | August 2022 | v2.17.0 | v4.8.5 | v2.6.4 | v2.8.0 | - |
| Recorded Task Question | May 2022 | v2.16.0 | Not supported | Not supported | Not supported | - |
| "Skipped" Skip Logic | April 2022 (web) Aug 2022 (mobile) | v2.15.14 | v4.8.5 | v2.6.1 | v2.8.0 | - |
| Consent/Legal Question | April 2022 (web) Aug 2022 (mobile) | v2.15.10 | v4.8.5 | v2.6.1 | v2.8.0 | - |
| Enrich URL Prompts | March 2022 (web) Aug 2022 (mobile) | v2.15.2 | v4.8.5 | v2.6.3 | v2.8.0 | - |
| Video & Voice Question | August 2022 | v2.2.4 | Not supported | Not supported | Not supported | - |
| Text/URL Prompt | June 2021 | v1.13.1 | v4.3.0 | v2.3.0 | v2.4.0 | - |
| Multi-select Skip Logic | March 2021 | v1.11.0 | v4.2.0 | v2.2.0 | v2.2.0 | - |
| Customized Description | February 2021 | v1.8.0 | v4.1.0 | v2.1.2 | v2.1.3 | - |
| Customized Continue Button | February 2021 | v1.8.0 | v4.1.0 | v2.1.2 | v2.1.3 | - |
| Open Text Placeholder | February 2021 | v1.8.0 | v4.1.0 | v2.1.2 | v2.1.3 | - |
| Customized Thank You Card | February 2021 | v1.8.0 | v4.1.0 | v2.1.2 | v2.1.3 | - |
| NPS Question Type | July 2020 | v1.3.0 | v2.1.0 | v1.1.0 | v1.1.0 | - |
## Upgrading SDKs
We adhere to [Semver](https://semver.org/) for versioning our SDKs so upgrading between minor versions or patches (e.g. 2.0.0 -> 2.1.0 or 3.1.0 > 3.2.1) should not present any breaking changes. You can view the release logs [here](/docs/developer-center/sdk-changelog/index)
## How do I upgrade my Sprig SDK to the latest version?
If you installed with [HTML](/docs/Installation/introduction-web/web-javascript), Segment, or Google Tag Manager your SDK will be automatically upgraded.
For [npm and Yarn](/docs/account-and-settings/team-management-roles/products-and-environments) install methods, reach out to your development team to upgrade the SDK to the latest version. Please note that if utilize additional [Products and Environments](/docs/account-and-settings/team-management-roles/products-and-environments) you will need to update the in each place that the SDK is installed.
Mobile SDK installs, including [iOS](/docs/Installation/introduction-mobile/ios-sdk-installation), [Android](/docs/Installation/introduction-mobile/android-sdk-installation/index) and [React Native](/docs/Installation/introduction-mobile/react-native-module), will require developer help to upgrade versions. Additionally, if bundled with an app store release, users will need to update to the latest version of\_your companies mobile application\_ in order to be eligible for a Sprig survey (or Replay) that requires a minSDK version.
# Sprig SDK
Source: https://docs.sprig.com/docs/developer-center/sprig-sdk/index
In this section, you can review Sprig SDK information such as:
* [Reviewing SDK versions and traffic](/docs/developer-center/sprig-sdk/sdk-traffic)
* [Features by SDK versions](/docs/developer-center/sprig-sdk/features-by-sdk-version)
* [Sprig's SDK end of life (EOL) policies](/docs/developer-center/sprig-sdk/sdk-end-of-life-eol-policy#overview)
# SDK End of Life (EOL) Policy
Source: https://docs.sprig.com/docs/developer-center/sprig-sdk/sdk-end-of-life-eol-policy
*Effective as of November 5, 2023*
## Overview
Keeping your Sprig SDK updated to the latest version ensures that you have access to all of Sprig’s newest features, bug fixes and security patches.
Sprig will support an SDK for 18 months after initial release date, after which the SDK will be deprecated and your ability to target users, conduct in product Surveys, or record Replay clips may be impacted.
Generally, if Sprig is installed into your application via Javascript, Google Tag Manager, or Segment, your SDKs will automatically update to the latest version. npm/yarn or native mobile installs will likely require your development team to manually upgrade to the newest SDK version - often this change takes only takes a few minutes, plus any testing and QA.
## SDK Deprecation
All SDKs will be deprecated 18 months after the initial release date. This policy applies 18 months from the release date for any major or minor version change.
* All users with Admin or Developer [roles](/docs/account-and-settings/account-and-login/index) will receive proactive in-app and email alerts stating that their SDK will be no longer supported
* Deprecated SDK version may be blocked from connecting to the service resulting in the inability to route visitor data to Sprig, or inhibit the ability to send Surveys to visitors or record Replay clips
At the time of a new release, Sprig will update the changelog to reflect what was modified.
## Critical SDK Upgrade
In the case that Sprig must release a new SDK version in order to remediate security and/or data protection or loss issues, a **critical** SDK upgrade may be necessary.
If a critical upgrade is required for an SDK, the old versions will be immediately deprecated at the time of release of the new version. A critical SDK upgrade will be limited to changes that are required to remediate security and/or data protection or loss issues.
* All users with Admin or Developer [roles](/docs/account-and-settings/account-and-login/index) will receive proactive in app and email alerts stating that their SDK will be no longer supported
* Additionally our support teams will proactively work with all impacted teams until resolved
# SDK & Traffic
Source: https://docs.sprig.com/docs/developer-center/sprig-sdk/sdk-traffic
See most recent SDK releases & visitor traffic by SDK version in app
## Overview
Sprig has in-app functionality to help you understand what Sprig SDK version your users have loaded on their device or browser. This information helps admins and developers determine the visitor traffic that might be impacted by a Sprig SDK that has reached end of life, or that won't have access to recent feature releases. See [SDK Versions by Feature](https://dash.readme.com/project/userleap/v6.0/docs/debugging) for more details.
As a reminder, **if Sprig is installed into your application via Javascript, Google Tag Manager, or Segment, your SDKs will automatically update to the latest version**. npm/yarn or native mobile installs will likely require your development team to manually upgrade to the newest SDK version - often this change takes only takes a few minutes, plus any testing and QA.
Keeping your Sprig SDK updated to the latest version ensures that you have access to all of Sprig’s newest features, bug fixes and security patches.
## SDK Version Table
SDK Traffic Tables display SDK initializations detected for Sprig and the associated visitor traffic by SDK version, by Product. In other words, these tables show the version of the Sprig SDK that end users have loaded on their device or browser.
Distribution is calculated as % of traffic with an SDK initialized over a 24 hour period, by platform, by product:
## Current SDK Releases
Easily see a list of Current SDK Releases, by platform and installation method.
For more details, visit the [SDK Changelog](/docs/developer-center/sdk-changelog/index)
# Enabling Dark Mode
Source: https://docs.sprig.com/docs/developer-center/styling/dark-mode
Sprig In-Product Studies can ship with a default dark appearance: turn it on and a respondent's study matches whatever light or dark setting their device or browser is using. It's a self-serve, product-wide setting in your Sprig team's settings. This is separate from writing your own `prefers-color-scheme` CSS, which you could always do (and still can on top of it). This page covers how the default works, how to brand it, and how it interacts with your custom CSS.
Already have your own `prefers-color-scheme` CSS covering dark mode? **Don't enable this toggle.** It loads Sprig's own dark stylesheet underneath your custom CSS, and that stylesheet applies everywhere you haven't explicitly overridden a Sprig selector or variable. Any element your own CSS doesn't already cover can pick up Sprig's default dark colors instead of staying in light mode.
This toggle is best used to start from scratch, utilizing Sprig's default styles as the baseline.
Default CSS dark mode shipped in Web SDK v2.49.0, and studies rendered in a mobile SDK need a version built against it: see [Minimum SDK versions](#minimum-sdk-versions) below.
## Turning it on
Only Admins and Developers can modify survey appearance. Go to Settings > Surveys > Look & Feel and switch on **Enable Default Dark Mode CSS**. This one toggle covers both surfaces: turning it on here enables the default dark theme for Feedback studies alongside In-Product Surveys.
Same story for the Brand Color fields below, set once in Surveys > Look & Feel and they apply to Feedback too. Custom CSS is the one thing that stays separate: to override built-in styles for Feedback specifically, use its own editor at Settings > Feedback > Look & Feel > CSS.
Once the toggle is on, a second **Brand Color** field appears for dark mode next to the existing light mode one. Each drives the `--sprig-brand-color` variable in its mode, controlling the default survey border, button background, radio fills, and other accent details, no CSS required.
## How it works
Sprig loads a second stylesheet that responds to the respondent's operating system or browser appearance setting via the standard CSS media query:
```css theme={null}
@media (prefers-color-scheme: dark) {
/* Sprig's dark palette */
}
```
Once enabled, there's no per-survey switch and no toggle inside the survey itself. Every respondent gets whichever version matches their own device or browser setting, instantly, on their end.
Sprig's styles are built on CSS custom properties (variables). The light values are declared once, and the dark stylesheet re-declares the same variable names with dark values. Every Sprig selector reads from those variables, so changing one variable updates every place that color is used.
```css theme={null}
/* Light (always loaded) */
html {
--background-color: #fff;
--text-color: #2f2e2c;
}
/* Dark */
@media (prefers-color-scheme: dark) {
:root {
--background-color: #1c1c1e;
--text-color: #fff;
}
}
```
### Load order and specificity
How the CSS is applied:
1. Your custom CSS is injected after Sprig's stylesheets. Your rules win at equal specificity. You do not need `!important` for ordinary overrides.
2. Sprig's dark values are declared on `:root`, not `html`. Since `:root` has higher specificity than `html`, a variable you set on `html` will apply in light mode but be overridden by Sprig in dark mode.
The commented reference block in the CSS editor is light-mode only: a snapshot of Sprig's selectors with hardcoded light colors, no variables or dark palette listed. Use the [variable reference](#css-variable-reference) below when you're working on dark mode.
## Choosing an approach
| Goal | Best when | Effort | Approach |
| :- | :- | :- | :- |
| **Set your Brand Color fields** | You only want to set Sprig's accent color for dark and light mode. No other custom styles. | None | [Study Style settings](/docs/sprig-studies/in-product-surveys/microsurvey-look-and-feel#study-style) |
| **Do nothing (CSS)** | Your customizations are structural (spacing, radius, font, layout) and don't set colors. | None | Approach 1 |
| **Override selectors directly** | You want plain CSS with no variables, or you're only restyling a few elements. | Low | Approach 2 |
| **Override Sprig's variables** | You want Sprig's dark behavior, just in more of your brand colors than the Brand Color fields cover. | Low | Approach 3 |
| **Define your own tokens** | You have a real design system with light/dark pairs to mirror. | Medium | Approach 4 |
Variables are a convenience, not a requirement: because every Sprig selector reads from them, changing one value updates everywhere that color is used. A plain `@media (prefers-color-scheme: dark)` block with ordinary selector overrides works just as well, and is often clearer for a handful of elements. Use whichever fits your stylesheet.
### Approach 1: Do nothing (color-free customizations)
If your custom CSS only changes layout, spacing, typography, or border radius, it already works in both modes. Sprig's colors keep flowing through the variables.
```css theme={null}
/* Safe in both light and dark: no color declarations */
.ul-card__container--desktop {
border-radius: 12px;
box-shadow: none;
padding: 24px;
}
.ul-question {
font-family: 'Inter', sans-serif;
font-size: 20px;
font-weight: 700;
}
```
A hardcoded color applies in both modes. `.ul-question { color: #1f2937; }` means dark text on Sprig's default dark card. Pair a foreground color with its matching background, or move both into variables.
### Approach 2: Override selectors directly
No variables involved. Write your light-mode rules as usual, then re-declare whatever needs to change inside a `@media (prefers-color-scheme: dark)` block. Your custom CSS is injected after Sprig's, so at equal specificity your rules win in both modes.
```css theme={null}
/* Applies in both modes */
.ul-card__container {
border-radius: 12px;
}
.ul-question {
color: #1f2937;
}
.ul-card-text__button {
background-color: #0075de;
color: #ffffff;
}
/* Dark only */
@media (prefers-color-scheme: dark) {
.ul-card__container {
background: #252525;
border-width: 0;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.35);
}
.ul-question {
color: #ffffff;
}
.ul-caption {
color: #9b9a97;
}
.ul-card-text__button {
background-color: #0075de;
color: #ffffff;
}
}
```
A selector you override only affects that selector, unlike a variable. Step through every question type in both light and dark mode before saving.
### Approach 3: Override Sprig's variables
The lowest-effort way to brand both modes. Set Sprig's own variable names on `:root` for light, then re-declare the ones that need to change inside a dark media query. Every Sprig selector picks the new values up automatically.
```css theme={null}
/* Light */
:root {
--text-color: #1f2937;
--text-color-light: #4b5563;
--background-color: #ffffff;
--selection-background-color: #f3f0ff;
--selection-border-color: #7c5cff;
}
/* Dark */
@media (prefers-color-scheme: dark) {
:root {
--text-color: #f5f5f7;
--text-color-light: #a1a1aa;
--background-color: #16161a;
--selection-background-color: #2a2440;
--selection-border-color: #a78bfa;
}
}
```
### Approach 4: Define your own tokens
If your company already maintains light/dark color pairs, declare them all up front, point a set of "active" tokens at the light values, and remap only the active tokens in the dark block. Your selectors then reference the active tokens and never need duplicating.
```css theme={null}
:root {
/* Full palette: both modes declared once */
--brand-text-light: #000000;
--brand-text-dark: #ffffff;
--brand-text-inverse-light: #ffffff;
--brand-text-inverse-dark: #000000;
--brand-button-light: #820076;
--brand-button-dark: #f0a0ff;
/* Active tokens default to light */
--brand-text: var(--brand-text-light);
--brand-text-inverse: var(--brand-text-inverse-light);
--brand-button: var(--brand-button-light);
}
@media (prefers-color-scheme: dark) {
:root {
/* Remap only the active tokens */
--brand-text: var(--brand-text-dark);
--brand-text-inverse: var(--brand-text-inverse-dark);
--brand-button: var(--brand-button-dark);
}
}
/* Selectors are written once and work in both modes */
.ul-question,
.likert-number {
color: var(--brand-text);
}
.ul-card-text__button {
background: var(--brand-button);
color: var(--brand-text-inverse);
border-radius: 20px;
padding: 12px 40px;
font-weight: 600;
}
```
## CSS variable reference
These are the variables Sprig's stylesheets read from, with the default value in each mode. Override any of them on `:root`. You only need this for Approach 3 or Approach 4 above; skip it otherwise.
This reference reflects Web SDK v2.49.0. Sprig may add variables in later versions; anything not listed here should be overridden by selector instead.
| Variable | Light | Dark |
| :- | :- | :- |
| `--background-color` | `#fff` | `#1c1c1e` |
| `--background-color-darker` | `#faf9f8` | `#2c2c2e` |
| `--text-color` | `#2f2e2c` | `#fff` |
| `--text-color-light` | `#575653` | `#8f8f8f` |
| `--text-color-lighter` | `#858481` | `#a8a8a8` |
| `--border-color` | `#ececec` | `#3a3a3c` |
| `--border-color-heavy` | `#ebebeb` | `#2c2c2e` |
| Variable | Light | Dark |
| :- | :- | :- |
| `--button-disabled-background` | `#f2f2f2` | `#2c2c2e` |
| `--button-disabled-text-color` | `#a8a8a8` | `#8f8f8f` |
| `--progress-bar-background` | `rgba(0, 0, 0, 0.1)` | `rgba(255, 255, 255, 0.1)` |
| `--prototype-button-background` | `rgba(0, 0, 0, 0.01)` | `rgba(255, 255, 255, 0.01)` |
| `--thank-you-link-background` | `rgba(0, 0, 0, 0.01)` | `rgba(255, 255, 255, 0.01)` |
| `--thank-you-link-background-hover` | `rgba(0, 0, 0, 0.03)` | `rgba(255, 255, 255, 0.03)` |
| Variable | Light | Dark |
| :- | :- | :- |
| `--selection-border-color` | `#c2c2c2` | `#3a3a3c` |
| `--selection-background-color` | `#f2f2f2` | `#2c2c2e` |
| `--selection-background-color-hover` | `#e6e6e6` | `#3a3a3c` |
| `--selection-indicator-color` | `#a8a8a8` | `#8f8f8f` |
| `--selection-indicator-color-selected` | `#000` | `#fff` |
| `--select-border` | `#e6e6e6` | `#3a3a3c` |
| `--select-border-hover` | `#dddcd9` | `#4a4a4c` |
| `--select-background` | `#fff` | `#1c1c1e` |
| `--select-background-hover` | `#f2f2f2` | `#2c2c2e` |
| Variable | Light | Dark |
| :- | :- | :- |
| `--matrix-header-background` | `#f7f7f7` | `#121212` |
| `--nps-unselected` | `#fcfcfc` | `#2c2c2e` |
| `--nps-unselected-border` | `#e6e6e6` | `#3a3a3c` |
| `--nps-selected-color-low` | `#b06d6d` | `#f44336` |
| `--nps-selected-color-high` | `#95a779` | `#4caf50` |
| `--likert-symbol-color` | `transparent` | `#8f8f8f` |
| `--rank-order-background` | `#f2f2f2` | `#2c2c2e` |
| `--rank-order-border` | `#e6e6e6` | `#3a3a3c` |
| `--rank-order-border-hover` | `#d9d9d9` | `#4a4a4c` |
| `--rank-order-number-background` | `#fff` | `#1c1c1e` |
| `--record-task-background` | `#f2f2f2` | `#2c2c2e` |
| `--record-task-border` | `#e6e6e6` | `#3a3a3c` |
| `--record-task-border-hover` | `#d9d9d9` | `#4a4a4c` |
| `--record-task-number-background` | `#fff` | `#1c1c1e` |
| `--voice-video-background` | `#f2f2f2` | `#2c2c2e` |
| `--voice-video-border` | `#e6e6e6` | `#3a3a3c` |
| `--voice-video-border-hover` | `#d9d9d9` | `#4a4a4c` |
| `--voice-video-icon-color` | `#a8a8a8` | `#8f8f8f` |
### Conversational UI
Conversational studies load an additional dark stylesheet with its own variables for the chat transcript and inputs, overridden the same way: inside a `@media (prefers-color-scheme: dark)` block on `:root`. The most commonly overridden:
| Variable | Controls |
| :- | :- |
| `--chat-right-bg` | Respondent message bubble background |
| `--chat-left-bg` | Sprig message bubble background |
| `--chat-msg-no-response` | Skipped/unanswered message text |
| `--chat-end-text` | End-of-conversation text |
| `--chat-footer` | Footer text |
| `--chat-choice-bg` | Choice option background |
| `--text-card-input-bg` | Open text input background |
| `--text-card-border` | Open text input border |
| `--select-checkbox-bg` | Checkbox fill |
| `--select-checkbox-border` | Checkbox border |
| `--select-radio-bg` | Radio button fill |
| `--consent-input-bg` | Consent card name input background |
## Testing your CSS
Because custom CSS applies to all studies in a product, including active ones, test both modes before you save. A Product's CSS is one stylesheet shared by its development and production environments, so saving updates both at once.
A sun/moon switcher is available in two places:
One sits above the preview in the custom CSS editor (Settings > Surveys > Look & Feel > Add Custom Styles), a sandbox: nothing here goes live until you hit save.
The other sits next to **Preview Study** in the study builder's sidebar preview, and renders your actual survey questions, so you can confirm what respondents will see in each mode.
1. Iterate in the CSS editor's preview first: unsaved, useful for a sandbox.
2. Once you save, confirm the result in the study builder's sidebar preview against your real questions.
3. Toggle your OS appearance (macOS: System Settings > Appearance; Windows: Settings > Personalization > Colors) only if you're checking the survey somewhere neither switcher covers, like a live link.
4. In Chrome DevTools you can also force the media query without changing your OS: open the Command Menu (`Cmd/Ctrl + Shift + P`), run **Show Rendering**, and set **Emulate CSS media feature prefers-color-scheme**.
5. Step through every question type in the preview, not just the first card. Matrix, NPS, Rank Order, and Open Text have the most mode-specific styling.
## Common issues
You most likely declared your variables on `html` instead of `:root`. Sprig's dark values are on `:root`, which has higher specificity, so it wins regardless of source order. Change your selector to `:root`.
You have a hardcoded foreground color with no matching background, or vice versa. Search your CSS for any literal hex value on a `color`, `background`, or `border-color` property and either move it into a variable pair or wrap the dark variant in a `@media (prefers-color-scheme: dark)` block.
Something in the card's ancestry still has a light background. Reset the wrappers to transparent so the host page shows through:
```css theme={null}
html,
body,
#ul-app,
.ul-app--overlay,
.ul-app--visible,
.ul-app__container {
background: transparent !important;
}
```
Some Sprig icons are inline SVG data URIs with a fixed stroke color. Sprig's dark stylesheet replaces the affected ones, but if you've overridden a background shorthand you may have wiped the replacement. Set `background-color` rather than `background`, or re-declare the `background-image` in your dark block.
Confirm three things: **Enable Default Dark Mode CSS** is switched on in Look & Feel settings (it's off by default), you're on Web SDK v2.49.0 or later or a mobile SDK version built against it (see [Minimum SDK versions](#minimum-sdk-versions)), and the test device's OS appearance is actually set to Dark.
The toggle applies per Product, not per environment: a Product's development and production environments share one setting. If dark mode works in one place and not another, check whether you're comparing two different Products rather than two environments of the same one. Both the study builder's preview and the custom CSS editor's preview have their own sun/moon switcher, see [Testing your CSS](#testing-your-css), so you can rule out an OS-level mismatch by checking either one directly.
## Mobile SDKs
Studies rendered in the iOS, Android, React Native, and Flutter SDKs use the same web stylesheets inside a web view, so everything on this page applies there as well.
Native light/dark support (the SDK letting the web view render dark at all) landed earlier than the default CSS work, which is why some customers were already shipping their own dark mode CSS before v2.49.0.
The mobile SDKs also expose APIs to force a study into light or dark mode regardless of the device setting: all include a method called `overrideUserInterfaceMode`, which takes `dark`, `light`, or `unspecified`. This lets an app align the survey's theme with its own custom settings; passing `unspecified` resets it to match the device again.
### Minimum SDK versions
These are the first mobile SDK releases built against Web SDK v2.49.0, and therefore the first to include the default CSS dark mode styles.
These versions gate only Sprig's default dark stylesheet. You don't need any of them to write your own `prefers-color-scheme` CSS, that's plain custom CSS and always has worked on any SDK version. The default just gives you a baseline dark setting to start from or override.
| SDK | Minimum version |
| :- | :- |
| Web | v2.49.0 |
| iOS | v4.33.1 |
| Android | v2.27.2 |
| React Native | v4.1.1 |
| Flutter | v0.9.1 |
| Segment iOS | v1.10.1 |
| Segment Android | v1.10.1 |
| Segment React Native | v0.9.1 |
For the full list of selectors and non-color customization options, see [Styling Studies with Custom CSS](/docs/developer-center/styling/styling-your-studies-with-custom-css).
# Styling
Source: https://docs.sprig.com/docs/developer-center/styling/index
In this section, you can review how to control the look and feel of your Sprig studies, from dashboard settings like brand color to custom CSS:
* [Styling studies with custom CSS](/docs/developer-center/styling/styling-your-studies-with-custom-css)
* [Dark mode](/docs/developer-center/styling/dark-mode)
# Styling Studies with Custom CSS
Source: https://docs.sprig.com/docs/developer-center/styling/styling-your-studies-with-custom-css
**You can add and override the CSS applied to Sprig In-Product Surveys and Feedback to completely re-work its appearance to match your branding guidelines and requirements.**
Some look and feel styling is built into the Sprig dashboard by default. Other customizations require CSS styling. The guidance here is a deeper dive into how the CSS editor works and how to safely override default rules.
Custom CSS styling is done separately for In-Product Surveys and Feedback, and can be done in:
* Settings > Surveys > Look & Feel > CSS OR
* Settings > Feedback > Look & Feel > CSS
**Note:** currently Sprig only supports 1 CSS styling theme per Sprig Product. Per study styling is coming soon!
**Styling for dark mode?** Turn on **Enable Default Dark Mode CSS** in Look & Feel settings first, self-serve, no need to contact Sprig. The code shown in the editor below is a **light-mode-only snapshot**: no variables, no dark palette. See [Dark Mode](/docs/developer-center/styling/dark-mode) before adding any color rules.
### Introduction
A single CSS file applies to all survey question types, although some CSS selectors only apply to HTML elements on specific survey types. **Any un-commented out CSS you add will override the default styling to all surveys when saved, including any in-progress studies. Do proceed with caution when applying.**
When you open the Custom CSS editor, you’ll see a block of commented-out code. These aren’t “extra” styles you need to delete or modify, they’re simply the default Sprig styles shown for reference. You can ignore them if you like or choose to clear the window.
### Basic instructions:
* **Add your own CSS below the comments, or replace selectors with your own.**
* The default file is organized by general styles and question-type-specific styles.
* You can make modifications directly in this editor or paste in your own CSS.
* **Use the preview panel to test changes across question types.**
* The preview will update with the changes you make to your CSS. You can select each of the question types from underneath the preview to see how your custom CSS changes their appearance. Note that not all changes will be shown in previews until the CSS styling configurations are saved. Use this unsaved preview to get your styling right first: a Product's CSS is one value shared by its development and production environments, so once you save, it applies everywhere at once, there's no separate dev copy to promote afterward.
* If dark mode is enabled for the product, a sun/moon switcher above the preview lets you flip it between light and dark on demand, so you can check both without changing your OS or browser setting.
* Defaults will remain unless overridden.
* Custom CSS applies to all surveys within a product, including active surveys.
### CSS variables
Underneath the selectors shown in the editor, Sprig's stylesheets are built on **CSS custom properties** (variables) for color, e.g. `--text-color`, `--background-color`, `--selection-background-color`. Every selector below reads its color from one of these variables rather than a hardcoded value.
You don't need to touch variables to use custom CSS; overriding a selector directly (as shown throughout this page) works fine. Variables matter once you want the same color change to apply automatically in both light and dark mode, since a variable you set once is picked up everywhere Sprig uses it.
The full variable reference, and the three patterns for using them, live on the [Dark Mode](/docs/developer-center/styling/dark-mode#css-variable-reference) page rather than duplicated here.
## The Practical Guide
The 600+ lines of default CSS have JSDoc style comments that organize all the selectors.
* [Base Typography](#base-typography)
* [Universal Elements](#universal-elements)
* [Card Component](#card-component)
* [Rich Text](#rich-text)
* [Choice Elements](#choice-elements)
* [Buttons](#buttons)
* [Matrix Questions](#matrix-questions)
* [One to Five Scale (Likert)](#one-to-five-scale-likert)
* [NPS Question](#nps-question)
* [Open Text Card](#open-text-card)
* [Text or URL Prompt](#text-or-url-prompt)
* [Consent or Legal Card](#consent-or-legal-card)
* [Rank Order](#rank-order)
* [AI Follow-Up & AI Dynamic Question](#ai-follow-up-and-ai-dynamic-question)
* [Thank You Card](#thank-you-card)
* [Feedback Button & Container](#feedback-button-and-container)
Sprig has also curated 2 different quick "Choose-your-own-theme" [recipes](#quick-recipes), shown below!
#### Base Typography
What it controls: global text feel.
```css Try: theme={null}
/* Brand font */
html, body { font-family: 'Georgia', serif; }
```
`html`, `body`, `b`
#### Universal Elements
What it controls: the little bits around the card (footers, dots, close button).
```css Try: theme={null}
/* Increased footer spacing & add color */
.ul-footer { margin-top: 12px; background-color: #e97451; }
/* Increase size of the close icon */
.close-btn { height: 18px; width: 18px;}
```
`.ul-footer`, `.ul-footer-bubble`, `.close-container`, `.close-btn`
#### Card Component
What it controls: the survey “card”, padding, shadow, radius.
```css Try: theme={null}
/* Rounded, no heavy shadow */
.ul-card__container--desktop, .ul-card__container--mobile {
border-radius: 10px;
box-shadow: none;
}
/* Headline + subcopy tone */
.ul-question { font-size: 20px; font-weight: 700; color: #1f2937; }
```
`.ul-card`, `.ul-card__container--desktop`, `.ul-card__container--mobile`, `.ul-card__container`, `.ul-card-main-content`, `.ul-question`, `.ul-caption`
#### Rich Text
What it controls: paragraphs and lists in rich text cards.
```css Try: theme={null}
/* Visual focus on rich text */
.ul-rich-text-body p, .ul-rich-text-body li {
text-align: center;
padding: 5px;
border: #b18187 3px solid;
}
```
`.ul-rich-text-body`, `.ul-rich-text-body p`, `.ul-rich-text-body li`
#### Choice Elements
What it controls: option "buttons," spacing, radio dots, labels (multiple choice, multi-select, matrix options).
```css Try: theme={null}
/* Space the list a bit */
.ul-card__choices--desktop { margin-top: 16px; }
/* Button-like options */
.choice { background: #f9f9f8; border-radius: 12px; }
/* Hide radio circles for a cleaner look */
.select-radio { display: none; }
```
`.ul-card--multiple`, `.ul-card__choices--desktop`, `.ul-card__choices--mobile`, `.ul-card__choices`, `.choice--mobile`, `.choice--desktop` (has `:hover`/`:active` states), `.choice`, `.select-label`, `.select-radio`, `.ul-select-active-dynamic-style .select-radio`
#### Buttons
What it controls: primary/secondary actions (finish/submit). Buttons appear across nearly every question type, not just one, so this section sits with the other general-purpose selectors above.
```css Try: theme={null}
/* Rounded (pill-shape) primary action */
.ul-card-text__button {
border-radius: 20px;
background: #e97451;
color: #fff;
}
```
`.ul-card-text__button`, `.ul-card-text__button:disabled`, `.ul-card__button-wrapper`, `.ul-card-skip__button`
#### Matrix Questions
What it controls: row/column labels and cells.
```css Try: theme={null}
/* Colorful matrix background & label text */
.ul-matrix-option-wrapper {
background-color: #e97451;
margin: 4px;
border-radius: 3px;
}
.ul-matrix-row-label, .ul-matrix-column-label {
background: white;
color: #e97451;
}
```
`.ul-card--matrix_grid`, `.ul-card--matrix_container`, `.ul-matrix-column-label`, `.ul-matrix-option-wrapper`, `.ul-matrix-last-option`, `.ul-matrix-row-label`
#### One to Five Scale (Likert)
What it controls: the row of numbers and labels beneath.
```css Try: theme={null}
/* Dotted borders on each number & mauve labels */
.likert-number--desktop { border: 2px #f1e1e7 dotted; }
.ul-card--likert__labels { color: #b18187; }
```
`.ul-card--likert`, `.ul-card--likert__numbers`, `.likert-number--mobile`, `.likert-number--desktop` (has `:hover`/`:active` states), `.likert-number`, `.ul-card--likert__labels`
#### NPS Question
What it controls: the number grid and label row.
```css Try: theme={null}
/* Same visual language as Likert */
.ul-card--nps__numbers { border: 2px #f1e1e7 dotted; }
.ul-card--nps__labels { color: #b18187; }
```
`.ul-card--nps`, `.ul-card--nps__numbers`, `.nps-number--mobile`, `.nps-number--desktop` (has `:hover`/`:active` states), `.nps-number`, `.ul-card--nps__labels`
#### Open Text Card
What it controls: text areas and their container.
```css Try: theme={null}
/* Peach background, rounder corners */
.ul-card-text__input { background: #fad6c3; border-radius: 8px; }
```
`.ul-card--text`, `.ul-card-text`, `.ul-card-text__container`, `.ul-card-text__input--mobile`, `.ul-card-text__input--desktop` (has a `:hover` state), `.ul-card-text__input` (has `::placeholder`/`:focus` states)
#### Text or URL Prompt
What it controls: the prompt button styling.
```css Try: theme={null}
/* Make prompt feel like a primary action */
.ul-card__text-url-prompt-button { background-color: #e97451 }
```
`.ul-card__text-url-prompt`, `.ul-card__text-url-prompt-button`
#### Consent or Legal Card
What it controls: name input and consent choices.
```css Try: theme={null}
/* Peach background, rounder corners */
.ul-consent-legal__name-input { background: #fad6c3; border-radius: 6px; }
```
`.ul-consent-legal__name-input--mobile`, `.ul-consent-legal__name-input--desktop` (has a `:hover` state), `.ul-consent-legal__name-input` (has `::placeholder`/`:focus` states), `.ul-card__consent-legal .choice`, `.ul-card__consent-legal .choice--desktop` (has `:hover`/`:active` states), `.ul-card__consent-legal .choice--mobile` (has an `:active` state)
#### Rank Order
What it controls: draggable rows, drag handle, and the rank select dropdown.
```css Try: theme={null}
/* Rounder rows with a colored drag handle */
.ul-card-rank__option { border-radius: 12px; border-color: #b18187; }
.ul-card-rank__drag-btn { color: #b18187; }
/* Custom-colored rank select */
.ul-card-rank__select { border-color: #b18187; border-radius: 8px; }
```
`.ul-card-rank__labels`, `.ul-card--rank__question-inner-container`, `.ul-card-rank__list`, `.ul-card-rank__option` (has an `:active` state, plus `.is-dragging` and `.is-drop-target` modifier classes), `.ul-card-rank__option.is-drop-target select, .ul-card-rank__option.is-drop-target span, .ul-card-rank__option.is-drop-target button`, `.ul-card-rank__drag-btn` (has an `:active` state), `.ul-card-rank__option svg`, `.ul-card-rank__option span`, `.ul-card-rank__select`, `.ul-card-rank__select.ul-card-rank__select--placeholder`
#### AI Follow-Up & AI Dynamic Question
What it controls: the loading indicator shown while an AI Follow-Up or AI Dynamic Question is generated. Everything else on these question types shares styling with the [Open Text Card](#open-text-card).
```css Try: theme={null}
/* Slower, brand-colored shimmer */
.ul-card-text__input__loading {
background-image: linear-gradient(70deg, #b18187 0%, #f1e1e7 50%, #b18187 100%);
animation-duration: 3s;
}
```
`.ul-card-text__input__loading`
#### Thank You Card
What it controls: closing screen layout and text.
```css Try: theme={null}
/* Colored checkmark, tighter closing copy */
.ul-thanks-check { color: #21522e; }
.ul-card--thanks .ul-question { font-weight: 700; }
.ul-card--thanks .ul-caption { color: #575653; }
```
Want to replace the checkmark with your own image entirely — a logo, an icon, an illustration? Hide the default SVG and inject your own via a `content: url(...)` data URI:
```css Try: theme={null}
/* Custom image instead of the checkmark */
.ul-thanks-check svg { display: none; }
.ul-thanks-check::before {
content: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzIiIGZpbGw9IiNGRkM5NDAiLz4KPGNpcmNsZSBjeD0iMjIiIGN5PSIyNiIgcj0iNCIgZmlsbD0iIzQwNDA0MCIvPgo8Y2lyY2xlIGN4PSI0MiIgY3k9IjI2IiByPSI0IiBmaWxsPSIjNDA0MDQwIi8+CjxwYXRoIGQ9Ik0xOCAzOEMxOCAzOCAyNCA0NiAzMiA0NkM0MCA0NiA0NiAzOCA0NiAzOCIgc3Ryb2tlPSIjNDA0MDQwIiBzdHJva2Utd2lkdGg9IjQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0ibm9uZSIvPgo8L3N2Zz4K');
}
```
Keep your image close to 64×64px to match the default icon's footprint, or set explicit `width`/`height` on `.ul-thanks-check::before` if it needs different dimensions.
`.ul-card--thanks`, `.ul-thanks-check`, `.ul-card--thanks-content`, `.ul-card--thanks .ul-question`, `.ul-card--thanks .ul-caption`
#### Feedback Button & Container
What it controls: the floating Feedback button and the container it opens into. These selectors are only relevant to the Feedback tab's CSS editor, not surveys.
```css Try: theme={null}
/* Rounder floating button */
#sprig-feedback-button { border-radius: 24px; }
```
**`.sprig-feedback-button-light` / `.sprig-feedback-button-dark` are not the same as the dark mode covered on the [Dark Mode](/docs/developer-center/styling/dark-mode) page.** These two classes correspond to the Feedback button's own **Light/Dark theme** setting in Look & Feel — a manual choice you make once for the button, not something that responds to the respondent's system appearance. If you want the Feedback button itself to follow `prefers-color-scheme`, you'll need to write that media query yourself against these selectors.
`#sprig-feedback-button`, `.sprig-feedback-button-label`, `.sprig-feedback-button-right`, `.sprig-feedback-button-bottom`, `.sprig-feedback-button-light`, `.sprig-feedback-button-dark`, `#sprig-feedback-container`, `.sprig-feedback-container-left`, `.sprig-feedback-container-center`, `.sprig-feedback-container-bottom`
## Quick Recipes
“Choose-Your-Own-Theme” recipes designed to help you tailor the look and feel of your studies.
These recipes are light-mode only. If dark mode is enabled for your product, pair them with a `@media (prefers-color-scheme: dark)` block — see [Dark Mode](/docs/developer-center/styling/dark-mode) for the patterns to use.
```css Minimal Branded Look theme={null}
body { font-family: Optima; }
.ul-card__container { border: #5a6b5f 2px solid; border-radius: 0; box-shadow: none; }
.ul-question { font-weight: 700; color: #21522e; text-align: center}
.choice { background: white; border-radius: 24px; }
.select-radio { display: none; }
.ul-card-text__button { border-radius: 16px; padding: 8px;}
```
```css High Contrast for Accessibility theme={null}
.ul-question { font-weight: 700; font-family: Verdana; color: #25283D; font-size: 22px; }
.choice { background: white; font-size: 16px; border: 2px solid #25283D; }
.ul-card-text__button { background: #25283D; color: #fff; border-radius: 16px; }
```
# Android SDK
Source: https://docs.sprig.com/docs/installation/introduction-mobile/android-sdk-installation/index
## Getting Started
### Overview
The Sprig Android SDK, when installed in your native Android app, allows you to track your customer’s in-product behavior and display Sprig studies when they perform certain actions.
### Requirements
* Join your teammates on [Sprig](https://app.sprig.com) (check with your Sprig admin whether team discovery is on, or simply have a team member invite you via your email address). This will give you access to your team’s environment IDs, as well as the [interactive Installation Guide](https://app.sprig.com/integrations/installation/android-sdk).
* Ensure you have access to your Android codebase, and can deploy to a development and/or production environment
* The Sprig Android SDK is designed to work with Android SDK 21 (Android Lollipop, OS 5.0) and above. If using minSdk below 21, you can override the library in your main AndroidManifest:
```markup theme={null}
....
```
To see all official releases of the Sprig Android SDK, visit the [repository](https://search.maven.org/artifact/com.userleap/userleap-android-sdk).
## Install SDK
### Install via Gradle
You can install the Sprig SDK via [maven central](https://search.maven.org/artifact/com.userleap/userleap-android-sdk):
```groovy theme={null}
dependencies {
implementation "com.userleap:userleap-android-sdk:2.17.8"
}
```
Add Java 8 support to your project (if not added already):
```groovy theme={null}
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}
```
If you experience build issues like "Failed to find the generated class", try adding this to your proguard rules:
```text theme={null}
-keep class com.userleap.** { *; }
-keep class sprig.** { *; }
```
Your app will also need to maintain the following dependencies:
* [Kotlin](https://developer.android.com/kotlin) (1.5.31)
* [Gradle](https://developer.android.com/studio/releases/gradle-plugin) (7.2.0)
* [Android X](https://developer.android.com/jetpack/androidx)
* [Material Components](https://github.com/material-components/material-components-android) (1.5.0-alpha04) (used for bottom sheet dialog for surveys)
* ConstraintLayout (1.1.3) (used for flat view hierarchies for surveys)
### Obtain an Environment ID
After you've installed, you must obtain an environment ID from Sprig. Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [Integrations > Android SDK](https://app.sprig.com/integrations/installation/android-sdk)).
The Development environment is recommended for initially setting up and verifying your installation. Then, you can use the Production environment to deploy studies to real users.
### Initialize the SDK
Initializing and using the SDK revolves around a singleton named `Sprig`. The singleton must be configured before it can be used; a common pattern is to configure Sprig in your class that extends [Application](https://developer.android.com/reference/android/app/Application), but follow the best practices for your team and application.
Make sure to check the [OS system version](https://developer.android.com/training/basics/supporting-devices/platforms#version-codes) before calling Sprig:
```java theme={null}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Sprig.configure(context, "ENVIRONMENT_ID")
}
/**
* You can test your study easily (bypass all filters and resurvey windows) by
* using Sprig's new testing feature. This requires installing Sprig v2.15.0 and
* adding the following code to pass the study's unique previewKey to the Sprig
* instance.
**/
class DeepLinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
intent?.data?.getQueryParameter("sprigPreviewKey")?.let { previewKey ->
Sprig.setPreviewKey(previewKey)
}
finish()
}
}
```
Be sure to swap in the correct ENVIRONMENT\_ID. Note that `configure` will only accept 1 environment ID, and calling it multiple times with different IDs will have no effect.
**Warning:** Additional action recommended for customers that completed SDK install before October 2023 to enable in app testing feature
In order to [test your study](/docs/sprig-studies/in-product-surveys/study-testing) directly in your production application, you must first update your application’s install code to include additional snippet below ⬇️
### Study Previews
```java theme={null}
/**
* You can test your study easily (bypass all filters and resurvey windows) by
* using Sprig's new testing feature. This requires installing Sprig v2.15.0 and
* adding the following code to pass the study's unique previewKey to the Sprig
* instance.
**/
class DeepLinkActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
intent?.data?.getQueryParameter("sprigPreviewKey")?.let { previewKey ->
Sprig.setPreviewKey(previewKey)
}
finish()
}
}
```
Alternatively, you can overwrite the previously added install code with the version [here](/docs/Installation/introduction-mobile/android-sdk-installation/index#initialize-the-sdk) that includes the required changes. Be sure to swap in the correct ENVIRONMENT\_ID
## Identify Users
Identifying users ensures that a user’s actions are all associated with the same profile so they can be targeted.
Properly identifying users helps ensure:
* Your users have a consistent experience across platforms, and do not see the same study multiple times
* You can accurately target the right users
* You are billed for the correct number of [Monthly Unique Users (MUUs)](/docs/account-and-settings/usage-muu/index)
### Set User ID
Sprig allows you to differentiate users by setting a unique USER\_ID. You may want to ensure consistency between the User IDs sent to Sprig and the ones in your internal database, product analytics/CDP, or data warehouse. You can also use an [anonymizing function or hash](https://docs.google.com/document/d/1qMO3DaXklt9csAPfWNolBpPecAiQ55350ke2_nwFSAs/edit).
A good User ID is…
* Unique: Two users should not share the same User ID.
* Mappable: User IDs sent to Sprig should map back to your internal User IDs, either directly or anonymously.
* Static: Once assigned, a User ID should not change.
Users that do not have a User ID set are considered unauthenticated.
You can use `setUserIdentifier` to identify a user with any string less than 256 characters. This function can be called multiple times safely, and stores the identifier locally. We recommend you set the User ID whenever the user logs in to your app, as well as after configuring Sprig (if the user is already logged in).
```java theme={null}
Sprig.setUserIdentifier("USER_ID")
```
### Logout
When a user logs out of your app, make sure to log that user out of the Sprig SDK. This will prevent any new activity from being associated with the wrong user. Note that if you call `logout()` on an unauthenticated user, Sprig will assign them a new profile and count this new user separately toward your MTU limit.
```java theme={null}
Sprig.logout()
```
## Track Events
Sprig uses events to **trigger** (display) studies after the user performs a specific action. They can also be used as a **filter** to target users who have previously performed an action.
Once you’ve installed the Sprig SDK, the next step is to configure the tracking of events that you would like to use to trigger or filter a study. For mobile SDKs, you must configure [Code](/docs/shared-study-foundations/events/code-events) events. (Sprig also offers [No-Code](/docs/shared-study-foundations/events/no-code-events) events, but these are only available on web platforms.)
To track a Code event, use:
```java theme={null}
val payload = EventPayload(event = "EVENT_NAME", properties = mapOf("key" to "value"))
Sprig.trackAndPresent(payload, YOUR_FRAGMENT_ACTIVITY)
```
After sending a new Code event to Sprig, you must [approve the new event request](/docs/shared-study-foundations/events/index#adding-events) on the [Events page](https://app.sprig.com/events) before it can be used to trigger or filter surveys.
Alternatively, after sending each tracking event, you can check if a new survey is ready for the user. If a survey is ready, you can decide to present the survey to the user. The survey will be presented on a [modal bottom sheet](https://material.io/develop/android/components/bottom-sheet-dialog-fragment/).
```java theme={null}
val payload = EventPayload(event = "EVENT_NAME", properties = mapOf("key" to "value")) { surveyState ->
when (surveyState) {
SurveyState.READY -> {
// We received a survey for the event, present it to the user
Sprig.presentSurvey(activity)
}
SurveyState.NO_SURVEY -> {
// No survey available based on event
}
SurveyState.DISABLED -> {
// Sprig has been disabled remotely
}
}
}
Sprig.track(payload)
```
These events will also be available as filters for your studies. For example, you may want to only display a study to users who have performed the "checkout" event at least 3 times.
## Track Attributes
Sprig allows you to track **attributes**, which can provide more context about the user to help you better understand their feedback. You can also use these attributes to [filter](/docs/shared-study-foundations/main-tasks/study-triggers-user-filters-and-groups-copy#survey-filter) your audience and target specific kinds of users. Some example attributes that can be tracked are:
* Plan type
* Super users / power users
* Company
A user’s attributes can be seen on their profile in the Users page, and are recorded and attached to any surveys response they submit. For more information, see [Attributes](/docs/shared-study-foundations/attributes).
To set a user’s attribute, provide key-values pairs where:
* `ATTRIBUTE_NAME` must be a string less than 256 characters, and cannot start with an `!` (these names are reserved for use by Sprig)
* `ATTRIBUTE_VALUE` must be a number, boolean, or string less than 256 characters
```java theme={null}
Sprig.setVisitorAttributes(mapOf("key" to "value", "plan" to "enterprise"))
```
### Set Email Address
Setting the user’s email address is **optional**. Setting emails is not required for web or mobile studies, but can be used to target users or create a Group of users based on their email. Check your organization's guidelines around personally-identifiable information before sending email addresses to Sprig.
```java theme={null}
Sprig.setEmailAddress("EMAIL_ADDRESS")
```
## Test & Deploy
To verify your SDK is configured properly, we recommend testing with your development `ENVIRONMENT_ID`.
1. Create a survey in your Sprig Development Environment
2. Choose an approved event as a trigger for your study
3. \[For testing purposes only] Allow users to retake the survey and set the recontact waiting period to 0 days
4. Track the approved event from your app and confirm that the survey appears
Congratulations! Your installation is complete and you can begin deploying.
## Advanced Customization
### Study Lifecycle Notifications
Sprig exposes updates throughout the study lifecycle. Here is a sample code block for listening to SDK events in real time:
```kotlin theme={null}
val listener = EventListener {
Log.d("Sprig Event Tracking", it.toString())
}
Sprig.addEventListener(eventName, listener)
```
| Lifecycle Event | Data | Min SDK Version |
| - | - | - |
| SDK\_READY | `null` | 2.15.0 |
| VISITOR\_ID\_UPDATED | `{"visitorId": UUID }` | 2.15.0 |
| ~~SURVEY\_WILL\_PRESENT~~ | `{name: "survey.will.present", "survey.id": Integer}` | removed in 2.29.0 |
| SURVEY\_RETURNED | `{name: "survey.returned", "survey.id": Integer}` | 2.29.0 |
| ~~SURVEY\_PRESENTED~~ | `{name: "survey.presented", "survey.id": Integer}` | removed in 2.29.0 |
| SURVEY\_APPEARED | `{name: "survey.appeared", "survey.id": Integer}` | 2.16.1 |
| SURVEY\_HEIGHT | `{"name":"survey.height","contentFrameHeight": Integer}` | 2.15.0 |
| SURVEY\_WILL\_CLOSE | `{"name":"survey.willClose","initiator":"close.click"}` `{"name":"survey.willClose","initiator":"survey.completed"}` | 2.15.0 |
| SURVEY\_CLOSED | `{"name":"survey.closed","initiator":"close.click"}` `{"name":"survey.closed","initiator":"survey.completed"}` | 2.15.0 |
| SURVEY\_DID\_NOT\_APPEAR | `{ name: survey.did.not.appear' , 'reason': String }` | 2.29.0 |
### Set Locale
Sprig supports setting the locale for default caption and button text. The following locales are supported:
* de
* en
* es-es
* fr
* hi
* ja
* ko
* pt-br
* ru
* zh
To set the locale to Chinese:
```java theme={null}
Sprig.setLocale('zh')
```
Setting the locale will only affect static text, and is only available for the iOS and Android SDKs (not React Native).
### App size impact
The Sprig SDK AAR size is **211 KB**.
The impact to an Android App Bundle is around **650 KB**. Note: The Sprig SDK uses the common dependencies listed above. The actual size impact will be smaller if these dependencies are already used by the app.
Methodology: Build a ProGuarded release Android App Bundle in Android Studio with an Empty Activity project. Then compare size after adding the Sprig SDK.
# Android and React Native Android Session Replay Wireframes Implementation Guide
Source: https://docs.sprig.com/docs/installation/introduction-mobile/android-session-replay-wireframes-implementation-guide
# Background
Historically, Android session replays have been based on snapshots of the entire screen that are then used as the frames for the session replay.
Starting with version v2.28.0 of the Android SDK, developers can now opt to capture their screens as wireframes. This generally allows for better performance on the main thread as well as more control over PII elements.
# Native Android Implementation
To make this change, host app developers simply need to pass the `WIREFRAME` value to the `setReplaySessionRecordingFormat() `method on the Android SDK instance:
```kotlin theme={null}
var recordReplaysAsWireframes = true
Sprig.setReplaySessionRecordingFormat(
if (recordReplaysAsWireframes) ReplaySessionRecordingFormat.WIREFRAME
else ReplaySessionRecordingFormat.SCREENSHOT
)
```
# React Native Android Implementation
The same flag needs to be set on React Native Android in order to record replays as wireframes:
```kotlin theme={null}
const recordReplaysAsWireframes = true;
Sprig.setAndroidReplaySessionRecordingFormat(
recordReplaysAsWireframes
? Sprig.ReplaySessionRecordingFormat.wireframe
: Sprig.ReplaySessionRecordingFormat.screenshot,
);
```
# Flutter Plugin
Source: https://docs.sprig.com/docs/installation/introduction-mobile/flutter_plugin
# Getting Started
### Overview
The Sprig Flutter plugin, when installed in app, allows you to track your customer’s in-product behavior and display Sprig studies when they perform certain actions.
### Requirements
* Join your teammates on [Sprig](https://app.sprig.com) (check with your Sprig admin whether team discovery is on, or simply have a team member invite you via your email address). This will give you access to your team’s environment IDs, as well as the [interactive Installation Guide](https://app.sprig.com/integrations/installation/react-native-module).
* Ensure you have access to your Flutter codebase, and can deploy to a development and/or production environment
* Please check the platform-specific requirements:
* [iOS](/docs/Installation/introduction-mobile/ios-sdk-installation#requirements): iOS 15 or above; Xcode 16
* [Android](/docs/Installation/introduction-mobile/android-sdk-installation/index#requirements): Android 5.1(22): Android Studio 2024.2.2
# Setup
### Obtain an Environment ID
Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [any of the installation methods](https://app.sprig.com/integrations/installation)).
The Development environment is recommended for initially setting up and verifying your installation. Then, you can use the Production environment to deploy studies to real users.
### Add a reference to flutter-sprig
The Sprig Flutter plugin ([flutter-sprig](https://github.com/UserLeap/flutter-sprig/)) is hosted in a [github repository](https://github.com/UserLeap/flutter-sprig/) where it can be easily referenced from within your Flutter application.
In your **pubspec.yaml** file, add a reference to Sprig in your dependancies. The entry should look like this when you are done:
```yaml theme={null}
dependencies:
flutter:
sdk: flutter
sprig_flutter_plugin:
git:
url: https://github.com/UserLeap/flutter-sprig
```
One that is in place, in a CLI that has a path to the Flutter SDK, run at the root of the plugin example project:
```bash theme={null}
flutter pub get
```
When installing for iOS, you need to do `pod install`. And if you are updating, it's best to remove the `Podfile.lock` and run `pod repo update` first. So from your app top-level directory, run the following commands:
```bash theme={null}
cd example
cd ios
rm Podfile.lock
pod repo update
pod install
```
### Full main.dart example
Following is a full example of a main.dart file that includes initializing the plugin, checking the version and calling trackAndPresent with an event code to display a survey.
```cplusplus Dart theme={null}
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:sprig_flutter_plugin/sprig_flutter_plugin.dart';
import 'package:sprig_flutter_plugin/sprig_types.dart';
void main() {
runApp(MaterialApp(home: MyApp()));
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State createState() => _MyAppState();
}
class _MyAppState extends State {
String _sdkVersion = "";
final _sprigFlutterPlugin = SprigFlutterPlugin();
@override
void initState() {
super.initState();
initPlatformState();
}
Future initPlatformState() async {
String sdkVersion = "";
try {
_sprigFlutterPlugin.configure(environment: "", configuration: null);
sdkVersion = await _sprigFlutterPlugin.sdkVersion() ?? "";
_sprigFlutterPlugin.registerEventListener(SprigLifecycleEvent.sdkReady, (Map