# 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! Changelog Back Button # 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! Email distribution graphic Email distribution graphic # 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 Images In Response Options 1 # 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! Email distribution graphic Email distribution graphic # 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! Email distribution graphic Email distribution graphic # 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. Send To LLM # 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! Email distribution graphic Email distribution graphic # 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. Email distribution graphic Email distribution graphic # 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! Email distribution graphic # 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. Quotas announcement Quotas announcement # 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. Quotas announcement Quotas announcement # 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. Changelog AI Translation # 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! Quotas announcement # 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. Custom branding announcement visual # 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. Custom branding announcement visual # 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. Small preview of the new layout for Surveys ## 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. Sprigmcpcreate 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. Changelog MCP ## 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. New: AI Study Report ## 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. AI Dynamic Questions ## 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! Prototype Testing Enhancements # 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. AI Follow-up Question # 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: 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) Image of a survey question with 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. Display Limits for Choice Randomization # 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#/) Date filters for CSV Exports # 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. New Question Type: MaxDiff # 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! Conversational 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! Validation for Multiple Choice Multi-Select questions # 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! Surveys are out of beta # 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! New: Response Piping # 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). Introducing: Rank Order Questions # 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. Sprig Mobile Replays: Capture WKWebView views and SwiftUI text and images # 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. Randomization for pages and questions # 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. Surveys: Beta now open # 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). Easily Collaborate With Direct Response Sharing in Slack ## 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) Get More Actionable Themes With Improved Replays AI ## 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. Detect Friction At Scale With Frustration Signals for Always-On Replays ## 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) Surface the Highest-Signal Sessions With Daily Clip Limits ## 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)* Reveal Friction Automatically with AI-Powered Always-On Replays ## 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) Earn $250 for Every Qualified Referral to 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) Uncover Friction Points with Frustration Signals in Sprig Replays ## 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)* Unlock Continuous User Insights with Always-On Replays ## 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)* Reproduce Users’ App Journey with Replays for Mobile # 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:
  1. Click the account menu.
  2. Click Log Out.
  3. Click Forgot Password.
  4. Type in your email.
  5. Click Send password reset email.
  6. 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). Image 1054 ## 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. Image 208 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) How Sprig tracks MUUs
