Flutter SDK - 인앱 이벤트 추적

인앱 이벤트 추적

인앱 이벤트를 추적하여 캠페인 성과를 분석하고 사용자 로그인, 가입, 튜토리얼 완료, 진행 마일스톤과 같은 핵심 성과 지표(KPI)를 측정하세요.

표준 이벤트 및 속성

이벤트 유형 이해하기

Singular은 범용 추적 요구사항과 앱별 추적 요구사항을 모두 지원하기 위해 두 가지 유형의 이벤트를 제공합니다.

  • 표준 이벤트: Singular이 인식하고 광고 네트워크가 리포팅 및 최적화를 위해 지원하는 사전 정의된 이벤트(예: sngLogin , sngContentView )입니다. 표준 이벤트를 사용하면 Singular이 수동 정의 없이 자동으로 이벤트 목록에 추가하므로 설정이 간소화됩니다. 전체 이벤트 이름과 권장 속성은 표준 이벤트 및 속성 목록 을 참조하세요.
  • 커스텀 이벤트: Singular의 표준 이벤트와 일치하지 않는, 앱 고유의 이벤트(예: Signup , AchievementUnlocked )입니다.

권장 사항: 광고 네트워크와의 호환성과 Singular 이벤트 목록에서의 자동 인식을 위해 가능하면 항상 표준 이벤트를 사용하세요.

UA, 마케팅 또는 비즈니스 팀이 조직의 마케팅 KPI를 기반으로 이벤트 목록을 작성해야 합니다. 계획 수립 시 인앱 이벤트 추적 방법: Singular 어트리뷰션 고객을 위한 가이드 를 참조하세요.


커스텀 이벤트 제한 사항

커스텀 이벤트에는 서드파티 파트너 및 분석 솔루션과의 호환성을 보장하기 위한 특정 문자 및 인코딩 제약이 있습니다.

커스텀 이벤트 제한 사항:

  • 언어: 서드파티 파트너 및 분석 솔루션과의 호환성을 보장하려면 이벤트 이름과 속성을 영어로 전달하세요
  • 이벤트 이름: ASCII 32자로 제한됩니다. 비 ASCII 문자열은 UTF-8로 변환 시 32바이트 미만이어야 합니다
  • 속성 및 값: ASCII 500자로 제한됩니다

이벤트 전송

Event 메서드

추가 속성 없이 간단한 이벤트를 추적하려면 event() 메서드를 사용하세요.

Dart
import 'package:singular_flutter_sdk/singular.dart';

// Track a simple custom event
Singular.event('SignUp');

// Track a standard event
Singular.event('sngLogin');

메서드 시그니처:

static void event(String eventName)

전체 메서드 목록은 event 메서드 레퍼런스 를 참조하세요.


EventWithArgs 메서드

추가 커스텀 속성과 함께 이벤트를 추적하여 더 풍부한 컨텍스트를 제공하고 리포트에서 세부적인 세그먼테이션을 활성화하세요.

Dart
import 'package:singular_flutter_sdk/singular.dart';

// Track custom event with attributes
Singular.eventWithArgs('LevelComplete', {
  'level': 5,
  'score': 1250,
  'time_spent': 45.3
});

// Track standard event with recommended attributes
Singular.eventWithArgs('sngTutorialComplete', {
  'sngAttrContent': 'Flutter Basics',
  'sngAttrContentId': '32',
  'sngAttrContentType': 'video',
  'sngAttrSuccess': 'yes'
});

메서드 시그니처:

static void eventWithArgs(String eventName, Map args)

전체 메서드 목록은 eventWithArgs 메서드 레퍼런스 를 참조하세요.


모범 사례

  • 표준 이벤트 사용: 광고 네트워크와의 호환성과 Singular 이벤트 목록에서의 자동 인식을 위해 표준 이벤트를 우선 사용하세요
  • 속성 검증: 전송하기 전에 속성이 예상 형식과 문자 수 제한에 부합하는지 확인하세요
  • 이벤트 디버깅: 개발 중 SDK 로깅을 활성화하여 이벤트가 올바르게 전송되고 적절한 시점에 트리거되는지 확인하세요
  • 팀과의 협업: 추적하는 이벤트가 앱의 KPI와 부합하도록 UA/마케팅 팀과 협력하세요
  • 프로덕션 전 테스트: 개발 환경에서 이벤트를 테스트하여 Singular 대시보드의 데이터 정확성을 검증하세요

