Visitor identification and properties
Identity and attributes are the core data bridge between your product and OXVO conversation workflows.
What it is
You can send three data types through Messenger SDK:
- Identity: who the user is (
identify) - Contact attributes: durable profile context (
setAttributes) - Conversation attributes: session-level context (
setConversationAttributes)
Where to find it in OXVO
- Settings → Inboxes → [Your inbox] → Installation for SDK setup
- Settings → Custom Attributes to define reusable attribute schema
When to use it
Use this flow when you need:
- Authenticated conversation continuity
- Better assignment/routing based on profile data
- Reliable reporting by product plan, tier, segment, or workflow source
Identify logged-in users
Plain web runtime
<script>
const onReady = () => {
window.oxvo.identify('USER_ID_123', {
name: 'Jane Doe',
email: 'jane@example.com',
identifier_hash: 'SERVER_GENERATED_HASH',
});
};
if (window.oxvo && typeof window.oxvo.ready === 'function') {
window.oxvo.ready().then(onReady);
} else {
window.addEventListener('oxvo:ready', onReady, { once: true });
}
</script>
React
import { useEffect } from 'react';
import { useOxvoMessenger } from '@oxvo/messenger';
export function IdentitySync({ user }) {
const messenger = useOxvoMessenger();
useEffect(() => {
if (!user?.id) return;
messenger.identify(String(user.id), {
name: user.name,
email: user.email,
identifier_hash: user.identifierHash,
});
}, [messenger, user]);
return null;
}
Vue / Nuxt
import { onMounted } from 'vue';
import { useOxvoMessenger } from '@oxvo/messenger-vue';
const messenger = useOxvoMessenger();
onMounted(() => {
messenger.identify('USER_ID_123', {
name: 'Jane Doe',
email: 'jane@example.com',
identifier_hash: 'SERVER_GENERATED_HASH',
});
});
Warning: Generate
identifier_hashon your server. Do not compute or expose signing secrets in frontend code.
Set contact attributes
await messenger.setAttributes({
plan: 'pro',
account_tier: 'enterprise',
signup_source: 'pricing_page',
});
await messenger.removeAttribute('signup_source');
Set conversation attributes
await messenger.setConversationAttributes({
checkout_step: 'payment',
cart_value: 129.0,
order_currency: 'USD',
});
await messenger.removeConversationAttribute('checkout_step');
Add labels from product context
await messenger.addLabel('vip');
await messenger.removeLabel('vip');
Data quality tips
- Keep attribute keys stable and snake_case.
- Prefer small, typed payloads over raw nested blobs.
- Do not store secrets or regulated data in custom attributes.
- Keep identity sync idempotent when route changes or app shell re-renders.
Related guides
📷 Image (optional): Identity and attribute sync lifecycle
Why: Shows when identity, contact attributes, and conversation attributes should be sent during app and checkout flows.
File:docs/images/sdk-identity-attribute-lifecycle.png
AI prompt: "Modern SaaS documentation flow diagram for OXVO showing user login, messenger identify call, contact attributes sync, conversation attributes update during checkout, and labels for routing; clean neutral UI style, high contrast typography, OXVO branding only, no third-party logos, 1600x1000."