راهنمای اتریبیوشن (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 بهصورت خودکار:
- ۱۰ ثانیه صبر میکند
- دوباره درخواست را ارسال میکند
- این روند را تا زمان دریافت وضعیت نهایی تکرار میکند
این مکانیزم باعث میشود در نهایت اطلاعات کامل اتریبیوشن را دریافت کنید.
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)
}| فیلد | نوع | الزامی | توضیح | پیشفرض |
|---|---|---|---|---|
enabled | boolean | ✓ | فعالسازی ردیابی نشست | ندارد |
packageName | string | شناسه سفارشی اپ | ندارد |
نشستها چگونه کار میکنند
چرخه عمر نشست
┌─────────────────────────────────────────────────────────┐
│ 1. کاربر از صفحه بازدید میکند / اپلیکیشن اجرا میشود │
│ ← صفحه فعال میشود │
│ ← اگر اولین جلسه است: به عنوان نصب شمارش شود │
└─────────────────────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────┐
│ 2. جلسه فعال است │
│ ← URL صفحه پیگیری شود │
│ ← مدت زمان جلسه اندازهگیری شود │
│ ← میزان تعامل پیگیری شود │
│ ← رویدادها و درآمد ارسال شود │
└───────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────┐
│ کاربر به صفحه دیگری میرود یا │
│ صفحه پنهان میشود؟ │
└─────────────────────────────────┘
↓ ↓
بله خیر
│ │
↓ ↓
┌─────────────────────┐ ┌─────────────────────────┐
│ جلسه پایان مییابد │ │ همچنان فعال است │
│ اطلاعات جلسه ارسال شود │ │ پیگیری ادامه یابد│
│ پایان ردیابی │ └─────────────────────────┘
└─────────────────────┘
↓
┌───────────────────────────────────┐
│ بیش از ۳۰ دقیقه عدم فعالیت؟ │
│ بله ← جلسه جدید آغاز میشود │
│ خیر ← جلسه از سر گرفته میشود │
└───────────────────────────────────┘مواردی که در نشست ردیابی میشوند
-
بارگذاری صفحه / فوکوس
- وقتی صفحه فعال میشود
- بعد از ۳۰ دقیقه یا بیشتر عدم فعالیت
-
وضعیت دیدهشدن صفحه
- وقتی صفحه hidden شود، نشست متوقف میشود
- وقتی دوباره visible شود، نشست ادامه پیدا میکند
-
تغییرات URL
- هر URL بازدیدشده ثبت میشود
- الگوی جابجایی کاربر بین صفحات ردیابی میشود
-
مدت زمان
- کل زمان فعال بودن روی صفحه
- فاصله زمانی بین اقدامات
-
عدم فعالیت
- آستانه 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 بهدرستی انجام شود:
- اپلیکیشن نیتیو، Google Advertising ID را دریافت میکند
- آن را از طریق پارامتر URL به وباپ منتقل میکند
- 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را بررسی کنید - نصبها شمرده نمیشوند؟ مطمئن شوید قبل از اولین نشست، ردیابی نشست فعال شده باشد