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.
What we do
Orivia is a startup aimed at helping publishers earn more revenue from their ad monetization.
Dynamic adUnit selection
Orivia analyzes user behavior and market demand, dynamically choosing the most effective adUnit for every ad impression to maximize revenue.
User‑level optimization
We don't apply a one‑size‑fits‑all approach. Our system tailors optimization individually, increasing the value of high‑potential users.
Expected results
With Orivia, we're confident of a +5–10% ARPDAU uplift. Currently, we are running a test phase with a client and seeing these results on almost 50k DAU.
Why this is better than manual optimization
- Real‑time, fully dynamic decisions.
- No need to run manual tests.
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.
Why Orivia Outperforms Alternatives
Comprehensive competitive analysis for gaming monetization
Capability |
Manual Optimization
A/B testing approach
|
Generic ML Platforms
Non-gaming focused
|
Orivia
Gaming-native solution
|
---|---|---|---|
Implementation Speed | 2–3 weeks per test |
1–2 weeks setup |
2 days integration |
Gaming Expertise | Generic approach |
No gaming focus |
Gaming‑native algorithms |
User‑Level Optimization | Segment‑based only |
Limited personalization |
Individual user optimization |
Retention Protection | Manual monitoring |
No UX consideration |
Built‑in safeguards |
Real‑Time Adaptation | Static until next test |
Periodic updates |
Continuous optimization |
Resource Requirements | High engineering overhead |
Moderate setup effort |
Minimal maintenance |
Pricing
- No setup fees
- No long‑term lock‑ins
- Transparent reporting
Translation of our promise: No uplift, no fee.
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.