Prospect Qualification¶
Overview¶
Rose analyzes your website visitors' conversations in real time to identify buying intent and qualify prospects. This page explains how qualification works, what criteria are used, and how the resulting data is captured.
How Qualification Works¶
When a visitor interacts with the Rose chatbot, each message is analyzed to understand both what the visitor is trying to do and how interested they are in your product.
Rose distinguishes between visitors who are exploring your product, sharing their business context, requesting a demo, seeking support as existing customers, or sending unrelated messages. This ensures each visitor gets an appropriate response — product questions get helpful answers, demo requests get connected to your team, and support issues are routed to the right resources.
Interest Score¶
In the backoffice, each visitor and conversation displays an interest score from 1 to 5. This is a composite score that combines two factors:
- Conversation behavior — How far the visitor progressed in the conversation (e.g., just browsing, engaged in multiple exchanges, demo proposed, CTA clicked, demo booked)
- Buying signals — What the visitor talked about (e.g., pricing questions, sharing their use case, comparing competitors, asking about ROI)
| Score | Label | Typical behavior |
|---|---|---|
| 5 | Hot | Demo booked |
| 4 | Engaged | Clicked on a call-to-action |
| 3 | Interested | Demo or CTA was proposed by Rose |
| 2 | Curious | Multiple messages exchanged |
| 1 | Cold | Minimal interaction |
During the conversation, Rose tracks buying signals in real time. When the accumulated signals cross a configured threshold, Rose proposes a call-to-action such as booking a demo or starting a free trial. A visitor can be qualified instantly (e.g., by explicitly requesting a demo) or progressively as signals accumulate over multiple messages.
Qualification Questions¶
Rose may also ask qualification questions during the conversation to better understand the visitor's profile — for example, company size, industry, or volume of activity. These questions are configured specifically for your account.
The answers help Rose route the visitor to the most relevant CTA (e.g., free trial for small teams, demo for larger organizations) and enrich the prospect data available to your sales team.
Customization
Both the interest threshold and qualification questions are configured by your Rose account manager to match your sales process. Contact your account manager if you'd like to adjust them.
How Data Is Captured¶
All qualification data is captured automatically during the conversation and available in the backoffice:
- Interest score — composite score (1-5) combining conversation behavior and buying signals
- Qualification answers — extracted from visitor responses to profiling questions
- CTA interactions — tracked when a visitor clicks a demo or trial button
This data persists across sessions — if a visitor returns later, Rose remembers their previous interest level and qualification data.
Non-Qualified Visitors¶
Not every visitor is a prospect. Rose automatically identifies and handles non-prospect visitors:
- Existing customers with support issues — directed to support resources
- Job seekers, press, or partners — directed to the appropriate contact channel
- Off-topic messages — politely redirected
These visitors do not receive sales-oriented CTAs.
Post-Conversion Qualification Webhooks¶
When you use Rose's post-conversion qualification (the form that appears after a visitor submits a demo request), Rose can send the collected data directly to your systems via webhooks. This lets you automatically feed qualification answers into your CRM, trigger follow-up emails, or enrich your sales pipeline.
How It Works¶
Rose sends a single webhook (post_conversion_complete) when all qualification questions have been answered. The payload includes all collected fields, the visitor's contact info, and the AI qualification summary and score.
Setting Up Your Endpoint¶
Your webhook endpoint must:
- Accept
POSTrequests with a JSON body - Return a
2xxstatus code to acknowledge receipt - Respond within 5 seconds
Rose retries failed deliveries up to 3 times with exponential backoff (1s, 2s, 4s).
To configure your endpoint:
- Go to your site's Settings page in the Rose backoffice
- Open the Qualification section and find your form under Profiling → Forms
- Expand On Complete and enter your webhook URL in the Webhook Endpoint field
- Click Save — Rose automatically generates a Webhook Secret for signature verification
- Copy the secret using the copy button next to the field — you'll need it to verify webhook signatures
Webhook Payload¶
Each webhook sends a JSON payload with the following structure:
{
"event_type": "post_conversion_complete",
"session_id": "abc-123-def",
"site_name": "www.yoursite.com",
"is_complete": true,
"collected_fields": {
"company_size": "11-50",
"industry": "SaaS",
"budget": "> 50k",
"timeline": "< 3 months"
},
"visitor_contact": {
"email": "lead@company.com",
"utm_source": "google",
"utm_campaign": "spring-2025"
},
"ai_summary": "Strong SaaS lead with immediate need and budget. Looking for a reporting solution to replace manual Excel workflows.",
"ai_score": "hot",
"ai_score_explanation": "High budget (> 50k), short timeline (< 3 months), and clear pain point (manual reporting)."
}
| Field | Type | Description |
|---|---|---|
event_type |
string | Always post_conversion_complete |
session_id |
string | Unique conversation identifier |
site_name |
string | Your website domain |
is_complete |
boolean | Always true |
collected_fields |
object | All collected answers (field name → answer) |
visitor_contact |
object | Contact info passed when opening the form — typically includes email and any URL query parameters from the page (e.g., UTM tags) |
ai_summary |
string | AI-generated summary of the qualification (when AI scoring is enabled) |
ai_score |
string | AI qualification score: hot, warm, cold, or redirect (when AI scoring is enabled) |
ai_score_explanation |
string | Why the AI assigned this score (when AI scoring is enabled) |
Note
The ai_summary, ai_score, and ai_score_explanation fields are only present when AI scoring is enabled for your account.
Verifying Webhook Authenticity (HMAC Signature)¶
If a webhook secret is configured for your account, every webhook request includes an X-Webhook-Signature header containing an HMAC-SHA256 signature. Use this to verify that the request genuinely came from Rose and wasn't tampered with.
Body encoding
Rose signs the body using compact JSON (no spaces after separators). If your framework parses and re-serializes the JSON before you compute the HMAC, the signature will not match. Always compute the signature from the raw request body bytes, not from a re-serialized object.
How to verify:
- Get the raw JSON body of the request (as bytes, before any parsing)
- Compute
HMAC-SHA256using your webhook secret as the key and the raw body as the message - Compare the hex digest with the
X-Webhook-Signatureheader value
Example in Python:
import hashlib
import hmac
import json
def verify_signature(body: bytes, signature: str, secret: str) -> bool:
"""Verify that a webhook request came from Rose."""
expected = hmac.new(
secret.encode(),
body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
# In your webhook handler:
# body = request.body (raw bytes)
# signature = request.headers["X-Webhook-Signature"]
# is_valid = verify_signature(body, signature, YOUR_WEBHOOK_SECRET)
Example in Node.js (Express):
const crypto = require('crypto');
function verifySignature(rawBody, signature, secret) {
// rawBody must be the raw request buffer, not a re-serialized object
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}
// In Express, use express.raw() or express.json({ verify: ... }) to preserve raw body
Tip
Your webhook secret is available in the Rose backoffice under your form's On Complete settings. Copy it using the copy button next to the field. Keep it confidential — never expose it in client-side code.
Integration Examples¶
n8n¶
- Add a Webhook node as the trigger of your workflow
- Set HTTP Method to
POST - Copy the Test URL or Production URL from n8n — this is the URL you'll paste into the Rose backoffice
- In the Rose backoffice, paste the n8n webhook URL into the Webhook Endpoint field and save
- n8n automatically parses the JSON payload — you can access fields like
{{ $json.collected_fields.company_size }}or{{ $json.ai_score }}in subsequent nodes
To verify the HMAC signature in n8n, configure the Webhook node to return the raw body (set Options → Raw Body to true), then add a Code node after the trigger:
const crypto = require('crypto');
const secret = 'YOUR_WEBHOOK_SECRET'; // paste from Rose backoffice
const signature = $input.first().headers['x-webhook-signature'];
// Use the raw body bytes — do NOT re-serialize with JSON.stringify()
const body = $input.first().rawBody;
const expected = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
throw new Error('Invalid webhook signature');
}
return $input.all();
Zapier¶
Use a Webhooks by Zapier trigger ("Catch Hook"). Copy the webhook URL into Rose backoffice. Zapier parses the JSON payload automatically.
HubSpot¶
Use an n8n or Zapier workflow to receive the webhook and create/update a HubSpot contact via the HubSpot node/action. Map collected_fields to contact properties and use ai_score to set the lead status.
Salesforce¶
Map collected_fields to Salesforce lead fields, and use ai_score to set the lead rating (e.g., hot → Hot, warm → Warm).
Need Help?¶
If you have questions about how qualification works for your account, or if you'd like to adjust your qualification criteria, contact your Rose account manager.