Appearance
Rollout and holdout
Every landing page carries a built-in holdout. This is not an add-on for a pilot — it is how the page works, so that the effect of the agent is measurable from the first visitor.
data-nam-rollout
html
<form data-nam-landing-page="kestrel" data-nam-key="lp_live_…" data-nam-rollout="50">The share of visitors who get the agent, 0–100. Anything outside that is clamped; anything fractional is rounded. The default is 100.
How the split is decided
On the server, in intake, from a SHA-256 of the visitor's own token — not in the browser, and not from a coin flip:
parseInt(digest, 16) % 100 < rolloutPct → assist
otherwise → controlDeriving it from the token alone has three consequences that matter:
- a reload lands on the same side;
- a second tagged form on the same page lands on the same side;
- a re-created session lands on the same side.
And the browser cannot choose its own arm.
What a control visitor gets
Nothing. The controller opens a session, starts the view beacon, and stops. No greeting, no conversation, no visible change of any kind.
That is the point: completion is being measured against a genuinely untouched page, so nothing may speak to a control visitor first. Both arms still get a session, a profile and the same funnel events, so the two are directly comparable.
Registering a page dark
Set the rollout to 0. Every visitor is control, nothing renders, and the funnel still records views — which gives you a baseline on the real page before anyone sees the agent.
Forcing an arm while you test
Append ?nam_arm=assist or ?nam_arm=control to the URL. Anything else in that parameter is ignored.
It does nothing in production
The override is honoured only where ALLOW_ARM_OVERRIDE is set, which a deployed namespace cannot do. On a live page it is ignored, so it cannot be used — by you or by anyone else — to skew the measurement.
What is recorded
| Event | Written by | When |
|---|---|---|
lp_view | SDK | Half the form has been on screen. Once per session. |
lp_assist_start | SDK | The agent took over. Once. |
lp_field_set | SDK | The visitor, or their password manager, wrote into one of your fields. |
lp_question | Platform | They typed something while a field was open that was not its answer. |
lp_choice | Platform | A card or a stage action was chosen. |
lp_beat | Platform | A block reached the page. |
lp_submit | SDK | Your form really submitted. Once. |
lp_abandon | SDK | The page went away without a submit. Once, and never after a conversion. |
Full detail in the events reference.