Vue product tours: libraries, working code, and build vs. buy.
Vue's tour ecosystem is thinner than React's but perfectly workable: one Vue-native option, two excellent framework-agnostic ones, and one licensing trap. Working code for each, what every library leaves you to build, and when buying honestly wins.
Libraries and licenses checked August 21, 2026.
Vue teams shopping for onboarding tours find a smaller aisle than React's — the Vue-native options are community-maintained ports rather than flagship projects. The practical consequence: the framework-agnostic libraries (Shepherd, Driver.js) are relatively stronger choices in Vue than their React equivalents, because the DOM-level approach sidesteps the wrapper-maintenance question entirely.
As everywhere, the library is the visible fifth of the system. Steps and popovers come from the package; targeting, seen-state, analytics, and non-engineer editing are what production onboarding runs on, and every option below leaves those to you. The roundup first, the honest accounting after.
The libraries, honestly — with the code.
vue3-tour — the Vue-native option
- License:
- MIT
- Best for:
- Vue teams that want steps as template data and Vue-flavored ergonomics
The community-maintained successor to vue-tour for Vue 3: register the plugin, declare steps against selectors, drop a v-tour component in your template. It feels like Vue, which is the entire pitch.
Being a community port is also the caveat — release cadence and issue response vary, and teams have been bitten by gaps between Vue major versions before. Pin your versions and read the repo's pulse before betting a core flow on it.
// main.js
import { createApp } from "vue";
import Vue3Tour from "vue3-tour";
import "vue3-tour/dist/vue3-tour.css";
import App from "./App.vue";
createApp(App).use(Vue3Tour).mount("#app");
// App.vue — template:
// <v-tour name="onboarding" :steps="steps" />
const steps = [
{ target: ".new-project-btn", content: "Everything starts here — create your first project." },
{ target: ".invite-field", content: "Onboarding sticks better with a teammate aboard." },
];Shepherd.js — the framework-agnostic heavyweight
- License:
- MIT (core library)
- Best for:
- Vue teams that want full control without depending on a wrapper
Shepherd needs no Vue wrapper to be excellent in a Vue app — instantiate the tour in a composable or an onMounted hook and it drives the DOM directly. Modal overlays, promise hooks around transitions, and rich step options make it the most capable pure option.
The verbosity trade is the same as anywhere: explicit configuration objects per step and its own CSS to restyle toward your brand. Budget the styling time honestly.
// useOnboardingTour.js — a composable
import Shepherd from "shepherd.js";
import "shepherd.js/dist/css/shepherd.css";
export function useOnboardingTour() {
const tour = new Shepherd.Tour({
useModalOverlay: true,
defaultStepOptions: { scrollTo: true, cancelIcon: { enabled: true } },
});
tour.addStep({
id: "create-project",
text: "Everything starts here — create your first project.",
attachTo: { element: ".new-project-btn", on: "bottom" },
buttons: [{ text: "Next", action: tour.next }],
});
return tour; // call tour.start() from onMounted
}Driver.js — the lightweight one
- License:
- MIT
- Best for:
- Simple highlight-and-explain tours with minimal footprint
Framework-agnostic, dependency-free, and a few kilobytes: Driver.js highlights an element, shows a popover, and moves on. In a Vue app it needs nothing Vue-specific — call it from a lifecycle hook and you're done.
Deliberately minimal, which cuts both ways: fewer behaviors and less lifecycle control, but for a two-step feature highlight it's exactly the right amount of tool.
import { driver } from "driver.js";
import "driver.js/dist/driver.css";
const tour = driver({
showProgress: true,
steps: [
{
element: ".new-project-btn",
popover: { title: "Start here", description: "Create your first project." },
},
{
element: ".invite-field",
popover: { title: "Bring the team", description: "Invite a teammate early." },
},
],
});
tour.drive(); // e.g. from onMounted
Intro.js — the famous one, with a licensing trap
- License:
- AGPL-3.0, or a paid commercial license
- Best for:
- Open-source projects, or teams that buy the commercial license
Mature, polished, instantly recognizable — and AGPL-3.0 licensed, which for a commercial SaaS product effectively means buying its paid commercial license. The AGPL's obligations are ones almost no company's legal team will accept for a proprietary app.
Paying for good software is fine; discovering the obligation in a legal review after shipping is not. Read the license before the npm install — or pick one of the MIT options above.
import introJs from "intro.js";
import "intro.js/introjs.css";
introJs()
.setOptions({
steps: [
{ element: document.querySelector(".new-project-btn"), intro: "Everything starts here." },
{ element: document.querySelector(".invite-field"), intro: "Invite a teammate early." },
],
})
.start();What every library leaves you to build.
The tour is the visible fifth of an onboarding system. These four builds are the rest — and they are where hand-rolled setups quietly stall.
Who edits the copy?
With every library above, changing a step's wording is a merge request and a deploy. The person who owns activation files a ticket and waits — the exact dependency onboarding tooling exists to remove.
Targeting is a second project
New users only, skip invited teammates, re-show to non-finishers — audiences, traits, and rules are entirely yours to build, and routinely amount to more code than the tour.
Seen-state is a third one
"Has this user seen this?" needs per-user storage, across devices, forever. localStorage demos it; production needs your backend involved.
Analytics is a fourth
Step-level drop-off, funnels, and whether the tour moved activation — libraries emit events at best; the measurement system is a separate build.
The whole trade, in one table.
| Dimension | Build on a library | Buy (Wakeline) |
|---|---|---|
| Upfront cost | Free (library) + engineering days to integrate | Free tier, then $49/mo for 25,000 MAU |
| Who edits a step's copy | An engineer, via a pull request and a deploy | Anyone on the team, in a visual builder, live in seconds |
| Targeting & segmentation | You build it — user traits, rules, audiences | Included: audiences, trait rules, saved segments |
| Analytics | You build it — step events, funnels, dashboards | Included: per-step funnels, trends, click actions |
| Seen-state & persistence | You build it — per user, across devices | Included, cross-device for identified users |
| Surfaces beyond tours | Checklists, surveys, banners: all separate builds | Included in the same builder |
| A/B testing | You build it, including the statistics | Included, with significance testing |
| Ongoing maintenance | Yours — selector breakage, library upgrades, edge cases | Vendor's — anchors degrade gracefully, tooling maintained |
Wakeline with Vue: deliberately boring.
Wakeline is the buy side, and the Vue story is deliberately boring: no Vue plugin, no wrapper, no build-step integration. The snippet works at the DOM level Vue renders to, so Vue 2, Vue 3, Nuxt, and whatever ships next all integrate identically.
- Anchors survive reactivity. Steps attach by selector to the live DOM; v-if timing and re-renders don't detach them — steps wait for elements to appear or skip gracefully.
- vue-router transitions are non-events. Client-side navigation is handled; steps can pin to URL paths with wildcards so lookalike screens never mis-fire a tour.
- Tours are built visually on your live app, no-code — copy edits go live in seconds, no merge request involved.
- The system gaps come filled: targeting and segments, cross-device seen-state, per-step funnels, A/B testing, plus checklists, surveys, and banners from the same builder.
<script>
(function (w, d, s) {
w.Wakeline = w.Wakeline || function () { (w.Wakeline.q = w.Wakeline.q || []).push(arguments); };
var js = d.createElement("script"); js.async = 1; js.src = s;
var f = d.getElementsByTagName("script")[0]; f.parentNode.insertBefore(js, f);
})(window, document, "https://wakeline.io/wakeline.js");
Wakeline("init", { key: "YOUR_PUBLISHABLE_KEY" });
// After login — unlocks targeting, segments, and cross-device state:
Wakeline("identify", user.id, { name: user.name, plan: user.plan });
</script>When building on a library is still right.
One static tour, engineer-owned
A single walkthrough written once and rarely touched fits vue3-tour or Driver.js fine — with no program, the system gaps never bite.
Your users are developers
A dev-tool audience notices and respects a hand-rolled tour, and your team can genuinely maintain one.
Zero budget, genuinely
MIT libraries are free forever. (A free tier covering 1,000 MAU exists for exactly this stage — count the engineering hours honestly before deciding.)
Total control is a requirement
Bespoke animation or deep product coupling means you were always building. Shepherd will fight you least.
What is the best product tour library for Vue?
vue3-tour for Vue-native ergonomics (mind its community-port maintenance cadence), Shepherd.js for full control without a wrapper, Driver.js for minimal-footprint highlights. All MIT. Intro.js is capable but AGPL — commercial use realistically means buying its paid license.
Is there a Wakeline plugin for Vue?
Deliberately not — nothing framework-specific exists to install. The snippet operates on the rendered DOM, so Vue 2, Vue 3, and Nuxt integrate identically: paste it, call identify() after login, build tours visually on the live app.
Do tours survive vue-router navigation and v-if rendering?
Yes — Wakeline anchors by selector and waits for elements to appear (or skips gracefully), so client-side route changes and conditionally-rendered elements behave. Steps can also pin to URL paths with wildcards to keep multi-page tours honest.
Is Intro.js free to use in a commercial Vue app?
Effectively no — it's AGPL-3.0, and the practical route for proprietary products is its paid commercial license. Check before integrating; the MIT alternatives above avoid the question entirely.
When should a Vue team build instead of buy?
One engineer-owned tour that rarely changes: build. An onboarding program — multiple flows, targeting, funnels, non-engineers editing: the build-vs-buy table is the honest math, and the four system gaps are where DIY setups stall.
Ship a Vue tour today — without the build.
The snippet takes five minutes; the free plan covers 1,000 monthly active users. Compare it against the library route on your own app.