Google AdMob

Pair TIKI with AdMob to increase the value of your ad inventory. Create a data reward program to increase revenue by boosting opt-in rates.

If you're already an AdMob customer, you know how critical ad performance is to your business's success. Good user data is vital to the value of your ad inventory. Attribution, personalization, and retargeting directly impact your bottomline.

However, it's never been more difficult to collect these signals. Users feel burned, and without a clear incentive, they're opting out.

🌴

Only 30% of mobile gamers in the US opt-in to tracking on iOS

Yet, 81% of mobile games are reliant on revenue from advertisements to maintain profitability. Oof, that's a hard business to be in. Read more →

TIKI is a zero-party data rewards platform, enabling you to create compelling incentive programs, for the legal exchange and licensing of data —in this case, to improve your AdMob revenue!

It takes less than an hour to set up, so let's dive in!

Create the Offer

First, you're going to need to decide on your incentive program, then we're going to create a couple marketing assets for the Offer.

Ultimately, it's up to you to decide what rewards you'd like to offer your users, and for them to decide if it's a fair-trade or now. Fair compensation, and explicit, signed (we handle this for you) user consent opens up a lot of new doors. But please keep in mind, you still have to play by each platform's (Apple/Google) rules and abide by relevant data privacy laws.

Offer Guidelines

You don't have to follow them, but we do have a few recommendations to help stay within the guard rails.

  • Use an incentive or reward program you already have built into your app —it's easier for your users to understand and easier for you to implement
  • Make the program optional, a compelling incentive to participate, but not mandatory. Some platforms, notably Apple, require certain permissions like tracking, to be optional. Optional programs widen the scope of what data you can collect, and what you can do with it.
  • Utilize non-exclusive rewards —for example, a new skin that users would have to purchase otherwise, bonus spins, or a discount on your premium subscription. It helps you and your users quantify the value of the exchange.

Offer Examples

Here's a couple generic example programs to get you started.

🌴

Did you know 85% of consumers are willing to trade data for discounts?

Offer Assets

1. The Reward Image —named that because it should describe the user's reward in exchange for participating in the program. Resolution of 300x86.

For example:

2. A text Description of the program —up to 3 lines, adding additional details about your program.

For example:
Enable personalized ads and get a 2X bonus multiplier every month.


3. Bullets (3x) explaining to the user how their data will or will NOT be used

For example:

  • Yes: To personalize the ads you see
  • Yes: Shared with our advertising partners
  • No: Creepy, non-advertising reasons

The last part of the Offer is the official legal terms of the deal, aka the User Data License Agreement (UDLA). The agreement becomes the official legal document under the covers that makes these types of programs possible.

If you intend to draft your own UDLA, please review our guidelines for drafting an effective agreement. Or, we have a boilerplate agreement as a template you can quickly modify for your use case.

🌴

UDLAs are digitally signed by both your business and your users. However like everything TIKI, it's programmatic and automated. This is not like docusign, where your team will be tied up for months processing millions of signatures 😅.

Add the TIKI SDK

Alright! With your new data reward program designed, use the TIKI SDK to add the offer to your app or website.

Supported Libraries:

For platform-specific example apps using TIKI + AdMob, refer to our Integrations Repository 🤖.

Configure TIKI

Configure the SDK with your new Offer details and optionally set a Theme to match your app.

init() {
  try? TikiSdk.config()
        .offer
            .ptr("PTR RECORD")
            .description("Enable personalized ads and get a 2X bonus multiplier every month.")
            .use(usecases: [.personalization])
            .bullet(text: "To personalize the ads you see", isUsed: true)
            .bullet(text: "Shared with our advertising partners", isUsed: true)
            .bullet(text: "Creepy, non-advertising reasons", isUsed: false)
            .tag(.advertisingData)
            .reward("reward")
            .terms("terms.md")
            .add()
        .initialize(publishingId: "PUBLISHING ID", id: "USER ID")
}
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  TikiSdk
    .offer
      .ptr("PTR RECORD")
      .description("Enable personalized ads and get a 2X bonus multiplier every month.")
      .use(listOf(LicenseUsecase.PERSONALIZATION))
      .bullet("To personalize the ads you see", true)
      .bullet("Shared with our advertising partners", true)
      .bullet("Creepy, non-advertising reasons", false)
      .tag(TitleTag.ADVERTISING_DATA)
      .reward(ResourcesCompat.getDrawable(resources, R.drawable.reward, null)!!)
      .terms(this,"terms.md")
      .and()
    .initialize(this, "PUBLISHING ID", "USER ID")
}
void main() async {
  await TikiSdk.config()
    .offer
        .ptr("PTR RECORD")
        .description("DEnable personalized ads and get a 2X bonus multiplier every month.")
        .use([LicenseUsecase.personalization()])
        .bullet("To personalize the ads you see", true)
        .bullet("Shared with our advertising partners", true)
        .bullet("Creepy, non-advertising reasons", false)
        .tag(TitleTag.advertisingData())
        .reward(Image.asset("lib/assets/images/reward.png"))
        .terms("lib/assets/terms.md")
        .add()
    .initialize("PUBLISHING ID", "USER ID");
} 

