구독 이벤트 기술 구현 가이드

문서

개요:

이 문서는 Singular SDK를 사용하여 구독 이벤트를 구현하는 방법에 대한 종합적인 가이드를 제공합니다. 다양한 플랫폼에서 인앱 구독 이벤트 추적, 서버 간(S2S) 이벤트 연동, RevenueCat 및 Adapty와 같은 타사 연동에 대해 다룹니다.

Singular를 사용하면 앱 내에서 구독과 갱신을 추적하여 사용자 행동과 구매 창출에 대한 인사이트를 얻을 수 있습니다. Singular의 구독 어트리뷰션은 구독 이벤트를 추적할 수 있는 강력한 방법을 제공하여 정확한 실시간 데이터 수집을 보장합니다.

고려 사항 SDK S2S S2S 3P 연동
구현 SDK의 사용자 정의 구매 메소드를 통해 구독 이벤트를 Singular로 전송합니다. 백엔드에서 관리되는 구독 이벤트를 필수 모바일 디바이스 속성과 함께 Singular의 REST API(직접 S2S 구현)로 전송합니다. S2S 연동은 타사 파트너가 관리하며, 해당 플랫폼에서 구성이 필요합니다.
앱 활동에 대한 의존도 구독 이벤트를 전송하려면 앱이 실행되어야 Singular SDK가 구독 이벤트를 전송할 수 있습니다. 구독 이벤트는 서버 간 실시간 전송 가능 구독 이벤트는 타사 파트너로부터 실시간으로 전송됩니다.
이벤트 타이밍 이벤트 전송은 앱 실행(및 Singular SDK의 초기화)에 의존하기 때문에 Singular로 전송된 이벤트는 실제 구독 시간과 다른 이벤트 시간을 가질 수 있습니다. 구독 이벤트는 백엔드에서 처리되므로 실시간으로 전송할 수 있습니다. 구독 이벤트는 3P 공급업체에서 처리된 후 거의 실시간으로 전송될 수 있습니다.

참고:

S2S 연동 중 하나를 통해 구독 이벤트를 전송하기로 선택한 경우에도 대부분의 고객은 여전히 세션 및 비구독 이벤트를 관리하기 위해 Singular SDK를 연동해야 합니다.

앱에서 구독 상태 관리 구현하기

Google의 Play 청구 라이브러리와 Apple의 StoreKit을 연동하면 기기에서 직접 구독 정보를 쿼리하고 구독 상태를 관리할 수 있습니다. 이 설정을 통해 Singular의 구현 방법 중 하나와 연동할 수 있습니다. 아래는 청구 라이브러리와 StoreKit의 간단한 구현을 보여주는 샘플 코드 스니펫으로 실용적인 예시입니다. 프로덕션 환경에서 앱의 코드와 구독 모델에 맞게 이러한 예제를 수정해야 합니다.

Android: Google Play 청구 라이브러리 연동

1. 프로젝트에 청구 라이브러리 추가

build.gradle에 Google Play 청구 라이브러리 구성을 추가합니다.

implementation 'com.android.billingclient:billing:6.0.1'

2. 인앱 제품 및 구독 설정하기

구글 플레이 콘솔에서 인앱 제품 및 구독 항목을 구성합니다.

3. 구독 정보 조회

BillingClient를 사용하여 앱 내에서 구매 내역 및 구독 상태를 쿼리합니다.

KotlinJava
val billingClient = BillingClient.newBuilder(context)
  .setListener(purchaseUpdateListener)
  .enablePendingPurchases()
  .build()
billingClient.startConnection(object : BillingClientStateListener {
  override fun onBillingSetupFinished(billingResult: BillingResult) {
    if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
        // The billing client is ready, you can now query subscription information asynchronously


        billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS) {result, subscriptionList ->
            if (result.responseCode == BillingClient.BillingResponseCode.OK && subscriptionList != null) {
                // Handle the retrieved subscription list


                subscriptionList.forEach { purchase ->
                    // Process each subscription purchase


                }
            } else {
                // Handle error in queryPurchasesAsync


            }
        }
    } else {
       // Handle error on setup finished


    }
  }
  override fun onBillingServiceDisconnected() {
    // Retry connection after a delay if the service gets disconnected


    Handler(Looper.getMainLooper()).postDelayed({
        billingClient.startConnection(this)
    }, 3000)
  }
})
// Remember to properly disconnect the billing client in your activity/fragment lifecycle


override fun onDestroy() {
    billingClient.endConnection()
    super.onDestroy()
}

iOS: 스토어키트 연동

1. StoreKit 구현

스토어키트 프레임워크를 iOS 앱에 연동합니다.

2. 인앱 제품 및 구독 설정하기

앱 스토어 커넥트에서 인앱 제품 및 구독 항목을 설정합니다.

3. 구독 정보 쿼리

구독 상태 및 영수증 정보를 조회하기 위해 SKPaymentQueue 및 SKReceiptRefreshRequest를 사용합니다.

Swift
import StoreKit
class YourViewController: UIViewController, SKPaymentTransactionObserver {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Add the observer for payment transactions


        SKPaymentQueue.default().add(self)
        
        // Refresh the receipt to get the latest subscription information


