Examples
Common integration patterns for different use cases.
Rover v2 task boundaries are strict: normal sends always start a fresh task boundary. Only ask_user answers continue the current boundary.
Basic Setup
Minimal latency-first ACT setup to get Rover running quickly.
<script>
(function(){ var r = window.rover = window.rover || function(){ (r.q = r.q || []).push(arguments); }; r.l = +new Date(); })();
rover('boot', {
siteId: 'my-site',
publicKey: 'pk_site_your_public_key',
allowedDomains: ['example.com'],
navigation: { crossHostPolicy: 'same_tab' },
taskRouting: { mode: 'act' }, // Force ACT routing (no planner routing heuristics)
});
</script>
<script src="https://rover.rtrvr.ai/embed.js?v=your_site_key_id" async></script>Journeys + Async Identify
Blend workspace journeys with runtime overrides and personalize greeting after login.
<script>
(function(){ var r = window.rover = window.rover || function(){ (r.q = r.q || []).push(arguments); }; r.l = +new Date(); })();
rover('boot', {
siteId: 'my-app',
publicKey: 'pk_site_your_public_key',
siteKeyId: 'your-site-key-id',
allowedDomains: ['app.example.com'],
navigation: { crossHostPolicy: 'same_tab' },
// Workspace journeys are fetched by default via /v2/rover/session/open.
// Optional override in boot config:
ui: {
shortcuts: [
{ id: 'onboard', label: 'Onboard me', prompt: 'Guide me through onboarding', routing: 'planner', enabled: true }
],
greeting: { text: 'Hey {name}! Need setup help?', delay: 2000, duration: 8000 }
},
});
// Later, when auth completes:
rover('identify', { name: 'Alex', email: 'alex@example.com' });
</script>
<script src="https://rover.rtrvr.ai/embed.js?v=your_site_key_id" async></script>Onboarding Flow
Auto-routing setup with planner fallback only when ACT has no usable outcome.
<script>
(function(){ var r = window.rover = window.rover || function(){ (r.q = r.q || []).push(arguments); }; r.l = +new Date(); })();
const isNewUser = !localStorage.getItem('onboarded');
rover('boot', {
siteId: 'my-app',
publicKey: 'pk_site_your_public_key',
allowedDomains: ['app.example.com'],
navigation: { crossHostPolicy: 'same_tab' },
openOnInit: isNewUser,
taskRouting: {
mode: 'auto',
plannerOnActError: true, // Planner fallback runs only if ACT has no usable result
actHeuristicThreshold: 5
},
checkpointing: { enabled: true, autoVisitorId: true },
});
</script>
<script src="https://rover.rtrvr.ai/embed.js?v=your_site_key_id" async></script>Checkout Assistant
Help users complete checkout by filling addresses, applying promos, and handling payment flows.
<script>
(function(){ var r = window.rover = window.rover || function(){ (r.q = r.q || []).push(arguments); }; r.l = +new Date(); })();
rover('boot', {
siteId: 'my-store',
publicKey: 'pk_site_your_public_key',
allowedDomains: ['shop.example.com', 'checkout.example.com'],
domainScopeMode: 'registrable_domain',
navigation: { crossHostPolicy: 'same_tab' },
externalNavigationPolicy: 'block',
allowActions: true,
taskRouting: { mode: 'auto', plannerOnActError: true },
});
</script>
<script src="https://rover.rtrvr.ai/embed.js?v=your_site_key_id" async></script>Form Assistance
Guide users through complex multi-step forms with validation and auto-fill.
<script>
(function(){ var r = window.rover = window.rover || function(){ (r.q = r.q || []).push(arguments); }; r.l = +new Date(); })();
rover('boot', {
siteId: 'my-portal',
publicKey: 'pk_site_your_public_key',
allowedDomains: ['portal.example.com'],
navigation: { crossHostPolicy: 'same_tab' },
sessionScope: 'tab',
taskRouting: { mode: 'planner' },
checkpointing: { enabled: true, autoVisitorId: true },
});
</script>
<script src="https://rover.rtrvr.ai/embed.js?v=your_site_key_id" async></script>Read-Only Support Agent
Rover helps users find information and navigate, but doesn't take actions.
<script>
(function(){ var r = window.rover = window.rover || function(){ (r.q = r.q || []).push(arguments); }; r.l = +new Date(); })();
rover('boot', {
siteId: 'my-help',
publicKey: 'pk_site_your_public_key',
allowedDomains: ['help.example.com'],
navigation: { crossHostPolicy: 'same_tab' },
allowActions: false,
externalNavigationPolicy: 'open_new_tab_notice',
});
</script>
<script src="https://rover.rtrvr.ai/embed.js?v=your_site_key_id" async></script>Strict Security Mode
Maximum lockdown: host-only match, no external navigation, strict scoping.
<script>
(function(){ var r = window.rover = window.rover || function(){ (r.q = r.q || []).push(arguments); }; r.l = +new Date(); })();
rover('boot', {
siteId: 'secure-app',
publicKey: 'pk_site_your_public_key',
allowedDomains: ['app.example.com'],
domainScopeMode: 'host_only',
navigation: { crossHostPolicy: 'same_tab' },
externalNavigationPolicy: 'block',
sessionScope: 'tab',
});
</script>
<script src="https://rover.rtrvr.ai/embed.js?v=your_site_key_id" async></script>Need a pattern not listed here? Check the Configuration Reference for all available options, or reach out on Discord.