**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. MTU Visitor Usage Model [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: Web Changelog page with the Recommended if you use line, the urgency tag next to a release, and an impact tag on a change bullet highlighted Web Changelog page with the Recommended if you use line, the urgency tag next to a release, and an impact tag on a change bullet highlighted 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. Look & Feel settings showing the Enable Default Dark Mode CSS toggle and separate light and dark Brand Color fields
## 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 custom CSS editor's preview panel with a sun and moon icon switcher for toggling between light and dark
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. The study builder toolbar with a sun and moon icon switcher next to the Preview Study button
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. The custom CSS editor's preview panel with a sun and moon icon switcher for toggling between light and dark
### 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 Image 2354 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 eventData) async { print("SDK is ready"); }); } on PlatformException catch (e) { print('PlatformException: ${e.message}'); } if (!mounted) return; setState(() { _sdkVersion = sdkVersion; }); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('A Flutter App'), ), body: Container( margin: const EdgeInsets.only(left: 16.0), child: ListView( padding: const EdgeInsets.all(8), children: [ Text('Sprig SDK version: $_sdkVersion'), // Spacer SizedBox(height: 20), // Button to present a survey by supplied ID SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () { _sprigFlutterPlugin.trackAndPresent(eventName: ""); }, child: Text("Call trackAndPresent"), ), ), ], ), ) ), ); } } ``` Be sure to swap in the correct environment ID for YOUR\_ENVIRONMENT\_ID. Note that `configure()` will only accept 1 environment ID, and calling it multiple times with different IDs will have no effect. # Additional Functionality Note that the remaining examples use **\_sprigFlutterPlugin** when calling the plugin, assuming you have set **\_sprigFlutterPlugin** to **SprigFlutterPlugin()** as in the above code.
## 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 via local storage. We recommend you set the User ID whenever the user logs in to your app, as well as after the installation snippet (if the user is already logged in). ```cplusplus Dart theme={null} _sprigFlutterPlugin.setUserIdentifier(identifier: ""); ``` ### Logout When a user logs out of your app, make sure to log out of Sprig. This will prevent new activity from being associated with an incorrect 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. ```cplusplus Dart theme={null} _sprigFlutterPlugin.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 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: ```cplusplus Dart theme={null} SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () { _sprigFlutterPlugin.track(eventName: "", onCompletion: (surveyState) { debugPrint("Track completed with survey state: $surveyState"); if (surveyState == SprigSurveyState.ready) { _sprigFlutterPlugin.present(); } }); }, child: const Text('Track with callback and then present'), ), ), ``` 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. 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 user attributes, provide the SDK with a key-value pairs: * `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 ```cplusplus Dart theme={null} _sprigFlutterPlugin.setVisitorAttribute(key: "", value: ""); // if attributes no longer apply to the user, // you can delete multiple at a time _sprigFlutterPlugin.removeVisitorAttributes(attributes:["", ""]); ``` ### 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. ```cplusplus Dart theme={null} _sprigFlutterPlugin.setEmailAddress(emailAddress: ); ``` ## 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 Image 2354 4. Track the approved event from your app and confirm that the survey appears Congratulations! Your installation is complete and you can begin deploying. # iOS SwiftUI Session Replay Implementation Guide Source: https://docs.sprig.com/docs/installation/introduction-mobile/i-os-swift-ui-session-replay-implementation-guide # Background Sprig Session Replays for iOS are schematic; each frame is a rough representation of what the user is seeing on the screen of the app. They are not screen shots of the UI itself.

To achieve this, the Sprig iOS SDK traverses the UIKit view hierarchy, collecting element details of the screen and then recreating them into an image, using the image as the basis for each video frame. This allows us to filter out text or images when customers select the Strict replay capture mode. Starting with iOS26, some SwiftUI text and image elements no longer appear in the UIKit view hierarchy. In order to capture these elements in replays, we have created SwiftUI modifiers that host app developers can place in their code on elements that they would like rendered in session replays. This content capture method also enables the capture of custom UI elements that could not previously be captured (a custom chart view, for example). This replay capture enhancement is available starting with the Sprig iOS SDK v4.34.0. # The Sprig SwiftUI session replay modifiers Following are the modifiers you can add to SwiftUI elements in order to capture them in schematic session replays. `.sprigSnapshotText()` - Views with this modifier will be captured as an image unless the privacy settings require masking of text, in which case they will not be captured, and instead placeholder text will be rendered in the same frame. `.sprigSnapshotImage()` - Views with this modifier will be captured as an image unless the privacy settings require masking of images, in which case they will be rendered as a rectangle shape in the same frame with an image icon in the middle. `.sprigSnapshotPlaceholder()` - Views with this modifier will be rendered as a rectangle shape in the same frame as the View. `.sprigSnapshot()` - Views with this modifier will be captured as an image regardless of the current privacy settings. Use this only if you want to capture a custom View that is not being captured by the UIKit capture and does not contain PII. # Example code and images Following is an example of implemented modifiers in some basic SwiftUI: ```swift theme={null} struct ExampleView: View { var body: some View { VStack(spacing: 20) { Text("This is a Text element.") .sprigSnapshotText() Rectangle() .fill(Color.green) .frame(width: 200, height: 200) .sprigSnapshotPlaceholder(color: Color.green) Image("puppy") .resizable() .frame(width: 100, height: 100) .cornerRadius(20) .sprigSnapshotImage() Image("puppy") .resizable() .frame(width: 100, height: 100) .cornerRadius(20) .sprigSnapshot() } } } ``` Below are screenshots of the app itself (running the code above), a frame of the replay without masking and a frame of the replay with privacy set to Strict.
2 Note that the second puppy image used the`.sprigSnapshot()`modifier, which did *not* adhere to the privacy settings, and thus still fully rendered even when the privacy setting was on Strict. # Considerations When implementing the Sprig SwiftUI modifiers in your SwiftUI app, please keep the following in mind: ## Test first Many SwiftUI elements *do* get translated down to UIKit elements and *will* show up in Sprig session replays without any additional code. Before adding the Sprig SwiftUI modifiers, you should run a replay capture on the user paths of your app that you would like captured and note any UI elements that are already being captured (and thus don’t need the modifiers). ## Smaller is better (most of the time) The modifiers use`UIGraphicsImageRenderer`to capture the content of the View they are modifying. This happens on the main thread; as such you should use them sparingly and apply them to the smaller pieces that you want to capture. In other words, if you have a view that is made up of 5 text elements, rather than capture the entire view with one modifier, capture each text element with a modifier. Adding a modifier to each element rather than a parent View decreases the chance that you will accidentally capture an element with PII and decreases the total area that needs to be captured. Having said that, due to the extreme complexity around SwiftUI rendering, if an element you are trying to capture is not showing up in the replay after adding a modifier, go up a level to the parent View and apply the modifier there. ## Think about PII The Sprig SwiftUI replays modifiers are designed to respect the privacy settings that customers select in the Sprig dashboard. In order for this to work, developers need to use the modifier designed for the element they are trying to capture. * Text elements should be captured with the`.sprigSnapshotText() `modifier. * Image elements should be captured with the`.sprigSnapshotImage() `modifier. Note that the`.sprigSnapshot()`modifier will capture everything in the view being modified, regardless of the privacy setting in the dashboard. It is designed to be used with UI elements that are not normally captured in the UIKit view hierarchy but should be rendered in a replay (for example, a custom chart view). Use the`.sprigSnapshotPlaceholder()`modifier to put a placeholder colored box where PII content exists that you do not want to capture. This allows viewers of the replay to recognize that something is in that location without showing potential PII contained in that element. ## View snapshots are cached In order to be as efficient as possible with our session replay capture, snapshots of elements are cached until the replay itself has been rendered. As such, dynamic elements in your UI that are being captured will only reflect their initial state in replays. ## Capturing complex stacked layouts Given the nature of SwiftUI rendering of text and images, it is impossible for the SprigSDK to know the Z-index of an element being captured. Therefore, if you have multiple elements that live on top of each other that you would like to capture, you should pass a z-index value as a parameter in the modifier. This will allow the SprigSDK to render the elements in the proper order in the replay itself. For example: ```swift theme={null} ZStack { // Bottom Layer: A large blue square. Rectangle() .fill(.blue) .frame(width: 200, height: 200) .sprigSnapshotPlaceholder(zIndex: 0, color: .blue) // Middle Layer: A smaller green square. Rectangle() .fill(.green) .frame(width: 130, height: 130) .sprigSnapshotPlaceholder(zIndex: 1, color: .green) // Top Layer: Text on top of everything. Text("Front Layer") .foregroundColor(.white) .fontWeight(.bold) .sprigSnapshotText(zIndex: 2) } ``` ## Gaining visibility into capture time on the main thread In order to give host app developers visibility into how long screen captures are taking, we have provided the ability to subscribe to loggingEvents that contain the details of each UIKit and SwiftUI element capture. To receive the capture details, simply pass a value of`true`to the`showReplayCaptureLogging`method on the Sprig singleton, and register to listen to logging events, like so: ```swift theme={null} Sprig.shared.showReplayCaptureLogging(true) Sprig.shared.registerEventListener(for: .loggingEvent) { data in print(data["message"] ?? "(none)") } ``` # Mobile Source: https://docs.sprig.com/docs/installation/introduction-mobile/index ## Overview Installing Sprig on your mobile applications allows you to: * Ask the right questions, to the right users, at the right time with [Sprig Surveys](/docs/sprig-studies/in-product-surveys/index) * Monitor your customer's interactions and behavior with [Sprig Replays](/docs/sprig-studies/replays/replay-creation/mobile-replays) Install Sprig in hours or days (not months) and configure studies based on [Events](/docs/shared-study-foundations/events/index) and [Attributes](/docs/shared-study-foundations/attributes) associated with users as they use your app. ## Installation Options To launch a Sprig study on your mobile app, you'll need to install one of the following: * Native [iOS](/docs/Installation/introduction-mobile/ios-sdk-installation) and [Android](/docs/Installation/introduction-mobile/android-sdk-installation/index) SDKs * [React Native Module](/docs/Installation/introduction-mobile/react-native-module) (if your apps are built using React Native) * [Segment iOS](/docs/Installation/introduction-mobile/segment-ios), [Segment Android](/docs/Installation/introduction-mobile/segment-android), or [Segment React Native](/docs/Installation/introduction-mobile/segment-react-native) (if Segment is installed in your apps) # iOS SDK Source: https://docs.sprig.com/docs/installation/introduction-mobile/ios-sdk-installation/index ## Getting Started ### Overview The Sprig iOS SDK, when installed in your native iOS 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/ios-sdk). * Ensure you have access to your iOS codebase, and can deploy to a development and/or production environment * The Sprig iOS SDK only supports iOS 16 and above. * Xcode 14: If you have not updated to the Xcode 14, you may experience build issues since [Xcode 14 removes bitcode](https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes). Check out Sprig's [legacy release](https://github.com/UserLeap/userleap-ios-sdk-releases/releases?q=legacy\&expanded=true) for Xcode 13 compatibility. To see all official releases of the Sprig iOS SDK, visit the [repository](https://github.com/UserLeap/userleap-ios-sdk-releases/releases). ## Install SDK There are three ways you can include Sprig in your application: SPM, CocoaPods, or manually. ### Install via SPM To install using SPM, use our [release repository](https://github.com/UserLeap/userleap-ios-sdk-releases/releases) and install the package from main branch: ### Install via CocoaPods To install via CocoaPods, add the following statement to your Podfile: ```bash theme={null} pod 'UserLeapKit' ``` Then run this command in the same directory that contains your Podfile: ```bash theme={null} pod install ``` ### Install manually If you’re unable to use Cocoapods or Carthage, you can also install Sprig manually. Download the latest framework as a zip from our [Releases](https://github.com/UserLeap/userleap-ios-sdk-releases/releases). Unzip the downloaded file and drag the UserLeap.framework folder into your project directory. Open Xcode and select your project in the “Project Navigator” pane, select your app under “TARGETS”. In the “Frameworks, Libraries, and Embedded Content” section, press “+”, “Add Other…”, “Add Files…” and select the UserLeap.framework folder. ![](https://lh3.googleusercontent.com/Jh5t0nVJUlL7uPJwLbeayxmy57_f3y2S2aoaUwQnCZMicmBF8nJmB3Ld4TzlQsLINGbOjvWDeBjIDUxv10KUgjQdvWx7-EsxdVNJGKlf8aqm71nueXSSKkDsOfLYDmQGpBia96eC) Be sure that UserLeap.framework is in your project settings “Framework Search Paths” or Xcode will throw the “no such module UserLeap” error. ![](https://lh5.googleusercontent.com/ki8F-lJq1soDu4WZ8uBgp_T5PE1NWMog2ImBpfcgzP02Yd1JH-yypVWLBu6S4vsbYbQBr0mGMV5PSzUFxetB9mcyh66ODLbNolzbGXhOnh7vF6Jh3czDBjsaKlYw1MJEScOOp0id) ### 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 > iOS SDK](https://app.sprig.com/integrations/installation/ios-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 Usage is simple and revolves around a singleton, conveniently named `Sprig`. The singleton must be configured before it can be used. A common pattern is to configure this in your `ApplicationDelegate`, but follow the best practices for your team and application. ```swift theme={null} import UserLeapKit class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { //your app setup Sprig.shared.configure(withEnvironment: "ENVIRONMENT_ID") return true } } /** * You can test your study easily (bypass all filters and resurvey windows) by * using Sprig's new testing feature. This requires installing Sprig v4.19.0 and * adding the following code to pass the study's unique previewKey to the Sprig * instance. **/ func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems?.forEach { if let value = $0.value, $0.name == Sprig.previewKeyName { Sprig.shared.setPreviewKey(value) } } return true } ``` 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 ```swift 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 v4.19.0 and * adding the following code to pass the study's unique previewKey to the Sprig * instance. **/ func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems?.forEach { if let value = $0.value, $0.name == Sprig.previewKeyName { Sprig.shared.setPreviewKey(value) } } return true } ``` Alternatively, you can overwrite the previously added install code with the version [here](/docs/Installation/introduction-mobile/ios-sdk-installation#initialize-the-sdk) that includes the required changes. Be sure to swap in the correct ENVIRONMENT\_ID Sprig is not thread-safe, so please invoke all methods on the main thread. Rest assured that all network and I/O requests are made asynchronously. ## 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#monthly-unique-users-muu-usage) ### 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 the configuring Sprig (if the user is already logged in). ```swift theme={null} Sprig.shared.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. ```swift theme={null} Sprig.shared.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.) An event’s properties can be used to further filter an event trigger for a survey. To set an event's properties, provide key-values pairs where: * `KEY` must be a string less than 256 characters, and cannot start with an `!` (these names are reserved for use by Sprig) * `VALUE` can be string|number|boolean that is less than 256 characters To track a Code event, use: ```swift theme={null} let payload = EventPayload(eventName: "EVENT_NAME", properties:["key": "value"]) Sprig.shared.trackAndPresent(payload: payload, from: YOUR_VIEW_CONTROLLER) ``` If you are using SwiftUI and don't want to create UIViewController, you can call trackAndPresent without passing a UIViewController. The SDK will look for the root or host UIViewController and present the survey from there. ```swift SwiftUI theme={null} let payload = EventPayload(eventName: "EVENT_NAME", properties:["key": "value"]) Sprig.shared.trackAndPresent(payload: payload) ```
After sending a new Code event to Sprig, you must [approve the new event request](https://sprig.mintlify.app/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 onto the provided viewController from the bottom of the screen. ```swift theme={null} let payload = EventPayload(eventName: "EVENT_NAME", properties:["key": "value"]) { state in switch state { case .ready: Sprig.shared.presentSurvey(from: viewController) case .noSurvey, .disabled: break } } Sprig.shared.track(payload: payload) ``` These events will also be available as filters for your studies. For example, you may want to restrict a study to users who performed the "checkout" event at most 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: * `KEY` must be a string less than 256 characters, and cannot start with an `!` (these names are reserved for use by Sprig) * `VALUE` can be string|number|boolean that is less than 256 characters ```swift theme={null} // for a single attribute Sprig.shared.setVisitorAttribute(key: "KEY", value: "VALUE") // for multiple attributes // saves multiple round-trips and reduces data usage Sprig.shared.setVisitorAttributes([ "KEY1": "VALUE1", "KEY2": "VALUE2" ]) // if attributes no longer apply to the user, // you can delete multiple at a time Sprig.shared.removeVisitorAttributes(["KEY1", "KEY2"]) ``` ### 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. ```swift theme={null} Sprig.shared.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 Image 2354 4. Track the approved event from your app 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: ```swift Swift theme={null} Sprig.shared.registerEventListener(for: .surveyReturned) { eventData in let surveyId = eventData["surveyId"] } ``` | Lifecycle Event | Data | Min SDK Version | | :- | :- | :- | | sdkReady | `{ name: 'sdkReady' }` | 4.18.0 | | visitorIdUpdated | `{ name: 'visitorIdUpdated' }` | 4.18.0 | | ~~surveyWillPresent~~ | `{ name: 'surveyWillPresent', 'surveyId': String }` | removed in 4.35.0 | | ~~surveyPresented~~ | `{ name: 'surveyPresented' }` | removed in 4.35.0 | | surveyReturned | `{ name: 'surveyReturned' , 'surveyId': String }` | 4.35.0 | | surveyAppeared | `{ name: 'surveyAppeared' }` | 4.18.0 | | surveyClosed | `{ name: 'surveyClosed' }` | 4.18.0 | | surveyWillDismiss | `{ name: 'surveyWillDismiss' }` | 4.18.0 | | surveyDidNotAppear | `{ name: surveyDidNotAppear' , 'surveyDidNotAppearReason': String }` | 4.35.0 |
### Sprig Replays Lifecycle Notifications Sprig exposes updates throughout the Sprig Replay lifecycle. Here is a sample code block for listening to replay events in real time: ```swift Swift theme={null} Sprig.shared.registerEventListener(for: .replayCaptureStarted) { eventData in } ``` | Sprig Replay Lifecycle Event | Min SDK Version | | :- | :- | | replayCaptureStarted | 4.23.4 | | replayCaptureStopped | 4.23.4 | | replayCaptureCompleted | 4.23.4 | | replayRenderingCompleted | 4.23.4 | | replayUploadCompleted | 4.23.4 | | replayEventsUploadCompleted | 4.23.4 |
### 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: ```swift theme={null} Sprig.shared.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 Sprig only uses `Foundation`, `UIKit`, `SystemConfiguration`, and `CoreGraphics` with no third-party frameworks to provide the smallest disk footprint on your app binary. The SDK size is **234 KB** compressed and **592 KB** uncompressed. Note: Compressed is equivalent to the additional size downloaded from the App Store, and uncompressed is the additional size on an iPhone after installation Methodology: Created a fresh Xcode project with and without UserLeapKit.framework and used the App Size Report tool ([Apple docs](https://developer.apple.com/documentation/xcode/reducing_your_app_s_size#//apple_ref/doc/uid/DTS40014195-CH1-MEASURE)) # React Native SDK Source: https://docs.sprig.com/docs/installation/introduction-mobile/react-native-module Easily install Sprig into your React Native mobile apps via Segment to track behavior and send targeted In-Product Surveys based on your users' characteristics and actions they take in your product. ## Getting Started ### Overview The Sprig React Native SDK, 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 React Native 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 13 or above; Xcode 14 * [Android](/docs/Installation/introduction-mobile/android-sdk-installation/index#requirements): Android SDK 21 (Lollipop, OS 5.0) and above ## Install React Native Module ### Obtain an Environment ID Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [Integrations > React Native Module](https://app.sprig.com/integrations/installation/react-native-module)). 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. ### Install with npm/Yarn Use the following shell command to install the Sprig SDK through [npm](https://en.wikipedia.org/wiki/Npm_\(software\)) or [YARN](https://en.wikipedia.org/wiki/Yarn_\(package_manager\)). Note that you will have to update the SDK manually to receive the latest functionality. We recommend you update the package monthly for improved functionality and bug fixes. ```shell NPM theme={null} npm install --save react-native-userleap ``` ```shell Yarn theme={null} yarn add react-native-userleap@latest ``` 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 ios rm Podfile.lock pod repo update pod install ``` ### Initialize the SDK Then, in your application, initialize Sprig with your ENVIRONMENT\_ID: ```javascript theme={null} import { Linking } from 'react-native'; import Sprig from 'react-native-userleap' Sprig.configure('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. **/ Linking.getInitialURL().then(url => { let urlObj = new URL(url); let previewKey = urlObj.searchParams.get('sprigPreviewKey'); if (previewKey) { Sprig.setPreviewKey(previewKey) } }).catch(error => { console.log(error)}) // This handles URLs when the app is already open, but not foregrounded. Linking.addEventListener('url', (event) => { let urlObj = new URL(event.url); let previewKey = urlObj.searchParams.get('sprigPreviewKey'); if (previewKey) { Sprig.setPreviewKey(previewKey) } }) ``` 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. Note: If an installation error occurs on incompatible react versions, you may need to use the `--legacy-peer-deps` option ```bash theme={null} npm i --legacy-peer-deps ``` Note: If this error occurs on Android ` Attempt to invoke virtual method'boolean com.facebook.react.uimanager.FabricViewStateManager.hasStateWrappper()`, you can either update your `react-native` dependency to version `0.68.2` or higher, or you can add the following snippet to the dependencies in the `build.gradle` file under the app directory. The version block is necessary in the snippet. ```groovy theme={null} implementation ("androidx.appcompat:appcompat:1.3.1") { version { strictly '1.3.1' } } ``` **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 ```javascript 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. **/ import { Linking } from 'react-native'; Linking.getInitialURL().then(url => { let urlObj = new URL(url); let previewKey = urlObj.searchParams.get('sprigPreviewKey'); if (previewKey) { Sprig.setPreviewKey(previewKey) } }).catch(error => { console.log(error)}) // This handles URLs when the app is already open, but not foregrounded. Linking.addEventListener('url', (event) => { let urlObj = new URL(event.url); let previewKey = urlObj.searchParams.get('sprigPreviewKey'); if (previewKey) { Sprig.setPreviewKey(previewKey) } }) ``` Alternatively, you can overwrite the previously added install code with the version [here](/docs/Installation/introduction-mobile/react-native-module#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 via local storage. We recommend you set the User ID whenever the user logs in to your app, as well as after the installation snippet (if the user is already logged in). ```javascript theme={null} Sprig.setUserIdentifier('USER_ID'); ``` ### Logout When a user logs out of your app, make sure to log out of Sprig. This will prevent new activity from being associated with an incorrect 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. ```javascript 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 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: ```javascript theme={null} Sprig.trackWithProperties( 'EVENT_NAME', 'USER_ID', null, // ignore this parameter { property1: 'value', }, state => { if (state === Sprig.SurveyState.READY) { Sprig.presentSurvey(); } }, ); ``` 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. 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 user attributes, provide the SDK with a key-value pairs: * `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 ```javascript theme={null} Sprig.setVisitorAttribute('ATTRIBUTE_NAME', 'ATTRIBUTE_VALUE'); // you can set multiple at a time // to save on network round trips Sprig.setVisitorAttributes({'ATTRIBUTE_NAME', 'ATTRIBUTE_VALUE'}); // if attributes no longer apply to the user, // you can delete multiple at a time Sprig.removeVisitorAttributes({'ATTRIBUTE_NAME', 'ATTRIBUTE_VALUE'}); ``` ### 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. ```javascript theme={null} Sprig.setEmailAddress('EMAIL_ADDRESS'); ``` ## **Listening to Lifecycle Events** Sprig emits **lifecycle events** as the SDK initializes and as surveys are presented, answered, and closed. You can subscribe to these to run your own logic — for example, pausing background media while a survey is on screen, or logging when a survey completes.

Subscribe with `addEventListener`, which returns a subscription you can later remove: ```javascript theme={null} const subscription = Sprig.addEventListener( Sprig.SprigEventName.surveyPresented, (event) => { console.log('A survey was presented', event); } ); // Later, when you no longer need it: subscription.remove(); ``` The event name can be passed as a string or via the `Sprig.SprigEventName` constants. The callback receives an `event` object that always includes the event `type`, plus any fields relevant to that event (for example, `surveyId` on survey events).

**Commonly used events** * `sdkReady` — the SDK has finished initializing * `surveyWillPresent` / `surveyPresented` / `surveyAppeared` — a survey is being shown * `surveyCloseRequested` / `surveyWillClose` / `surveyClosed` — a survey is closing * `surveyCompleted` — the user completed a survey * `visitorIdUpdated` — the visitor ID changed * `questionAnswered` — the user answered a question within a survey * `loggingEvent` — SDK diagnostic logs, useful for debugging See the `Sprig.SprigEventName` enum for the full list of events.

**Removing listeners** ```javascript theme={null} // Remove all listeners for a single event Sprig.removeAllEventListeners(Sprig.SprigEventName.surveyPresented); // Remove all lifecycle event listeners Sprig.removeAllEventListeners(); ``` ## **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 Image 2354 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 ### App size impact See more information about the [iOS app size impact](/docs/Installation/introduction-mobile/ios-sdk-installation#app-size-impact) and [Android app size impact](/docs/Installation/introduction-mobile/android-sdk-installation/index#app-size-impact). # Segment Android Source: https://docs.sprig.com/docs/installation/introduction-mobile/segment-android Leverage the Segment Android CDP to easily install Sprig into your Android mobile app. This integration makes it easy to send targeted In-Product Surveys based on your users' characteristics and actions they take in your product. ## Getting Started ### Overview Segment is a Customer Data Platform (CDP) that collects and processes data from the users of your digital platforms and products. You can also use Segment to direct that data to other tools, making it a powerful tool for driving product experience insights with Sprig. If your team is already leveraging Segment in your digital properties, you can use Segment to install the Sprig SDK as well as send the data Sprig needs to trigger and filter studies (like events and attributes). This is an effective low-to-no-code option because it requires minimal code changes to deploy in-product Sprig studies. Even many of Sprig’s advanced features also require no changes to your codebase as long as you know what Segment functions your organization is already deploying. **Warning:** Segment Actions vs Segment Classic This install method leverages [Segment Actions](https://segment.com/docs/connections/destinations/actions/) both to install the Sprig SDK and to send events and attributes to Sprig from Segment. In most cases, we recommend integrating Sprig with Segment Actions over Segment Classic, although certain use cases may require Segment Classic, such as passing data to Sprig from your product's backend. For more information, consult with your Segment administrator or our [Segment Classic](/docs/Integrations/data-sources-introduction/segment-classic) documentation. ### Requirements 1. 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/segment-android). 2. You will either need to access your team’s Segment account, or work with your team’s Segment administrator. 3. If you are planning to use Segment as a source for certain events and attributes, you may wish to consult with a developer on your team who has knowledge of how these events and attributes are expressed in the codebase. ## Install SDK If you are running Segment and wish to integrate your Segment instance with Sprig, you will first need to follow these steps to install the Sprig SDK. ### Obtain a Sprig Environment ID Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [Integrations > Segment Android](https://app.sprig.com/integrations/installation/segment-android)). 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. ### Set up Sprig as a Segment Destination In Segment, you will be connecting your app as a Source to Sprig as a Destination. This will enable the Segment SDK to pass data to the Sprig SDK. To do this, follow these steps (or follow [this video](https://www.loom.com/share/f6858cc78d2f4132965e853ec4d0b80d)): 1. In Segment, click **Connections**, then click **Destinations**. 2. Search for “Sprig” and select the **Sprig** destination. 3. Click **Configure Sprig**. 4. Select your data source (e.g. your app). 5. Enter an identifiable destination name and ensure **Actions** is selected. 6. Copy your **Environment ID** from your [Sprig Dashboard](https://app.sprig.com/integrations) and paste it into the **Environment ID** field. 7. Turn on **Enable Destination** and save your changes. ### Install the Sprig Plugin via Gradle Next, you will need to install the Sprig plugin. 1. Add mavenCentral() to your project's root build.gradle repositories block 2. In your application module's build.gradle file, add the dependency: ```gradle theme={null} dependencies { implementation "com.userleap:segment-analytics-kotlin-destination:$version" } ``` Note the Sprig Android SDK will be installed as an additional dependency. ### Initialize the Sprig Plugin Add the Sprig destination where Segment is configured. If you are initializing the Analytics class in your Application class: ```gradle theme={null} analytics = Analytics(BuildConfig.SEGMENT_WRITE_KEY, this) { // Automatically track Lifecycle events trackApplicationLifecycleEvents = true flushAt = 3 flushInterval = 10 }.add(SprigDestination(application = this)) ``` If you are initializing the Analytics class in your Activity class: ```gradle theme={null} analytics = Analytics(BuildConfig.SEGMENT_WRITE_KEY, this) { // Automatically track Lifecycle events trackApplicationLifecycleEvents = true flushAt = 3 flushInterval = 10 }.add(SprigDestination(application = applicationContext)) ``` And that's it! All Users, Events, and Attributes that you send to the Segment SDK will automatically be forwarded to the Sprig SDK. Surveys will be presented on the top activity. ## Identify Users Each time a user is tracked by Sprig on an app with the SDK installed, they are assigned a unique visitor ID in Sprig that allows users to be targeted with studies when they perform specified behaviors. While this is a requirement for targeting users with Sprig studies, these are still considered unauthenticated users until their Sprig visitor IDs are coupled with the unique USER\_IDs assigned to users within your platform’s internal authentication framework. We recommend that you follow this best practice when installing Sprig: * This ensures consistency between the visitor IDs generated by Sprig and the ones in your internal database, product analytics/CDP, or data warehouse, allowing more effective targeting of studies. * Your users have a consistent experience across platforms, and do not see the same study multiple times. * **It also optimizes the number of [Monthly Unique Users (MUUs)](/docs/account-and-settings/usage-muu/index) sent to Sprig, which impacts your billing**. If necessary, 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. Once you've configured Sprig as a Segment destination above, users tracked from Segment's [Identify method](https://segment.com/docs/connections/spec/identify/) will be sent into Sprig: ```kotlin theme={null} Analytics.with(context).identify("userId123", Traits().putName("James Gibbson"), null); ``` You can view these users in Segment in the **Debugger**, or in Sprig on the Users page. ### Logout When a user logs out of your app, make sure to log out of Sprig. This will prevent new activity from being associated with an incorrect user. Note that if you call `analytics.track("SOME_EVENT")` on an unauthenticated user, Sprig will assign them a new profile and count this new user separately toward your MTU limit. ```kotlin theme={null} Analytics.with(context).track("Signed Out"); ``` **Warning:** Logging out your users correctly You must make the above call to log out your users and accurately track users in Sprig. Existing calls to Segment's `analytics.reset()` in your codebase will log the user out of Segment but **not** out of Sprig, creating discrepancies in your data if an accompanying `"Signed Out"` event is not tracked. ## Track Events If you are already leveraging Segment's [Track method](https://segment.com/docs/connections/spec/track/), your events in Segment will automatically be passed to Sprig, and you do not need to do additional work. 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. To track an event, use: ```kotlin theme={null} Analytics.with(context).track("Clicked Button", new Properties().putValue("plan", "Pro Annual"); ``` Now, go to your source site or app's Debugger page on Segment, and check to see if it has registered the `Clicked Button` event. If it appears here, in Sprig's [Events page](https://app.sprig.com/events), you will also see a banner showing that you have an event request to review. Click **Manage Requests** to see the event. ## Track Attributes If you are already leveraging [traits](https://segment.com/docs/connections/spec/identify/#traits) in Segment, your traits in Segment will automatically be passed to Sprig (as Attributes), and you do not need to do additional work. 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). In Segment, the equivalent of attributes are [traits](https://segment.com/docs/connections/spec/identify/#traits), and these are treated as a subset of the Identify spec. ## 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 Congratulations! Your installation is complete and you can begin deploying. # Segment iOS Source: https://docs.sprig.com/docs/installation/introduction-mobile/segment-ios Easily install Sprig into your iOS app via Segment to track your users' behavior and send targeted In-Product Surveys based on your users' characteristics and actions they take in your product. ## Getting Started ### Overview Segment is a Customer Data Platform (CDP) that collects and processes data from the users of your digital platforms and products. You can also use Segment to direct that data to other tools, making it a powerful tool for driving product experience insights with Sprig. If your team is already leveraging Segment in your digital properties, you can use Segment to install the Sprig SDK as well as send the data Sprig needs to trigger and filter studies (like events and attributes). This is an effective low-to-no-code option because it requires minimal code changes to deploy in-product Sprig studies. Even many of Sprig’s advanced features also require no changes to your codebase as long as you know what Segment functions your organization is already deploying. **Warning:** Segment Actions vs Segment Classic This install method leverages [Segment Actions](https://segment.com/docs/connections/destinations/actions/) both to install the Sprig SDK and to send events and attributes to Sprig from Segment. In most cases, we recommend integrating Sprig with Segment Actions over Segment Classic, although certain use cases may require Segment Classic, such as passing data to Sprig from your product's backend. For more information, consult with your Segment administrator or our [Segment Classic](/docs/Integrations/data-sources-introduction/segment-classic) documentation. ### Requirements 1. 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/segment-ios). 2. You will either need to access your team’s Segment account, or work with your team’s Segment administrator. 3. If you are planning to use Segment as a source for certain events and attributes, you may wish to consult with a developer on your team who has knowledge of how these events and attributes are expressed in the codebase. 4. You have Segment's [Swift](https://github.com/segmentio/analytics-swift) library installed ## Install SDK If you are running Segment and wish to integrate your Segment instance with Sprig, you will first need to follow these steps to install the Sprig SDK. ### Obtain a Sprig Environment ID Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [Integrations > Segment iOS](https://app.sprig.com/integrations/installation/segment-ios)). 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. ### Set up Sprig as a Segment Destination In Segment, you will be connecting your app as a Source to Sprig as a Destination. This will enable the Segment SDK to pass data to the Sprig SDK. To do this, follow these steps (or follow [this video](https://www.loom.com/share/f6858cc78d2f4132965e853ec4d0b80d)): 1. In Segment, click **Connections**, then click **Destinations**. 2. Search for “Sprig” and select the **Sprig** destination. 3. Click **Configure Sprig**. 4. Select your data source (e.g. your app). 5. Enter an identifiable destination name and ensure **Actions** is selected. 6. Copy your **Environment ID** from your [Sprig Dashboard](https://app.sprig.com/integrations) and paste it into the **Environment ID** field. 7. Turn on **Enable Destination** and save your changes. Next, you will need to install the Sprig plugin via SPM or via Package.swift. **Warning:** Installing via SPM or via Package.swift These are equivalent options — simply choose the installation method that you are more comfortable or familiar with. ### Install the Sprig Plugin via SPM 1. In Xcode > File > Add Packages, search for `https://github.com/UserLeap/analytics-swift-sprig` (you can view or star the [plugin repository on Github](https://github.com/UserLeap/analytics-swift-sprig)) 2. Click **Add Package** Image 2150 ### Install the Sprig Plugin via Package.swift Open your Package.swift file and add the following to the dependencies section: ```swift theme={null} dependencies: [ // ... other dependencies .package( url: "https://github.com/UserLeap/analytics-swift-sprig.git", from: "1.2.1" ), ] ``` If you have not migrated to Xcode 14 and need an Xcode 13 compatible version, you will need to use our legacy build: ```swift theme={null} dependencies: [ // ... other dependencies .package( url: "https://github.com/UserLeap/analytics-swift-sprig.git", exact: Version(1, 2, 1, prereleaseIdentifiers: ["legacy"]) // the version number are in sequence: major, minor, patch, prereleaseIdentifier without '-'. ), ] ``` Then specify the name of the package: ```swift theme={null} targets: [ .target( name: "YourPackageName", dependencies: [ .product(name: "SegmentSprig", package: "analytics-swift-sprig"), ] ) ] ``` Note the Sprig iOS SDK will also be installed as an additional dependency. ### Initialize the Sprig Plugin Go to your file that sets up your Segment Installation and add the following import: ```swift theme={null} import Segment import SegmentSprig // <-- Add this line ``` Add the following after you have initialized your `Analytics` object: ```swift theme={null} Analytics.add(plugin: SprigDestination()) ``` And that's it! All Users, Events, and Attributes that you send to the Segment SDK will automatically be forwarded to the Sprig SDK. Surveys will be presented on the top ViewController. ## Identify Users Each time a user is tracked by Sprig on an app with the SDK installed, they are assigned a unique visitor ID in Sprig that allows users to be targeted with studies when they perform specified behaviors. While this is a requirement for targeting users with Sprig studies, these are still considered unauthenticated users until their Sprig visitor IDs are coupled with the unique USER\_IDs assigned to users within your platform’s internal authentication framework. We recommend that you follow this best practice when installing Sprig: * This ensures consistency between the visitor IDs generated by Sprig and the ones in your internal database, product analytics/CDP, or data warehouse, allowing more effective targeting of studies. * Your users have a consistent experience across platforms, and do not see the same study multiple times. * **It also optimizes the number of [Monthly Unique Users (MUUs)](/docs/account-and-settings/usage-muu/index) sent to Sprig, which impacts your billing**. If necessary, 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. Once you've configured Sprig as a Segment destination above, users tracked from Segment's [Identify method](https://segment.com/docs/connections/spec/identify/) will be sent into Sprig: ```swift theme={null} Analytics.shared().identify("userId123", traits: ["firstName": "James", "lastName": "Gibbson"]) ``` You can view these users in Segment in the **Debugger**, or in Sprig on the Users page. ### Logout When a user logs out of your app, make sure to log out of Sprig. This will prevent new activity from being associated with an incorrect user. Note that if you call `analytics.track("SOME_EVENT")` on an unauthenticated user, Sprig will assign them a new profile and count this new user separately toward your MTU limit. ```swift theme={null} Analytics.shared().track("Signed Out") ``` **Warning:** Logging out your users correctly You must make the above call to log out your users and accurately track users in Sprig. Existing calls to Segment's `analytics.reset()` in your codebase will log the user out of Segment but **not** out of Sprig, creating discrepancies in your data if an accompanying `"Signed Out"` event is not tracked. ## Track Events If you are already leveraging Segment's [Track method](https://segment.com/docs/connections/spec/track/), your events in Segment will automatically be passed to Sprig, and you do not need to do additional work. 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. To track an event, use: ```swift theme={null} Analytics.shared().track("Clicked Button", properties: ["plan": "Pro Annual", "accountType": "Wick"]) ``` Now, go to your source site or app's Debugger page on Segment, and check to see if it has registered the `Clicked Button` event. If it appears here, in Sprig's [Events page](https://app.sprig.com/events), you will also see a banner showing that you have an event request to review. Click **Manage Requests** to see the event. ## Track Attributes If you are already leveraging [traits](https://segment.com/docs/connections/spec/identify/#traits) in Segment, your traits in Segment will automatically be passed to Sprig (as Attributes), and you do not need to do additional work. 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). In Segment, the equivalent of attributes are [traits](https://segment.com/docs/connections/spec/identify/#traits), and these are treated as a subset of the Identify spec. ## 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 Congratulations! Your installation is complete and you can begin deploying. # Segment React Native Source: https://docs.sprig.com/docs/installation/introduction-mobile/segment-react-native Leverage the Segment React Native CDP to easily install Sprig into your React Native mobile app. This integration makes it easy to send targeted In-Product Surveys based on your users' characteristics and actions they take in your product. ## Getting Started ### Overview Segment is a Customer Data Platform (CDP) that collects and processes data from the users of your digital platforms and products. You can also use Segment to direct that data to other tools, making it a powerful tool for driving product experience insights with Sprig. If your team is already leveraging Segment in your digital properties, you can use Segment to install the Sprig SDK as well as send the data Sprig needs to trigger and filter studies (like events and attributes). This is an effective low-to-no-code option because it requires minimal code changes to deploy in-product Sprig studies. Even many of Sprig’s advanced features also require no changes to your codebase as long as you know what Segment functions your organization is already deploying. **Warning:** Segment Actions vs Segment Classic This install method leverages [Segment Actions](https://segment.com/docs/connections/destinations/actions/) both to install the Sprig SDK and to send events and attributes to Sprig from Segment. In most cases, we recommend integrating Sprig with Segment Actions over Segment Classic, although certain use cases may require Segment Classic, such as passing data to Sprig from your product's backend. For more information, consult with your Segment administrator or our [Segment Classic](/docs/Integrations/data-sources-introduction/segment-classic) documentation. ### Requirements 1. 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/segment-react-native). 2. You will either need to access your team’s Segment account, or work with your team’s Segment administrator. 3. If you are planning to use Segment as a source for certain events and attributes, you may wish to consult with a developer on your team who has knowledge of how these events and attributes are expressed in the codebase. ## Install SDK If you are running Segment and wish to integrate your Segment instance with Sprig, you will first need to follow these steps to install the Sprig SDK. ### Obtain a Sprig Environment ID Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [Integrations > Segment React Native](https://app.sprig.com/integrations/installation/segment-react-native)), 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. ### Set up Sprig as a Segment Destination In Segment, you will be connecting your app as a Source to Sprig as a Destination. This will enable the Segment SDK to pass data to the Sprig SDK. To do this, follow these steps (or follow [this video](https://www.loom.com/share/f6858cc78d2f4132965e853ec4d0b80d)): 1. In Segment, click **Connections**, then click **Destinations**. 2. Search for “Sprig” and select the **Sprig** destination. 3. Click **Configure Sprig**. 4. Select your data source (e.g. your app). 5. Enter an identifiable destination name and ensure **Actions** is selected. 6. Copy your **Environment ID** from your [Sprig Dashboard](https://app.sprig.com/integrations) and paste it into the **Environment ID** field. 7. Turn on **Enable Destination** and save your changes. ### Install the Sprig Plugin with npm/Yarn Next, use the following shell command to install the Sprig SDK through [npm](https://en.wikipedia.org/wiki/Npm_\(software\)) or [YARN](https://en.wikipedia.org/wiki/Yarn_\(package_manager\)). Note that you will have to update the SDK manually to receive the latest functionality. We recommend you update the package monthly for improved functionality and bug fixes. ```shell npm theme={null} npm install --save @sprig-technologies/analytics-react-native-plugin-sprig react-native-userleap ``` ```shell Yarn theme={null} yarn add @sprig-technologies/analytics-react-native-plugin-sprig react-native-userleap ``` 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 ios rm Podfile.lock pod repo update pod install ``` ### Initialize the Sprig Plugin In your code where you initialize the analytics client call the `.add({ plugin })` method with a SprigPlugin instance. ```javascript theme={null} // App.js import { createClient } from '@segment/analytics-react-native'; import { SprigPlugin } from '@sprig-technologies/analytics-react-native-plugin-sprig'; const segmentClient = createClient({ writeKey: 'SEGMENT_WRITE_KEY' }); const plugin = new SprigPlugin(); segmentClient.add({ plugin }); ``` And that's it! All Users, Events, and Attributes that you send to the Segment SDK will automatically be forwarded to the Sprig SDK. Surveys will be presented on the top activity. ## Identify Users Each time a user is tracked by Sprig on an app with the SDK installed, they are assigned a unique visitor ID in Sprig that allows users to be targeted with studies when they perform specified behaviors. While this is a requirement for targeting users with Sprig studies, these are still considered unauthenticated users until their Sprig visitor IDs are coupled with the unique USER\_IDs assigned to users within your platform’s internal authentication framework. We recommend that you follow this best practice when installing Sprig: * This ensures consistency between the visitor IDs generated by Sprig and the ones in your internal database, product analytics/CDP, or data warehouse, allowing more effective targeting of studies. * Your users have a consistent experience across platforms, and do not see the same study multiple times. * **It also optimizes the number of [Monthly Unique Users (MUUs)](/docs/account-and-settings/usage-muu/index) sent to Sprig, which impacts your billing**. If necessary, 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. Once you've configured Sprig as a Segment destination above, users tracked from Segment's [Identify method](https://segment.com/docs/connections/spec/identify/) will be sent into Sprig: ```javascript theme={null} const { identify } = useAnalytics(); identify('userId123', { firstName: 'James', lastName: 'Gibbson', }); ``` You can view these users in Segment in the **Debugger**, or in Sprig on the Users page. ### Logout When a user logs out of your app, make sure to log out of Sprig. This will prevent new activity from being associated with an incorrect user. Note that if you call `analytics.track("SOME_EVENT")` on an unauthenticated user, Sprig will assign them a new profile and count this new user separately toward your MTU limit. ```javascript theme={null} const { track } = useAnalytics(); track('Signed Out'); ``` **Warning:** Logging out your users correctly You must make the above call to log out your users and accurately track users in Sprig. Existing calls to Segment's `analytics.reset()` in your codebase will log the user out of Segment but **not** out of Sprig, creating discrepancies in your data if an accompanying `"Signed Out"` event is not tracked. ## Track Events If you are already leveraging Segment's [Track method](https://segment.com/docs/connections/spec/track/), your events in Segment will automatically be passed to Sprig, and you do not need to do additional work. 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. To track an event, use: ```javascript theme={null} const { track } = useAnalytics(); track('Clicked Button', { plan: "Pro Annual", accountType: "Wick" }); ``` Now, go to your source site or app's Debugger page on Segment, and check to see if it has registered the `Clicked Button` event. If it appears here, in Sprig's [Events page](https://app.sprig.com/events), you will also see a banner showing that you have an event request to review. Click **Manage Requests** to see the event. ## Track Attributes If you are already leveraging [traits](https://segment.com/docs/connections/spec/identify/#traits) in Segment, your traits in Segment will automatically be passed to Sprig (as Attributes), and you do not need to do additional work. 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). In Segment, the equivalent of attributes are [traits](https://segment.com/docs/connections/spec/identify/#traits), and these are treated as a subset of the Identify spec. ## 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 Congratulations! Your installation is complete and you can begin deploying. # Web Source: https://docs.sprig.com/docs/installation/introduction-web/index ## Overview Installing Sprig allows you to monitor your customer's interactions and generate triggers to launch a Sprig Survey or Replay, so you can ask just the right question and capture just the right moments--all at just the right time. Installing Sprig in your website or web app allows you to send [Events](/docs/shared-study-foundations/events/index) and [Attributes](/docs/shared-study-foundations/attributes) associated with users as they use your Website or Web App. ## Installation Options To launch a Sprig study on your Website or Web App, you'll need to install one of the following: * [JavaScript SDK](/docs/installation/introduction-web/web-javascript) * [Google Tag Manager](/docs/Installation/introduction-web/web-google-tag-manager) (if Google Tag Manager is installed on your site) * [Segment Web](/docs/Installation/introduction-web/segment-web) (if Segment is installed on your site) * npm/yarn ## More Information ### Performance Performance is a critical part of any successful website, and Sprig ensures you can get deep insights about your users without sacrificing your site’s performance. #### Files The script is loaded asynchronously, so it does not impact website load times or scroll performance. The Sprig JS SDK is broken up into 2 JS files: a controller and a view. controller.js: 89kB (28kb gzipped) The controller is responsible for keeping track of your users and your interface to track events and set attributes and identities. A vast majority of sessions are not shown studies, so we separated the view into a separate file, reducing data usage for your users. view\.js: 171kB (users only download this when a study is presented to them) The view contains the code to show the study and send the responses to Sprig. You may notice that our [npm package](https://www.npmjs.com/package/@sprig-technologies/sprig-browser) shows a size of \~800kb. This is double of what is mentioned above because it includes both `.js` and `.cjs` exports. Sprig JS is intended only for web browser use so the `.cjs` files won't be included in your bundle and thus will be half of what is mentioned on the npm webpage #### Availability and load time The Sprig client-side script is hosted on a leading global CDN powered by AWS CloudFront. This allows for the fastest load times by hosting the script as close to the users as possible. #### Supporter browser versions The Sprig client-side script is tested against all modern browsers. These are our minimum supported versions: * Chrome 87 * Firefox 78 * Safari 14 * Edge 88 As Chrome and Firefox are on 6-week release cycles, best-effort support is given to older releases. #### Impact on Page Load ##### Methodology We performed an A/B test of the Sprig marketing page ([https://sprig.com](https://sprig.com)) with the Sprig SDK Snippet installed and not-installed. We used Lighthouse and configured it to throttle the network to "Slow 4G" and CPU to "4x slowdown". We measured 3 metrics: * FCP (First Contentful Paint) * LCP (Last Contentful Paint) * DCL (DOM Content Loaded) We ran each variant 20 times and both the average and median values showed no difference # Segment Web Source: https://docs.sprig.com/docs/installation/introduction-web/segment-web Leverage the Segment Web CDP to easily install Sprig into your web product. This integration makes it easy to send targeted In-Product Surveys based on your users' characteristics and actions they take in your product. ## Getting Started ### Overview Segment is a Customer Data Platform (CDP) that collects and processes data from the users of your digital platforms and products. You can also use Segment to direct that data to other tools, making it a powerful tool for driving product experience insights with Sprig. If your team is already leveraging Segment in your digital properties, you can use Segment to install the Sprig SDK as well as send the data Sprig needs to trigger and filter studies (like events and attributes). This is an effective low-to-no-code option because it requires no changes to your codebase to deploy in-product Sprig studies. Even many of Sprig’s advanced features also require no changes to your codebase as long as you know what Segment functions your organization is already deploying. **Warning:** Segment Actions vs Segment Classic This install method leverages [Segment Actions](https://segment.com/docs/connections/destinations/actions/) both to install the Sprig SDK and to send events and attributes to Sprig from Segment. In most cases, we recommend integrating Sprig with Segment Actions over Segment Classic, although certain use cases may require Segment Classic, such as passing data to Sprig from your product's backend. For more information, consult with your Segment administrator or our [Segment Classic](/docs/Integrations/data-sources-introduction/segment-classic) documentation. ### Requirements * You must be on Segment [Analytics.js 2.0](https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/) * 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/segment-web). * You will either need to access your team’s Segment account, or work with your team’s Segment administrator. * If you are planning to use Segment as a source for certain events and attributes, you may wish to consult with a developer on your team who has knowledge of how these events and attributes are expressed in JavaScript. ## Install SDK If you are running Segment and wish to integrate your Segment instance with Sprig, you will first need to follow these steps to install the Sprig SDK. ### Obtain a Sprig Environment ID Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [Integrations > Segment Web](https://app.sprig.com/integrations/installation/segment-web)). 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. ### Set up Sprig as a Segment Destination In Segment, you will be connecting your digital platform or product as a Source to Sprig as a Destination. This will both install the Sprig SDK in your digital platform and allow events and attributes to be passed back to Sprig for the purpose of triggering and filtering studies. To do this, follow these steps (or follow [this video](https://www.loom.com/share/f6858cc78d2f4132965e853ec4d0b80d)): 1. In Segment, click **Connections**, then click **Destinations**. 2. Search for “Sprig” and select the **Sprig** destination. 3. Click **Configure Sprig**. 4. Select your data source (e.g. your website or app). 5. Enter an identifiable destination name and ensure **Actions** is selected. 6. Copy your **Environment ID** from your [Sprig Dashboard](https://app.sprig.com/connect) and paste it into the **Environment ID** field. 7. Turn on **Enable Destination** and save your changes. That’s it! As well as the Sprig SDK, your events, attributes and other user data (e.g. userIDs) are automatically configured to be forwarded to Sprig. (See the **Mappings** tab for more details) ### Verify Installation To verify your Sprig installation, go to your Segment-enabled product and “hard refresh” the page to ensure the Segment destinations are updated. Next, open the console by holding `Control+Shift+I` on Chrome for Windows or `Option+Command+I` on Chrome and Safari for Mac, clicking on the Console tab. Once there, execute either or both of the following commands: * Type `Sprig._segment`. If the value 1 is returned, Sprig has been successfully installed via Segment. * Retrieve your Sprig visitor ID with `Sprig.visitorId`. This is the unique ID assigned by Sprig to visitors loading the SDK, so the value that is returned indicates Sprig is installed. You can then add this value to the following URL to view your activity in the Sprig Users page: `https://app.sprig.com/users/` For the following sections on identifying users and tracking events, you will need to ensure your Sprig Mappings are enabled in Segment. These are enabled by default, but if you want to review these settings in Segment, go to Destinations > Sprig > Mappings > Edit Mapping. ## Identify Users Each time a user is tracked by Sprig on a webpage with the SDK installed, they are assigned a unique visitor ID in Sprig that allows users to be targeted with studies when they perform specified behaviors. While this is a requirement for targeting users with Sprig studies, these are still considered unauthenticated users until their Sprig visitor IDs are coupled with the unique USER\_IDs assigned to users within your platform’s internal authentication framework. We recommend that you follow this best practice when installing Sprig: * This ensures consistency between the visitor IDs generated by Sprig and the ones in your internal database, product analytics/CDP, or data warehouse, allowing more effective targeting of studies. * Your users have a consistent experience across platforms, and do not see the same study multiple times. * **It also optimizes the number of [Monthly Unique Users (MUUs)](/docs/account-and-settings/usage-muu/index#monthly-unique-users-muu-usage) sent to Sprig, which impacts your billing**. If necessary, 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. Once you've configured Sprig as a Segment destination above, users tracked from Segment's [Identify method](https://segment.com/docs/connections/spec/identify/) will be sent into Sprig. If you want to test user identification, open the web page or app in your browser and run this command in your web console: ```javascript theme={null} analytics.identify('userId123', { firstName: 'James', lastName: 'Gibbon' }); ``` In Segment, go to the corresponding source and click **Debugger**. You should see something similar to the following: Once Identify events are being triggered in your users' browsers and successfully forwarded to Sprig, you can view visitors being created on your Sprig Users dashboard. You'll be able to see visitor emails if being set, and when clicking on a specific visitor, you'll be able to see their User ID and any attributes set for them. ### Logout When a user logs out of your webpage, make sure to log out of Sprig. This will prevent new activity from being associated with an incorrect user. Note that if you call `analytics.track("SOME_EVENT")` on an unauthenticated user, Sprig will assign them a new profile and count this new user separately toward your MTU limit. ```javascript theme={null} analytics.track("Signed Out") ``` > **Warning:** Logging out your users correctly > > You must make the above call to log out your users and accurately track users in Sprig. Existing calls to Segment's `analytics.reset()` in your codebase will log the user out of Segment but **not** out of Sprig, creating discrepancies in your data if an accompanying `"Signed Out"` event is not tracked. ## Track Events If you are already leveraging Segment's [Track method](https://segment.com/docs/connections/spec/track/), your events in Segment will automatically be passed to Sprig, and you do not need to do additional work. 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. If you want to test that events are passing from your source to Sprig through Segment, you can follow a similar process as testing that you are [identifying users](#identify-users). In the console, copy and paste the following script to stage a mock event: ```javascript theme={null} analytics.track('Clicked Button', { plan: "Pro Annual", accountType: "Wick" }) ``` Now, go to your source site or app's Debugger page on Segment, and check to see if it has registered the `Clicked Button` event. If it appears here, in Sprig's [Events page](https://app.sprig.com/events), you will also see a banner showing that you have an event request to review. Click **Manage Requests** to see the event. ### No-Code Events No-Code events let teammates without access to the codebase or to Segment create events in Sprig based on the page’s URL, HTML elements, or CSS, which can then be used to trigger or filter Web studies. No-Code events tend to be used to define more straightforward user actions, like viewing a page or clicking a button. For more information, see [No-Code events](/docs/shared-study-foundations/events/no-code-events). ## Track Attributes If you are already leveraging [traits](https://segment.com/docs/connections/spec/identify/#traits) in Segment, your traits in Segment will automatically be passed to Sprig (as Attributes), and you do not need to do additional work. 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). In Segment, the equivalent of attributes are [traits](https://segment.com/docs/connections/spec/identify/#traits), and these are treated as a subset of the Identify spec. ## Filter Attributes through Segment Segment offers the ability to define rules, so that only a subset of your data can be automatically sent to Sprig, through [Destination Filters](https://segment.com/docs/connections/destinations/destination-filters/). This is often used for limiting which PII is sent to Sprig, and does not require any additional engineering work to implement. The ability to use Destination filters within Segment, for reducing the scope of which data is sent to Sprig, is currently limited to Segment Business Tier customers. ### Enable Destination Filters for your Segment Source As part of the Segment Data Source you are using, you will need to ensure that the ability to use `Destination Filters` is enabled, under `Settings > Analytics.js` and toggling the `Destination Filters` setting on: ### Create the Destination Filter on your Segment Destination As part of your Sprig destination within Segment, you'll now need to create the filter. In the example below, we can define certain traits that should not be sent to Sprig, such as the `!email` associated with this visitor: Once your conditions have been set, you will then need to name your filter and save it. ## Screen Calls (Mobile) Segment allows clients to take advantage of Screen calls, which allow you to record whenever a user sees a Screen, which is the mobile app equivalent of a Page in Segment. Screen calls tracked via[ Segment’s Screen method](https://segment.com/docs/connections/spec/screen/) can be used in Sprig to trigger a Code Event when building out a Study’s targeted audience. For example, if there are specific user interactions in your mobile app that you would like to tie to a Study in Sprig, you can use an attribute in your Segment Screen call to trigger your Sprig Study. ## Test & Deploy To confirm everything is working as expected with survey delivery, you can create a survey and manually trigger delivery from the Developer Console. 1. You'll first need to create a Study and set the delivery method to Web. If you're testing in the Development environment, you'll need to create the Study in Development. 2. In the Sprig app, go to [Settings > Configure](https://app.sprig.com/settings/configure) and select **Allow Manual Study Display** (on by default for the Development environment) 3. Open the developer console and run `Sprig('displaySurvey', SURVEY_ID);`. The SURVEY\_ID of a study can be found at the end of its URL (`https://app.sprig.com/surveys/SURVEY_ID`). 4. If the Sprig snippet is already installed on that page, your browser will display the study. 1. If the questions are not rendering correctly or responses aren’t uploaded, check your browser console for any errors. You may have to work with your engineering and security teams to update your installation or CSP settings to resolve the errors. After you have finished your testing, consider returning to [Settings > Configure](https://app.sprig.com/settings/configure) and select Disable Manual Study Display. This will prevent any other visitor from using displaySurvey in your environment. Congratulations! Your installation is complete and you can begin deploying. # Google tag Manager Source: https://docs.sprig.com/docs/installation/introduction-web/web-google-tag-manager ## Getting Started ### Overview [Google Tag Manager](https://tagmanager.google.com/) (GTM) is a free tool that allows you to manage and deploy tags (snippets of code or tracking pixels) on your website, browser-based app, or mobile app without having to modify the code. It requires little to no coding and is deployed in minutes. If your organization is already running Google Tag Manager, or if you wish to install Google Tag Manager, you can use it to install Sprig on your website or browser-based app, as well as send events and attributes to Sprig. This is an effective low-to-no-code option because it requires no changes to your codebase to deploy in-product Sprig studies. Even many of Sprig’s advanced features also require no changes to your codebase as long as you know what Google Tag Manager functions your organization is already deploying. > **Are you already running Google Tag Manager?** > > If you don't have the Chrome [Tag Assistant](https://chrome.google.com/webstore/detail/tag-assistant-legacy-by-g/kejbdjndbnbjgmefkgdddjlbokphdefk) extension installed, you can check if GTM is installed by invoking the `inspect` option in your web browser while viewing your team's website or application. > > 1. To open the **Inspect** window in Chrome, Firefox and Edge, press `Control+Shift+I` (or `Option+Command+I` on Chrome and Safari for Mac). > 2. Make sure you are on the **Elements** tab (or **Inspector** tab in Firefox), then press `Control+F` (or `Command+F` for Mac) to open the search field. Firefox displays the search field by default. > 3. Search for the string *GTM*. If GTM is already deployed, you should get results similar to the following:``. The container id XXXXXX-X is specific to your deployment. ### 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/google-tag-manager). * If you have not already installed Google Tag Manager, and wish to do so, you will need access to your web codebase, and be able to deploy to a development and/or production environment. You will also need to [sign up for a Google Tag Manager account](https://support.google.com/tagmanager/answer/6103696?hl=en) and set up Google Tag Manager on all pages where you plan to trigger Sprig studies. * If your organization is already running Google Tag Manager, you will need administrator access to the account. Google Tag Manager administrators can [follow these steps](https://support.google.com/tagmanager/answer/6107011?hl=en) to add new users. * If you are planning to use Google Tag Manager as a source for certain events and attributes, you may wish to consult with a developer on your team who has knowledge of how these events and attributes are expressed in JavaScript. ## Install SDK Assuming that you are already running Google Tag Manager, you will first need to install the Sprig SDK following these steps. ### Obtain an Environment ID Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [Integrations > Google Tag Manager](https://app.sprig.com/integrations/installation/google-tag-manager)). 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. ### Create a Variable with the Sprig Environment ID Variables in Google Tag Manager are placeholders that populate the code on your website with specific values. To install Sprig with Google Tag Manager, you will first need to create a variable specifying your Sprig Environment ID. This will then be used to populate the Sprig Installation Tag (see below), and specify which Sprig Environment it should target. Here are the steps for creating a variable with your Sprig Environment ID: 1. Open Google Tag Manager app and click **Variables**. 2. In **User-Defined Variables**, click **New**. 3. In the **Untitled Variable** field, give the variable an appropriate name, like SPRIG\_PROD\_ENV\_ID (if you are installing for your **Production** environment) or SPRIG\_DEV\_ENV\_ID (if you are installing for your **Development** environment). 4. Click anywhere on the **Variable Configuration** box, and scroll down the new sidebar to find **Constant** (under the **Utilities** subheading). 5. Paste your Sprig Environment ID into the **Value** field and click **Save**. ### Add the Sprig Installation Tag to your Google Tag Manager Account A Tag in Google Tag Manager is a snippet of code that executes on web pages with Google Tag Manager installed. Sprig has created an installation tag, called **Sprig Tag**, which can be found in Google Tag Manager’s Community Template Gallery, and which you will now add to your Google Tag Manager account. This will execute the Sprig SDK on all pages on your website where you have Google Tag Manager installed. Here are the steps for adding the Sprig Installation Tag to your account: 1. Open Google Tag Manager and click **Tags**. 2. Click **New** to create a new tag. 3. In the **Untitled Tag** field, give the tag an appropriate name, like Sprig Install Tag. 4. Click anywhere on the **Tag Configuration** box, and click on **Discover more tag types in the Community Template Gallery** in the new sidebar. Search for **Sprig**, click on **Sprig Tag**, and then click **Choose Template** to confirm your selection. 5. Click plus and select the Environment **Variable** you created earlier (for example, SPRIG\_PROD\_ENV\_ID or SPRIG\_DEV\_ENV\_ID). 6. Make sure the **Action Type** is set to **Install**. 7. Click anywhere on the **Triggering** box below and select **All Pages** in the new sidebar. 8. Click **Save**. 9. Click **Submit** and then **Publish** to push your changes out to your website. > **Using the Sprig Tag in Google Tag Manager** > > Throughout this page, we will be leveraging the Sprig Tag to execute a number of Sprig functions, including configuring Events, Attributes, User IDs, and Data Layer variables. For each function, you will begin by creating a new Sprig Tag as outlined in Steps 1-5 above, and then changing the action type. ### Verify Installation 1. As you did before to check for the installation of GTM, open the **Inspect** window in your browser. 2. Make sure you are on the **Elements** tab (or **Inspector** tab in Firefox), then open the search field. 3. Search for the string *sprig*. If Sprig is installed, you should get results similar to the following:``, where XXX-XXXXX is your Environment ID. Sprig has now been successfully installed using GTM. ## Identify Users Each time a user is tracked by Sprig on a webpage with the SDK installed, they are assigned a unique visitor ID in Sprig that allows users to be targeted with studies when they perform specified behaviors. While this is a requirement for targeting users with Sprig studies, these are still considered unauthenticated users until their Sprig visitor IDs are coupled with the unique USER\_IDs assigned to users within your platform’s internal authentication framework. We recommend that you follow this best practice when installing Sprig: * This ensures consistency between the visitor IDs generated by Sprig and the ones in your internal database, product analytics/CDP, or data warehouse, allowing more effective targeting of studies. * Your users have a consistent experience across platforms, and do not see the same study multiple times. * **It also optimizes the number of [Monthly Unique Users (MUUs)](/docs/account-and-settings/usage-muu/index#monthly-unique-users-muu-usage) sent to Sprig, which impacts your billing**. If necessary, 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. We can use the same Sprig Installation Tag described above to couple the Sprig visitor ID with your system’s internal USER\_ID or EMAIL\_ADDRESS in Google Tag Manager: 1. Follow [Steps 1-5 in the instructions for adding the Sprig Installation Tag](#add-the-sprig-installation-tag-to-your-google-tag-manager-account) to Google Tag Manager, though when naming the tag, choose a different name, like Sprig User ID Tag. 2. Under **Action Type**, use the dropdown menu to select “User ID” (or, if adding email address, “User Email”). 3. Enter your internal USER\_ID string to the **User ID** field. 4. Click anywhere on the **Triggering** box below and select **All Pages** in the new sidebar. 5. Click **Save**, then click **Submit** and then **Publish** to push your changes out to your website. **Warning:** Identifying Users in the Data Layer If your team is leveraging Google Tag Manager's Data Layer, user IDs may be information stored there. Sending information from the Data Layer to Sprig is treated below under [Track Attributes](#track-attributes). ## 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 via Google Tag Manager, the next step is to configure the tracking of events that you would like to use to trigger a study. You can configure events either through Google Tag Manager, or by configuring [No-Code](/docs/shared-study-foundations/events/no-code-events) events within Sprig. ### No-Code Events No-Code events let teammates without access to the codebase create events in Sprig based on the page’s URL, HTML elements, or CSS, which can then be used to trigger or filter Web studies. No-code events tend to be used to define more straightforward user actions, like viewing a page or clicking a button. For more information, see [No-Code events](/docs/shared-study-foundations/events/no-code-events). ### Configuring Events as Google Tags For more complex user actions, Google Tag Manager contains a library of common triggers that you can use to configure events in Sprig. Some common triggers in the Google Tag Manager trigger library include: * scroll depth * form submission * element clicks For more information on Google Tag Manager triggers, click [here](https://support.google.com/tagmanager/answer/7679316?hl=en). There are four main steps in configuring Google Tag Manager to generate triggers that can be used by Sprig to display a study: 1. Create and configure the Trigger in Google Tag Manager 2. Create a new Sprig Tag associated with the Trigger 3. Publish your changes to the server 4. Approve the event when it appears in Sprig’s Events page The next section describes this workflow in greater detail, using [Scroll Depth](https://support.google.com/tagmanager/answer/7679218?hl=en) as an example Trigger. ### Sending an example Event to Sprig In this example, we want the user to scroll to certain depth on the webpage in order to trigger the study. This example will use the Google Tag Manager built-in trigger [Scroll Depth](https://support.google.com/tagmanager/answer/7679218?hl=en). 1. In the Google Tag Manager app, click **Triggers** 2. Click **New** on the Triggers dashboard. 3. Click **Untitled Tag** and give the trigger an appropriate name, for example Scroll Depth. 4. Click anywhere on the **Trigger Configuration** card and select **Scroll Depth** from the sidebar that appears. 5. Configure the trigger (for example, the direction & percentage of scroll depth you want for the trigger) and click **Save**. 6. Follow [Steps 1-5 in the instructions for adding the Sprig Installation Tag](#add-the-sprig-installation-tag-to-your-google-tag-manager-account) to Google Tag Manager, though when naming the tag, choose a different name, like Sprig Scroll Depth Tag. 7. Under **Action Type**, use the dropdown menu to select “Event”. 8. Under **Event Name**, enter the name of the event as you would like it to appear in Sprig (for example, Scroll Depth). 9. Click anywhere on the **Triggering** card to bring up the sidebar where you can select the **Scroll Depth** trigger you configured earlier. 10. Click **Save** then click **Submit** and **Publish** to push the changes to the server. 11. In the target site, go to a page with Google Tag Manager installed and scroll to trigger the event. Then, in Sprig, open the **Events**, where you will see a prompt to approve a new event under review. Click **Manage Requests** to add this event. For more information, Google also provides [documentation](https://support.google.com/tagmanager/answer/6107056?hl=en) describing methods and tools to diagnose variables, tags, and triggers. ## 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). In Google Tag Manager, there are two methods by which you can pass attributes to Sprig: 1. Determine if your organization already leverages Google Tag Manager **Data Layers**, and identify variables stored in the Data Layer you wish to send to Sprig. 2. Configure a **discrete attribute** and use the Sprig Install Tag to pass the attribute If you are setting attributes with Google Tag Manager, it is likely your team is leveraging the Data Layer. The following section describes how to send these attributes to Sprig, with some further information on individual attributes following. **Configuring Attributes in Sprig** If your team is not already tracking user attributes in Google Tag Manager, you will likely require some knowledge of JavaScript to configure these attributes and direct to Sprig. Note that in order for Sprig to receive attributes, your website or web app must also be able to parse that information to the JavaScript layer. You may have to engage your Web engineering team to find out which attributes are visible to JavaScript and ask them to enable visibility for those attributes that are not. ### Sending Data Layer Variables to Sprig Google Tag Manager's [Data Layer](https://developers.google.com/tag-manager/devguide#datalayer) is a JavaScript array that stores data which you can process and pass from your website to other applications. If your team is leveraging the Data Layer to supply data to your analytics tool about the details of your website visitor (such as login status, user ID, and location), you can also use these details as attributes to filter your studies in Sprig. The most likely use case for leveraging the Data Layer as a source for Sprig is therefore if your organization is already storing user data there that would be useful for targeting studies. To **check your current Data Layer**, follow these steps: 1. Make sure Google Tag Manager is installed. 2. Go to a page where you wish to check the Data Layer, and open up the browser JavaScript console with `Ctrl + Shift + J` (`command + option + J` on Mac). 3. Enter `window.dataLayer` in the console prompt. Note: The dataLayer name is case-sensitive, meaning that only dataLayer will work, not for example, datalayer. If you are running a Data Layer on this page, you will see the data it is storing. If you are not, the console will return an 'undefined' response. #### Example Data Layer Variable Once you have determined that a Data Layer is present, the next step is to identify some information to send to Sprig. In this example, we are going to send information about which plan a user purchased when the checkout event occurred. This example will just treat this information as static data; in the real world a developer would generate this information dynamically for each checkout event. Data is stored in the Data Layer in key-value pairs. The key is a variable name in string format, and values can be any allowed JavaScript type. At our example checkout event, we might store the following information in the Data Layer: | Key | Value | | :- | :- | | event | checkout | | planid | 99 | | costPerMonth | 79 | | planName | Enterprise | | userid | 12345 | In JavaScript, this would be described as follows: ```javascript theme={null} 'event': 'checkout', 'planid': 99, 'costPerMonth': 79, 'planName': 'Enterprise', 'userid': 12345 ``` #### Instructions In order to pass this information to Sprig, we first need to add the following code snippet to the `` of the webpage before the Google Tag Manager snippet as follows: ```html theme={null} ... ``` Next, we will need to go to Google Tag Manager to create a variable that points to the Data Layer and identifes `planid` as the key we wish to select to pass to Sprig. 1. In Google Tag Manager, click **Variables**. 2. In **User-Defined Variables**, click **New**. 3. Click **Untitled Variable** and give the variable an appropriate name, for example, DL-planid. 4. In **Variable Configuration**, click anywhere on the card to choose the variable type, and select **Data Layer Variable** as the variable type in the sidebar. 5. In the Data Layer Variable Name field type `planid`. The Data Layer Variable Name field is case-sensitive.\ Click **Save**. Finally, you need to create a Sprig tag that fires at the appropriate time to send `planid` to Sprig: 1. Follow [Steps 1-5 in the instructions for adding the Sprig Installation Tag](#add-the-sprig-installation-tag-to-your-google-tag-manager-account) to Google Tag Manager, though when naming the tag, choose a different name, like Sprig DL. 2. Under **Action Type**, select **User Attribute**. This will allow you to define a custom attribute. 3. In **Attribute Key** type in the name your attribute as you wish it to appear in Sprig; in this case, 'PlanID'. Don't forget to put single quotes around the attribute key name. 4. Select the Custom JavaScript variable you created in the last step; in the previous example it was called, DL-planid. 5. Click anywhere on the **Triggering** box below and select **All Pages** in the new sidebar. 6. Click **Save**, then click **Submit** and then **Publish** to push your changes out to the server. Whenever a user clicks **Finish** to return a Study to Sprig, the current value of `planid` will be associated with the Study response. In the Sprig app, click **Users**, then click on the last **User ID**. If you look under **Profile**, you will be able to see the custom attribute that you defined. Image 351 In addition, if you go to **Studies > YOUR\_STUDY\_NAME > Responses**, then click on **Download CSV**. In the CSV file that you download there will be one column containing all the custom attributes. ### Using GTM to Trigger Dismissal of an Active Survey Using Sprig’s tag, you can configure the action of dismissing an Active Sprig Survey directly through GTM. Here are the steps for creating a trigger to dismiss an active Sprig Survey given a set of criteria. 1. Open Google Tag Manager and click Tags 2. Click New to create a new tag 3. Find the Sprig Tag and select the Action Type **Dismiss Active Survey** 4. Click plus and select the appropriate Environment Variable (for example, SPRIG\_PROD\_ENV\_ID or SPRIG\_DEV\_ENV\_ID) 5. In the Triggering section, select the set of criteria that will dictate when an Active Sprig Survey will be automatically dismissed. ### Triggering Logout User using GTM While using Sprig to track user behaviors there may be a need to have Sprig reset a users status to track a different user’s behavior across your website or application. Some common reasons this may be necessary include: 1. A user is accessing your app or website on a shared device 2. A user has multiple accounts across your website or application If it becomes necessary to reset a user via Sprig in either of those scenarios, configuring the Sprig tag to trigger a Logout User Action. You can set this up by following the typical tag and trigger configuration steps and selecting **Logout User** as the action type. ### Sending Discrete Attributes to Sprig The simplest way to send attributes to Sprig individually is to create a custom variable containing the Javascript identifying the attribute, then configuring the Sprig Tag in a similar manner as above. Simply follow the steps, but when identifying the **Variable Configuration**, select **Custom Javascript** (instead of Data Layer Variable). Supply your attribute's Javascript call here, then follow the remaining steps to action the User Attribute in the Sprig Tag as with the Data Layer Variable. ## Test & Deploy To confirm everything is working as expected with survey delivery, you can create a survey and manually trigger delivery from the Developer Console. 1. You'll first need to create a Study and set the delivery method to Web. If you're testing in the Development environment, you'll need to create the Study in Development. 2. In the Sprig app, go to [Settings > Configure](https://app.sprig.com/settings/configure) and select **Allow Manual Study Display** (on by default for the Development environment) 3. Open the developer console and run `Sprig('displaySurvey', SURVEY_ID);`. The SURVEY\_ID of a study can be found at the end of its URL (`https://app.sprig.com/surveys/SURVEY_ID`). 4. If the Sprig snippet is already installed on that page, your browser will display the study.\ 4a. If the questions are not rendering correctly or responses aren’t uploaded, check your browser console for any errors. You may have to work with your engineering and security teams to update your installation or CSP settings to resolve the errors. After you have finished your testing, consider returning to [Settings > Configure](https://app.sprig.com/settings/configure) and select Disable Manual Study Display. This will prevent any other visitor from using displaySurvey in your environment. Congratulations! Your installation is complete and you can begin deploying. # JavaScript SDK Source: https://docs.sprig.com/docs/installation/introduction-web/web-javascript ## Getting Started ### Overview The Sprig Javascript SDK, when installed in your website or web app, allows you to track your customer’s in-product behavior and display Sprig studies when they perform certain actions. To learn more about SDKs and web installation options provided by Sprig, click [here](/docs/Installation/introduction-web/index). ### 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/javascript-sdk). * Ensure you have access to your web codebase, and can deploy to a development and/or production environment ## Install SDK If you are installing the Sprig Javascript SDK, we recommend installing Sprig via the HTML code snippet. This installation method automatically ensures you have the latest version of our SDK, reducing the workload on your engineering team since they won’t have to fetch and deploy an update every time Sprig releases a new version of the SDK. You will automatically have access to the latest features on the latest SDKs. For teams that prefer to use a package manager, Sprig can also be installed via npm or Yarn. Note that your engineering team will need to do some additional work to update in order to access the latest features and bug fixes. ### Obtain an Environment ID Sprig provides two environments, Development and Production, each with its own corresponding ENVIRONMENT\_ID (which can be found in [Integrations > Javascript SDK](https://app.sprig.com/integrations/installation/javascript-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. ### Install with HTML (recommended) Add the following JavaScript snippet to every page on your website where you want Sprig to track your users. You can paste the snippet anywhere on the page, but preferably at the [bottom](https://gtmetrix.com/put-javascript-at-bottom.html) of the document, before the `` tag. Be sure to swap in the correct ENVIRONMENT\_ID. ```html theme={null} ``` This snippet fetches the latest version of the SDK asynchronously when the page is loaded. Click [here](/docs/Installation/introduction-web/index#performance) for more information on performance. ### Install with npm/Yarn Use the following shell command to install the Sprig SDK through [npm](https://en.wikipedia.org/wiki/Npm_\(software\)) or [YARN](https://en.wikipedia.org/wiki/Yarn_\(package_manager\)). With this installation method, Sprig will be bundled with the rest of your front-end application and be immediately accessible on page load. Note that you will have to update the SDK manually to receive the latest functionality. We recommend you update the package monthly for improved functionality and bug fixes. ```shell npm theme={null} npm install --save @sprig-technologies/sprig-browser ``` ```shell Yarn theme={null} yarn add @sprig-technologies/sprig-browser --latest ``` Then, in your application, initialize Sprig with your ENVIRONMENT\_ID: ```javascript theme={null} import { sprig } from '@sprig-technologies/sprig-browser'; // Starting with version 2.42.0 released on 2026-03-16 sprig.configure({ environmentId: 'ENVIRONMENT_ID', }) // For versions 2.41.3 and earlier export const Sprig = sprig.configure({ environmentId: 'ENVIRONMENT_ID', }) ``` Other parameters for `configure` can be found below in the [Customize Appearance](/docs/Installation/introduction-web/web-javascript#customize-appearance) section. #### Usage with Next.js (Sprig SDK v2.42.0 or higher) The Sprig SDK is a client side SDK that should only be run in [client components in Next.js applications](https://nextjs.org/docs/app/getting-started/server-and-client-components). Former versions of the Sprig SDK relied on the browsers global `window`. Starting with v2.42.0 of the SDK, calls to `window` have been transitioned to `globalThis` with optional chaining so calls fail silently if Sprig does not exist. If you are still using a previous version of the SDK, please skip to [Usage with Next.js (Sprig SDK v.2.41.3 or lower)](/docs/Installation/introduction-web/web-javascript#usage-with-next-js-sprig-sdk-v2-41-3-or-lower) for the recommended implementation of Sprig with your Next.js application. After installing the Sprig SDK through npm or YARN, initialize Sprig with your ENVIRONMENT\_ID: ```javascript theme={null} import { sprig } from '@sprig-technologies/sprig-browser'; sprig.configure({ environmentId: 'ENVIRONMENT_ID', }) ``` Use Sprig across your application in client components: ```javascript theme={null} 'use client'; import { Sprig } from '@sprig-technologies/sprig-browser'; export const Button = ({ children, click }: { children: React.ReactNode, click?: () => unknown }) => { const handleClick = () => { Sprig.track('btn-clicked'); click?.(); } return } ``` #### Usage with Next.js (Sprig SDK v2.41.3 or lower) The Sprig SDK is a client side SDK that relies on the browsers global `window` and other client side APIs, meaning that the Sprig SDK should only be run in [client components in Next.js applications](https://nextjs.org/docs/app/getting-started/server-and-client-components). We recommend creating a client side [context](https://react.dev/learn/passing-data-deeply-with-context) for the Sprig SDK to ensure that only one instance of the Sprig SDK is configured. Create the Sprig Context and load the Sprig SDK dynamically in a `useEffect`: ```typescript theme={null} 'use client'; import { createContext, useContext, useEffect, useRef, useMemo, ReactNode } from 'react'; import { type WindowSprig } from '@sprig-technologies/sprig-browser'; const SprigNoop = (() => {}) as unknown as WindowSprig; export const SprigContext = createContext({ Sprig: SprigNoop }); export const useSprigContext = () => useContext<{ Sprig: WindowSprig }>(SprigContext); export const SprigContextProvider = ({ children }: { children: ReactNode }) => { const SprigRef = useRef(SprigNoop); useEffect(() => { import('@sprig-technologies/sprig-browser').then(({ sprig }) => { SprigRef.current = sprig.configure({ environmentId: 'ENVIRONMENT_ID' }); }); }, []); const value = useMemo(() => ({ Sprig: SprigRef.current, }) , []) return {children} } ``` Include the newly created `SprigContextProvider` within your application: ```typescript theme={null} 'use client'; import { SprigContextProvider } from './SprigContext'; export const Providers = ({ children }: { children: React.ReactNode }) => { return {children} } ``` Use the newly created context across your application in client components: ```typescript theme={null} 'use client'; import { useSprigContext } from './SprigContext'; export const Button = ({ children, click }: { children: React.ReactNode, click?: () => unknown }) => { const { Sprig } = useSprigContext(); const handleClick = () => { Sprig('track', 'btn-clicked'); click?.(); } return } ``` #### Updating the Sprig SDK with npm or Yarn When using npm or Yarn, you should regularly update your Sprig installation with the latest features by running the following command: ```shell npm theme={null} npm update @sprig-technologies/sprig-browser ``` ```shell YARN theme={null} yarn update @sprig-technologies/sprig-browser ``` ### CSP Configuration Using Sprig for Web studies may require you to update your web application's [Content Security Policy](https://en.wikipedia.org/wiki/Content_Security_Policy) (CSP). This may be required because Sprig uses third-party libraries to support JavaScript. The following list of sources is required to use Video & Voice questions: * Base64 SVGs and fonts. * Connecting to Mux (for streaming and short video uploads). * Connecting to Google APIs (for long video uploads). Examples are shown in the following CSP source list: ```text Sprig CSP theme={null} ``` ```text Sprig CSP for Voice/Video theme={null} ``` > **Info** > > As every company has different security policies, the example may not reflect the complete configuration. You may need to add additional keys and values in order to comply with your own organization’s policies. ### Verify Installation 1. Load a page from your website/web app that has the Sprig SDK installed 2. Open the developer console to the **Network** tab 3. Find a network request named `config` that hits `https://api.sprig.com/...` 4. Check the status code of the request. If it’s 200 or 304, your install is working correctly and you can move on. ## Identify Users Each time a user is tracked by Sprig on a webpage with the SDK installed, they are assigned a unique visitor ID in Sprig that allows users to be targeted with studies when they perform specified behaviors. While this is a requirement for targeting users with Sprig studies, these are still considered unauthenticated users until their Sprig visitor IDs are coupled with the unique USER\_IDs assigned to users within your platform’s internal authentication framework. We recommend that you follow this best practice when installing Sprig: * This ensures consistency between the visitor IDs generated by Sprig and the ones in your internal database, product analytics/CDP, or data warehouse, allowing more effective targeting of studies. * Your users have a consistent experience across platforms, and do not see the same study multiple times. * **It also optimizes the number of [Monthly Unique Users (MUUs)](/docs/account-and-settings/usage-muu/index#monthly-unique-users-muu-usage) sent to Sprig, which impacts your billing**. If necessary, 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. ### Set User ID You can use `setUserId` to identify a user with any string less than 256 characters. This function can be called multiple times safely, and stores the identifier via local storage. We recommend you set the User ID whenever the user logs in to your website, as well as after the installation snippet (if the user is already logged in). ```html HTML script tag theme={null} ``` ```javascript npm theme={null} // import the client returned from your Sprig.configure call import { Sprig } from 'utils/sprig' Sprig.setUserId('USER_ID'); ``` ### Logout When a user logs out of your webpage, make sure to log out of Sprig. This will prevent new activity from being associated with an incorrect user. Note that if you call `logoutUser()` on an unauthenticated user, Sprig will assign them a new profile and count this new user separately toward your MTU limit. ```html HTML script tag theme={null} ``` ```javascript npm theme={null} // import the client returned from your Sprig.configure call import { Sprig } from 'utils/sprig' Sprig.logoutUser(); ``` ## 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 a study. Sprig provides two types of Events for triggering and filtering your studies, [Code](/docs/shared-study-foundations/events/code-events) and [No-Code](/docs/shared-study-foundations/events/no-code-events) events. ### No-Code Events No-Code events let teammates without access to the codebase create events in Sprig based on the page’s URL, HTML elements, or CSS, which can then be used to trigger or filter Web studies. No-code events tend to be used to define more straightforward user actions, like viewing a page or clicking a button. For more information, see [No-Code events](/docs/shared-study-foundations/events/no-code-events). ### Code Events Sometimes No-Code events may not provide visibility into a particular event that you would like to track. For example, you may want to study users who, in the previous month, have downgraded their account status from *premium* to *standard*. It may be preferable to generate the event directly from the webpage. To track a Code event, you will need the following snippet. You can also optionally attach properties to your event. ```html HTML script tag theme={null} ``` ```javascript npm theme={null} // import the client returned from your Sprig.configure call import { Sprig } from 'utils/sprig' // Note: all of these functions make a network call, so be sure to give them enough time to complete // RECOMMENDED: Track event with event payload. Only eventName is required. Sprig.identifyAndTrack({ eventName: 'EVENT_NAME', userId: 'some_user_id', properties: { property1: 'value'} }); // ALTERNATIVES // Track event with string Sprig.track('EVENT_NAME'); // Optionally include properties Sprig.track('EVENT_NAME', { property1: 'value' }; ``` 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 as a trigger or filter. 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. Alternatively, after sending each tracking event, you can decide if a survey should be shown for the user if there is an eligible survey. The optional parameter accepts an async function that expects a boolean. We include the eligible survey ID as the parameter. ```javascript theme={null} ``` ## 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#/user-filters---attributes-group-or-event-history-optional) 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 People page, and are recorded and attached to any response they submit. For more information, see [Attributes](/docs/shared-study-foundations/attributes). To set a user’s attribute, provide the SDK with a key-value pair: * `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 ```html HTML script tag theme={null} ``` ```javascript npm theme={null} // import the client returned from your Sprig.configure call import { Sprig } from 'utils/sprig' Sprig.setAttribute('ATTRIBUTE', 'VALUE'); // for multiple attributes // saves multiple round-trips and reduces data usage Sprig.setAttributes({ ATTRIBUTE1: 'VALUE1', ATTRIBUTE2: 'VALUE2' }); // if attributes no longer apply to the user, // you can delete multiple at a time Sprig.removeAttributes(['ATTRIBUTE1', 'ATTRIBUTE2']); ``` ### 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. ```html HTML script tag theme={null} ``` ```javascript npm theme={null} import { Sprig } from 'utils/sprig' Sprig.setEmail('EMAIL_ADDRESS'); ``` ## Test & Deploy To confirm everything is working as expected with survey, you can create a survey and manually trigger delivery from the Developer Console. 1. You'll first need to create a Study and set the delivery method to Web. If you're testing in the Development environment, you'll need to create the Study in Development. 2. In the Sprig app, go to [Settings > Configure](https://app.sprig.com/settings/configure) and select **Allow Manual Study Display** (on by default for the Development environment) 3. Open the developer console and run `Sprig('displaySurvey', SURVEY_ID);`. The SURVEY\_ID of a study can be found at the end of its URL (`https://app.sprig.com/surveys/SURVEY_ID`). 4. If the Sprig snippet is already installed on that page, your browser will display the study. 1. If the questions are not rendering correctly or responses aren’t uploaded, check your browser console for any errors. You may have to work with your engineering and security teams to update your installation or CSP settings to resolve the errors. After you have finished your testing, consider returning to [Settings > Configure](https://app.sprig.com/settings/configure) and select Disable Manual Study Display. This will prevent any other visitor from using displaySurvey in your environment. Congratulations! Your installation is complete and you can begin deploying. ## Advanced Customization ### Customize Appearance You can set a hard limit on the height of your study with the `maxHeight` parameter, which sets the `maxHeight` property of the iframe. For custom installations, if Sprig is installed within an iframe that initially has 0 width, by default, studies will render with desktop styling and a width of 360px. In these cases, to make use of mobile styling and full-width studies on mobile web, you can provide your window dimensions when Sprig is initialized, and when the window is resized, with the `setWindowDimensions` function. Example of configuring `maxHeight` and using `setWindowDimensions`: ```html HTML script tag theme={null} ``` ```javascript npm theme={null} import Sprig from '@sprig-technologies/sprig-browser'; // or with require() syntax: // const sprig = require('@sprig-technologies/sprig-browser'); export const Sprig = sprig.configure({ environmentId: '[[ENVIRONMENT_ID]]', maxHeight: '50%', // sets maxHeight property of the iframe to 50% of page height. }); // during initialization, and when the window is resized Sprig.setWindowDimensions([[WIDTH]], [[HEIGHT]]) // [[WIDTH]] and [[HEIGHT]] are pixel numbers ``` You can further customize study placement and appearance in our dashboard: [**Settings > Look and Feel**](https://app.sprig.com/settings/look-and-feel). See [Study look and feel documentation](/docs/sprig-studies/in-product-surveys/microsurvey-look-and-feel#microsurvey-appearance) for more details. ### Sandbox implementation A common use case from our customers is to place the UserLeapKit in a sandbox iframe that's hosted by a hosting frame with an initial size of 0. The sandboxed frame will observe the `survey.height` events and the `survey.closed` events to manage the size and appearance of the hosting frame. [See a gist of the implementation](https://gist.github.com/earlsprig/76e13e54b01f29af55d789219ca96f28) ### Inject CSS to your studies For more fine-tuned control of how your study looks, Sprig supports injecting CSS into the survey. Sprig creates a `