Skip to Content
مستندات متریکس همواره در حال بهبود است! 🚀 آخرین به‌روزرسانی‌ها را از اینجا دنبال کنید.

راهنمای اتریبیوشن (Attribution) و ردیابی نشست (Session Tracking) در Web SDK

نمای کلی

Metrix Web SDK قابلیت‌های جامعی برای اتریبیوشن و ردیابی نشست ارائه می‌دهد:

  • Attribution: مشخص می‌کند کاربران از چه طریقی جذب شده‌اند (کمپین، ارگانیک و غیره)
  • Session Tracking: نشست‌های کاربر، نصب‌ها و میزان تعامل را ردیابی می‌کند
  • User Identification: شناسه یکتای کاربر متریکس را تولید و در اختیار شما قرار می‌دهد
  • Deep Linking Support: از سناریوهای TWA (Trusted Web Activity) و PWA (Progressive Web App) پشتیبانی می‌کند

شروع سریع

import { init, getAttributionStatus, onMetrixUserIdReceived } from '@metrixorg/websdk'; // Initialize with session tracking init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true, packageName: 'my-web-app', }, }); // Get Metrix user ID const metrixUserId = await onMetrixUserIdReceived(); console.log('Metrix User ID:', metrixUserId); // Check attribution status const attribution = await getAttributionStatus(); console.log('Attribution:', attribution);

بخش ۱: وضعیت اتریبیوشن

نمای کلی

Attribution مشخص می‌کند کاربر از چه مسیری جذب شده است. SDK متدهایی برای بررسی وضعیت اتریبیوشن کاربر فعلی ارائه می‌دهد تا بتوانید اثربخشی کمپین‌های بازاریابی خود را بهتر تحلیل کنید.

دریافت وضعیت اتریبیوشن

برای دریافت اطلاعات کامل اتریبیوشن، از getAttributionStatus() استفاده کنید:

import { getAttributionStatus, onMetrixUserIdReceived } from '@metrixorg/websdk'; // Wait for Metrix user ID to be available await onMetrixUserIdReceived(); // Get attribution information const attribution = await getAttributionStatus(); if (attribution) { console.log('Attribution Status:', attribution.attributionStatus); console.log('Source:', attribution.acquisitionSource); console.log('Campaign:', attribution.acquisitionCampaign); }

Method Signature

getAttributionStatus(): Promise<AttributionStatus | null>

خروجی:

  • AttributionStatus شامل داده‌های کامل اتریبیوشن
  • null اگر SDK مقداردهی اولیه نشده باشد یا شناسه کاربر متریکس هنوز در دسترس نباشد

منطق تلاش مجدد خودکار

وقتی سرور مقدار NOT_ATTRIBUTED_YET را برگرداند، SDK به‌صورت خودکار:

  1. ۱۰ ثانیه صبر می‌کند
  2. دوباره درخواست را ارسال می‌کند
  3. این روند را تا زمان دریافت وضعیت نهایی تکرار می‌کند

این مکانیزم باعث می‌شود در نهایت اطلاعات کامل اتریبیوشن را دریافت کنید.

AttributionStatus

