Message to Earn (M2E)

인앱 메시징은 더 많은 사용자를 오퍼월로 유도하는 전략적 방법입니다. 메시징은 특정 사용자 집단이나 커런시 세일을 타겟팅하는 용도로 사용될 수 있습니다. Tapjoy의 Message to Earn 은 메시지의 내용, 타겟팅 및 빈도를 설정할 수 있도록 지원합니다. 또는 앱 내 자체적으로 사용중이신 메시징 기능을 사용하려는 경우 인앱 메시지를 통해 오퍼월로 연결하실 수 있습니다. 이를 활용하는 방법에 대한 자세한 내용은 아래를 참조하세요.

image_title

모범 사례

  • Message to Earn 은 커런시 세일 혹은 오퍼월 수익 극대화를 위한 모든 유형의 타켓팅과 함께 설정해야 합니다.
  • Message to Earn 은 사용자에게 오퍼월을 소개하기 위해 홈 화면/메인 메뉴에 노출되어야 합니다.
  • 테스트는 매우 중요합니다! A/B 테스트를 통해 트래픽의 10~20%에 대해 M2E를 실행하여 M2E 메시징의 효율성을 측정합니다.
  • 앱의 UI와 느낌을 살려 Message to Earn 의 메시지를 설정합니다.

Message to Earn (M2E) 사용하기

M2E(Message to Earn) 콘텐츠 카드는 사용자를 오퍼월로 안내하기 전 이에 대한 정보를 제공하는 사용자 정의 가능한 앱 내 "팝업" 메시지입니다. 메시지는 더 많은 사용자를 오퍼월로 유도하는 데 도움이 됩니다. 또한, 커런시 세일 및 타겟팅 테스트와 연계하여 효율성을 극대화할 수 있습니다. 예를 들어, “무료 골드를 받으세요. 첫 광고를 완료하고 골드는 두 배로 받으세요!”라는 메시지를 노출시켜 오퍼월을 최초로 사용하는 사용자를 타켓팅하여 2배의 리워드를 지급할 수 있습니다.

M2E 추가하기 위해 설정한 플레이스먼트에서 해당 메시지와 오퍼월이 사용자에게 노출됩니다. M2E가 노출되는 플레이스먼트는 사용자 상황에 맞는 플레이스먼트로 설정되어야 합니다. 앱 내 사용자가 특정 조건을 충족하면 각 상황에 맞게 플레이스먼트가 노출됩니다.

Tapjoy 에서는 아래와 같은 타입의 플레이스먼트에 M2E를 노출하길 권장합니다.

  • 앱 로딩이 완료된 후 앱 오픈 시점
  • 커런시 부족 팝업 노출 혹은 사용자가 해당 팝업을 닫았을 경우
  • 앱 내 우편함 메시지 (가능한 경우)
  • 게임 레벨 업 혹은 이벤트 완료 후
  • 앱 메시징

플레이스먼트를 추가하는 방법에 대해서는 본 문서 를 참고해 주시길 부탁드립니다.

Message to Earn 설정하기

Message to Earn 을 추가하기 위해서는 우선 플레이스먼트 설정이 필요합니다. 앱 내 플레이스먼트가 설정되어있지 않은 경우 플레이스먼트 생성 절차에 따라 플레이스먼트를 추가해야 합니다.

이미 플레이스먼트가 존재할 경우 Message to Earn을 노출할 플레이스먼트를 선택 후 아래 절차에 따라 설정합니다.

  1. 화면 좌측 “컨텐츠 등록” 버튼을 클릭하고, “Message to Earn” 을 선택합니다.
  2. 콘텐츠 카드를 설정합니다.
  3. 매사자 설정 화면에서, 여러분의 메시지를 추가할 수 있습니다.
    • 이미지 추가를 위해서는
      • 업로드 할 이미지를 선택합니다.
      • 화면 전환 방법을 선택합니다/
      • 커스텀 메시지를 추가합니다.
  4. 플레이스먼트 설정 화면에서 Message to Earn 이 노출될 플레이스먼트를 선택합니다.
  5. 저장 버튼을 클릭합니다.

라이브 배포 후 기본 지표를 통해 M2E 컨텐츠의 성과를 리뷰합니다. 만약 M2E의성과가 낮을 경우 A/B test를 통해 서로 다른 메시지와 타켓팅 테스트를 고려해 보시길 바랍니다.

고급 설정

M2E 컨텐츠 카드와 함께 다음 기능을 사용할 수 있습니다.

커런시 세일

  • 여러분의 커런시 세일을 Message to Earn을 통해 개인화여 이에 대한 인지도를 높입니다. 이에 대한 생성 방법은 본 문서를 참고 바랍니다.

타켓팅

  • 특정 세그먼트의 사용자를 대상으로 개인화된 메시지를 타켓팅 합니다. 주로 사용하는 방법으로는:
    • 오퍼월을 한번도 사용하지 않은 사용자.
    • X일 이내에 오퍼월 내 광고를 참여하지 않은 사용자.
    • X일 동안 오퍼월을 방문하지 않은 사용자 유도.
    • 오퍼월의 특정 광고의 중간 단계(예: 3/7)에 있는 사용자의 재참여를 유도.
  • Tapjoy 타켓팅에 관한 자세한 내용은 해당 문서를 참고 바랍니다: 사용자 테그, 광고 이력 타겟팅, 사용자 코호트.