In addition to your Offer marketing assets, you'll need to define some key metadata.

  • PTR record —the unique identifier for the data you're licensing. The easiest is your system's internal user id (FYI, we hash all PTRs), but you may have a separate internal advertising id, if so use that.
  • Usecases —the metadata describing the use case for the license. In this case, it's "personalization" in this example, but other common ones are "attribution" and "retargeting". And yes, multiple are allowed/encouraged.
  • Tag —an optional field(s) to add metadata tags describing the data set —very helpful when querying TIKI's API's with your backed.

Next, let's call initialize. It requires just 2 parameters:

  • Publishing ID — Get one for free at console.mytiki.com by creating a Project.
  • User ID — Your internal User ID.

Done! Call TikiSdk.present() to see your hard work.

Connect AdMob

Use one or both of TIKI's event handlers (onAccept and onDecline) to initialize AdMob after the user completes the reward program flow. In this example, we'll only use the onAccept handler. However, if you're also using AdMob for delivering non-personalized ads, you'll likely want to implement a second, anonymous initialization method.

TikiSdk.config()
    .onAccept { offer, license in
        checkUMPConsent()
    }
})

func checkUMPConsent(){
  let parameters = UMPRequestParameters()
  parameters.tagForUnderAgeOfConsent = false
  UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
    with: parameters,
    completionHandler: { 
      error in
      if(UMPConsentInformation.sharedInstance.consentStatus != .required) {
        loadAd()
      }
      else{
        UMPConsentForm.load(completionHandler: { 
          form, loadError in
          if loadError != nil {
            let formStatus = UMPConsentInformation.sharedInstance.formStatus
            if formStatus == UMPFormStatus.available {
              UMPConsentForm.load(completionHandler: { 
                form, loadError in
                if loadError != nil {
                  print(error?.localizedDescription)
                }
              })
            }
          }
        })
      }
    })
}
TikiSdk.config()
  .onAccept{ offer, license -> {
    initAdMob()
  }}
)

private fun initAdMob(){
  val params = ConsentRequestParameters
    .Builder()
    .build()

  consentInformation = UserMessagingPlatform.getConsentInformation(this)
  consentInformation!!.requestConsentInfoUpdate(this, params, {
    val consent = consentInformation!!.consentStatus
    if (consentInformation!!.isConsentFormAvailable) {
      this.loadForm()
    }
  },{Log.e(tag, it.toString())})
}

private fun loadForm() {
  UserMessagingPlatform.loadConsentForm(
    this,
    { it ->
      if (consentInformation!!.consentStatus == ConsentInformation.ConsentStatus.REQUIRED) {
        it.show(this) { error ->
          if(error != null) {
            Log.e(tag, error.message)
          }
          if (
            consentInformation!!.consentStatus != ConsentInformation.ConsentStatus.OBTAINED){
          }
        }
      }
    },
    {
      Log.e(tag, it.toString())
    }
  )
}
TikiSdk.config()
  .onAccept((offer, license) => {
    _initAdMob();
});

void _initAdMob() {
  ConsentDebugSettings debugSettings = ConsentDebugSettings();
  ConsentRequestParameters params =
      ConsentRequestParameters(consentDebugSettings: debugSettings);
  ConsentInformation.instance.requestConsentInfoUpdate(params, () async {
    if (await ConsentInformation.instance.isConsentFormAvailable()) {
      _loadUmpForm();
    }
  }, (formError) => debugPrint(formError.message));
}

void _loadUmpForm() {
  ConsentForm.loadConsentForm((ConsentForm consentForm) async {
    var status = await ConsentInformation.instance.getConsentStatus();
    if (status == ConsentStatus.required) {
      consentForm.show((FormError? formError) => _loadUmpForm());
    }
  }, (formError) => debugPrint(formError.message));
}

Connect Reward Program

Connecting your reward program is a piece of cake. Just use the same onAccept event handler to call your function.

TikiSdk.config()
    .onAccept { offer, license in
        checkUMPConsent()
        // Issue the user their reward
    }
})
TikiSdk.config()
  .onAccept{ offer, license -> {
    initAdMob()
    // Issue the user their reward
  }}
)
TikiSdk.config()
  .onAccept((offer, license) => {
    _initAdMob();
    // Issue the user their reward
})

That's it. Now you can use standard AdMob functions to show personalized, high-converting ads —interstitial, native, banner, rewarded, whatever works best for your new incentive program.

For full working examples, refer to our Integrations Repository 🤖.

Happy users & a happy bottom line 🍹.



Love the integration but found the instructions hard to follow? We're here to help!

👾 Pop into our Discord

📅 Chat with Mike