interface AttributionStatus { acquisitionAd: string; // Ad identifier acquisitionAdSet: string; // Ad set identifier acquisitionCampaign: string; // Campaign name acquisitionSource: string; // Source (e.g., 'Google', 'Facebook') acquisitionSubId: string; // Additional tracking sub ID acquisitionAdNetwork: string; // Ad network (e.g., 'Google Ads') attributionStatus: string; // Current status (see below) trackerToken: string; // Metrix tracker token installTime: number; // Installation timestamp (ms) reinstalled: boolean; // Whether user reinstalled installedByImpression: boolean; // Whether attributed to impression }

مقادیر وضعیت اتریبیوشن

مقدارتوضیح
ATTRIBUTEDکاربر با موفقیت به یک کمپین یا منبع جذب نسبت داده شده است. نصب کاربر به یک کمپین بازاریابی مشخص متصل شده است.
NOT_ATTRIBUTED_YETپردازش اتریبیوشن هنوز کامل نشده است. SDK به‌صورت خودکار هر ۱۰ ثانیه دوباره تلاش می‌کند. این یک وضعیت موقتی است و معمولاً طی ۳۰ تا ۶۰ ثانیه نهایی می‌شود.
ATTRIBUTION_NOT_NEEDEDکاربر ارگانیک است و نیازی به اتریبیوشن کمپینی ندارد. کاربر بدون کلیک روی تبلیغ یا لینک کمپین وارد شده است.
UNKNOWNوضعیت اتریبیوشن قابل تشخیص نیست. سیستم نتوانسته وضعیت اتریبیوشن کاربر را تعیین کند.

مثال کامل

import { init, getAttributionStatus, onMetrixUserIdReceived } from '@metrixorg/websdk'; // Initialize SDK init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true }, }); // Wait for Metrix ID const metrixUserId = await onMetrixUserIdReceived(); console.log('Device ID:', metrixUserId); // Get attribution with complete handling try { const attribution = await getAttributionStatus(); if (!attribution) { console.log('Attribution not available yet'); return; } switch (attribution.attributionStatus) { case 'ATTRIBUTED': console.log('✓ Attributed user'); console.log(' Campaign:', attribution.acquisitionCampaign); console.log(' Source:', attribution.acquisitionSource); console.log(' Network:', attribution.acquisitionAdNetwork); console.log(' Install Time:', new Date(attribution.installTime)); break; case 'NOT_ATTRIBUTED_YET': console.log('○ Attribution still processing...'); // SDK will retry automatically break; case 'ATTRIBUTION_NOT_NEEDED': console.log('Organic user - no campaign attribution'); break; case 'UNKNOWN': console.log('? Attribution status unknown'); break; } // Log for analytics analytics.logAttribution({ status: attribution.attributionStatus, source: attribution.acquisitionSource, campaign: attribution.acquisitionCampaign, }); } catch (error) { console.error('Failed to get attribution:', error); }

موارد استفاده

۱. User Onboarding

const attribution = await getAttributionStatus(); if (attribution?.attributionStatus === 'ATTRIBUTED') { // Show campaign-specific welcome message showWelcomeMessage(attribution.acquisitionCampaign); } else { // Show generic welcome showGenericWelcome(); }

۲. Conversion Tracking

function trackPurchase(amount) { getAttributionStatus().then(attribution => { analytics.trackPurchase({ amount, campaign: attribution?.acquisitionCampaign, source: attribution?.acquisitionSource, }); }); }

۳. Campaign ROI Analysis

async function calculateROI() { const attribution = await getAttributionStatus(); if (attribution?.attributionStatus === 'ATTRIBUTED') { const roi = calculateReturn(attribution.acquisitionCampaign); updateDashboard(attribution.acquisitionCampaign, roi); } }

۴. شناسایی تقلب

const attribution = await getAttributionStatus(); if (attribution?.reinstalled) { console.log('Warning: User reinstalled app'); // Apply additional fraud checks }

بخش ۲: ردیابی نشست

نمای کلی

ردیابی نشست، میزان تعامل کاربر با وب‌اپلیکیشن شما را پایش می‌کند:

  • Install Counting: اولین نشست به‌عنوان نصب در نظر گرفته می‌شود
  • Session Management: بازه‌های فعالیت کاربر ردیابی می‌شوند
  • Session Duration: مدت زمان فعال بودن کاربر اندازه‌گیری می‌شود
  • Inactivity Detection: پس از ۳۰ دقیقه یا بیشتر عدم فعالیت، نشست جدید آغاز می‌شود
  • URL Tracking: صفحاتی که کاربر بازدید می‌کند ثبت می‌شوند

فعال‌سازی ردیابی نشست

import { init } from '@metrixorg/websdk'; init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true, // Required packageName: 'my-app', // Optional: identify your app }, });

پیکربندی

interface SessionTrackingConfig { enabled: boolean; // Enable/disable session tracking (required) packageName?: string; // App identifier for tracking (optional) }
فیلدنوعالزامیتوضیحپیش‌فرض
enabledbooleanفعال‌سازی ردیابی نشستندارد
packageNamestringشناسه سفارشی اپندارد

نشست‌ها چگونه کار می‌کنند

چرخه عمر نشست

┌─────────────────────────────────────────────────────────┐ │ 1. کاربر از صفحه بازدید می‌کند / اپلیکیشن اجرا می‌شود │ │ ← صفحه فعال می‌شود │ │ ← اگر اولین جلسه است: به عنوان نصب شمارش شود │ └─────────────────────────────────────────────────────────┘ ┌───────────────────────────────────────────────────────┐ │ 2. جلسه فعال است │ │ ← URL صفحه پیگیری شود │ │ ← مدت زمان جلسه اندازه‌گیری شود │ │ ← میزان تعامل پیگیری شود │ │ ← رویدادها و درآمد ارسال شود │ └───────────────────────────────────────────────────────┘ ┌─────────────────────────────────┐ │ کاربر به صفحه دیگری می‌رود یا │ │ صفحه پنهان می‌شود؟ │ └─────────────────────────────────┘ ↓ ↓ بله خیر │ │ ↓ ↓ ┌─────────────────────┐ ┌─────────────────────────┐ │ جلسه پایان می‌یابد │ │ همچنان فعال است │ │ اطلاعات جلسه ارسال شود │ │ پیگیری ادامه یابد│ │ پایان ردیابی │ └─────────────────────────┘ └─────────────────────┘ ┌───────────────────────────────────┐ │ بیش از ۳۰ دقیقه عدم فعالیت؟ │ │ بله ← جلسه جدید آغاز می‌شود │ │ خیر ← جلسه از سر گرفته می‌شود │ └───────────────────────────────────┘

مواردی که در نشست ردیابی می‌شوند

  1. بارگذاری صفحه / فوکوس

    • وقتی صفحه فعال می‌شود
    • بعد از ۳۰ دقیقه یا بیشتر عدم فعالیت
  2. وضعیت دیده‌شدن صفحه

    • وقتی صفحه hidden شود، نشست متوقف می‌شود
    • وقتی دوباره visible شود، نشست ادامه پیدا می‌کند
  3. تغییرات URL

    • هر URL بازدیدشده ثبت می‌شود
    • الگوی جابجایی کاربر بین صفحات ردیابی می‌شود
  4. مدت زمان

    • کل زمان فعال بودن روی صفحه
    • فاصله زمانی بین اقدامات
  5. عدم فعالیت

    • آستانه timeout برابر ۳۰ دقیقه
    • نشست قبلی بسته شده و نشست جدید به‌صورت خودکار آغاز می‌شود

شمارش نصب

وب‌اپ‌ها

اولین نشست کاربر به‌صورت خودکار به‌عنوان نصب ثبت می‌شود:

init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true, }, }); // اولین بازدید کاربر → نصب ثبت می‌شود // بازدیدهای بعدی → نشست‌ها ردیابی می‌شوند

PWA (Progressive Web App)

نیاز به تنظیم خاصی ندارد. کافی است ردیابی نشست را فعال کنید تا اولین نشست = نصب محسوب شود:

init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true, packageName: 'my-pwa', // Optional identifier }, });

SDK بدون نیاز به شناسه دستگاه، نصب‌ها را می‌شمارد؛ زیرا نصب PWA در سطح مرورگر انجام می‌شود.


بخش ۳: راه‌اندازی TWA (Trusted Web Activity)

نمای کلی

Trusted Web Activity به اپلیکیشن‌های اندرویدی اجازه می‌دهد محتوای وب را میزبانی کنند. برای اینکه اتریبیوشن در TWA به‌درستی انجام شود:

