Offer a question at the moment it fits
A launcher waits to be noticed. A nudge is the other way round: you mark up the part of the page where a question naturally occurs, and the assistant offers that question there — once, quietly, next to the launcher.
Mark up the moment
One attribute carries the line the visitor sees:
<section data-voyse-nudge="Wondering how the interview process works?">
…your hiring process content…
</section>
When the visitor reaches that section, a callout appears beside the launcher with your line and a button reading Ask this. Accepting it opens the assistant with the question already asked.
By default the question sent is the line itself. Where the line reads better as an invitation than as a question, separate the two:
<section
data-voyse-nudge="Wondering how the interview process works?"
data-voyse-nudge-prompt="What are the stages of your interview process?"
data-voyse-button-text="Tell me more"
>
| Attribute | Does | Default |
|---|---|---|
data-voyse-nudge |
The line shown in the callout. Required — without it there is no nudge | — |
data-voyse-nudge-prompt |
The question actually sent when the visitor accepts | The line itself |
data-voyse-button-text |
The accept button's label | Ask this |
When it appears
Two modes, set with data-voyse-nudge-mode:
scroll (the default) waits until the marked element comes into view — 12%
of it visible, with a small bottom margin so it fires as the section arrives
rather than as it grazes the fold. Where the browser has no
IntersectionObserver, the nudge shows immediately rather than never.
linger waits for time spent on the page instead:
<section
data-voyse-nudge="Questions about relocation?"
data-voyse-nudge-mode="linger"
data-voyse-nudge-linger="12"
>
data-voyse-nudge-linger is in seconds, defaults to 5, and is clamped between
0.5 and 600. Only visible time counts: a backgrounded tab does not burn the
timer, so a visitor who opens your page in a background tab and returns two
minutes later is not greeted the instant they arrive.
What it will not do
The constraints matter more than the options here, because they are what stops a nudge becoming a pop-up:
- One per page. The embed uses the first
[data-voyse-nudge]element it finds. Marking up five sections gets you the first one, not five callouts. - Once per session. Acceptance is not required — being shown is enough. The record is kept per path and per line, so changing the line offers it again, and a different page can have its own.
- Never over an open assistant. If the panel is already open when the trigger fires, no callout appears.
- Never before the assistant is available. A nudge is not shown on an account that renders no launcher.
Choosing between them
Reach for scroll when the question belongs to a place — a benefits section,
a relocation paragraph, the part of a job description people always ask about.
Reach for linger when it belongs to hesitation — a long job page where a
visitor who is still there after twenty seconds is deciding rather than
skimming.
Both are worth measuring rather than assuming. A shown nudge announces itself to your own page as a same-origin message, so you can forward it to whatever analytics you already run:
window.addEventListener("message", (event) => {
if (event.source !== window || event.origin !== window.location.origin) return;
if (!event.data || event.data.type !== "voyse:analytics") return;
if (event.data.event !== "assistant_nudge_shown") return;
// event.data.eventModel: { campaign_id, tenant_id, job_id, page_path,
// page_type, surface }
myAnalytics.track("voyse_nudge_shown", event.data.eventModel);
});
This one stays on your page: unlike the events in The voyse object, a shown nudge is not sent to Voyse, so it will not appear in your team's numbers unless you forward it.
Check it worked
Load the page and scroll to the marked section (or wait out the linger). The
callout should appear beside the launcher. If it does not, and the markup is
right, the likely cause is that it has already been shown this session — clear
sessionStorage for the site and reload.