인앱 수익 추적

인앱 구매(IAP), 구독, 커스텀 수익원의 수익을 추적하여 캠페인 성과와 광고 비용 대비 수익(ROAS)을 측정하세요.

수익 데이터는 세 가지 채널을 통해 흐릅니다:

  • 인터랙티브 리포트: Singular 대시보드에서 수익 지표를 확인합니다
  • 익스포트 로그: 커스텀 분석을 위한 상세 ETL 데이터에 액세스합니다
  • 실시간 포스트백: 수익 이벤트를 외부 플랫폼으로 전송합니다

수익 이벤트를 추적해야 하는 이유

  • 풍부한 분석: 상세한 거래 데이터를 수집하여 Singular 리포트를 강화합니다
  • 어뷰징 방지: 거래 영수증(예: Google Play 또는 Apple App Store)을 포함하여 구매를 검증하고 인앱 어뷰징에 대응합니다
  • 캠페인 최적화: 수익을 마케팅 활동에 연결하여 ROI를 측정합니다

모범 사례: 전체 구매 객체 전달하기

Android(Google Play Billing) 또는 iOS(StoreKit)의 인앱 구매(IAP) 프로세스에서 반환된 구매 객체를 전달할 것을 강력히 권장합니다. 이를 통해 Singular은 다음을 포함한 포괄적인 거래 세부 정보를 수신합니다:

  • Product ID
  • 가격
  • 통화
  • Transaction ID
  • 영수증 데이터(검증용)

전체 구매 객체를 전달하면 특히 Google Play 거래에 대해 더 풍부한 리포팅을 활성화하고 Singular의 어뷰징 탐지 기능을 활용할 수 있습니다.


인앱 구매 연동

IAP 구매 객체 캡처하기

Flutter in_app_purchase 패키지를 사용하여 완전한 거래 세부 정보가 포함된 구매 객체를 가져오세요.

  • Flutter: iOS StoreKit과 Android Google Play Billing의 구매 세부 정보에 모두 액세스하려면 in_app_purchase 패키지를 사용하세요

InAppPurchase 메서드

수익 검증 및 어뷰징 방지를 위해 구매 세부 정보와 함께 인앱 구매 이벤트를 추적하세요.

메서드 시그니처:

static void inAppPurchase(String eventName, SingularIAP purchase)
static void inAppPurchaseWithAttributes(String eventName, SingularIAP purchase, Map attributes)

전체 메서드 목록은 inAppPurchase 메서드 레퍼런스 를 참조하세요.


완전한 IAP 구현 예시

IAP 이벤트를 캡처하고 플랫폼별 구매 객체와 함께 Singular으로 전송하는 완전한 구매 리스너를 구현하세요.

Dart
import 'dart:io' show Platform;
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:in_app_purchase_android/in_app_purchase_android.dart';
import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart';
import 'package:singular_flutter_sdk/singular.dart';
import 'package:singular_flutter_sdk/singular_iap.dart';

