ব্যবহারকারী শনাক্তকরণ
ব্যবহারকারী শনাক্ত করলে বেনামি চ্যাট সেশনগুলো আসল ব্যবহারকারী প্রোফাইলের সঙ্গে যুক্ত হয়।
কীভাবে কাজ করে
আপনি যখন Respondo.identify() কল করেন, তখন পাঠানো ফিল্ডগুলো কথোপকথনের সঙ্গে যুক্ত হয়ে যায়। সব ফিল্ডই ঐচ্ছিক — আপনার কাছে যা আছে কেবল সেগুলোই পাঠান। যেমন, email বা নাম ছাড়া শুধু userId পাঠাতে পারেন। সাপোর্ট কর্মীরা কথোপকথনের বিবরণ প্যানেলে এই তথ্য দেখতে পান।
প্যারামিটার#
| প্রপার্টি | টাইপ | আবশ্যক | বিবরণ |
|---|---|---|---|
| string | ঐচ্ছিক | ব্যবহারকারীর ইমেইল ঠিকানা | |
| name | string | ঐচ্ছিক | প্রদর্শিত নাম |
| userId | string | ঐচ্ছিক | আপনার অভ্যন্তরীণ ব্যবহারকারী বা প্রদর্শনের ID — ড্যাশবোর্ডে যেমন আছে তেমনই দেখানো হয় |
| userHash | string | ঐচ্ছিক | পরিচয় যাচাইয়ের জন্য HMAC-SHA256 স্বাক্ষর |
| metadata | object | ঐচ্ছিক | কাস্টম ফিল্ডের কী-ভ্যালু জোড়া (plan, company ইত্যাদি) |
| properties | object | ঐচ্ছিক | Agent Settings-এ নির্ধারিত কাস্টম কন্টাক্ট প্রপার্টি। কী-গুলো প্রপার্টির সংজ্ঞার সঙ্গে মিলতে হবে। মানগুলো cp_ প্রিফিক্স সহ সংরক্ষিত হয় এবং ইনবক্সে ফিল্টার করা যায়। |
// সফল লগইনের পরে
async function onLogin(user) {
await authenticateUser(user);
Respondo.identify({
email: user.email,
name: user.fullName,
userId: user.id,
metadata: {
plan: user.subscription.plan,
company: user.company.name,
role: user.role,
signedUp: user.createdAt
},
properties: { // কাস্টম কন্টাক্ট প্রপার্টি
account_type: user.accountType, // Agent Settings-এর কী-এর সঙ্গে মিলতে হবে
industry: user.industry,
contract_tier: user.tier
}
});
}identify() যেকোনো সময়ে কল করা যায় — widget.js লোড শেষ হওয়ার আগের কলগুলো স্নিপেটই সারিতে জমিয়ে রাখে এবং উইজেট ইনিশিয়ালাইজ হওয়ার পর নিজে থেকেই আবার চালায়। পরিচয়ের তথ্য কেবল তখনই বাদ পড়ে (কনসোলে একটি সতর্কবার্তা সহ), যখন আপনি widget.js নিজে লোড করেন এবং কখনো init() কল করার আগেই identify() কল করেন — ম্যানুয়াল সেটআপে সবসময় আগে init() কল করুন।বেনামি দর্শনার্থী#
আপনি যদি identify() কল না করেন, তাহলে উইজেট নিজে থেকেই একটি স্থায়ী visitor ID বরাদ্দ করে, যা localStorage-এ রাখা হয় (কী respondoai_visitor_id)। ড্যাশবোর্ডে কথোপকথনটি Guest · Web widget নামে দেখা যায়।
| মোড | ড্যাশবোর্ডে প্রদর্শন | HMAC লাগে কি |
|---|---|---|
identify() ছাড়া | Guest · Web widget | না |
identify({ email, name }) | নাম + email দেখানো হয় | না — যদি না Identity Verification চালু থাকে; চালু থাকলে স্বাক্ষরবিহীন email/নাম নীরবে বাদ দেওয়া হয় এবং সেশনটি বেনামিই থেকে যায় |
identify({ userId }) | userId যেমন আছে তেমনই দেখানো হয় | না — যদি না Identity Verification চালু থাকে; চালু থাকলে বৈধ userHash লাগবে, নইলে পরিচয় বাদ দেওয়া হয় |
identify({ userId, userHash }) | যাচাই করা ব্যবহারকারী পরিচয় | হ্যাঁ — ক্রিপ্টোগ্রাফিকভাবে যাচাই করা |
চ্যানেলে Identity Verification চালু থাকলে, বৈধ userHash ছাড়া email বা userId বহনকারী যেকোনো identify() সার্ভার-সাইডে বাদ দেওয়া হয় এবং দর্শনার্থী বেনামিই থেকে যান — নিচের ‘পরিচয় যাচাই (HMAC)’ দেখুন।
শুধু userId দিয়ে শনাক্তকরণ (email বা নাম ছাড়া)#
আপনার প্ল্যাটফর্মে যদি ব্যবহারকারীর email বা নাম না থাকে — যেমন কেবল একটি অভ্যন্তরীণ প্রদর্শন-ID আছে — তাহলে শুধু userId পাঠালেই চলবে। আর কোনো ফিল্ড লাগবে না। ড্যাশবোর্ডে কথোপকথনের বিবরণে userId যেমন আছে তেমনই দেখানো হবে।
// আপনার প্ল্যাটফর্মে কেবল একটি প্রদর্শন-ID আছে — এটুকুই যথেষ্ট
Respondo.identify({
userId: user.displayId, // যেমন ‘USR-4821’ — ড্যাশবোর্ডে দেখানো হয়
metadata: { // ঐচ্ছিক বাড়তি প্রেক্ষাপট
plan: 'premium',
region: 'eu-west'
}
});
// email বা নাম লাগবে না — শুধু userId দিয়েই উইজেট কাজ করেuserHash ব্যবহার করুন (নিচের ‘পরিচয় যাচাই’ দেখুন)। HMAC ছাড়া যে কেউ ব্রাউজার কনসোল থেকে যেকোনো userId পাঠাতে পারে।Google Tag Manager / বিলম্বিত identify()#
GTM দিয়ে এম্বেড করলে পেজ লোডের সময় ব্যবহারকারীর তথ্য না-ও থাকতে পারে। দুটি উপায় আছে:
// আপনার প্ল্যাটফর্ম যদি ইতিমধ্যেই ব্যবহারকারীর ID localStorage-এ লেখে:
Respondo.init({
agentId: 'YOUR_AGENT_ID',
localStorageKey: 'myapp_user_id' // নিজে থেকেই localStorage.getItem('myapp_user_id') পড়ে
});
// identify() কল লাগবে না — উইজেট নিজেই userId তুলে নেয়// 1. উইজেট সঙ্গে সঙ্গে ইনিশিয়ালাইজ করুন (GTM ট্যাগ)
Respondo.init({ agentId: 'YOUR_AGENT_ID' });
// 2. পরে, যখন ব্যবহারকারীর তথ্য আসে (যেমন dataLayer বা আপনার অ্যাপ থেকে):
var waitForUser = setInterval(function() {
var uid = localStorage.getItem('myapp_user_id');
if (uid && window.Respondo && typeof window.Respondo.identify === 'function') {
clearInterval(waitForUser);
Respondo.identify({ userId: uid });
}
}, 500);localStorageKey কেবল তখনই কাজে লাগে, যখন userId আগে থেকে identify() দিয়ে সেট করা নেই। স্পষ্টভাবে করা identify() কল সবসময় অগ্রাধিকার পায়।পরিচয় যাচাই (HMAC)#
যাচাই ছাড়া যে কেউ জাল userId বা email পাঠিয়ে অন্য ব্যবহারকারী সেজে বসতে পারত। পরিচয় যাচাই HMAC-SHA256 ব্যবহার করে ক্রিপ্টোগ্রাফিকভাবে প্রমাণ করে যে ব্যবহারকারীর পরিচয় আপনার সার্ভার নির্ধারণ করেছে, ক্লায়েন্ট-সাইড কোড নয়।
কীভাবে কাজ করে#
- আপনার চ্যানেল সেটিংসে পরিচয় যাচাই চালু করুন — আপনি একটি সিক্রেট কী পাবেন।
- আপনার সার্ভারে
HMAC-SHA256(secret, userId)হিসাব করুন — secret হলো কী, userId হলো বার্তা — এবং ফলাফলটি ফ্রন্টএন্ডে পাঠান। আপনি যদি ব্যবহারকারীদের কেবল email দিয়ে শনাক্ত করেন (userId নেই), তাহলে email-টিই স্বাক্ষর করুন: স্বাক্ষরিত পেলোড হলো userId (সেট থাকলে), নইলে email। দুটোই পাঠালে userId স্বাক্ষর করুন; সেটিই অগ্রাধিকার পায়। - হ্যাশটি
userHashহিসেবেRespondo.identify()-এ পাঠান। - Respondo সার্ভারের দিকে হ্যাশটি যাচাই করে। হ্যাশ ভুল হলে পরিচয়ের তথ্য বাদ দেওয়া হয় এবং ব্যবহারকারীকে বেনামি ধরা হয়।
userId বা email বহনকারী প্রতিটি identify()-এ একটি বৈধ userHash থাকতেই হবে — নইলে পরিচয়ের ফিল্ডগুলো বাদ দেওয়া হয় এবং দর্শনার্থীকে বেনামি ধরা হয়।সার্ভার-সাইড উদাহরণ#
const crypto = require('crypto');
const SECRET = process.env.RESPONDO_IDENTITY_SECRET;
function generateUserHash(userId) {
return crypto
.createHmac('sha256', SECRET)
.update(userId)
.digest('hex');
}
// আপনার API এন্ডপয়েন্টে:
app.get('/api/respondo-hash', (req, res) => {
const hash = generateUserHash(req.user.id);
res.json({ userHash: hash });
});import hmac, hashlib, os
SECRET = os.environ['RESPONDO_IDENTITY_SECRET']
def generate_user_hash(user_id: str) -> str:
return hmac.new(
SECRET.encode(),
user_id.encode(),
hashlib.sha256
).hexdigest()
# আপনার ভিউ / এন্ডপয়েন্টে:
user_hash = generate_user_hash(request.user.id)import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
)
func GenerateUserHash(userID, secret string) string {
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(userID))
return hex.EncodeToString(mac.Sum(nil))
}ফ্রন্টএন্ডে ব্যবহার#
// হ্যাশটি আপনার নিজের সার্ভার থেকে আনুন
const { userHash } = await fetch('/api/respondo-hash').then(r => r.json());
Respondo.identify({
email: user.email,
name: user.name,
userId: user.id,
userHash: userHash // HMAC-SHA256 স্বাক্ষর
});