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
Performance pricing: No uplift, no fee.
Typical uplift (illustrative)
eCPM
ARPDAU
0
Engineering rework

Impact is app/geo dependent. We validate with a built‑in holdout.

How it works

1

Drop‑in SDK

Initialize Orivia after MAX and before requesting ads. Default ad unit IDs are your safe fallback.

2

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.

3

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

Performance
Pay from uplift only
  • No setup fees
  • No long‑term lock‑ins
  • Transparent reporting
Start a pilot

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.