Future<void> handlePurchase(PurchaseDetails purchaseDetails) async {
  if (purchaseDetails.status != PurchaseStatus.purchased &&
      purchaseDetails.status != PurchaseStatus.restored) {
    return;
  }

  final response = await InAppPurchase.instance
      .queryProductDetails({purchaseDetails.productID});
  if (response.productDetails.isEmpty) {
    return;
  }
  final product = response.productDetails.first;

  // Extract price and currency with platform-specific handling
  double price = 0.0;
  String currency = 'USD';

  if (Platform.isAndroid && product is GooglePlayProductDetails) {
    final offer = product.productDetails.oneTimePurchaseOfferDetails;
    price = (offer?.priceAmountMicros ?? 0) / 1000000;
    currency = offer?.priceCurrencyCode ?? 'USD';
  } else if (Platform.isIOS && product is AppStoreProductDetails) {
    price = product.skProduct.price;
    currency = product.skProduct.priceLocale.currencyCode ?? 'USD';
  }

  SingularIAP? singularPurchase;

  if (Platform.isAndroid && purchaseDetails is GooglePlayPurchaseDetails) {
    singularPurchase = SingularAndroidIAP(
      price,
      currency,
      purchaseDetails.billingClientPurchase.signature,
      purchaseDetails.billingClientPurchase.originalJson,
    );
  } else if (Platform.isIOS && purchaseDetails is AppStorePurchaseDetails) {
    singularPurchase = SingularIOSIAP(
      price,
      currency,
      purchaseDetails.productID,
      purchaseDetails.skPaymentTransaction.transactionIdentifier ?? '',
      purchaseDetails.verificationData.serverVerificationData,
    );
  } else {
    return;
  }

  const String eventName = 'iap_purchase';

  // Track with attributes (use only ONE tracking method)
  Singular.inAppPurchaseWithAttributes(eventName, singularPurchase, {
    'user_level': 42,
    'is_first_purchase': true,
    'gems_balance': 1500
  });

  await InAppPurchase.instance.completePurchase(purchaseDetails);
}

수동 수익 추적

구매 검증 없는 수익 추적

Purchase 객체 없이 통화, 금액, 선택적 제품 세부 정보를 전달하여 수익을 추적하세요. 이 메서드는 검증을 위한 거래 영수증을 제공하지 않는다는 점에 유의하세요.

중요: 유효한 구매 객체 없이 수익 이벤트를 전송하면 Singular은 거래를 검증하지 않습니다. 가능하면 항상 위에서 설명한 inAppPurchase() 메서드를 사용할 것을 강력히 권장합니다.

참고: 통화는 세 자리 ISO 4217 통화 코드로 전달하세요. 예: USD , EUR , INR .


CustomRevenue 메서드

지정된 이벤트 이름, 통화, 금액으로 커스텀 수익 이벤트를 추적하세요.

Dart
import 'package:singular_flutter_sdk/singular.dart';

// Track custom revenue event
Singular.customRevenue('PremiumUpgrade', 'USD', 9.99);

메서드 시그니처:

static void customRevenue(String eventName, String currency, double amount)

전체 메서드 목록은 customRevenue 메서드 레퍼런스 를 참조하세요.


CustomRevenueWithAttributes 메서드

지정된 이벤트 이름, 통화, 금액, 추가 커스텀 속성으로 커스텀 수익 이벤트를 추적하세요.

Dart
import 'package:singular_flutter_sdk/singular.dart';

// Track custom revenue event with attributes
Singular.customRevenueWithAttributes('PremiumBundlePurchase', 'USD', 99.99, {
  'productSKU': 'premium_bundle_xyz',
  'productName': 'Premium Bundle',
  'productCategory': 'Bundles',
  'productQuantity': 1,
  'discount_applied': true
});

메서드 시그니처:

static void customRevenueWithAttributes(
  String eventName,
  String currency,
  double amount,
  Map attributes
)

전체 메서드 목록은 customRevenueWithAttributes 메서드 레퍼런스 를 참조하세요.


CustomRevenueWithAllAttributes 메서드

제품 SKU, 이름, 카테고리, 수량, 커스텀 속성을 포함한 가능한 모든 속성으로 커스텀 수익 이벤트를 추적하세요.

Dart
import 'package:singular_flutter_sdk/singular.dart';

// Track custom revenue with all attributes
Singular.customRevenueWithAllAttributes(
  'CoinPackagePurchase',
  'USD',
  4.99,
  'coin_package_abc123',
  'Coin Pack 10',
  'Virtual Currency',
  2,
  {
    'payment_method': 'google_play',
    'transaction_id': 'T12345'
  }
);

메서드 시그니처:

static void customRevenueWithAllAttributes(
  String eventName,
  String currency,
  double amount,
  String productSKU,
  String productName,
  String productCategory,
  int productQuantity,
  Map attributes
)

