What is a product tour?
A product tour (also called an interactive walkthrough or onboarding overlay) is a guided, step-by-step experience that highlights features of a web application and prompts users to take action. They appear as floating tooltips, spotlights, banners, or modal overlays, often triggered automatically on first login or feature release.
Used well, product tours reduce support burden and accelerate user activation. Used badly, they become barriers that lock out users who rely on keyboards, switch access, screen readers, or other assistive technologies. Because they sit on top of the existing interface and inject dynamic content, they are among the most frequently failing components in any accessibility audit.
The most common accessibility failures
Product tours fail for a predictable set of reasons. These are not edge cases, they appear in the majority of implementations we test.
Focus does not move into the tour
The overlay appears visually but keyboard focus stays on the triggering button or wherever it was. Screen reader users receive no indication that anything has changed.
No keyboard navigation between steps
Next and Back buttons are only clickable by mouse. Tab does not reach them. Users cannot advance the tour, meaning they cannot dismiss the overlay blocking their work.
Background content still reachable by Tab
The tour overlay creates a visual block but does not trap or suppress focus behind it. Tab continues to cycle through the underlying page, which is invisible beneath the overlay.
No screen reader status message
Step content is injected dynamically without an ARIA live region. Screen reader users receive no announcement when the tour opens or when steps change.
No Escape key to dismiss
The tour cannot be closed by keyboard at all, or the Close button exists in the DOM but is visually hidden and not in the tab order. Users are trapped.
Focus not returned after close
When the tour ends or is dismissed, focus is dropped, often reset to the top of the document, rather than returned to the element that launched the tour.
Live demo: Inaccessible Tour
The example below demonstrates a typical out-of-the-box product tour implementation. Launch it and try navigating with the keyboard only, you will find that Tab does not reach the tour controls, the background remains interactive, no screen reader announcement is made, and there is no keyboard way to close it.
Welcome to Analytics Co!
Let us show you around your new dashboard. Click Next to begin.
Your key metrics
These cards show your weekly performance at a glance.
Recent page views
Drill into any page to see detailed analytics and user flows.
Live demo: Accessible Tour
The example below uses a custom TourEngine that manages step state and focus correctly. When launched, focus moves into the tour card. → / ← advance steps. Esc closes and returns focus. Each step change is announced to screen readers via an ARIA live region.
Top 10 product tour tools: Accessibility Comparison
These are the most widely used product tour and interactive walkthrough tools as of 2025–26. Accessibility support is rated based on publicly documented behaviour, community reporting, and our own testing where applicable. Ratings may change as tools are updated, always test with real assistive technology before selecting a tool.
| Tool | Type | Keyboard Nav | Screen Reader | Focus Mgmt | Notes |
|---|---|---|---|---|---|
| Shepherd.js | Open source | ✅ | ⚠️ | ✅ | Best open-source option. ARIA attributes built in. Focus moves to step on advance. Screen reader support varies by configuration. |
| WalkMe | SaaS | ✅ | ✅ | ✅ | Enterprise-grade. Claims Section 508 and WCAG 2.1 AA compliance. Has a dedicated accessibility mode. Most mature enterprise AT support. |
| Driver.js | Open source | ⚠️ | ❌ | ⚠️ | Lightweight and popular. v2 improved keyboard handling. Screen reader support is minimal. Spotlight uses pointer-events: none, focus leaks behind overlay. |
| Intro.js | Open source | ⚠️ | ⚠️ | ⚠️ | Very widely used (5M+ weekly downloads). Includes aria-labelledby on step containers and some keyboard support, but focus management is inconsistent across step types. |
| Appcues | SaaS | ⚠️ | ❌ | ⚠️ | Popular product-led growth platform. Keyboard support varies by flow type. Limited public accessibility documentation. Screen reader experience is inconsistent. |
| Pendo | SaaS | ⚠️ | ⚠️ | ⚠️ | Analytics + guidance platform. In-app guides have basic ARIA attributes. Focus management depends on guide configuration. Accessibility varies significantly by implementation. |
| Intercom Tours | SaaS | ⚠️ | ❌ | ❌ | Part of the Intercom platform. Basic keyboard tab support on some elements. Focus is not moved to tour content on launch. Screen reader users receive no step announcements. |
| UserPilot | SaaS | ❌ | ❌ | ❌ | User onboarding and product adoption platform. Limited publicly available accessibility documentation. Testing shows no focus management or screen reader announcements. |
| HelpHero | SaaS | ⚠️ | ⚠️ | ⚠️ | Claims accessibility-friendly design. Some ARIA attributes present. Focus handling and screen reader support require verification, "accessibility friendly" marketing does not equal WCAG conformance. |
| Product Fruits | SaaS | ❌ | ❌ | ❌ | Growing product adoption platform. No evidence of keyboard navigation or screen reader support in walkthroughs. No public WCAG conformance documentation. |
Building an accessible tour: Key Patterns
The accessible demo above uses a TourEngine class. The core patterns that make it work are below. The full implementation manages step state, spotlight positioning, and focus in a single, testable object, rather than scattering logic across event listeners.
// TourEngine, manages step state, focus, and announcements
class TourEngine {
constructor(steps, options = {}) {
this.steps = steps;
this.current = -1;
this.origin = null; // element to restore focus to
this.liveRegion = options.liveRegion || null;
this.onStep = options.onStep || null;
this._keyHandler = this._onKey.bind(this);
}
// Launch the tour, storing which element to return focus to
start(triggerEl) {
this.origin = triggerEl;
document.addEventListener('keydown', this._keyHandler);
this._goto(0);
}
next() {
const hasMore = this.current < this.steps.length - 1;
hasMore ? this._goto(this.current + 1) : this.end();
}
prev() {
if (this.current > 0) this._goto(this.current - 1);
}
// Always return focus to the trigger element on close
end() {
document.removeEventListener('keydown', this._keyHandler);
this._teardown();
if (this.origin) this.origin.focus(); // ← critical
this.current = -1;
}
_goto(index) {
this.current = index;
const step = this.steps[index];
// Announce step to screen readers via ARIA live region
if (this.liveRegion) {
this.liveRegion.textContent = ``;
requestAnimationFrame(() => {
this.liveRegion.textContent =
`Step ${index + 1} of ${this.steps.length}. ${step.title}. ${step.body}`;
});
}
// Render the step card, then move focus into it
if (this.onStep) this.onStep(step, index, this.steps.length);
}
// Escape = close, arrow keys = navigate
_onKey(e) {
if (e.key === 'Escape') { e.preventDefault(); this.end(); }
if (e.key === 'ArrowRight') { e.preventDefault(); this.next(); }
if (e.key === 'ArrowLeft') { e.preventDefault(); this.prev(); }
}
}
// Usage
const tour = new TourEngine([
{ target: '#metrics', title: 'Your key metrics', body: '...' },
{ target: '#table', title: 'Recent page data', body: '...' },
], {
liveRegion: document.getElementById('tourLive'),
onStep: (step, idx, total) => renderCard(step, idx, total),
});
WCAG 2.2 requirements
A product tour that cannot be used by keyboard or screen reader fails WCAG 2.2 at Level A, the minimum conformance level. These are not aspirational standards; they are the legal baseline for most Australian government and enterprise digital properties.
All functionality available by keyboard
Every step of the tour must be reachable, advanceable, and closeable without a pointing device.
Focus containment with an exit
If the tour traps focus (which it should, to prevent interaction behind the overlay), there must always be a keyboard method to close it, typically Esc.
Focus moves into the tour on open
When a walkthrough launches, focus must move into the first interactive element or the step container. Focus must return to the trigger on close.
Step changes announced to screen readers
New step content injected dynamically must be announced via an ARIA live region. Without this, screen reader users receive no notification when a step changes.
Tour container has a meaningful role and name
The tour container should have role="region" and aria-label. Interactive controls must have accessible names. The overlay must be aria-hidden="true".
Auto-advancing tours must be stoppable
If your tour advances automatically on a timer, the user must be able to pause, stop, or control the timing. Auto-play tours with no pause mechanism fail this criterion.
Is your product tour excluding users?
ExceedAbility can audit your onboarding experience and provide a detailed remediation report, with assistive technology testing on real devices.
Talk to ExceedAbility