A/B 테스팅

  • 사용자에 대한 메시지를 최적화하려면 A/B 테스트를 실행하여 데이터가 포함된 가장 효과적인 메시지를 검증할 수 있습니다.
    • 컨텐츠 카드 생성시 A/B test 를 선택합니다.
    • A/B Test 화면에서, “Add a Variant” 버튼을 클릭합니다. 각각의 변수에 따라 서로 다른 메시지와 이미지를 추가합니다.
    • 컨텐츠 카드 설정이 완료되면 저장 버튼을 클릭합니다.
    • Tapjoy A/B Test 에 대한 자세한 내용은 본 문서를 참고하시길 바랍니다.

자체 앱 메시지에 오퍼월 딥링크 연결

Message to Earn의 대안으로 앱 내 메시지를 활용하여 사용자를 Offerwall로 유도할 수 있습니다. 아래의 설정 지침을 참조하시기 바랍니다.

  1. 앱 내 메시지를 나타내는 플레이스먼트를 생성합니다. 예를 들어 플레이스먼트 노출 위치와 같은 연관된 이름으로 지정하는 것이 좋습니다. (예시 :커스텀_팝업) 이를 설정하는 방법은 본 문서를 참조하세요.
  2. 메시지에 노출된 사용자들에게 보여줄 오퍼월 콘텐츠 카드를 생성합니다. 이 단계에서는 Message to Earn 을 활성화 하지 않습니다. 이를 설정하는 방법은 본 문서를 참조하세요.
  3. 플레이스먼트를 앱에 연동합니다.
    • 플레이스먼트를 요청하기 위해서는 TJPlacement 클래스를 사용해야 합니다. 플레이스먼트 이름의 경우 반드시 대시보드상에 등록한 이름을 사용해 주시길 부탁드립니다.

Android

TJPlacementListener placementListener = this;
TJPlacement p = Tapjoy.getPlacement("[PLACEMENT_NAME]", placementListener);

// Listeners

public void onRequestSuccess(TJPlacement placement);
public void onRequestFailure(TJPlacement placement, TJError error);
public void onContentReady(TJPlacement placement);
public void onContentShow(TJPlacement placement);
public void onContentDismiss(TJPlacement placement);

iOS (Objective-c)

TJPlacement *p = [TJPlacement placementWithName:@"Main Menu" delegate:self];

// Callbacks

- (void)requestDidSucceed:(TJPlacement*)placement{}
- (void)requestDidFail:(TJPlacement*)placement error:(NSError*)error{}
- (void)contentIsReady:(TJPlacement*)placement{}
- (void)contentDidAppear:(TJPlacement*)placement{} 
- (void)contentDidDisappear:(TJPlacement*)placement{}

iOS (Swift)

let p = TJPlacement(name: "Main Menu", delegate: self)

// Callbacks

func requestDidSucceed(_ placement: TJPlacement!) {}
func requestDidFail(_ placement: TJPlacement!, error: Error!) {}
func contentIsReady(_ placement: TJPlacement!) {}
func contentDidAppear(_ placement: TJPlacement!) {}
func contentDidDisappear(_ placement: TJPlacement!) {}

Unity

TJPlacement p = TJPlacement.CreatePlacement("APP_LAUNCH");

TJPlacement.OnRequestSuccess += HandlePlacementRequestSuccess;
TJPlacement.OnRequestFailure += HandlePlacementRequestFailure;
TJPlacement.OnContentReady += HandlePlacementContentReady;
TJPlacement.OnContentShow += HandlePlacementContentShow;
TJPlacement.OnContentDismiss += HandlePlacementContentDismiss;

React Native

let placement = new TJPlacement("Placement Name");

placement.on(TJPlacement.REQUEST_DID_SUCCEED, (placement: TJPlacement) => { });
placement.on(TJPlacement.REQUEST_DID_FAIL, (placement: TJPlacement) => { });
placement.on(TJPlacement.CONTENT_IS_READY, (placement: TJPlacement) => { });
placement.on(TJPlacement.CONTENT_DID_APPEAR, (placement: TJPlacement) => { });
placement.on(TJPlacement.CONTENT_DID_DISAPPEAR, (placement: TJPlacement) => { });
  1. 리스너와 메소드의 준비가 완료되고 플레이스먼트 인스턴스가 설정되면 해당 플레이스먼트에 설정된 컨텐츠를 요청하실 수 있습니다.

Android

if(Tapjoy.isConnected()) {
p.requestContent();
} else {
Log.d("MyApp", "Tapjoy SDK must finish connecting before requesting content.")
}

iOS (Objective-c)

[p requestContent];

iOS (Swift)

p?.requestContent()

Unity


if (Tapjoy.IsConnected()) {
    p.requestContent();
} else {
    Debug.LogWarning("Tapjoy SDK must be connected before you can request content.");
}

React Native

placement.requestContent();
  1. 컨텐츠 요청 전 Tapjoy connect API 요청이 성공하였는지 확인합니다. onConnectSuccess 콜백을 받기 전까지는 컨텐츠를 요청하지 않습니다.
  2. 컨텐츠의 준비가 완료되면 사용자에게 컨텐츠를 노출합니다.

Android

public void onContentReady(TJPlacement tjPlacement) {
	if(tjPlacement.isContentReady()) {
	    p.showContent();
	}
}

iOS (Objective-c)

if (p.isContentReady) {
   [p showContentWithViewController: nil];
}
else {
  //handle situation where there is no content to show, or it has not yet downloaded.
}

iOS (Swift)

if (p.isContentReady) {
    p.showContent(with: nil)
} else {
  //handle situation where there is no content to show, or it has not yet downloaded.
}

Unity

if (p.IsContentReady()) {
    p.ShowContent();
} else {
    // Code to handle situation where content is not ready goes here
}

React Native

if (placement.isContentReady()) {
   placement.showContent();
}