Wakeline
wakeline for vue

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 open-source options

The libraries, honestly — with the code.

vue3-tourthe 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." },
];
vue3-tour: plugin registration plus steps as data.

Shepherd.jsthe 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
}
Shepherd as a composable — no wrapper package needed.

Driver.jsthe 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
Driver.js: identical in Vue, React, or anything else — that's the point.

Intro.jsthe 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();
Intro.js quick start — read the license before this ships to production.
the honest accounting

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.

build vs. buy

The whole trade, in one table.

DimensionBuild on a libraryBuy (Wakeline)
Upfront costFree (library) + engineering days to integrateFree tier, then $49/mo for 25,000 MAU
Who edits a step's copyAn engineer, via a pull request and a deployAnyone on the team, in a visual builder, live in seconds
Targeting & segmentationYou build it — user traits, rules, audiencesIncluded: audiences, trait rules, saved segments
AnalyticsYou build it — step events, funnels, dashboardsIncluded: per-step funnels, trends, click actions
Seen-state & persistenceYou build it — per user, across devicesIncluded, cross-device for identified users
Surfaces beyond toursChecklists, surveys, banners: all separate buildsIncluded in the same builder
A/B testingYou build it, including the statisticsIncluded, with significance testing
Ongoing maintenanceYours — selector breakage, library upgrades, edge casesVendor's — anchors degrade gracefully, tooling maintained
the buy side

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>
The entire integration, for any Vue app. There is no step two.
honest limits

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.

questions

Vue onboarding tours: common questions.

Still stuck? Read the docs or talk to us.

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.