전체 메서드 목록은 customRevenueWithAllAttributes 메서드 레퍼런스 를 참조하세요.


구독 수익

구독 추적하기

Singular은 Singular SDK를 사용하여 구독 이벤트를 구현하는 방법에 대한 포괄적인 가이드를 제공합니다. 이 가이드는 다양한 플랫폼에 걸친 인앱 구독 이벤트 추적을 다룹니다.


하이브리드 이벤트 추적(고급)

CDP 및 서드파티 연동 비호환성: SDID는 CDP(Segment, mParticle) 또는 서드파티 구독 제공업체(RevenueCat, Adapty)와 호환되지 않습니다. SDID가 활성화된 경우 이러한 플랫폼을 이벤트 전달에 병행하여 사용할 수 없으며, 이는 어트리뷰션이 불완전하거나 손상되는 결과로 이어집니다.

Singular은 최적의 어트리뷰션을 위해 앱에 연동된 Singular SDK를 통해 모든 이벤트와 수익을 전송할 것을 권장합니다. 다만 필요한 경우 Singular은 다른 소스에서 이벤트를 수집할 수 있습니다.

Singular SDK 외부에서 전송되는 이벤트는 Singular의 Server-to-Server Event 문서 요구사항 을 준수해야 하며, 올바른 어트리뷰션을 위해 일치하는 디바이스 식별자를 제공해야 합니다.

중요:

Server-to-Server 이벤트 요청에 사용된 디바이스 식별자가 Singular의 디바이스 식별자와 일치하지 않으면 불일치가 발생합니다. 다음 가능성에 유의하세요:

  • 조기 이벤트: Singular SDK가 App Session에서 디바이스 식별자를 기록하기 전에 이벤트 요청이 수신되면, 해당 이벤트 요청은 알 수 없는 디바이스의 "첫 세션"으로 간주되어 Singular은 해당 디바이스를 오가닉 어트리뷰션 으로 어트리뷰션합니다
  • 불일치 식별자: Singular SDK가 디바이스 식별자를 기록했지만 Server-to-Server Event 요청에 지정된 디바이스 식별자와 다른 경우, 해당 이벤트는 잘못 어트리뷰션됩니다

하이브리드 이벤트 추적 가이드

내부 서버에서 이벤트 전송하기

내부 서버에서 수익 데이터를 수집하여 캠페인 성과와 ROI를 분석하세요.

요구사항:

  • 디바이스 식별자 캡처: 인앱 가입 또는 로그인 이벤트에서 디바이스 식별자를 캡처하여 전달하고, 이 데이터를 User ID와 함께 서버에 저장하세요. 디바이스 식별자는 사용자에 대해 변경될 수 있으므로, 사용자가 앱 세션을 생성할 때 식별자를 업데이트하세요. 이렇게 하면 서버 측 이벤트가 올바른 디바이스에 어트리뷰션되도록 보장됩니다
  • 플랫폼별 식별자: 서버 측 이벤트는 플랫폼별로 다르며, 디바이스 플랫폼과 일치하는 디바이스 식별자로만 전송해야 합니다(예: iOS 디바이스는 IDFA 또는 IDFV, Android 디바이스는 GAID)
  • 실시간 업데이트: Singular Internal BI 포스트백 메커니즘을 사용하여 이벤트를 실시간으로 내부 엔드포인트에 푸시하면 서버 측 데이터 세트를 업데이트할 수 있습니다. Internal BI Postback FAQ 를 참조하세요
  • 구현 세부 정보: 자세한 내용은 Server-to-Server Integration 가이드의 수익 추적 섹션을 검토하세요

수익 제공업체에서 이벤트 전송하기

RevenueCat 또는 adapty와 같은 서드파티 수익 제공업체를 연동하여 구매 및 구독 수익을 Singular으로 전송하세요.

지원되는 제공업체:


Segment에서 이벤트 전송하기

Segment에서 "Cloud-Mode" 데스티네이션을 추가하여 Singular SDK와 병행하여 Segment가 Singular으로 이벤트를 전송하도록 설정하세요.

자세한 설정 방법은 구현 가이드 Singular-Segment 연동 을 참조하세요.