A guided tour in Bubble uses a sequence of tooltip-like popups that highlight different UI elements and walk new users through your app. You track tour completion on the User record, trigger it on first login, and advance through steps using custom states. This can be built natively with Groups and conditionals or with an HTML-based tour library like Shepherd.js embedded in an HTML element.
Overview: Guided Tours in Bubble
This tutorial shows you how to create an onboarding guided tour that walks new users through your app's key features. You will build step-by-step tooltips, track progress, and ensure the tour only appears for new users.
Prerequisites
- A Bubble app with user authentication and a main dashboard page
- Understanding of custom states and conditional visibility
- Key UI elements that need explaining to new users
Step-by-step guide
Add a 'has_completed_tour' field to the User type
Add a 'has_completed_tour' field to the User type
In the Data tab, add a field 'has_completed_tour' (yes/no, default no) to the User Data Type. This tracks whether each user has seen the tour. On the dashboard page, add a 'Page is loaded' workflow with condition 'Only when Current User's has_completed_tour is no' that starts the tour.
Expected result: A flag on the User record controls whether the tour appears, triggering only for users who have not completed it.
Create tour step overlays with tooltip Groups
Create tour step overlays with tooltip Groups
Add a semi-transparent overlay Group covering the full page (background black, 50% opacity). On top, add individual tooltip Groups for each tour step — small white cards with an arrow, title text, description text, and Next/Skip buttons. Position each tooltip near the UI element it explains. Use a page custom state 'tour_step' (number, default 1) to control which tooltip is visible: 'When page's tour_step is 1' shows tooltip 1, etc.
Pro tip: Use a Floating Group for tooltips so they stay in position even if the page scrolls.
Expected result: A dark overlay with positioned tooltip cards appears for each tour step, shown one at a time based on the step state.
Highlight the target element for each step
Highlight the target element for each step
To make the referenced UI element stand out through the overlay, add a conditional on the target element: 'When page's tour_step is [this step's number]' → set z-index higher than the overlay (add a CSS override via ID attribute). This makes the highlighted element appear above the dark overlay while everything else stays dimmed. Add a spotlight effect by giving the element a bright border or glow.
Expected result: Each tour step highlights the relevant UI element above the dark overlay, drawing the user's attention.
Wire up Next, Back, and Skip buttons
Wire up Next, Back, and Skip buttons
On each tooltip's 'Next' button, create a workflow that increments the 'tour_step' state by 1. On 'Back', decrement by 1. On 'Skip' or the final step's 'Done' button, set Current User's has_completed_tour to yes and hide the overlay. Add a progress indicator (Step 1 of 5) using the tour_step state. On the final step, change the Next button text to 'Get Started' and complete the tour.
Expected result: Users can navigate forward and backward through tour steps, skip the tour, or complete it to dismiss permanently.
Add a replay option in account settings
Add a replay option in account settings
In the user's account settings or help section, add a 'Replay Tour' button. Its workflow: set Current User's has_completed_tour to no, then reload the page (Go to page → current page). The tour will trigger again on page load. This lets users who dismissed the tour early revisit it later.
Expected result: Users can restart the guided tour from their account settings at any time.
Alternative: embed Shepherd.js for a richer tour experience
Alternative: embed Shepherd.js for a richer tour experience
For a more polished tour with smooth animations and automatic positioning, embed the Shepherd.js library via an HTML element. Add the Shepherd CSS and JS CDN links, then write a script that defines tour steps targeting Bubble elements by their ID attribute (set IDs in the element's property editor). Shepherd automatically positions tooltips and handles scrolling to elements. Use the Bubble JavaScript-to-Bubble bridge to update the has_completed_tour field on completion.
1<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/shepherd.js@11/dist/css/shepherd.css"/>2<script src="https://cdn.jsdelivr.net/npm/shepherd.js@11/dist/js/shepherd.min.js"></script>3<script>4const tour = new Shepherd.Tour({5 defaultStepOptions: {6 cancelIcon: { enabled: true },7 classes: 'shadow-md'8 }9});10tour.addStep({11 title: 'Welcome!',12 text: 'This is your dashboard. Let us show you around.',13 attachTo: { element: '#dashboard-header', on: 'bottom' },14 buttons: [{ text: 'Next', action: tour.next }]15});16tour.start();17</script>Expected result: A polished guided tour with automatic positioning and animations runs using the Shepherd.js library.
Complete working example
1GUIDED TOUR — WORKFLOW SUMMARY2=================================34USER FIELD: has_completed_tour (yes/no, default no)5PAGE STATE: tour_step (number, default 1)67TRIGGER TOUR:8 Event: Page is loaded9 Condition: Current User's has_completed_tour = no10 Action: Show overlay, set tour_step = 11112TOUR ELEMENTS:13 Overlay Group: full page, black 50% opacity14 Tooltip Groups: white cards with arrow15 Each visible when tour_step = its number16 Target elements: z-index above overlay per step1718NAVIGATION:19 Next button: tour_step = tour_step + 120 Back button: tour_step = tour_step - 121 Skip button: has_completed_tour = yes, hide overlay22 Done (last step): has_completed_tour = yes, hide2324REPLAY:25 Settings → Replay Tour button26 Set has_completed_tour = no → reload page2728ALTERNATIVE: Shepherd.js29 Embed via HTML element30 Target elements by ID attribute31 Auto-positions tooltips with animationsCommon mistakes when adding a Guided Tour to a Bubble App
Why it's a problem: Showing the tour on every page load without checking completion
How to avoid: Always check 'has_completed_tour is no' before triggering the tour
Why it's a problem: Not assigning ID attributes to target elements
How to avoid: Set the ID attribute in each target element's property editor (e.g., 'dashboard-header', 'nav-menu')
Why it's a problem: Hardcoding tooltip positions that break on different screen sizes
How to avoid: Use Floating Groups with responsive positioning, or use Shepherd.js which auto-calculates positions
Best practices
- Track tour completion on the User record to prevent repeat displays
- Keep tours short — 3-5 steps covering only the most important features
- Add a Skip button so experienced users can dismiss immediately
- Provide a Replay option in settings for users who want to revisit
- Highlight only one element per step to maintain focus
- Use progressive disclosure — show basic features first, advanced ones later
- Test the tour on mobile screens to ensure tooltips are positioned correctly
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I want to add a product tour to my Bubble.io dashboard that shows new users 5 key features with highlighted elements and tooltip descriptions. How do I build this with completion tracking?
Create a guided tour for my dashboard page. Highlight the navigation menu, the create button, the notifications area, and the settings link with tooltip descriptions. Track whether the user has completed the tour and only show it on first login. Add a replay option.
Frequently asked questions
Should I use native Bubble Groups or a JavaScript library for the tour?
Use native Groups for simple 3-5 step tours. Use Shepherd.js or Intro.js for more than 5 steps or when you need automatic positioning and scroll-to features.
Can I show different tours for different user roles?
Yes. Add a condition to check the user's role and trigger different tour sequences (e.g., admin tour vs regular user tour) based on the role.
How do I handle the tour on mobile?
Keep tooltips simple and centered on mobile. Test positioning at mobile breakpoints. Consider a simpler full-screen card sequence instead of element-attached tooltips on small screens.
Can I track which step users drop off at?
Yes. Log each step advance to a TourAnalytics Data Type. Compare completion rates per step to identify where users lose interest.
Can RapidDev build custom onboarding experiences in Bubble?
Yes. RapidDev can design and build guided tours, onboarding wizards, contextual help systems, and interactive tutorials in Bubble.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation