دستاویزات

صارف کی شناخت

صارفین کی شناخت گمنام چیٹ سیشنز کو حقیقی صارف پروفائلز سے جوڑ دیتی ہے۔

یہ کیسے کام کرتا ہے

جب آپ Respondo.identify() کال کرتے ہیں تو دی گئی فیلڈز گفتگو کے ساتھ منسلک ہو جاتی ہیں۔ تمام فیلڈز اختیاری ہیں — صرف وہی بھیجیں جو آپ کے پاس ہیں۔ مثلاً آپ ای میل یا نام کے بغیر صرف userId بھی بھیج سکتے ہیں۔ سپورٹ ایجنٹس یہ ڈیٹا گفتگو کی تفصیلات کے پینل میں دیکھتے ہیں۔

پیرامیٹرز#

خصوصیتقسملازمیتفصیل
emailstringاختیاریصارف کا ای میل پتہ
namestringاختیاریظاہر ہونے والا نام
userIdstringاختیاریآپ کا اندرونی صارف ID یا ڈسپلے ID — ڈیش بورڈ میں جوں کا توں دکھایا جاتا ہے
userHashstringاختیاریشناخت کی تصدیق کے لیے HMAC-SHA256 دستخط
metadataobjectاختیاریکسٹم فیلڈز کے کلید-قدر جوڑے (plan، company وغیرہ)
propertiesobjectاختیاریAgent Settings میں طے شدہ کسٹم رابطہ خصوصیات۔ کلیدیں خصوصیات کی تعریفوں سے میل کھانی چاہئیں۔ قدریں cp_ سابقے کے ساتھ محفوظ ہوتی ہیں اور Inbox میں فلٹر کی جا سکتی ہیں۔
مثال: سنگل پیج ایپ (SPA)javascript
// After successful login
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: {                        // custom contact properties
      account_type: user.accountType,    // must match keys from 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 })نام + ای میل دکھائے جاتے ہیںنہیں — الا یہ کہ شناخت کی تصدیق آن ہو؛ تب بغیر دستخط والے ای میل/نام خاموشی سے ہٹا دیے جاتے ہیں اور سیشن گمنام ہی رہتا ہے
identify({ userId })userId جوں کا توں دکھایا جاتا ہےنہیں — الا یہ کہ شناخت کی تصدیق آن ہو؛ تب درست userHash لازمی ہے، ورنہ شناخت ہٹا دی جاتی ہے
identify({ userId, userHash })تصدیق شدہ صارف شناختہاں — خفیہ نگاری سے تصدیق شدہ

جب چینل پر شناخت کی تصدیق آن ہو تو ای میل یا userId والی ہر وہ identify() کال جس میں درست userHash نہ ہو، سرور کی طرف سے ہٹا دی جاتی ہے اور وزیٹر گمنام ہی رہتا ہے — نیچے “شناخت کی تصدیق (HMAC)” دیکھیں۔

visitor ID ایک ہی براؤزر میں سیشنز کے دوران برقرار رہتا ہے۔ یہ کبھی بھی تصدیق شدہ شناخت کے طور پر Respondo کو نہیں بھیجا جاتا — یہ صرف گمنام گفتگو کے تسلسل کے لیے استعمال ہوتا ہے۔

صرف userId سے شناخت (ای میل یا نام کے بغیر)#

اگر آپ کے پلیٹ فارم پر صارفین کے ای میل یا نام موجود نہیں — مثلاً آپ کے پاس صرف اندرونی ڈسپلے ID ہے — تو آپ صرف userId بھیج سکتے ہیں۔ کسی اور فیلڈ کی ضرورت نہیں۔ ڈیش بورڈ گفتگو کی تفصیلات میں userId جوں کا توں دکھائے گا۔

userId + metadata (ای میل یا نام کے بغیر)javascript
// Your platform only has a display ID — that's enough
Respondo.identify({
  userId: user.displayId,      // e.g. "USR-4821" — shown in dashboard
  metadata: {                  // optional extra context
    plan: 'premium',
    region: 'eu-west'
  }
});
// No email or name needed — the widget works with just userId
userId کی جعلسازی روکنے کے لیے اسے userHash کے ساتھ استعمال کریں (نیچے “شناخت کی تصدیق” دیکھیں)۔ HMAC کے بغیر کوئی بھی براؤزر کنسول سے کوئی بھی userId بھیج سکتا ہے۔

Google Tag Manager / تاخیری identify()#

GTM کے ذریعے ایمبیڈ کرتے وقت ممکن ہے صفحہ لوڈ ہونے پر صارف کا ڈیٹا دستیاب نہ ہو۔ دو طریقے ہیں:

طریقہ A: localStorageKey (JS کی ایک سطر بھی نہیں)javascript
// If your platform already writes the user ID to localStorage:
Respondo.init({
  agentId: 'YOUR_AGENT_ID',
  localStorageKey: 'myapp_user_id'  // reads localStorage.getItem('myapp_user_id') automatically
});
// No identify() call needed — the widget picks up the userId on its own
طریقہ B: dataLayer کے ذریعے تاخیری identify()javascript
// 1. Init widget immediately (GTM tag)
Respondo.init({ agentId: 'YOUR_AGENT_ID' });

// 2. Later, when user data appears (e.g. from dataLayer or your app):
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 استعمال کرتی ہے تاکہ خفیہ نگاری کے ذریعے یہ ثابت ہو کہ صارف کی شناخت آپ کے سرور نے مقرر کی ہے، کلائنٹ سائیڈ کوڈ نے نہیں۔

یہ کیسے کام کرتا ہے#

  1. اپنے چینل کی سیٹنگز میں شناخت کی تصدیق آن کریں — آپ کو ایک خفیہ کلید ملے گی۔
  2. اپنے سرور پر HMAC-SHA256(secret, userId) شمار کریں — secret کلید ہے اور userId پیغام — اور نتیجہ فرنٹ اینڈ کو بھیجیں۔ اگر آپ صارفین کی شناخت صرف ای میل سے کرتے ہیں (userId کے بغیر) تو اس کے بجائے ای میل پر دستخط کریں: دستخط ہونے والا payload userId ہوتا ہے جب وہ موجود ہو، ورنہ ای میل۔ دونوں بھیجیں تو userId پر دستخط ہوتے ہیں؛ اسی کو ترجیح حاصل ہے۔
  3. ہیش کو userHash کے طور پر Respondo.identify() میں بھیجیں۔
  4. Respondo ہیش کی تصدیق سرور کی طرف کرتا ہے۔ اگر یہ غلط ہو تو شناخت ہٹا دی جاتی ہے اور صارف کو گمنام سمجھا جاتا ہے۔
اپنی خفیہ کلید کبھی فرنٹ اینڈ کوڈ میں ظاہر نہ کریں۔ HMAC آپ کے بیک اینڈ ہی پر شمار ہونا چاہیے۔
تصدیق آن ہو جانے کے بعد userId یا email والی ہر identify() کال میں درست userHash شامل ہونا لازمی ہے — ورنہ شناخت کے خانے ہٹا دیے جاتے ہیں اور وزیٹر کو گمنام سمجھا جاتا ہے۔

سرور کی طرف کی مثالیں#

Node.jsjavascript
const crypto = require('crypto');

const SECRET = process.env.RESPONDO_IDENTITY_SECRET;

function generateUserHash(userId) {
  return crypto
    .createHmac('sha256', SECRET)
    .update(userId)
    .digest('hex');
}

// In your API endpoint:
app.get('/api/respondo-hash', (req, res) => {
  const hash = generateUserHash(req.user.id);
  res.json({ userHash: hash });
});
Pythonpython
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()

# In your view / endpoint:
user_hash = generate_user_hash(request.user.id)
Gogo
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))
}

فرنٹ اینڈ پر استعمال#

شناخت کی تصدیق کے ساتھjavascript
// Fetch the hash from YOUR server
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 signature
});