
Alex Morgan
Product specialist
Chapter 10
Every page asks for a different kind of attention. This chapter shows how to make Stand feel intentional on pricing, booking, docs, contact, and other high-intent pages without changing the install snippet.
Stand Guidebook
Chapter 10 of 11
Field guide
Tune the visitor-facing widget per page: when it appears, whether it opens, what it says first, and which in-page prompts invite a conversation. The goal is a chat experience that feels helpful in the moment, not pasted over the site.
Use this chapter when Stand is installed but feels too quiet, too eager, or too generic on important pages.
Map visitor intent by path: home, pricing, docs, booking, contact, and comparison pages may need different invitations.
Choose how visible Stand should be on each page: hidden, button only, delayed, scroll-triggered, or opened with a specific message.
Write opening messages from the rep or stand-in point of view, tied to what the visitor is likely deciding right now.
Use stand-button or stand-card for page-native prompts when a small CTA fits better than the floating widget.
Use JavaScript only when built-in rules and declarative prompts cannot express the experiment.
Runtime rules
Chat widget behavior is runtime site configuration. The installed snippet stays the same; Stand calls find immediately, receives the current behavior config, and applies the first matching rule for the visitor page.
Each site has an ordered list of behavior rules. Put specific rules above broad rules. The empty path rule is the default fallback. The / rule is only the front page. Other paths match exactly, ignoring a trailing slash; add /* to match that page and every child path.
App link
In Stand, open Sites, choose a site, then use Chat widget behavior to edit the ordered runtime rules. Changes apply to the next visitor load without changing the snippet.
Declarative prompts
A stand-button is the smallest in-page chat prompt. Use stand-card when the invitation needs more context, identity, media, or custom layout. Stand handles availability, identity, click behavior, and the opening message.
Put either element anywhere on the page, include hidden to avoid flicker, and Stand reveals it only after find returns an available rep or stand-in. The message attribute replaces the normal greeting for that open, so write it as the first thing the rep or stand-in says.
stand-button
Use stand-button when the page already has enough context and all you need is a small call to action that opens Stand with the right first message.
Preview
Opens with: Happy to walk you through installation and get you started. How do you host your website today?
HTML
<stand-button hidden avatar message="Happy to walk you through installation and get you started. How do you host your website today?">How it works?</stand-button>
<style>
stand-button::part(button) { cursor: pointer; }
stand-button:hover::part(button) { background: #F4F4F4; }
</style>stand-button attributes
stand-button slots and parts
stand-card
Use stand-card when the invitation should carry supporting copy, identity, media, or a layout that feels like part of the page.
The card API follows the same shape as component docs you may already know: authored content goes into slots, visual variants go in the space-separated theme attribute, and styling hooks are exposed as shadow parts. Stand owns the identity header from availability data, so the header prefix, title, subtitle, and AI badge are parts rather than author-provided slots.
HTML
<stand-card hidden class="stand-card--simple" hide-avatar hide-name hide-title message="I can help with pricing. What would you like to compare?">→ Pricing details</stand-card>
<style>
.stand-card--simple::part(card) { cursor: pointer; }
.stand-card--simple:hover::part(card) { background: #F4F4F4; }
</style>stand-card attributes
stand-card slots
stand-card theme variants
stand-card shadow parts
Theme variants
Preview identity
Preview

Alex Morgan
Product specialist
Generated HTML
<stand-card hidden theme="outlined horizontal cover-media" message="I can help you decide whether a call is worth booking. What are you trying to figure out?">
<img slot="media" src="/images/guide/stand-card-implementation.png" alt="">
Plan the right call
Share your goal before choosing a time.
<span slot="footer">Useful when visitors are comparing meeting options.</span>
</stand-card>Styled examples
Pricing, booking, service fit, and contact pages usually need different invitations. Use a class on stand-card, style the shadow-DOM parts with ::part(), and style your own slotted content with normal CSS. Click any preview card; if Stand is present, it opens chat with that card's message.
Example 1
Opens with: I can help with pricing. What would you like to compare?
HTML
<stand-card hidden class="stand-card--pricing" theme="elevated" hide-avatar hide-name hide-title message="I can help with pricing. What would you like to compare?">
<span class="stand-card-eyebrow">Plans and limits</span>
<strong>→ Pricing details</strong>
<span>Compare plans, limits, and what changes by team size.</span>
</stand-card>CSS
.stand-card--pricing::part(card) {
border-color: #F6C510;
border-left: 4px solid #F6C510;
background: #fffdf4;
cursor: pointer;
}
.stand-card--pricing:hover::part(card) {
background: #fff8d8;
}
.stand-card--pricing .stand-card-eyebrow {
display: block;
margin-bottom: 0.25rem;
color: #C19802;
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
}Example 2

Alex Morgan
Product specialist
Opens with: I can help you decide whether a call is worth booking. What are you trying to figure out?
HTML
<stand-card hidden class="stand-card--booking" theme="outlined elevated horizontal cover-media" message="I can help you decide whether a call is worth booking. What are you trying to figure out?">
<img slot="media" src="/images/guide/stand-card-implementation.png" alt="">
<span class="stand-card-eyebrow">Before you book</span>
<strong>Plan the right call</strong>
<span>Share your goal before choosing a time.</span>
<span slot="footer">Useful when visitors are comparing meeting options.</span>
</stand-card>CSS
.stand-card--booking {
max-width: 42rem;
}
.stand-card--booking::part(card) {
border-color: #38B9E0;
background: #f7fcfd;
cursor: pointer;
}
.stand-card--booking:hover::part(card) {
background: #eef9fc;
}
.stand-card--booking::part(media) {
min-height: 12rem;
}
.stand-card--booking .stand-card-eyebrow {
color: #1B90B3;
font-weight: 700;
}Example 3
Riley
Opens with: I can help you narrow this down. What are you trying to accomplish?
HTML
<stand-card hidden class="stand-card--service-fit" theme="outlined" hide-title message="I can help you narrow this down. What are you trying to accomplish?">
<span class="stand-card-eyebrow">Not sure yet?</span>
<strong>Which option fits?</strong>
<span>Describe your goal and compare the likely paths.</span>
</stand-card>CSS
.stand-card--service-fit::part(card) {
border-color: #38B9E0;
background: #f3fbfd;
cursor: pointer;
}
.stand-card--service-fit:hover::part(card) {
background: #e3f7fc;
}
.stand-card--service-fit::part(header-prefix) {
background: #1B90B3;
}
.stand-card--service-fit .stand-card-eyebrow {
color: #05485D;
font-weight: 700;
}Example 4
Alex Morgan
Product specialist
Opens with: I can answer a quick question before you contact the team. What would you like to know?
HTML
<stand-card hidden class="stand-card--contact" theme="outlined" message="I can answer a quick question before you contact the team. What would you like to know?">
<span class="stand-card-eyebrow">Need a person?</span>
<strong>Ask before you submit</strong>
<span>Get an answer before sending the contact form.</span>
<span slot="footer">Good for visitors who are close to reaching out.</span>
</stand-card>CSS
.stand-card--contact::part(card) {
border-style: dashed;
border-color: #A3A3A3;
background: white;
cursor: pointer;
}
.stand-card--contact:hover::part(card) {
background: #F4F4F4;
}
.stand-card--contact::part(footer) {
color: #676767;
font-style: italic;
}
.stand-card--contact .stand-card-eyebrow {
color: #B3371B;
font-weight: 700;
}Developer API
Use stand-button or stand-card first when a declarative prompt is enough. Use the JavaScript API when the site already has its own button, comparison table, booking flow, or component that should open Stand.
The JavaScript API is the window.StandChat object created by the Stand script. Because the script can load asynchronously, read it defensively and wire custom UI only after the object exists.
The object can exist before the availability lookup has finished. isAvailable() tells you whether Stand found a responder. whenAvailable(callback) is the usual place to reveal custom UI, and the callback receives a copied availability object: { available, human, name, title, avatarUrl, brandName }.
openChat(...) reveals the widget and starts the chat. The first argument replaces the rep or stand-in greeting for that open. The optional visitor message becomes the visitor's first sent message. The optional prompt is internal context stored in dashboard history and used by the AI stand-in; visitors do not see it.
The API exposes copied availability data only. It does not expose visitor tokens, websocket tokens, session tokens, or internal widget state.
Open Stand from a page button
function setupPricingButton(tries = 0) {
const StandChat = window.StandChat
const button = document.querySelector("[data-ask-pricing]")
if (!StandChat || !button) {
if (tries < 200) {
window.setTimeout(() => setupPricingButton(tries + 1), 50)
}
return
}
StandChat.whenAvailable(() => {
button.hidden = false
})
button.addEventListener("click", () => {
StandChat.openChat("I can help with pricing. What would you like to compare?")
})
}
setupPricingButton()This waits for the deferred Stand script and still works if Stand has already found someone available.
Declarative stand-button and stand-card prompts
<stand-button
hidden
avatar
message="Happy to walk you through installation. How do you host your website today?"
prompt="Find out the visitor's website platform and where they are in the install process before giving setup guidance.">
Ask how Stand works
</stand-button>
<stand-card
hidden
message="I can help with pricing. What would you like to compare?"
prompt="Ask about team size, expected chat volume, and whether they need AI stand-in coverage before recommending a plan.">
<strong>Compare pricing</strong>
<span>Ask which plan fits your site.</span>
</stand-card>The message is visible to the visitor; the prompt is internal context for the rep or stand-in.
Feature request box
<label for="feature-request">Submit a feature request</label>
<textarea id="feature-request"></textarea>
<button id="feature-request-submit" type="button" disabled>
Submit a feature request
</button>
<script>
function setupFeatureRequestBox(tries = 0) {
const StandChat = window.StandChat
const textarea = document.getElementById("feature-request")
const button = document.getElementById("feature-request-submit")
const prompt = "Ask visitor for more details about the feature and interview them about their use-case. The goal is to record the feature clearly in this conversation so that the product team can understand it. In the end of the conversation, thank and name who is your rep and say that they will review the feature. Ask if visitor wants to them to also follow up."
if (!StandChat || !textarea || !button) {
if (tries < 200) {
window.setTimeout(() => setupFeatureRequestBox(tries + 1), 50)
}
return
}
let standAvailable = StandChat.isAvailable()
const updateButton = () => {
button.disabled = !standAvailable || !textarea.value.trim()
}
StandChat.whenAvailable(() => {
standAvailable = true
updateButton()
})
textarea.addEventListener("input", updateButton)
button.addEventListener("click", () => {
const visitorMessage = textarea.value.trim()
if (!standAvailable || !visitorMessage) return
StandChat.openChat("What feature would you like to have?", visitorMessage, prompt)
})
updateButton()
}
setupFeatureRequestBox()
</script>The button remains disabled until Stand is available and the textarea has content.
Live examples
Waiting for Stand
Page button
Opens chat with a replacement first message from the rep or stand-in.
Advanced experimentation
Custom JavaScript runs on the customer website after Stand finds an available rep or stand-in and before the button is shown. That is useful for experiments, but it is powerful enough to change page behavior or break part of the site.
Enable it only while you are actively testing a custom behavior. When a behavior works, implement it in the website itself and turn custom JavaScript off.
Questions
No. Use it to test. When the behavior proves useful, move it into the website implementation and turn injection off.
No. Runtime behavior is returned by Stand after the snippet calls find.
Continue the guide