Message to Earn (M2E)

In-app messaging is a strategic way to drive more users to your offerwall. Messaging can be used in the context of targeting specific user cohorts or currency sales. Tapjoy’s Message to Earn product provides granular control to customize the content, targeting and frequency of your messages. Alternatively, if you prefer using your internal messaging, you can deeplink your in-app messages to offerwall. See below for more details on how to leverage both.

image_title

Best Practices

  • Message to Earn should be set up with currency sales or running any type of targeting test to maximize effectiveness of Offerwall.
  • Message to Earn should appear at the home screen/main menu to introduce users to the Offerwall.
  • Test, test, test! Run M2E for 10-20% of your traffic via an A/B test to measure the efficacy of your M2E messaging.
  • Customize your Message to Earn to mimic the look and feel of your game.

Using Message to Earn (M2E)

Message to Earn (M2E) content cards are customizable in-app “pop up” messages that provide context before directing users to an Offerwall. These messages help drive more users to your Offerwall. In addition, they can be used in conjunction with currency sales and targeting tests to maximize their effectiveness. For example, you can target first time users with 2X exchange rate with the following message, “Earn Free Gold. Get Double the golds when completing your 1st offer!”

The placements you select to add your Message to Earn content cards will determine where these messages and Offerwalls will appear to your users in gameplay. M2E placements should be set up in contextual placements instead of user-initiated placements. A contextual placement is initiated once certain conditions are met by the user in game play.

We recommend setting up M2E with the following type of placements:

  • On app open, after main app loading is completed
  • Insufficient currency pop-up / or user abandon pop-up
  • From app inbox message (if available)
  • After game level or event is completed
  • From app messaging

Learn more about how to add new placements here.

Setting up Message to Earn content cards

Placements are required for the implementation for Message to Earn. Please follow these steps to create placements if there are no placements created for your app yet.

If there are already existing placements where you would like to add Message to Earn, please proceed with the following steps.

  1. On the left navigation, select “Create Content”. Then select “Message to Earn”.
  2. Proceed to set up your content card.
  3. Under Message, you can either add your own custom image or request one created by Tapjoy’s team.
    • To add custom image
      • Select Upload Image
      • Select a transition type
      • Create a custom message text
  4. Under placement, select the placement where you would like the Message to Earn to appear to your users.
  5. Save

After going live, you may review your M2E content card in Overview. If the M2E content card is underperforming, consider setting up an A/B test to test different messages and targeting.

Advanced Setup

The following features can be used in conjunction with the M2E content cards.

Currency Sale

  • Personalize your currency sale with Message to Earn to create more awareness around the sale. Instructions on how to create can be found here. Targeting
  • Target specific segments of users with personalized messages. Common examples include:
    • Introduce first time users who have not used Offerwall
    • Encourage users that have not completed an offer in X days
    • Nudge users that have not logged into the Offerwall in X days
    • Re-engage users that are in mid-Offerwall event ie 3/7
  • Learn more about Tapjoy’s targeting tools: User-Tags, Ad Behavior Targeting, or User Cohorts. A/B Testing
  • To optimize your message to users, you can run an A/B test to validate the most effective copy with data.
    • When creating your content card, toggle on the A/B test.
    • Under A/B Test, select “Add a Variant”. For each variant, you upload different images and messages.
    • Finish creating your content card and select Save.
    • Learn more about Tapjoy's A/B Testing tool here.

Deeplinking internal messaging to Offerwall

Alternative to Message to Earn, you can leverage your internal in-game messaging to direct users to the Offerwall. Please refer to the set up instructions below.

  1. Create a contextual placement in the dashboard that will represent your internal message. We recommend naming it in relation to what the placement represents ex. Custom_Popup. For instructions on how to do this, refer here.
  2. Create Offerwall Card(s) that you want your users to be directed to from the message. In this step, please ensure to not enable Message to Earn so users will not be shown two messages, both M2E and internal. For instructions on how to do this, refer here.
  3. Implement the placement in your code.
    • To request a Placement, use the TJPlacement class. Be sure the Placement name string in your code matches the Placement name you’ve set up in the dashboard exactly from step 1.

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. Once the listener methods are in place, and the placement has been instantiated, you can request content for that placement.

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. Before you request content please ensure that the Tapjoy connect call has succeeded. Do not make a request before you have received the onConnectSuccess callback.
  2. When the content is ready, you can show it.

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();
}