# API Authorization Source: https://docs.frigade.com/api-reference/authorization The Frigade API is secured using authorization tokens. These api keys are used to authenticate your requests to the API. You can create and manage your api keys in the [Frigade Dashboard](https://app.frigade.com/developer). Frigade provides two scopes of API keys: public and private. Below, we describe the differences between the two. ## Public API keys This key can be exposed publicly (i.e. in your frontend code) and is used to access the public API endpoints. These endpoints are prefixed with the `public` namespace in the API url (e.g. `https://api.frigade.com/v1/public/flows`). ## Private API keys This key should be kept secret and is used to access the private API endpoints. It can be used to both access public and private API endpoints. ## Sample API request The key should be passed in the `Authorization: Bearer ` header. For example, to access the list of available flows in your account, you would make the following request: ```bash curl -i -X GET \ -H "Authorization:Bearer api_public_J3FNG3dJASDKLW98SN4KLOJHNTYUFGNVSK" \ 'https://api.frigade.com/v1/public/flows' ``` # Get User Flow State Source: https://docs.frigade.com/api-reference/flows/flow-states-get get /v1/public/flowStates Get the state of a User in all Flows # Update User Flow State Source: https://docs.frigade.com/api-reference/flows/flow-states-post post /v1/public/flowStates Updates the user's state in a single Flow # Delete Flow Source: https://docs.frigade.com/api-reference/flows/flows-delete delete /v1/flows/{numericFlowId} Delete a Flow Deleting a Flow will remove all the data associated with it, including the Flow itself, its responses, and any other related data. This operation is irreversible. Only call this endpoint from your backend code. ### Obtaining the numeric ID of a Flow To obtain the numeric ID of a Flow, you should make a [GET request](/api-reference/flows/flows-get) to get the Flow you are looking to change. The numeric ID is a number and is different from the slug (e.g. `flow_GzXC2fHz`). The reason for this is that different [versions](/platform/versioning) of the Flow share the same slug but have different numeric IDs to differentiate them. # Get a Flow Source: https://docs.frigade.com/api-reference/flows/flows-get get /v1/public/flows/{slug} Get a single Flow by its Flow ID/slug. # Update Flow Source: https://docs.frigade.com/api-reference/flows/flows-put put /v1/flows/{numericFlowId} Update a Flow's configuration and metadata As this endpoint modifies data, you will need to use the [private API key](/api-reference/authorization). Only call this endpoint from your backend code. ### Obtaining the numeric ID of a Flow To obtain the numeric ID of a Flow, you should make a [GET request](/api-reference/flows/flows-get) to get the Flow you are looking to change. The numeric ID is a number and is different from the slug (e.g. `flow_GzXC2fHz`). The reason for this is that different [versions](/platform/versioning) of the Flow share the same slug but have different numeric IDs to differentiate them. # Get all Flows Source: https://docs.frigade.com/api-reference/flows/overview get /v1/public/flows Get all Flows for your organization. # Delete a Group Source: https://docs.frigade.com/api-reference/groups/groups-delete delete /v1/groups # Find a Group Source: https://docs.frigade.com/api-reference/groups/groups-get get /v1/groups Find a group by ID # Create a Group Source: https://docs.frigade.com/api-reference/groups/overview post /v1/public/groups This endpoint allows you to upsert new or existing Groups. If the group already exists, it will be updated with the new data. Any property left unchanged will not be modified. Changes to tracking events are append-only. # Create or update a User Source: https://docs.frigade.com/api-reference/users/overview post /v1/public/users Create a user, add properties, and tracking events This endpoint allows you to upsert new or existing Users. If the user already exists, it will be updated with the new data. Any property left unchanged will not be modified. Changes to tracking events are append-only. # Delete a User Source: https://docs.frigade.com/api-reference/users/users-delete delete /v1/users # Find a User Source: https://docs.frigade.com/api-reference/users/users-get get /v1/users Find a user by ID # Webhooks Source: https://docs.frigade.com/api-reference/webhooks Webhooks allow you to receive notifications from Frigade when certain events occur. You can use webhooks to receive notifications about your users when they start a Flow and as they progress through it. ## Creating a webhook To add a new webhook, open the Webhooks page from the left sidebar in the Frigade dashboard and click the "New webhook" button. ## Supported events The following events are currently supported: When a user starts a Flow When a user completes a Flow When a user dismisses/skips a Flow When a user starts a Step in a Flow When a user completes a Step in a Flow ## Webhook payload The payload of the message includes the type of the event in the `type` property. The data property contains the actual payload sent by Frigade. The payload can be a different object depending on the event type. The below example shows the payload for a `flowResponse.completedFlow` event for the [NPS Survey](/component/survey/nps) component: ```json { "timeout": 1000, "data__nps-feedback-page__nps-feedback-text": "I love the service!", "data__nps-score-page__nps-score": 10, "data__id": "flowResponse_uPzbTOayngU00Vzc", "data__flowId": "flow_8Lq7hAqA", "data__flowSlug": "flow_8Lq7hAqA", "data__userId": 53526, "data__userSlug": "user_qnsDyTeZxP2sl12Q", "data__actionType": "COMPLETED_FLOW", "data__data": "{}", "data__stepId": "nps-feedback-page", "data__blocked": false, "data__hidden": false, "user__name": "", "user__email": null, "user__id": "abcdefgh", "flow__id": "flow_8Lq7hAqA", "flow__name": "NPS Survey", "type": "flowResponse.completedFlow", "data": { "nps-feedback-page": { "nps-feedback-text": "I love the service!" }, "nps-score-page": { "nps-score": 10 }, "id": "flowResponse_uPzbTOayngU00Vzc", "flowId": "flow_8Lq7hAqA", "flowSlug": "flow_8Lq7hAqA", "userId": 53526, "userSlug": "user_qnsDyTeZxP2sl12Q", "actionType": "COMPLETED_FLOW", "data": "{}", "stepId": "nps-feedback-page", "createdAt": "2024-08-21T16:31:36.187Z", "foreignUserId": "abcdefgh", "blocked": false, "hidden": false }, "time": "2024-08-21T16:31:36.207Z", "user": { "name": "", "email": null, "id": "abcdefgh" }, "flow": { "id": "flow_8Lq7hAqA", "name": "NPS Survey" } } ``` ## Verifying webhooks When you create a webhook, Frigade will generate a secret key for you. You can use this key to verify that the webhook is coming from Frigade. If you don't verify the request, your app will be susceptible to a number of attacks since your webhook endpoint is open to the public. To verify the request, you need to calculate the HMAC SHA256 digest of the JSON-encoded `data` field using the secret key as the key and compare it to the value in the `X-Webhook-Signature` header. The signature is base64 encoded. Note that when JSON-encoding the `data` field it needs to match the order of the keys in the payload and not contain any whitespace between the keys and values. For example, in Node.js, you can do it like this: ```ts const crypto = require('crypto'); const payload = '{"type":"flowResponse.completedStep",....}}' const secret = 'my-secret' // Find this in the webhook settings in the Frigade dashboard function verifySignature(secret, payload) { const hmac = crypto.createHmac('sha256', secret); hmac.update(Buffer.from(payload, 'utf-8')); const digest = hmac.digest('base64'); return digest; } const signature = verifySignature(secret, payload); if (signature !== payload.signature) { throw new Error('Invalid signature'); } ``` ## Verifying timestamps The `time` field in the payload is the time when the event occurred. You can use this field to verify that the request is not a [replay attack](https://en.wikipedia.org/wiki/Replay_attack) by ignoring older events. ## Retrying failed requests Frigade will retry failed requests up to 5 times with an exponential backoff strategy. ## Common fields The following fields are available in all Frigade webhooks (shown in flattened format): * `flow__id`: The ID of the Flow that triggered the webhook * `flow__name`: The name of the Flow that triggered the webhook * `user__id`: The ID of the user that triggered the webhook * `user__name`: The name of the user that triggered the webhook (if available) * `user__email`: The email of the user that triggered the webhook (if available) # Announcement Source: https://docs.frigade.com/component/announcement Communicate information or drive action via modal-based announcements ## About this component The `Announcement` component is a flexible communication tool that’s perfect for sharing important information or driving user action. They’re especially effective for getting the word out about new feature launches, upcoming webinars, or welcoming users to new areas of your product. **When to Use Announcements:** * **Key Communications:** Use announcements to highlight significant updates or events that need immediate user attention. * **Transactional Flows:** They’re also great for welcoming users or guiding them to explore new features, like kicking off a product tour. **Advantages of Announcements:** * **Grab Attention:** Announcements often interrupt workflows in a way that demands attention, making sure users don’t miss out on important info. * **Visual Impact:** You have ample space for visual assets (videos, images, GIF), which can help draw users in and keep the message engaging. **Best Practices for Effective Announcements:** * **Limit Frequency:** To avoid overwhelming users, try to keep announcements to once a session per user, and ideally once a week. This helps maintain their impact and prevents the dreaded “wack-a-mole” effect. * **Be Concise:** Keep your messages short and to the point. The easier they are to digest, the more likely users will engage with them. * **Target Your Audience:** Make sure your announcements are relevant and reach the right people by targeting on user properties, events and other signals. * **Clear Calls to Action:** Use actionable phrases like “Learn more” and direct links over passive language like "Got it" or "Okay". * **Utilize Collections:** Use Frigade Collections to manage in-app UI channels effectively, ensuring that only one announcement is displayed at a time. * **Less Critical Info:** For non-essential information, consider launching announcements in the corner of the screen without background blurs for a subtler touchpoint. ## Resources * [Launch announcements](/platform/collections#launch-with-collections) in minutes with no-code via Collections * Target your announcement to specific users with [Targeting](/platform/targeting) ## Demo * See announcements in action in our [live demo](https://demo.frigade.com/modals) ## Installation ```tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` Announcements can be be deployed with no-code using [Collections](/platform/collections). ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties Optional component to wrap the child components in, e.g. `as={Dialog}` will render the Flow in a modal Dialog. Defaults to `Box`. Whether to automatically mark the Flow started (i.e. in progress) when the Flow is eligible to be shown. You will need to call `flow.start()` or `step.start()` from the parent component if you set this to `false`. Most components should not need to override this behavior. Defaults to `true`. Emotion CSS prop to apply to the component. See [Theming documentation](https://docs.frigade.com/v2/sdk/styling/css-overrides) for more information. Example usage: ``` ``` Whether the Flow is dismissible or not The Flow ID to render. You can find the Flow ID in the Frigade dashboard. If true, the Flow will be mounted even if it has already been completed or dismissed. However, if the user does not match the Flow's targeting, the Flow will not be mounted. Register the Flow as a modal to prevent popup collisions (only one modal Flow will render at a time). Event handler called when auto-focusing on close. Can be prevented. Handler for when the Flow is completed. This is event is fired immediately after the user completes the Flow. Handler for when the Flow is dismissed (skipped). This is event is fired immediately after the user dismisses the Flow. Event handler called when the escape key is down. Can be prevented. Event handler called when an interaction happens outside the `DismissableLayer`. Specifically, when a `pointerdown` event happens outside or focus moves outside of it. Can be prevented. Event handler called when auto-focusing on open. Can be prevented. Event handler called when the a `pointerdown` event happens outside of the `DismissableLayer`. Can be prevented. Handler for when primary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Handler for when secondary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Variables to pass to the Flow. You can use variables in the Flow configuration to customize copy. For instance, you can use `title: Hello, ${name}!` in the Flow configuration and pass `variables={{name: 'John'}}` to customize the copy. The individual steps/pages of the announcement Unique identifier for the step. Do not change this once the step has been created. The title of the step The description of the step Url to an image to display in the step Url to an icon to display in the step. This is only supported by the carousel checklist component. Url to a video to display in the step such as YouTube, Vimeo, or a direct link to an mp4 file Config for the primary button in this step. Primary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Primary button URI target (defaults to \_self). Primary button title. If omitted, the primary button will not be shown. Primary button URI. **Deprecated**: use `primaryButton.title` instead. The title of the primary button **Deprecated**: use `primaryButton.uri` instead. The url to open when the primary button is clicked **Deprecated**: use `primaryButton.target` instead. The target of the primary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Config for the secondary button in this step. Secondary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Secondary button URI target (defaults to \_self). Secondary button title. If omitted, the secondary button will not be shown. Secondary button URI. **Deprecated**: use `secondaryButton.title` instead. The title of the secondary button **Deprecated**: use `secondaryButton.uri` instead. The url to open when the secondary button is clicked **Deprecated**: use `secondaryButton.target` instead. The target of the secondary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Targeting that automatically completes the step. E.g.: user.property('connectedBank') == true Targeting that automatically blocks the step from starting until it becomes true. E.g.: user.property('connectedBank') == true Targeting that automatically shows the step when it becomes true. E.g.: user.property('connectedBank') == true Override the default UI props for the corresponding component
# Banner Source: https://docs.frigade.com/component/banner Communicate information or drive action via in-line banners ## About this component The `Banner` component is a versatile, persistent UI component that typically span the full width of a page or container, often at the top or bottom of the page. They serve as an unobtrusive way to communicate important information and promote additional offerings without disrupting the user’s workflow. **When to use Banners:** * **Alerts:** Ideal for notifying users about critical updates, such as free trial expirations or scheduled maintenance. * **Lightweight Up-sells:** Effective for promoting related products or features, banners can be strategically targted and placed next to relevant content. **Advantages of Banners:** * **Non-Disruptive Communication:** Since banners remain visible without interrupting the user experience, they allow users to continue their tasks while still being informed. * **Flexible Design Options:** Banners can be customized with full-bleed graphics and images, making them visually appealing and engaging. Frigade supports custom components including on-brand, eye-catching banners. **Best Practices for Banners:** * **Use Collections:** Leverage Collections to define reusable in-app UI channels, enabling teams to efficiently manage and launch banners across different pages, such as your product dashboard or a specific product pages. * **Regulate Frequency:** Control the frequency of banner displays to ensure they remain relevant and engaging without overwhelming users. * **Make Dismissible:** Most often, banners are easily dismissible for the best user expeirence. In select cases, banners may be non-dismissible to communicate a critical message for some time (e.g. product downtime). ## Resources * Launch banners with no-code using custom [Collections](/platform/collections#inline-ui-components) * Target your banner to specific users with [Targeting](/platform/targeting) * See [industry examples](https://www.productonboarding.com/?type=banner) of banners ## Demo * See banners in action in our [live demo](https://demo.frigade.com/cards) ## Installation ```tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` Banners can be be deployed with no-code using [Collections](/platform/collections). ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties Optional component to wrap the child components in, e.g. `as={Dialog}` will render the Flow in a modal Dialog. Defaults to `Box`. Whether to automatically mark the Flow started (i.e. in progress) when the Flow is eligible to be shown. You will need to call `flow.start()` or `step.start()` from the parent component if you set this to `false`. Most components should not need to override this behavior. Defaults to `true`. Emotion CSS prop to apply to the component. See [Theming documentation](https://docs.frigade.com/v2/sdk/styling/css-overrides) for more information. Example usage: ``` ``` Whether the Flow is dismissible or not The Flow ID to render. You can find the Flow ID in the Frigade dashboard. If true, the Flow will be mounted even if it has already been completed or dismissed. However, if the user does not match the Flow's targeting, the Flow will not be mounted. Register the Flow as a modal to prevent popup collisions (only one modal Flow will render at a time). Handler for when the Flow is completed. This is event is fired immediately after the user completes the Flow. Handler for when the Flow is dismissed (skipped). This is event is fired immediately after the user dismisses the Flow. Handler for when primary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Handler for when secondary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Variables to pass to the Flow. You can use variables in the Flow configuration to customize copy. For instance, you can use `title: Hello, ${name}!` in the Flow configuration and pass `variables={{name: 'John'}}` to customize the copy. The steps to show in the tooltip tour. Unique identifier for the step. Do not change this once the step has been created. The title of the step The description of the step Url to an image to display in the step Url to an icon to display in the step. This is only supported by the carousel checklist component. Url to a video to display in the step such as YouTube, Vimeo, or a direct link to an mp4 file Config for the primary button in this step. Primary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Primary button URI target (defaults to \_self). Primary button title. If omitted, the primary button will not be shown. Primary button URI. **Deprecated**: use `primaryButton.title` instead. The title of the primary button **Deprecated**: use `primaryButton.uri` instead. The url to open when the primary button is clicked **Deprecated**: use `primaryButton.target` instead. The target of the primary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Config for the secondary button in this step. Secondary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Secondary button URI target (defaults to \_self). Secondary button title. If omitted, the secondary button will not be shown. Secondary button URI. **Deprecated**: use `secondaryButton.title` instead. The title of the secondary button **Deprecated**: use `secondaryButton.uri` instead. The url to open when the secondary button is clicked **Deprecated**: use `secondaryButton.target` instead. The target of the secondary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Targeting that automatically completes the step. E.g.: user.property('connectedBank') == true Targeting that automatically blocks the step from starting until it becomes true. E.g.: user.property('connectedBank') == true Targeting that automatically shows the step when it becomes true. E.g.: user.property('connectedBank') == true Override the default UI props for the corresponding component
# Carousel Source: https://docs.frigade.com/component/checklist/carousel A carousel checklist component to drive set up and activation ## About this component The `Checklist` component is one of Frigade’s most popular tools, especially for user onboarding and activation. They’re super handy for guiding users through their journey, whether it’s at the start of their experience or when they’re setting up a new product vertical or a complex feature. **When to Use Checklists:** * **Onboarding and Activation:** Checklists are perfect for helping users get started and ensuring they complete essential tasks. They provide a clear path forward and help users feel more confident as they navigate your product. **Advantages of Announcements::** * **Two Default Versions:** Frigade offers two out-of-the-box checklist formats—carousel and collapsible—so you can choose what fits best for your users. Plus, if you need something custom, you can easily build one using the Frigade SDK/API. * **Deeply integrated:** The most effective checklists measure actual in-product results. Frigade makes it easy to connect checklist steps to automatically complete from actual in-product actions and milestones. **Best Practices for Checklists:** * **Limit the Number of Tasks:** Keep your checklists manageable. Too many tasks can overwhelm users, so aim for a concise list that’s easy to follow. * **Pre-Complete Steps Where Applicable:** For example, marking “Set up account” complete after sign up can show users progress from the start and create a sense of momentum (like showing 20% done instead of 0%). * **Avoid Basic “Mark Done” Steps:** Whenever possible, tie checklist steps to actual workflows and tasks. Deep linking users to complete actions is way more effective. It’s okay to have “Skip” or “Mark done” as secondary options for non-essential steps. * **Include a CTA to Hide the Checklist:** Giving users the option to hide the checklist can help them feel more in control of their setup and UI. * **Break Large Workflows into Smaller Segments:** If you have a hefty checklist (like 12 steps), consider phasing it and breaking it into smaller groups (like two groups of 6). This makes it feel less daunting. * **Measure Completion Rates:** Keep track of how users are progressing through each step and the entire checklist. This data can help you identify areas for improvement for future iterations. ## Resources * Target your checklist to specific users with [Targeting](/platform/targeting) * [Dynamically mark a step complete](/sdk/advanced/completing-a-step#programmatically-marking-steps-complete) * Create shared checklists using [Group Properties](/sdk/hooks/group) and [completion criteria](/sdk/advanced/completing-a-step#automatically-marking-steps-complete) * See [industry examples](https://www.productonboarding.com/?type=checklist) of checklists ## Demo * See checklists in action in our [live demo](https://demo.frigade.com/checklists) ## Installation ```tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` Checklists can be be deployed with no-code using [Collections](/platform/collections). ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties Optional component to wrap the child components in, e.g. `as={Dialog}` will render the Flow in a modal Dialog. Defaults to `Box`. Whether to automatically mark the Flow started (i.e. in progress) when the Flow is eligible to be shown. You will need to call `flow.start()` or `step.start()` from the parent component if you set this to `false`. Most components should not need to override this behavior. Defaults to `true`. Emotion CSS prop to apply to the component. See [Theming documentation](https://docs.frigade.com/v2/sdk/styling/css-overrides) for more information. Example usage: ``` ``` Whether the Flow is dismissible or not The Flow ID to render. You can find the Flow ID in the Frigade dashboard. If true, the Flow will be mounted even if it has already been completed or dismissed. However, if the user does not match the Flow's targeting, the Flow will not be mounted. Register the Flow as a modal to prevent popup collisions (only one modal Flow will render at a time). Handler for when the Flow is completed. This is event is fired immediately after the user completes the Flow. Handler for when the Flow is dismissed (skipped). This is event is fired immediately after the user dismisses the Flow. Handler for when primary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Handler for when secondary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. How to sort the default the completed steps of the carousel. * `completed-last` will sort the completed/skips steps to the end of the carousel. * `default` will keep the order of the steps as they are in the flow. Variables to pass to the Flow. You can use variables in the Flow configuration to customize copy. For instance, you can use `title: Hello, ${name}!` in the Flow configuration and pass `variables={{name: 'John'}}` to customize the copy. If true, all steps must be completed in order. This means that the next step will be disabled until the current step is completed. Default behavior is `false`. The steps to show in the checklist flow. Unique identifier for the step. Do not change this once the step has been created. The title of the step The description of the step Url to an image to display in the step Url to an icon to display in the step. This is only supported by the carousel checklist component. Url to a video to display in the step such as YouTube, Vimeo, or a direct link to an mp4 file Config for the primary button in this step. Primary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Primary button URI target (defaults to \_self). Primary button title. If omitted, the primary button will not be shown. Primary button URI. **Deprecated**: use `primaryButton.title` instead. The title of the primary button **Deprecated**: use `primaryButton.uri` instead. The url to open when the primary button is clicked **Deprecated**: use `primaryButton.target` instead. The target of the primary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Config for the secondary button in this step. Secondary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Secondary button URI target (defaults to \_self). Secondary button title. If omitted, the secondary button will not be shown. Secondary button URI. **Deprecated**: use `secondaryButton.title` instead. The title of the secondary button **Deprecated**: use `secondaryButton.uri` instead. The url to open when the secondary button is clicked **Deprecated**: use `secondaryButton.target` instead. The target of the secondary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Targeting that automatically completes the step. E.g.: user.property('connectedBank') == true Targeting that automatically blocks the step from starting until it becomes true. E.g.: user.property('connectedBank') == true Targeting that automatically shows the step when it becomes true. E.g.: user.property('connectedBank') == true Override the default UI props for the corresponding component
# Collapsible Source: https://docs.frigade.com/component/checklist/collapsible A condensed checklist component that can be used inline or in a modal ## About this component The `Checklist` component is one of Frigade’s most popular tools, especially for user onboarding and activation. They’re super handy for guiding users through their journey, whether it’s at the start of their experience or when they’re setting up a new product vertical or a complex feature. **When to Use Checklists:** * **Onboarding and Activation:** Checklists are perfect for helping users get started and ensuring they complete essential tasks. They provide a clear path forward and help users feel more confident as they navigate your product. **Advantages of Announcements::** * **Two Default Versions:** Frigade offers two out-of-the-box checklist formats—carousel and collapsible—so you can choose what fits best for your users. Plus, if you need something custom, you can easily build one using the Frigade SDK/API. * **Deeply integrated:** The most effective checklists measure actual in-product results. Frigade makes it easy to connect checklist steps to automatically complete from actual in-product actions and milestones. **Best Practices for Checklists:** * **Limit the Number of Tasks:** Keep your checklists manageable. Too many tasks can overwhelm users, so aim for a concise list that’s easy to follow. * **Pre-Complete Steps Where Applicable:** For example, marking “Set up account” complete after sign up can show users progress from the start and create a sense of momentum (like showing 20% done instead of 0%). * **Avoid Basic “Mark Done” Steps:** Whenever possible, tie checklist steps to actual workflows and tasks. Deep linking users to complete actions is way more effective. It’s okay to have “Skip” or “Mark done” as secondary options for non-essential steps. * **Include a CTA to Hide the Checklist:** Giving users the option to hide the checklist can help them feel more in control of their setup and UI. * **Break Large Workflows into Smaller Segments:** If you have a hefty checklist (like 12 steps), consider phasing it and breaking it into smaller groups (like two groups of 6). This makes it feel less daunting. * **Measure Completion Rates:** Keep track of how users are progressing through each step and the entire checklist. This data can help you identify areas for improvement for future iterations. ## Resources * Target your checklist to specific users with [Targeting](/platform/targeting) * [Dynamically mark a step complete](/sdk/advanced/completing-a-step#programmatically-marking-steps-complete) * Create shared checklists using [Group Properties](/sdk/hooks/group) and [completion criteria](/sdk/advanced/completing-a-step#automatically-marking-steps-complete) * See [industry examples](https://www.productonboarding.com/?type=checklist) of checklists ## Demo * See checklists in action in our [live demo](https://demo.frigade.com/checklists) ## Code ```tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` Checklists can be be deployed with no-code using [Collections](/platform/collections). ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties Optional component to wrap the child components in, e.g. `as={Dialog}` will render the Flow in a modal Dialog. Defaults to `Box`. Whether to automatically mark the Flow started (i.e. in progress) when the Flow is eligible to be shown. You will need to call `flow.start()` or `step.start()` from the parent component if you set this to `false`. Most components should not need to override this behavior. Defaults to `true`. Emotion CSS prop to apply to the component. See [Theming documentation](https://docs.frigade.com/v2/sdk/styling/css-overrides) for more information. Example usage: ``` ``` Whether the Flow is dismissible or not The Flow ID to render. You can find the Flow ID in the Frigade dashboard. If true, the Flow will be mounted even if it has already been completed or dismissed. However, if the user does not match the Flow's targeting, the Flow will not be mounted. Register the Flow as a modal to prevent popup collisions (only one modal Flow will render at a time). Handler for when the Flow is completed. This is event is fired immediately after the user completes the Flow. Handler for when the Flow is dismissed (skipped). This is event is fired immediately after the user dismisses the Flow. Handler for when primary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Handler for when secondary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Map of step types to their respective components. Use this to build custom step components. The `type` defined on the step in the Flow YAML config should match the key in this object. For instance, if you have a step with `type: 'custom'`, you should provide a component for it like so: ``` ``` The corresponding YAML config would look like: ``` steps: - id: custom-step type: custom ``` Variables to pass to the Flow. You can use variables in the Flow configuration to customize copy. For instance, you can use `title: Hello, ${name}!` in the Flow configuration and pass `variables={{name: 'John'}}` to customize the copy. If true, all steps must be completed in order. This means that the next step will be disabled until the current step is completed. Default behavior is `false`. The steps to show in the checklist flow. Unique identifier for the step. Do not change this once the step has been created. The title of the step The description of the step Url to an image to display in the step Url to an icon to display in the step. This is only supported by the carousel checklist component. Url to a video to display in the step such as YouTube, Vimeo, or a direct link to an mp4 file Config for the primary button in this step. Primary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Primary button URI target (defaults to \_self). Primary button title. If omitted, the primary button will not be shown. Primary button URI. **Deprecated**: use `primaryButton.title` instead. The title of the primary button **Deprecated**: use `primaryButton.uri` instead. The url to open when the primary button is clicked **Deprecated**: use `primaryButton.target` instead. The target of the primary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Config for the secondary button in this step. Secondary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Secondary button URI target (defaults to \_self). Secondary button title. If omitted, the secondary button will not be shown. Secondary button URI. **Deprecated**: use `secondaryButton.title` instead. The title of the secondary button **Deprecated**: use `secondaryButton.uri` instead. The url to open when the secondary button is clicked **Deprecated**: use `secondaryButton.target` instead. The target of the secondary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Targeting that automatically completes the step. E.g.: user.property('connectedBank') == true Targeting that automatically blocks the step from starting until it becomes true. E.g.: user.property('connectedBank') == true Targeting that automatically shows the step when it becomes true. E.g.: user.property('connectedBank') == true Override the default UI props for the corresponding component
# Form Source: https://docs.frigade.com/component/form Collect user information via forms in modals or embedded in your UI ## About this component The `Form` component is a super versatile tool that can fit right into your product UI or pop up in a modal for things like surveys. They can be used for wide range of use cases including registration flows, surveys, feedback forms, and more. The component supports form validation (client and server-side), conditional fields, branching logic, and multi-step Flows. **When to Use Forms:** * **Embedded in UI:** Forms work great for tasks like product registration, helping users get started smoothly without leaving the page. * **Modal Surveys:** Use forms in modals for surveys or feedback, making it easy for users to share their thoughts without disrupting their experience. **Why Forms Are Powerful:** * **Conditional and Branching Logic:** Forms can adapt based on user responses, guiding them through a tailored experience that feels intuitive. * **Custom React Steps:** You can embed custom React components to invite teammates or perform API lookups, adding a personal touch to your forms. * **Customizable Input Types:** With a variety of built-in input types—like text fields, multiple-choice options, and dropdowns—you can design forms that suit your specific needs. **Best Practices for Forms:** * **Provide Progress Indicators:** Adding progress bars or step indicators (like “Step X of Y”) can help users see how far they’ve come and what’s left to do. This makes the process feel less daunting and more manageable. * **Streamlined Data Collection:** Frigade makes it easy to create new forms quickly, allowing you to gather user data and send it wherever you need it in your system. ## Resources * Create a form and [send events to Slack](/guides/form-video-demo) * Launch pop-up forms and surveys with no-code using [Collections](/platform/collections#announcements-surveys-and-dialogs) * Target your form to specific users with [Targeting](/platform/targeting) * See [industry examples](https://www.productonboarding.com/?type=form) of forms ## Demo * See forms in action in our [live demo](https://demo.frigade.com/forms) ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## Examples The following section includes ready-made examples and code for various form use cases. ### Simple Modal Form ```Typescript App.tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ) } ``` ```yaml Configuration steps: - id: waitlist-page title: Join the waitlist subtitle: Get pumped! We are launching soon. primaryButton: title: Join the waitlist fields: - id: company-size type: radio label: Company size options: - label: 1-10 value: 1-10 - label: 20-100 value: 20-100 - label: 100+ value: 100 - id: industry type: select label: Industry options: - label: Icecream making value: icecream - label: Guitar riffing value: guitar-riffing - id: name type: text label: Your name placeholder: John Doe ``` ### Churn Survey ```Typescript App.tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ) } ``` ```yaml Configuration steps: - id: collect-intend title: We are sorry to see you go subtitle: We are sorry to see you go. Please help us improve by answering a few questions. primaryButton: title: Cancel my plan fields: - id: rating type: select multiple: true label: Why would you like to cancel your plan? options: - label: Too expensive value: too-expensive - label: Not enough features value: not-enough-features - label: Found a better alternative value: better-alternative - label: Too many bugs value: too-many-bugs - label: Other value: other - id: feedback type: textarea label: What can we do better? placeholder: Your feedback here ``` ### Dynamic Fields Sometimes you may want to conditionally render a dynamic field based on the value of another field. The example above dynamically changes the second dropdown based on the value of the first dropdown. This component requires a custom form field for dynamically changing the input. You can achieve this by using the `formContext` provided by react-hook-forms. In this case, we define a [custom field](/component/form#custom-field-types) type called `DynamicFollowUpBasedOnField` that renders a `SelectField` component. The options of the `follow-up` dropdown depends on the value of `food`. If the user selects `pizza`, the `follow-up` dropdown will show options for pizza toppings. If the user selects `pasta`, the `follow-up` dropdown will show options for pasta sauces. ```Typescript App.tsx import { Form, type FormFieldProps, SelectField } from "@frigade/react"; const App = () => { return (
{ const categoryValue = props.formContext.watch("food"); const field = props.fieldData.props.mappings[categoryValue]; if (!field) { return null; } return ( ); }, }} /> ) } ``` ```yaml Configuration steps: - id: collect-intend title: Tell us about your favorites subtitle: Help us understand your preferences and taste. fields: - id: food label: What is your favorite food? type: select required: true options: - value: pizza label: Pizza - value: pasta label: Pasta - id: follow-up type: DynamicFollowUpBasedOnField required: true props: mappings: pizza: label: What is your favorite topping? required: true options: - value: pepperoni label: Pepperoni - value: mushrooms label: Mushrooms pasta: label: What is your favorite sauce? required: true options: - value: tomato label: Tomato - value: alfredo label: Alfredo ``` ### Branching Forms This example shows how to implement branching in a form based on the user's choice in the first step. If you want a form to conditionally skip a step based on the result of a previous step, you can use the `visibilityCriteria` property in the step configuration. For instance, the example below will jump directly to page 3 if the user picks a specific option on the first page/step: ```Typescript App.tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); } ``` ```yaml Configuration steps: - id: page-1 title: This is page 1 primaryButtonTitle: Next fields: - id: test-radio-1 type: radio label: Which page do you want to go to? options: - label: Go to page 3 value: x - label: Continue to page 2 value: y - id: page-2 title: This is page 2 primaryButtonTitle: Next # Replace the flow ID below with your own visibilityCriteria: user.flowStepData("my-flow-id", "page-1", "test-radio-1") != "x" fields: - id: test-text type: text label: Text field - id: page-3 title: This is page 3 primaryButtonTitle: Finish fields: - id: test-radio-3 type: radio label: Radio group options: - label: Radio 1 value: 1 - label: Radio 2 value: 2 - label: Radio 3 value: 3 ``` `visibilityCriteria` will work with both form data or any other [Targeting](/platform/targeting#examples) condition. ## Supported Field Types The component supports the following builtin field types that correspond to their respective HTML input types: * `select` * `radio` * `text` * `textarea` * `checkbox` ### Overriding Field Attributes You can override or add any attribute for a field by using the `props` property in the field configuration. For instance, this is useful if you want to use the `text` field type, but override the `type` to `email` or `tel`. It can also be used to add any attribute such as a css class, data, or styling. ```yaml steps: - id: step-1 title: This is page 1 fields: - id: email type: text props: type: email className: "my-custom-class" data-attr: "my-custom-data-attr" style: color: "red" ``` ### Custom Field Types The Form SDK is built on top of [react-hook-form](https://react-hook-form.com/), which means you can use the majority of its features in your forms. You can define your own custom field types using the `fieldTypes` [prop](#fieldtypes). For instance, you can implement a simple calendar datepicker field type as such: ```tsx import { FormFieldProps } from "@frigade/react"; import * as Frigade from "@frigade/react"; function CalendarField({ field, submit }: FormFieldProps) { return (
); } // ... ; ``` It is also possible to conditionally render a field based on the value of another field by using the [formContext](https://react-hook-form.com/docs/useformcontext) provided by react-hook-form. For instance, if you want a custom field called `company-size` to show up when a user selects `company` in the `customer-type` field: ```tsx import { type FormFieldProps, SelectField } from "@frigade/react"; import * as Frigade from "@frigade/react"; { const customerTypeValue = props.formContext.watch("customer-type"); if (customerTypeValue !== "company") { return null; } return
My custom conditional field
; }, }} />; ``` ## Form Validation The component supports client-side and server-side validation out of the box. You can define validation rules for each field in the form configuration using the `pattern` property with a regular expression. The example below shows how to validate an email field: ```yaml steps: - id: collect-intend fields: - id: email type: text required: true pattern: message: Please provide a valid email value: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ``` ### Server-side Validation You can perform server-side validation by returning a Promise from the `onPrimary` event handler. If the promise resolves to `false`, the current step in the form will not be marked as completed. The `onPrimary` event handler also contains all form data collected in the session, which allows you to send the data to your server for validation or storage. ```tsx import { StepHandlerProp } from "@frigade/react"; import * as Frigade from "@frigade/react"; const App = () => { const handlePrimary: StepHandlerProp = async (step, event, properties) => { const response = await fetch("https://my-server.com/validate", { method: "POST", body: JSON.stringify(properties), headers: { "Content-Type": "application/json", }, }); if (response.ok) { return true; } // The current step in the form will be marked as completed return false; }; return ; }; ``` ## Prefilling a form Forms can be prefilled by using [Dynamic Variables](/platform/dynamic-variables) by linking the `value` of a `field` to the `variables` prop of the Form component. The example below shows how to prefill a form with the user's name: ```Typescript App.tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ) } ``` ```yaml Configuration steps: - id: collect-intend fields: - id: name type: text label: Your name value: ${name} ``` ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties Optional component to wrap the child components in, e.g. `as={Dialog}` will render the Flow in a modal Dialog. Defaults to `Box`. Whether to automatically mark the Flow started (i.e. in progress) when the Flow is eligible to be shown. You will need to call `flow.start()` or `step.start()` from the parent component if you set this to `false`. Most components should not need to override this behavior. Defaults to `true`. Emotion CSS prop to apply to the component. See [Theming documentation](https://docs.frigade.com/v2/sdk/styling/css-overrides) for more information. Example usage: ``` ``` Whether the Flow is dismissible or not Custom field types to be used in the Form. You can use this to build your own custom form fields in a `Form`. For example, if you want to use a custom field type called `calendar`: ```tsx import { Form, FormFieldProps } from '@frigade/react' function CalendarField({ field, submit }: FormFieldProps) { return (
) } // ... ```
The Flow ID to render. You can find the Flow ID in the Frigade dashboard. If true, the Flow will be mounted even if it has already been completed or dismissed. However, if the user does not match the Flow's targeting, the Flow will not be mounted. Register the Flow as a modal to prevent popup collisions (only one modal Flow will render at a time). Handler for when the Flow is completed. This is event is fired immediately after the user completes the Flow. Handler for when the Flow is dismissed (skipped). This is event is fired immediately after the user dismisses the Flow. Handler for when primary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Handler for when secondary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Variables to pass to the Flow. You can use variables in the Flow configuration to customize copy. For instance, you can use `title: Hello, ${name}!` in the Flow configuration and pass `variables={{name: 'John'}}` to customize the copy.
The individual steps/pages of the form Unique identifier for the step. Do not change this once the step has been created. The title of the step The description of the step Url to an image to display in the step Url to an icon to display in the step. This is only supported by the carousel checklist component. Url to a video to display in the step such as YouTube, Vimeo, or a direct link to an mp4 file Config for the primary button in this step. Primary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Primary button URI target (defaults to \_self). Primary button title. If omitted, the primary button will not be shown. Primary button URI. **Deprecated**: use `primaryButton.title` instead. The title of the primary button **Deprecated**: use `primaryButton.uri` instead. The url to open when the primary button is clicked **Deprecated**: use `primaryButton.target` instead. The target of the primary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Config for the secondary button in this step. Secondary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Secondary button URI target (defaults to \_self). Secondary button title. If omitted, the secondary button will not be shown. Secondary button URI. **Deprecated**: use `secondaryButton.title` instead. The title of the secondary button **Deprecated**: use `secondaryButton.uri` instead. The url to open when the secondary button is clicked **Deprecated**: use `secondaryButton.target` instead. The target of the secondary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Targeting that automatically completes the step. E.g.: user.property('connectedBank') == true Targeting that automatically blocks the step from starting until it becomes true. E.g.: user.property('connectedBank') == true Targeting that automatically shows the step when it becomes true. E.g.: user.property('connectedBank') == true Override the default UI props for the corresponding component The data contained on the form step, typically text input boxes, multiple choice questions, etc. Unique identifier for the step. Do not change this once the step has been created. The label of the field The default value of the field (used for prefilling). For checkboxes, use 'true' or 'false'. Whether the field can accept multiple values. Only used for the `select` type field. The type of the field. The built-in supported types are: `text`, `textarea`, `select`, `checkbox`, and `radio`. If you are using custom form field types, the name here should match it. The placeholder of the field The maximum length of the field Whether the field is required or not. Use a string here to show a custom error message. The options for the field. Only used for select fields. The label of the option The value of the option The validation rules for the field. See documentation for more information. Regex pattern to match the field against The error message to display if the pattern does not match Optional additional properties for the field. These will be passed to the frontend component as HTML attributes and merged with the default props for the given field type.
``` ``` # Hint Source: https://docs.frigade.com/component/hint Hints are a great way to subtly call attention to specific parts of your UI ## About this component The `Hint` component provides users with contextual guidance without interrupting their workflow. Unlike tours, hints are not sequential and are closed by default, allowing users to engage with them at their own pace. This design choice minimizes disruption and enhances the user experience by offering assistance when needed. **When to Use Hints:** * **Contextual Assistance:** Provide users with relevant tips or information based on their current task or location within the app. * **Feature Highlights:** Draw attention to new or underutilized features without overwhelming users with a full tour. * **Error Prevention:** Offer guidance that helps users avoid common mistakes or pitfalls as they navigate the application. **Best Practices for Hints:** * **Visibility:** Ensure hints are easily noticeable but not obtrusive. Use subtle animations or colors to draw attention without being distracting. * **Actionable Content:** Like tours, hints should provide actionable advice. For example, instead of stating “This is the settings page,” a hint could say, “Click here to adjust your notification preferences.” * **Dismissible:** Hints should be easily dismissible. Users should feel in control and not forced to engage with hints if they choose not to. ## Demo * See hints in action in our [live demo](https://demo.frigade.com/hints) ## Installation ```tsx App.tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` Hints can be be deployed with no-code using [Collections](/platform/collections). ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties Hints are a specific configuration of Tours. Please refer to the [Tour](/component/tour#sdk-properties) documentation to see properties for Hints. # Card Source: https://docs.frigade.com/component/inline-card Communicate information or drive action via in-line content cards ## About this component The `Card` component is a handy little UI element that’s great for showing off promotional materials and important info in a visually appealing way. While they share some similarities with banners, cards have their own unique vibe and offer flexibility in placement. **When to Use Cards:** * **Promotional Materials:** Think of cards as your go-to swiss-army knife for inline promotions. For instance, showcasing new features, nudging users with onboarding tips, or encouraging user referrals. **Advantages of Cards:** * **Inline Placement:** You’ll usually find cards sitting neatly within in the main UI, like in a sidebar or alongside other product elements. This makes them easy to spot without getting in the way of the user experience. * **Visual Appeal:** Cards can be designed with eye-catching images, icons, and text, making them interesting and engaging for users. * **Versatile Use:** Whether you’re promoting a feature or sharing a helpful resource, cards can handle a variety of content types, making them super flexible. **Best Practices for Cards:** * **Strategic Placement:** Think about where you put your cards. Positioning them where users can easily see them can boost engagement. * **Keep It Consistent:** Stick to a consistent design and placement across all your cards. These patterns helps create a cohesive look and feel throughout your app, which increases engagement. * **Clear Calls to Action:** Make sure each card has a clear call to action, like “Learn More” or “Request Demo.” This encourages users to take that next step. ## Resources * Launch cards with no-code using custom [Collections](/platform/collections#inline-ui-components) * Target your card to specific users with [Targeting](/platform/targeting) * See [industry examples](https://www.productonboarding.com/?type=card) of cards ## Demo * See cards in action in our [live demo](https://demo.frigade.com/cards) ## Installation ```tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` Cards can be be deployed with no-code using [Collections](/platform/collections). ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties Optional component to wrap the child components in, e.g. `as={Dialog}` will render the Flow in a modal Dialog. Defaults to `Box`. Whether to automatically mark the Flow started (i.e. in progress) when the Flow is eligible to be shown. You will need to call `flow.start()` or `step.start()` from the parent component if you set this to `false`. Most components should not need to override this behavior. Defaults to `true`. Emotion CSS prop to apply to the component. See [Theming documentation](https://docs.frigade.com/v2/sdk/styling/css-overrides) for more information. Example usage: ``` ``` Whether the Flow is dismissible or not The Flow ID to render. You can find the Flow ID in the Frigade dashboard. If true, the Flow will be mounted even if it has already been completed or dismissed. However, if the user does not match the Flow's targeting, the Flow will not be mounted. Register the Flow as a modal to prevent popup collisions (only one modal Flow will render at a time). Handler for when the Flow is completed. This is event is fired immediately after the user completes the Flow. Handler for when the Flow is dismissed (skipped). This is event is fired immediately after the user dismisses the Flow. Handler for when primary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Handler for when secondary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Variables to pass to the Flow. You can use variables in the Flow configuration to customize copy. For instance, you can use `title: Hello, ${name}!` in the Flow configuration and pass `variables={{name: 'John'}}` to customize the copy. The steps to show in the tooltip tour. Unique identifier for the step. Do not change this once the step has been created. The title of the step The description of the step Url to an image to display in the step Url to an icon to display in the step. This is only supported by the carousel checklist component. Url to a video to display in the step such as YouTube, Vimeo, or a direct link to an mp4 file Config for the primary button in this step. Primary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Primary button URI target (defaults to \_self). Primary button title. If omitted, the primary button will not be shown. Primary button URI. **Deprecated**: use `primaryButton.title` instead. The title of the primary button **Deprecated**: use `primaryButton.uri` instead. The url to open when the primary button is clicked **Deprecated**: use `primaryButton.target` instead. The target of the primary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Config for the secondary button in this step. Secondary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Secondary button URI target (defaults to \_self). Secondary button title. If omitted, the secondary button will not be shown. Secondary button URI. **Deprecated**: use `secondaryButton.title` instead. The title of the secondary button **Deprecated**: use `secondaryButton.uri` instead. The url to open when the secondary button is clicked **Deprecated**: use `secondaryButton.target` instead. The target of the secondary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Targeting that automatically completes the step. E.g.: user.property('connectedBank') == true Targeting that automatically blocks the step from starting until it becomes true. E.g.: user.property('connectedBank') == true Targeting that automatically shows the step when it becomes true. E.g.: user.property('connectedBank') == true Override the default UI props for the corresponding component
# Components Overview Source: https://docs.frigade.com/component/overview Beautiful UI components, best practices built-in *** Frigade comes with a library of pixel-perfect React UI components so you don't have to reinvent the wheel. Get started with one click creation from the Components tab, and visit the [SDK](/sdk/overview) docs for advanced usage and [styling guides](/sdk/styling/theming). ### Resources Free Figma file with Frigade components See Frigade components in action ### Components Communicate major product updates Display inline product communications Embed tips and house ads in your UI Activate users and drive account setup Build native forms inline or in modals Guide users to important UI elements Collect user feedback and other info Launch interactive, guided tours Build with the headless Frigade SDKs # Progress Badge Source: https://docs.frigade.com/component/progress-badge Display a user's progress through a Flow ## About this component The Progress Badge component is unlike other components in that it doesn't have its own Flow. It exists to remind a user where they left off in an existing Flow (e.g. Checklist), and to help get them jump back in and complete it. ## Demo * See progress badges in action in our [live demo](https://demo.frigade.com/checklists) ## Installation ```tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties # NPS Survey Source: https://docs.frigade.com/component/survey/nps Collect structured and freeform feedback from your users ## About this component The `Survey` component is a fantastic way to engage users right when it matters and gather valuable feedback or data. Whether you’re looking to measure satisfaction or collect insights, targeted in-app surveys can help you connect with users at key moments in their journey. **When to Use Surveys:** * **User Research:** Deploy surveys like NPS (Net Promoter Score) right after users complete specific actions. This is a great way to capture their feelings while the experience is fresh in their minds. * **Data Collection:** Use surveys to collect additional data after user signups, helping you enrich your CRM and tailor your communications. **Best Practices for Surveys:** * **Flexible Display Options:** By default, NPS surveys typically float on the screen, ensuring they don’t take over the entire user experience. This keeps the process smooth and non-intrusive. * **Full-Screen Takeovers:** For the highest engagement rates, for custom surveys or other input forms, they can be displayed inline within the page or as a full page modal. Just be sure to use these methods thoughtfully to avoid annoying users. **Custom Surveys:** * **Built on Forms:** Custom surveys utilize the same underlying components as Forms, which means you can refer to the Forms documentation for more details on how to create and implement them effectively. ## Resources * Launch surveys with no-code using [Collections](/platform/collections#announcements-surveys-and-dialogs) * Target your survey to specific users with [Targeting](/platform/targeting) * See [industry examples](https://www.productonboarding.com/?type=survey) of surveys ## Demo * See surveys in action in our [live demo](https://demo.frigade.com/modals) ## Alternative scales The component comes with a default NPS scale of 0-10. You can also use a custom scale by passing the `options` property either directly in the React component or in the YAML config via the `props` property. For instance, in the example below, we're using an emoji scale: ```Typescript App.tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` ## Installation ```tsx import * as Frigade from '@frigade/react'; const App = () => { return ( ); }; ``` NPS Surveys can be be deployed with no-code using [Collections](/platform/collections). ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties Optional component to wrap the child components in, e.g. `as={Dialog}` will render the Flow in a modal Dialog. Defaults to `Box`. Whether to automatically mark the Flow started (i.e. in progress) when the Flow is eligible to be shown. You will need to call `flow.start()` or `step.start()` from the parent component if you set this to `false`. Most components should not need to override this behavior. Defaults to `true`. Emotion CSS prop to apply to the component. See [Theming documentation](https://docs.frigade.com/v2/sdk/styling/css-overrides) for more information. Example usage: ``` ``` Whether the Flow is dismissible or not Custom field types to be used in the Form. You can use this to build your own custom form fields in a `Form`. For example, if you want to use a custom field type called `calendar`: ```tsx import { Form, FormFieldProps } from "@frigade/react"; function CalendarField({ field, submit }: FormFieldProps) { return (
); } // ... ; ```
The Flow ID to render. You can find the Flow ID in the Frigade dashboard. If true, the Flow will be mounted even if it has already been completed or dismissed. However, if the user does not match the Flow's targeting, the Flow will not be mounted. Register the Flow as a modal to prevent popup collisions (only one modal Flow will render at a time). The label to display for the negative end of the NPS scale. If not provided, the default label "Not likely at all" will be used. Handler for when the Flow is completed. This is event is fired immediately after the user completes the Flow. Handler for when the Flow is dismissed (skipped). This is event is fired immediately after the user dismisses the Flow. Handler for when primary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Handler for when secondary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. The options to display in the NPS field. If not provided, the default NPS numbers from 0 to 10 will be used. The label to display for the positive end of the NPS scale. If not provided, the default label "Extremely likely" will be used. Variables to pass to the Flow. You can use variables in the Flow configuration to customize copy. For instance, you can use `title: Hello, ${name}!` in the Flow configuration and pass `variables={{name: 'John'}}` to customize the copy.
The individual steps/pages of the form Unique identifier for the step. Do not change this once the step has been created. The title of the step The description of the step Url to an image to display in the step Url to an icon to display in the step. This is only supported by the carousel checklist component. Url to a video to display in the step such as YouTube, Vimeo, or a direct link to an mp4 file Config for the primary button in this step. Primary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Primary button URI target (defaults to \_self). Primary button title. If omitted, the primary button will not be shown. Primary button URI. **Deprecated**: use `primaryButton.title` instead. The title of the primary button **Deprecated**: use `primaryButton.uri` instead. The url to open when the primary button is clicked **Deprecated**: use `primaryButton.target` instead. The target of the primary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Config for the secondary button in this step. Secondary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Secondary button URI target (defaults to \_self). Secondary button title. If omitted, the secondary button will not be shown. Secondary button URI. **Deprecated**: use `secondaryButton.title` instead. The title of the secondary button **Deprecated**: use `secondaryButton.uri` instead. The url to open when the secondary button is clicked **Deprecated**: use `secondaryButton.target` instead. The target of the secondary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Targeting that automatically completes the step. E.g.: user.property('connectedBank') == true Targeting that automatically blocks the step from starting until it becomes true. E.g.: user.property('connectedBank') == true Targeting that automatically shows the step when it becomes true. E.g.: user.property('connectedBank') == true Override the default UI props for the corresponding component The data contained on the form step, typically text input boxes, multiple choice questions, etc. Unique identifier for the step. Do not change this once the step has been created. The label of the field The default value of the field (used for prefilling). For checkboxes, use 'true' or 'false'. Whether the field can accept multiple values. Only used for the `select` type field. The type of the field. The built-in supported types are: `text`, `textarea`, `select`, `checkbox`, and `radio`. If you are using custom form field types, the name here should match it. The placeholder of the field The maximum length of the field Whether the field is required or not. Use a string here to show a custom error message. The options for the field. Only used for select fields. The label of the option The value of the option The validation rules for the field. See documentation for more information. Regex pattern to match the field against The error message to display if the pattern does not match Optional additional properties for the field. These will be passed to the frontend component as HTML attributes and merged with the default props for the given field type.
# Tour Source: https://docs.frigade.com/component/tour Guide users through a specific product flow or feature ## About this component The `Tour` component is a sequential walkthrough designed to guide users through in-app steps. While tours can be one of the most effective ways to onboard users, they can also be a bit controversial. A poorly designed tour can be frustrating, especially if it interrupts users when they have a task in mind. We’ve all been there—logging into an app only to be confronted by an intrusive tour that disrupts our focus. This often leads to users rushing to close or ignore the tour, resulting in a net negative experience. **When to Use Tours:** * **Product Onboarding:** Show new users around critical workflows to get started * **Feature Launches:** Increase adoption of a new feature by showing users how it workflows * **Ongoing Education:** Automatically trigger tours for users once they reach a certain usage threshold, or give users the ability to request a tour themselves if they get stuck **Best Practices for Announcements:** * **Opt-In Design:** Tours should ideally be opt-in. Asking users if they want guidance results in much higher engagement compared to forcing a tour upon them. Users can opt in from a checklist, announcement, inline card, or help hub. * **Actionable Steps:** Avoid generic and obvious statements like “This is the X page.” Instead, make tours actionable by connecting them to actual user actions. For example, a step that completes only when a user enters specific input or successfully finishes a task. * **Keep It Short:** Tours should be concise—avoid lengthy, 16-step tours that can overwhelm users. * **Dismissible:** Generally, tours should be dismissible. Be cautious about creating a tour that cannot be closed. * **Relaunch Hub:** If relevant, consider providing a hub where users can relaunch specific tours. This is helpful if they are not ready or don’t have time when prompted. ## Resources * [Create your first product tour](/guides/tours) in just a few minutes * See [industry examples](https://www.productonboarding.com/?type=tour) of tours ## Demo * See tours in action in our [live demo](https://demo.frigade.com/tours) ## Installation ```tsx import * as Frigade from "@frigade/react"; const App = () => { return ; }; ``` Tours can be be deployed with no-code using [Collections](/platform/collections). ## Customization To learn about how to customize Frigade components, see the [customization documentation](/sdk/styling/) and [examples](https://demo.frigade.com) of custom themes in action. ## SDK Properties The alignment of the tooltip relative to the anchor. Possible values: `after`, `before`, `center`, `end`, `start`. The offset of the tooltip relative to the anchor along the alignment axis. Optional component to wrap the child components in, e.g. `as={Dialog}` will render the Flow in a modal Dialog. Defaults to `Box`. Automatically scroll to the anchor element of the current Step Whether to automatically mark the Flow started (i.e. in progress) when the Flow is eligible to be shown. You will need to call `flow.start()` or `step.start()` from the parent component if you set this to `false`. Most components should not need to override this behavior. Defaults to `true`. Specify a container in the DOM render the Tour into. Use this to render the Tour into a different container/scrollable ancestor. Emotion CSS prop to apply to the component. See [Theming documentation](https://docs.frigade.com/v2/sdk/styling/css-overrides) for more information. Example usage: ``` ``` Whether the tooltip should be open by default. Whether the Flow is dismissible or not The Flow ID to render. You can find the Flow ID in the Frigade dashboard. If true, the Flow will be mounted even if it has already been completed or dismissed. However, if the user does not match the Flow's targeting, the Flow will not be mounted. Whether to lock the scroll of the container when the Spotlight is enabled. Defaults to `true`. Whether to render a modal overlay behind the tooltip. Handler for when the Flow is completed. This is event is fired immediately after the user completes the Flow. Handler for when the Flow is dismissed (skipped). This is event is fired immediately after the user dismisses the Flow. Callback function triggered when the open state of the tooltip changes. Handler for when primary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Handler for when secondary button is clicked. If this function returns false or a promise that resolves to `false`, the step will not be automatically completed when clicked. Controls the open state of the tooltip. Use this for controlled components. Whether the Tour should be completed by the end-user in sequential order. If `false`, all steps will be rendered at once. Defaults to `true`, which means only one step will be rendered at a time in sequential order. The preferred side of the anchor to render the tooltip. Possible values: `top`, `right`, `bottom`, `left`. The distance in pixels from the tooltip to the anchor element. Whether to highlight the anchor element with a spotlight/scrim effect. Variables to pass to the Flow. You can use variables in the Flow configuration to customize copy. For instance, you can use `title: Hello, ${name}!` in the Flow configuration and pass `variables={{name: 'John'}}` to customize the copy. The steps to show in the tooltip tour. Unique identifier for the step. Do not change this once the step has been created. The title of the step The description of the step Url to an image to display in the step Url to an icon to display in the step. This is only supported by the carousel checklist component. Url to a video to display in the step such as YouTube, Vimeo, or a direct link to an mp4 file Config for the primary button in this step. Primary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Primary button URI target (defaults to \_self). Primary button title. If omitted, the primary button will not be shown. Primary button URI. **Deprecated**: use `primaryButton.title` instead. The title of the primary button **Deprecated**: use `primaryButton.uri` instead. The url to open when the primary button is clicked **Deprecated**: use `primaryButton.target` instead. The target of the primary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Config for the secondary button in this step. Secondary button action. (defaults to step.complete).
**Possible values:** `false`, `flow.back`, `flow.complete`, `flow.forward`, `flow.restart`, `flow.skip`, `flow.start`, `step.complete`, `step.skip`, `step.reset`, `step.start`
Secondary button URI target (defaults to \_self). Secondary button title. If omitted, the secondary button will not be shown. Secondary button URI. **Deprecated**: use `secondaryButton.title` instead. The title of the secondary button **Deprecated**: use `secondaryButton.uri` instead. The url to open when the secondary button is clicked **Deprecated**: use `secondaryButton.target` instead. The target of the secondary button url (default: \_blank; use \_self to open in the same window). Setting it to # will open the existing page and dismiss any Frigade modals. Targeting that automatically completes the step. E.g.: user.property('connectedBank') == true Targeting that automatically blocks the step from starting until it becomes true. E.g.: user.property('connectedBank') == true Targeting that automatically shows the step when it becomes true. E.g.: user.property('connectedBank') == true Override the default UI props for the corresponding component CSS class or ID of the element to highlight in the step (e.g. .my-element or #my-element)
# Guide: Product Announcements Source: https://docs.frigade.com/guides/announcements ## Targeting announcements You can target [announcements](/component/announcement) to specific groups of users using the [Targeting](/platform/targeting) section on the flow detail page. By default, an announcement will show up for all users once the flow code is live in production. ## Launching additional announcements without code changes We recommend using the [Dialogs Collection](/platform/collections) to launch new announcements without updating your product codebase. The Dialogs Collection is built-in to the Frigade SDK and can be used to launch Frigade Announcements, Surveys, and other Dialog-based components. ## Launching another Flow from an Announcement You may want to launch another Flow when a user clicks on the primary button of a different Flow. For example, you can launch a tour Flow when a user clicks on the primary button of an announcement. You can achieve this my modifying the [Targeting](/platform/targeting) of the tour Flow directly in the Frigade dashboard, locating the given announcement under **Flows** and selecting **Completed** (typically initiated by the primary button) or **Dismissed** (if the user clicks the X button in the announcement). # Guide: Cards and Banners Source: https://docs.frigade.com/guides/cards-video-demo In this video, we show you how to build a GitHub style embedded card.