ML‑driven ad unit optimization for MAX
We pick the best ad unit per user & context to maximize eCPM and ARPDAU. Plug‑in SDK. No changes to your ad request logic.
- Works with AppLovin MAX
- Android & Unity today
- iOS coming soon
Impact is app/geo dependent. We validate with a built‑in holdout.
How it works
Drop‑in SDK
Initialize Orivia after MAX and before requesting ads. Default ad unit IDs are your safe fallback.
Ad unit choice per init
Your app asks Orivia which ad unit to use. We return the best option based on context and our models.
Continuous learning
We run controlled experiments to learn what works. Roadmap includes direct floor optimization.
2‑step integration
Initialize MAX, then initialize Orivia. That's it. Load/show ads the same way you do today.
/* Initialize MAX */
val initConfig = AppLovinSdkInitializationConfiguration.builder(MAX_SDK_KEY)
.setMediationProvider(AppLovinMediationProvider.MAX)
.build()
AppLovinSdk.getInstance(context).initialize(initConfig) {
// MAX SDK initialized
}
/* Initialize Orivia (any time after MAX init, but before requesting ads) */
OriviaSdk.getInstance(context).init(
OriviaSdk.Config(
publisherId = ORIVIA_PUBLISHER_ID,
defaultBannerAdUnit = BANNER_AD_UNIT_ID,
defaultInterstitialAdUnit = INTERSTITIAL_AD_UNIT_ID,
defaultRewardedAdUnit = REWARDED_AD_UNIT_ID,
dataCollectionOnly = false // optional, false by default
),
initListener = object : OriviaSdk.InitListener {
override fun onInitCompleted() {
Log.d("OriviaSDK", "Orivia SDK initialized.")
}
override fun onInitFailed(exception: OriviaException) {
Log.e("OriviaSDK", "Orivia init failed: ${exception.reason}")
}
}
)
// Orivia is ready immediately after calling init. If no config is loaded, default IDs are used.
/* Initialize MAX */
AppLovinSdkInitializationConfiguration initConfig = AppLovinSdkInitializationConfiguration.builder(MAX_SDK_KEY)
.setMediationProvider(AppLovinMediationProvider.MAX)
.build();
AppLovinSdk.getInstance(context).initialize(initConfig, config -> {
// MAX SDK initialized
});
/* Initialize Orivia (any time after MAX init, but before requesting ads) */
OriviaSdk.getInstance(context).init(
new OriviaSdk.Config(
ORIVIA_PUBLISHER_ID,
BANNER_AD_UNIT_ID,
INTERSTITIAL_AD_UNIT_ID,
REWARDED_AD_UNIT_ID,
false // dataCollectionOnly
),
new OriviaSdk.InitListener() {
@Override
public void onInitCompleted() {
Log.d("OriviaSDK", "Orivia SDK initialized.");
}
@Override
public void onInitFailed(@NonNull OriviaException exception) {
Log.e("OriviaSDK", "Orivia init failed: " + exception.getReason());
}
}
);
// Orivia is ready immediately after calling init. If no config is loaded, default IDs are used.
// Unity
OriviaSdk.Init(
publisherId: OriviaPublisherId,
defaultBannerAdUnitId: BannerAdUnitId,
defaultInterstitialAdUnitId: InterstitialAdUnitId,
defaultRewardedAdUnitId: RewardedAdUnitId,
dataCollectionOnly: false, // optional, false by default
initListener: new SimpleInitListener() // optional
);
// ...
internal class SimpleInitListener : IInitListener
{
public void OnInitCompleted() => Debug.Log("Orivia SDK initialized.");
public void OnInitFailed(OriviaException ex) => Debug.LogError($"Orivia init failed: {ex.ErrorReason} — {ex.Message}");
}
Works with AppLovin MAX mediation. “MAX” is a trademark of AppLovin.
Why Orivia
Revenue first
We chase incremental revenue, not vanity metrics. If we don’t deliver uplift, you don’t pay.
Low‑risk rollout
Traffic splitting with a built‑in holdout makes impact measurable and reversions trivial.
Future‑proof
Built for a world of signal loss. Roadmap includes direct floor optimization once available.
Pricing
- No setup fees
- No long‑term lock‑ins
- Transparent reporting
Translation of our promise: No uplift, no fee.
Team
FAQ
What formats do you support?
Interstitial, Rewarded, and Banner on Android & Unity today. iOS support is on our roadmap.
Is this safe for production?
Yes. If no config is returned, the SDK falls back to your default ad unit IDs. Your monetization logic for loading and showing ads does not change.
How do you measure uplift?
We recommend running with a built‑in control holdout, then comparing ARPDAU across comparable traffic slices (e.g., by country and format). We share transparent reports so you can validate the gain.
Do you change floors?
Today we optimize via ad unit selection. Direct floor optimization is in development and will be available once platform support allows.
Get in touch
Interested in a pilot? Reach out and we’ll set up a quick technical check and a launch plan.