        refreshReceipt()
    }
    func refreshReceipt() {
        let request = SKReceiptRefreshRequest()
        request.delegate = self
        request.start()
    }
    // Implement SKPaymentTransactionObserver methods


    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .purchased, .restored:
                // Handle the purchase or restore


                // You can check the transaction.transactionReceipt for receipt information


                break
            case .failed:
                // Handle the failed transaction


                break
            case .deferred:
                // Handle the deferred transaction


                break
            case .purchasing:
                // Transaction is in progress


                break
            @unknown default:
                break
            }
        }
    }
    // Implement SKRequestDelegate method


    func requestDidFinish(_ request: SKRequest) {
        // Receipt refresh request completed


        // Now you can use the updated receipt to check subscription status


    }
    func request(_ request: SKRequest, didFailWithError error: Error) {
        // Handle the error during the receipt refresh request


    }
}

Singular SDK에서 구독 이벤트 보내기

위의 구현에서 구독 상태가 변경되면 새로운 사용자 지정 구매 이벤트가 Singular로 전송되어야 합니다. IAP 함수를 사용하지 말고 영수증 값을 Singular로 보내지 마세요. 영수증 없이 customRevenue() 이벤트를 전송하려면 앱에서 구현한 Singular SDK의 각 구현 가이드를 따르세요.

  • iOS SDK: 이 메서드를 사용하여 "구독" 이벤트 이름을 전송합니다:

    (void)customRevenue:(NSString*)eventname currency:(NSString *)currency
            amount:(double)amount withAttributes:(NSDictionary*)attributes;
  • Android SDK: 이 메서드를 사용하여 "구독" 이벤트 이름을 전송합니다:

    Singular.customRevenue(String eventName, String currency, double
            amount, Map<String, Object> attributes)
  • React Native SDK: 이 메서드를 사용하여 "구독" 이벤트 이름을 전송합니다:

    static customRevenueWithArgs(eventName: string, currency: string,
            amount: number, args: SerializableObject): void;
  • Unity SDK: 이 메서드를 사용하여 "구독" 이벤트 이름을 전송합니다:

    SingularSDK.CustomRevenue(string eventName, string currency, double
            amount, Dictionary<string, object> attributes)
  • Flutter SDK: 이 메서드를 사용하여 "구독" 이벤트 이름을 전송합니다:

    Singular.customRevenueWithAttributes(String eventName, String currency, 
            double amount, Map attributes)
  • Cordova SDK: 이 방법을 사용하여 "구독" 이벤트 이름을 전송합니다:

    SingularCordovaSdk.customRevenueWithArgs(String eventName, String currency, 
            double amount, JSONObject args)

구독 이벤트 보내기 S2S

실시간으로 구독 이벤트를 전송하고 백엔드에서 구독 이벤트를 관리하려면 Singular의 REST API로 이벤트를 전송할 수 있습니다.

이벤트 엔드포인트를 사용하여 Singular에 구독 이벤트를 전송하고, 반드시 Revenue 매개변수를 포함하세요.

  • Singular SDK를 구현한 경우:
    • 이 옵션을 사용하여 SDK에서 구독 이벤트를 보내면 안 됩니다.
    • 시작(세션) S2S 엔드포인트와 연동할 필요가 없습니다.

3P 연동을 통해 구독 이벤트 보내기

타사 서비스를 사용하여 구독을 관리하는 경우 해당 공급업체는 자체 연동 방법을 통해 구독 데이터를 캡처합니다. 그런 다음 해당 공급업체는 이미 시스템에 연동되어 있는 Singular의 REST API로 구독 이벤트를 전송합니다. 이러한 연동을 위해서는 파트너 플랫폼에서 몇 가지 구성이 필요합니다(아래 각 가이드를 참조하세요):

구독 이벤트

여러 가지 구독 이벤트를 Singular로 전송할 수 있습니다. 아래에서 해당되는 경우 Singular의 표준 이벤트 이름이 제공되지만(관련 SDK 문서 참조), 원하는 경우 사용자 지정 이벤트 이름도 사용할 수 있습니다.

구독 상태 이벤트 SDK 방법 S2S 연동
구독 sng_subscribe
  • customRevenue 이벤트 메서드(영수증 유효성 검사는 지원되지 않음)
  • 구매 매개변수가 포함된 이벤트 요청
평가판 시작 sng_start_trial
  • 이벤트 방법(구매 금액 없음)
  • 표준 이벤트 요청
평가판 종료 sng_end_trial (아직 공식적으로 표준 이벤트가 아니므로 사용자 지정 이벤트로 전송됩니다.)
  • 이벤트 방법(구매 금액 없음)
  • 표준 이벤트 요청
환불 subscription_refunded
  • custom구매이 마이너스인 구매 이벤트 방법(선택 사항)
  • 이벤트 메소드(구매 금액 없음)
  • 구매 매개변수 및 음수 금액이 포함된 이벤트 요청(선택 사항)
  • 표준 이벤트 요청
취소 구독_취소
  • 이벤트 메소드(구매 금액 없음)
  • 표준 이벤트 요청
구독 갱신 subscription_renewed
  • customRevenue 이벤트 메서드(영수증 유효성 검사는 지원되지 않음)
  • 구매 매개변수가 포함된 이벤트 요청

참고:

customRevenue 메서드를 통해 구독 이벤트를 보내도록 선택한 경우 isRestored 이 거짓인 이벤트만 보내야 합니다.

SKAN 측정에 대한 참고 사항

Singular는 위에 언급된 모든 연동 방법을 통해 구독 이벤트 데이터를 측정할 수 있습니다. SKAN 버전에 따라 SKAN 포스트백 측정 기간에 따라 이벤트 측정이 제한될 수 있다는 점에 유의하세요.

라이프사이클 이벤트를 위해 Singular SDK를 구현하고 위의 S2S 연동 방법 중 하나를 사용하여 구독 이벤트를 전송하려는 경우 CSM에 문의하여 하이브리드 SKAN을 사용하도록 설정하세요.