Skip to main content

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_hash on 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.

📷 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."