Skip to main content
Puntego installs with a single script tag, but most apps want a tighter integration: a layout that mounts the guide once, declared targets that raise action success, and a no-code path for non-engineers. This page covers the common stacks. If you just want the raw script tag, see the install guide.
The script-tag and Google Tag Manager paths work today. The @puntego/react and @puntego/embed npm packages are rolling out — if npm install returns a 404, the package has not published yet, so use the install script in the meantime.

Next.js (App Router)

Install the React wrapper and its peers:
Mount the provider once in your root layout. Because <PuntegoProvider> only loads the guide in a client effect, it is safe to render on the server. Pass both appId and apiUrlapiUrl is required, since without a reachable worker URL the runtime cannot boot.

Declare targets

Declared targets are the highest-priority grounding tier — the guide resolves them before falling back to DOM heuristics, which raises action success. Declare the elements that matter on each page; the hook registers on mount and unregisters on unmount.

React

The same @puntego/react package works in any React 18+ app (Vite, CRA, Remix). Wrap your app once in <PuntegoProvider> (with appId and apiUrl), then use usePuntegoTarget and usePuntegoAction to declare targets and actions per component. Use usePuntego() for imperative calls such as point or sendMessage. See the SDK reference for the full surface.

Single-page apps and client-side routing

The runtime hooks history.pushState, popstate, and hashchange, so client-side route changes are detected automatically — there is nothing to wire up for React Router, Vue Router, or SvelteKit navigation. The guide re-reads the page on each route change, and an in-progress tour resumes across navigations. For accuracy: the runtime compares the pathname, so query-only changes and replaceState updates are deliberately not treated as navigations (many apps sync scroll position or filters into the query string, and re-reading on every such change would thrash). If you mount or unmount declared targets across those transitions, call the registration hooks — use the framework hooks, or call window.Puntego.registerTarget / unregisterTarget from your own lifecycle — so the registry always matches what is on screen.

Google Tag Manager (no code)

If you cannot edit your site’s HTML but you have a GTM container, use the community template.
1

Import the template

In GTM, open Templates → Tag Templates → New, then import the template. Get it by downloading the Puntego Embed template, or find Puntego Embed in the GTM Community Template Gallery.
2

Add and configure the tag

Add a Puntego Embed tag and fill in your App ID and Worker API origin (copy both from Dashboard → Install).
3

Trigger, preview, publish

Trigger on All Pages (Initialization), then Preview and Publish.
The tag injects boot.js once and publishes a window.__PUNTEGO_CONFIG__ object that the boot script reads when no data-app-id attribute is present. The GTM and hand-pasted paths share the same runtime.

Programmatic loader

For custom integrations, the loader injects the boot script imperatively and is SSR-safe (a no-op on the server):

Next steps

Install

The raw script tag and every launch attribute.

Configuration

Tune launcher mode, routes, voice, and wake behavior.

SDK reference

Imperative methods, hooks, and runtime events.

Guide Tools SDK

Build product-owned helpers and declared targets.

CSP

The full Content Security Policy for strict sites.

Domains

Allow the origins where the guide may mount.