selling physical goodsthrough apps & other monetization strategies (mbl306) | aws re:invent 2013
DESCRIPTION
How to make your app work as hard for you as you’ve worked on it is a common concern for most developers. In this session, learn how to implement monetization technology to help your Android app step up its game regardless of which store customers use to download your apps. This session covers a new API that helps you earn advertising fees for physical goods you sell in the context of your mobile app. The session offers code samples and best practices for bundling physical and digital goods for a seamless buying experience in your game or app. Learn how to implement more traditional monetization technology such as in-app purchasing and display ads.TRANSCRIPT
© 2013 Amazon.com, Inc. and its affiliates. All rights reserved. May not be copied, modified, or distributed in whole or in part without the express consent of Amazon.com, Inc.
Taking In-App Purchasing to the Next Level:
Selling Physical Goods Through Your App & Other
Monetization Strategies
David Isbitski, Developer Evangelist Apps and Games
November 14, 2013
Agenda
• Introducing the Mobile Associates API
– Setting up your App
– LinkService
– Shopping Service
• Mobile Ads API
• In-App Purchasing API
Introducing the Mobile Associates API
Amazon Mobile Associates
developer.amazon.com/sdk/mobile-associates.html
Offer Physical and Digital
Items for Sale
Earn up to 6% Advertising
Fees
Leverage Amazon’s Checkout
Experience
6%
Amazon Mobile Associates
Incentivize Users with Bundles • Drive further engagement by tying the purchase of physical products
to digital content in your app
• Upon purchase, you’ll get a receipt to fulfill your users’ digital content
Create an In-App Shop • Display products in a customizable in-app storefront
• Users can view and buy products from Amazon without leaving your app
• Easily populate your storefront by specifying items or using a search term
Sell One or Many Products • Create a button/link to a customizable listing of one or more products
– Purchase completed in-app for devices with Amazon Appstore
– Purchase linked to Amazon for Google Play devices
Key Benefits of Mobile Associates
• Better user experience – Learn more about a product and buy it from the app
• Incremental monetization – Complementary to IAP & Mobile Ads
– Up to 6% of sales
– Wide reach - both Amazon Appstore & Google Play
• Easy to integrate – Simple experience that can be integrated quickly
– Flexibility to create customized experiences
Amazon Mobile Associates API Features API features available through Amazon and other distribution channels
Distribution Channels
Feature Product Categories Amazon Appstore for
Android
Other Android Distribution
Channels
Direct Linking to Amazon Physical and Digital YES YES
In-App Product Detail Page Physical and Digital YES YES
In-App Product Preview Popover Physical and Digital YES YES
In-App Shopping Experience Physical Only YES NO
Digital Bundling (Available with In-App Shopping Experience)
Physical Only YES NO
Outside of direct linking to Amazon, search is available only if the app is distributed through
Amazon Appstore and only physical product results will be returned.
Agenda
• Introducing the Mobile Associates API
– Setting up your app
– LinkService
– Shopping Service
• Mobile Ads API
• In-App Purchasing API
Setting Up Your App Is Easy
• Register Developer Account
• Fill out Tax Identity
• Get Application Key
• Update AndroidManifest
• Reference Mobile Associates API external jar
• Export Mobile Associates API
• Decide on goods to sell (search, asin, etc.)
• Implement LinkService or ShoppingService
Demo – Setting up your app
Agenda
• Introducing the Mobile Associates API
– Setting up your app
– LinkService
– Shopping Service
• Mobile Ads API
• In-App Purchasing API
LinkService
Direct Linking – Amazon Product Page
Update AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET" />
Initialize the API protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AssociatesAPI.initialize(
new AssociatesAPI.Config(APPLICATION_KEY, this));
}
Link to the Amazon Home Page
openHomePageButton = (Button)findViewById(R.id.open_home_page_button);
openHomePageButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
OpenHomePageRequest request = new OpenHomePageRequest();
try {
LinkService linkService = AssociatesAPI.getLinkService();
linkService.openRetailPage(request);
} catch (NotInitializedException e) {
}
}
});
Link to an Amazon Search Page String term= ”snake arcade game"; // Search term
openSearchPageButton = (Button)findViewById(R.id.open_search_page_button);
openSearchPageButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
OpenSearchPageRequest request = new OpenSearchPageRequest(term);
try {
LinkService linkService = AssociatesAPI.getLinkService();
linkService.openRetailPage(request);
} catch (NotInitializedException e) {
}
}
});
Link to an Amazon Product Page String asin = "B00362TQZ4";
openProductPageButton = (Button)findViewById(R.id.open_prod_page_button);
openProductPageButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
OpenProductPageRequest request = new OpenProductPageRequest(asin);
try {
LinkService linkService = AssociatesAPI.getLinkService();
linkService.openRetailPage(request);
} catch (NotInitializedException e) {
}
}
});
Agenda
• Introducing the Mobile Associates API
– Setting up your app
– LinkService
– Shopping Service
• Mobile Ads API
• In-App Purchasing API
Demo – Snake Game with
LinkService
Agenda
• Introducing the Mobile Associates API
– Setting up your app
– LinkService
– ShoppingService
• Mobile Ads API
• In-App Purchasing API
ShoppingService
Shopping Service
Update AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET" />
<application>
...
<meta-data android:name="com.amazon.device.associates.ENABLE_TESTING"
android:value="true"/>
<receiver android:name="com.amazon.device.associates.ResponseReceiver">
<intent-filter>
<action android:name="com.amazon.device.iap.physical.NOTIFY »
android:permission="com.amazon.device.iap.physical.Permission.NOTIFY">
</intent-filter>
</receiver>
...
</application>
Implement the ShoppingListener public class GlobalShoppingListener implements ShoppingListener {
private static final GlobalShoppingListener instance = new
GlobalShoppingListener(); // Singleton object
public static GlobalShoppingListener getInstance() { returninstance; }
private static ShoppingListener localListener = null;
public void setLocalListener(ShoppingListener l) { localListener = l; }
}
Implement the ShoppingListener public void onServiceStatusResponse(ServiceStatusResponse response)
{ localListener.onServiceStatusResponse(response); }
public void onPurchaseResponse(PurchaseResponse response)
{ localListener.onPurchaseResponse(response); }
public void onSearchByIdResponse(SearchByIdResponse response)
{ localListener.onSearchByIdResponse(response); }
public void onSearchResponse(SearchResponse response)
{ localListener.onSearchResponse(response); }
public void onReceiptsResponse(ReceiptsResponse response)
{ localListener.onReceiptsResponse(response); }
Initialize the API protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AssociatesAPI.initialize(
new AssociatesAPI.Config(APPLICATION_KEY, this));
AmazonMAAGlobalShoppingListener globalListener =
AmazonMAAGlobalShoppingListener.getInstance();
globalListener.setLocalListener(this);
try {
AssociatesAPI.getShoppingService().setListener(globalListener);
} catch (final NotInitializedException notInitializedException) { }
} catch (final IllegalArgumentException illegalArgumentException) { }
}
Service Status public void onResume() {
super.onResume();
globalListener.setLocalListener(this);
try {
AssociatesAPI.getShoppingService().getServiceStatus();
}
catch (NotInitializedException e) { }
catch(final NoListenerException e) { }
}
Service Status – User public void onServiceStatusResponse(ServiceStatusResponse response) {
UserData userData = response.getUserData();
if (null != userData && null != userData.getUserId()) {
userID = userData.getUserId();
userMarketplace = userData.getMarketplace();
appDistributedThruAmazonAppstore = true;
}
localListener.onServiceStatusResponse(r);
}
Service Status – Purchase Experiences
public void onServiceStatusResponse(ServiceStatusResponse r) {
...
Set<PurchaseExperience> peSet = r.getSupportedPurchaseExperiences();
inAppDetailSupported =
peSet.contains(PurchaseExperience.DIRECT_WITH_DETAIL);
inAppPreviewSupported =
peSet.contains(PurchaseExperience.DIRECT_WITH_PREVIEW);
inAppShoppingSupported = peSet.contains(PurchaseExperience.IN_APP);
inAppShoppingDigitalBundleSupported = r.canGetReceipts();
searchSupported = r.canSearch();
localListener.onServiceStatusResponse(r);
}
Making a Purchase Button purchaseButton = (Button)findViewById(R.id.maaButton);
purchaseButton.setOnClickListener(new View.OnClickListener() {
public void onClick(final View view) {
if (globalListener.isInAppDetailSupported()) {
final PurchaseRequest pr = new PurchaseRequest(asin, view);
pr.setPurchaseExperience(PurchaseExperience.IN_APP);
try {
AssociatesAPI.getShoppingService().purchase(pr);
}
catch (NoListenerException e) { }
catch (NotInitializedException e) { }
}
}
});
Making a Purchase public void onPurchaseResponse(PurchaseResponse response) {
switch(response.getStatus()) {
case SUCCESSFUL: break;
case FAILED: break;
case NOT_SUPPORTED: break;
case INVALID_ID: break;
case PENDING: break;
}
localListener.onPurchaseResponse(response);
}
Demo – ShoppingService
Agenda
• Introducing the Mobile Associates API
– Setting up your app
– LinkService
– ShoppingService
• Mobile Ads API
• In-App Purchasing API
Mobile Ads API
API available for Android
running 1.6 and higher
Must be available through
Amazon first
Serves ads to U.S. customers
Amazon Mobile Ad Network
Tips for Mobile Ads
• Place Ads Visibly
• Use Auto Ad Size (default)
• Use Multiple Ad Networks for fill rate
• Refresh Ads every 30–45 seconds
Setting Up an Ad Is Easy
• Register Developer Account
• Fill out Tax Identity
• Get Application Key
• Update AndroidManifest
• Reference Ads external jar
• Export Ads API
• Implement Ad Activity and Ad Layout
• Optionally set up Ad Targets
Setting Up an Ad …
private AdLayout adView = null;
private void initializeAmazonMobileAds() {
AdRegistration.setAppKey(AMAZON_APPLICATION_KEY);
AdRegistration.enableLogging(true);
AdRegistration.enableTesting(true);
this.adView = new AdLayout(this);
this.adView.setTimeout(20000); // 20 seconds
this.adView = (AdLayout) findViewById(R.id.adview);
this.adView.setListener(new AdListener() {
…
loadAd();
private boolean loadAd() {
return this.adView.loadAd(getAdTargetingOptions());
} ...
Snake Game with Ads
Demo – Snake Game with Ads
Agenda
• Introducing the Mobile Associates API
– Setting up your app
– LinkService
– ShoppingService
• Mobile Ads API
• In-App Purchasing API
In-App Purchasing API
IAP Conversion Rate
INDEX: Average = 100%
Note: Conversion Rate is measured by the Number of IAP Customers / Total App Customers
Source: Amazon Appstore, July 2013
In-App Purchase Adoption Is Rising
Consumables Entitlements Subscriptions
What Are Customers Buying?
IAP Tips
• Number of Sessions vs. Session Length
• Build a core audience
• Design High Value Items
Implementing In-App Purchasing
Your App Amazon Appstore
Client
Purchasing
Observer
Purchasing
Manager
All IAP Activities are Performed Asynchronously
Setting Up IAP Is Easy
• Register Developer Account
• Fill out Tax Identity
• Get Application Key
• Update AndroidManifest
• Reference IAP external jar
• Export IAP API
• Set up IAP items on developer portal
• Implement ResponseReceiver and PurchaseObservers
Implementing In-App Purchasing
• Register ResponseReceiver
• Implement PurchasingObserver
• Register PurchasingObserver
• Initiate In-App Purchase
• Handle Purchase Notification
• Test Your Implementation
Implementing In-App Purchasing Test Your Implementation with SDK Tester
Snake Game with IAP
Demo – Snake Game with IAP
Agenda
• Introducing the Mobile Associates API
– Setting up your app
– LinkService
– ShoppingService
• Mobile Ads API
• In-App Purchasing API
Summary
Engagement Reports
PC / Mac Downloads
Indie Storefront
Android App Distribution
Kindle Fire
AWS
In-App Purchasing
Mobile Associates
Mobile Ads
Amazon Coins Achievements
Leaderboards
A/B/n Testing
Whispersync for Games
Login with Amazon
Amazon Device Messaging
Cross Platform
Amazon GameCircle
Direct to Account
Freemium
Paymium
Summary
• Mobile Associates is the next step in monetization
• Monetizing through In-App Purchases is about building relationships
• Freemium can be part of a successful business model
• Use Mobile Ads to monetize from your non-paying users
• Use multiple networks to get higher Ad fill rate
• Design High Value Items
Learn More
• Developer Portal: developer.amazon.com/appstore
• Blog: developer.amazon.com/blog
• Follow us: @AmazonAppDev @TheDaveDev
Please give us your feedback on this
presentation
As a thank you, we will select prize
winners daily for completed surveys!
MBL 306