  1. اپلیکیشن نیتیو، Google Advertising ID را دریافت می‌کند
  2. آن را از طریق پارامتر URL به وب‌اپ منتقل می‌کند
  3. Web SDK از آن برای ردیابی اتریبیوشن استفاده می‌کند

مرحله ۱: افزودن dependency اندروید

در فایل build.gradle پروژه اندروید خود:

dependencies { implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") }

مرحله ۲: دریافت Advertising ID در اندروید

پیاده‌سازی Java

import com.google.android.gms.ads.identifier.AdvertisingIdClient; import com.google.android.gms.common.GooglePlayServicesNotAvailableException; import com.google.android.gms.common.GooglePlayServicesRepeatedException; public class LaunchActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new Thread(() -> { try { AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(this); String advertisingId = adInfo.getId(); // Launch TWA with advertising ID Intent launchIntent = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("https://yourapp.com/app?gps_adid=" + advertisingId); launchIntent.setData(uri); startActivity(launchIntent); } catch (GooglePlayServicesNotAvailableException e) { // Handle error } catch (GooglePlayServicesRepeatedException e) { // Handle error } }).start(); } }

پیاده‌سازی Kotlin

import com.google.android.gms.ads.identifier.AdvertisingIdClient import com.google.android.gms.common.GooglePlayServicesNotAvailableException import com.google.android.gms.common.GooglePlayServicesRepeatedException class LaunchActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Thread { try { val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(this) val advertisingId = adInfo.id // Launch TWA with advertising ID val uri = Uri.parse("https://yourapp.com/app?gps_adid=$advertisingId") val launchIntent = Intent(Intent.ACTION_VIEW, uri) startActivity(launchIntent) } catch (e: GooglePlayServicesNotAvailableException) { // Handle error } catch (e: GooglePlayServicesRepeatedException) { // Handle error } }.start() } }

مرحله ۳: مقداردهی اولیه Web SDK

SDK به‌صورت خودکار پارامتر gps_adid را می‌خواند:

init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true, // SDK automatically reads gps_adid }, });

فرمت URL

https://yourapp.com/app?gps_adid=DEVICE_ADVERTISING_ID

مثال:

https://yourapp.com/app?gps_adid=5e6afe60-2b3f-4b4f-8f8f-8f8f8f8f8f8f

کد نمونه

نمونه‌های کامل در GitHub:


بخش ۴: دریافت شناسه کاربر متریکس

نمای کلی

Metrix برای هر دستگاه یک شناسه کاربر یکتا تولید می‌کند. این شناسه در موارد زیر مفید است:

  • ردیابی رویداد از سرور به سرور از طریق API
  • ردیابی بین دستگاهی
  • تحلیل کاربر
  • دیباگ

دریافت شناسه کاربر متریکس

import { onMetrixUserIdReceived } from '@metrixorg/websdk'; const metrixUserId = await onMetrixUserIdReceived(); console.log('Metrix User ID:', metrixUserId);

امضای متد

onMetrixUserIdReceived(): Promise<string>

خروجی: رشته یکتای شناسه کاربر متریکس

زمان‌بندی

شناسه کاربر متریکس مدت کوتاهی پس از مقداردهی اولیه SDK تولید می‌شود. برای منتظر ماندن تا آماده شدن آن، از onMetrixUserIdReceived() استفاده کنید:

import { init, onMetrixUserIdReceived } from '@metrixorg/websdk'; // Initialize SDK init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true }, }); // Wait for ID (typically ready within 1-2 seconds) try { const metrixUserId = await onMetrixUserIdReceived(); console.log('Ready to use:', metrixUserId); } catch (error) { console.error('Failed to get Metrix user ID:', error); }

یکپارچه‌سازی Server-to-Server

از شناسه کاربر متریکس برای ردیابی رویداد در بک‌اند استفاده کنید:

// Frontend: Get the ID const metrixUserId = await onMetrixUserIdReceived(); // Send to backend fetch('/api/user/setup', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ metrixUserId }), });
# Backend: Use for server-to-server API calls import requests def send_event_to_metrix(metrix_user_id, event_name): response = requests.post( 'https://api.metrix.ir/v1/events', headers={'Authorization': 'Bearer YOUR_API_KEY'}, json={ 'userId': metrix_user_id, 'eventName': event_name, 'timestamp': datetime.utcnow().isoformat(), } ) return response.json()

ذخیره‌سازی شناسه

در بیشتر موارد نیازی نیست این شناسه را ذخیره کنید. SDK آن را به‌صورت خودکار مدیریت می‌کند. فقط اگر نیاز بک‌اند خاصی دارید، آن را ذخیره کنید:

const metrixUserId = await onMetrixUserIdReceived(); // Store in database if needed localStorage.setItem('metrix_user_id', metrixUserId); // Or send to backend analyticsAPI.setUserId(metrixUserId);

مثال کامل یکپارچه‌سازی

import { init, authorizeUser, getAttributionStatus, onMetrixUserIdReceived, newEvent, } from '@metrixorg/websdk'; // ========================================== // 1. INITIALIZE SDK // ========================================== init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true, packageName: 'my-web-app', }, }); // ========================================== // 2. GET SYSTEM IDs // ========================================== const metrixUserId = await onMetrixUserIdReceived(); console.log('System User ID:', metrixUserId); // ========================================== // 3. CHECK ATTRIBUTION // ========================================== const attribution = await getAttributionStatus(); console.log('Attribution:', attribution?.attributionStatus); console.log('Campaign:', attribution?.acquisitionCampaign); console.log('Source:', attribution?.acquisitionSource); // ========================================== // 4. AUTHORIZE USER // ========================================== authorizeUser('customer@example.com'); // ========================================== // 5. TRACK EVENTS WITH CONTEXT // ========================================== newEvent('app_opened', { attribution_status: attribution?.attributionStatus, campaign: attribution?.acquisitionCampaign, }); // ========================================== // 6. SEND TO ANALYTICS // ========================================== analytics.init({ userId: metrixUserId, customerId: 'customer@example.com', campaign: attribution?.acquisitionCampaign, }); // ========================================== // 7. MONITOR SESSION // ========================================== document.addEventListener('visibilitychange', () => { if (document.hidden) { console.log('Session paused'); } else { console.log('Session resumed'); } });

Best Practices

۱. مقداردهی اولیه را زود انجام دهید

// ✓ Good - Initialize immediately import { init } from '@metrixorg/websdk'; init('APP_ID', 'API_KEY', { ... }); // ✗ Bad - Delayed initialization setTimeout(() => init(...), 5000);

۲. منتظر آماده‌شدن شناسه‌ها بمانید

// ✓ Good - Wait for IDs to be ready const id = await onMetrixUserIdReceived(); const attribution = await getAttributionStatus(); // ✗ Bad - Use immediately without waiting console.log(metrixUserId); // May be undefined

۳. ردیابی نشست را فعال کنید

// ✓ Good - Enable to count installs init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true }, }); // ✗ Bad - Disabled, installs not tracked init('APP_ID', 'API_KEY', { sessionTracking: { enabled: false }, });

۴. خطاها را به‌درستی مدیریت کنید

// ✓ Good try { const attribution = await getAttributionStatus(); // Use attribution } catch (error) { console.error('Attribution unavailable:', error); // Graceful fallback } // ✗ Bad - Unhandled errors crash const attribution = await getAttributionStatus(); console.log(attribution.acquisitionCampaign); // Crashes if null

۵. در TWA از Query Parameter درست استفاده کنید

// ✓ Good - Proper URL format const uri = Uri.parse("https://app.com?gps_adid=" + advertisingId); // ✗ Bad - Wrong parameter name const uri = Uri.parse("https://app.com?adid=" + advertisingId);

عیب‌یابی

اطلاعات اتریبیوشن در دسترس نیست

مشکل: getAttributionStatus() مقدار null برمی‌گرداند

  • بررسی کنید: آیا SDK قبل از فراخوانی مقداردهی اولیه شده است؟
  • بررسی کنید: آیا شناسه کاربر متریکس آماده است؟ از onMetrixUserIdReceived() استفاده کنید
  • بررسی کنید: آیا اپ دارای API_KEY معتبر است؟
// Wait for ID first await onMetrixUserIdReceived(); const attribution = await getAttributionStatus();

دریافت شناسه کاربر متریکس خیلی طول می‌کشد

مشکل: onMetrixUserIdReceived() timeout می‌شود

  • راه‌حل: مدیریت timeout اضافه کنید
const idPromise = onMetrixUserIdReceived(); const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject('Timeout'), 5000)); try { const metrixUserId = await Promise.race([idPromise, timeoutPromise]); } catch { console.log('ID not available in time'); }

نشست‌ها شروع نمی‌شوند

مشکل: اولین نشست به‌عنوان نصب ثبت نمی‌شود

  • بررسی کنید: آیا sessionTracking.enabled روی true تنظیم شده است؟
  • بررسی کنید: آیا هنگام init شدن SDK، صفحه لود شده است؟
  • راه‌حل: SDK را پیش از بارگذاری کامل صفحه یا در ابتدای اجرا مقداردهی کنید
// در <head> یا ابتدای اجرای اپ قرار دهید init('APP_ID', 'API_KEY', { sessionTracking: { enabled: true }, });

Advertising ID در TWA خوانده نمی‌شود

مشکل: اپ TWA به‌درستی اتریبیوشن نمی‌گیرد

  • بررسی کنید: آیا نام پارامتر URL دقیقاً gps_adid است؟
  • بررسی کنید: آیا Advertising ID در فرمت معتبر UUID است؟
  • بررسی کنید: اگر لازم است، آیا پارامتر URL-encode شده است؟
// Correct format "https://app.com?gps_adid=5e6afe60-2b3f-4b4f-8f8f-8f8f8f8f8f8f" // Not valid "https://app.com?ad_id=5e6afe60..." // Wrong parameter name "https://app.com?gps_adid=" // Empty value

پشتیبانی

برای مشکلات مربوط به Attribution و Session Tracking:

  • شناسه در دسترس نیست؟ با onMetrixUserIdReceived() منتظر بمانید
  • Attribution مقدار null برمی‌گرداند؟ بررسی کنید شناسه کاربر متریکس آماده باشد
  • نشست‌ها ردیابی نمی‌شوند؟ مطمئن شوید sessionTracking.enabled: true تنظیم شده است
  • TWA اتریبیوشن نمی‌گیرد؟ فرمت پارامتر URL به نام gps_adid را بررسی کنید
  • نصب‌ها شمرده نمی‌شوند؟ مطمئن شوید قبل از اولین نشست، ردیابی نشست فعال شده باشد