You just played a Bonus Round.
That round paid the game’s developer. Make three.js games? Monetize yours with one line of code.
<script async src="https://bonusround.io/v1/br.js" data-pub="pub_XXXXXXXX"></script>
BonusRound.attach({ THREE, scene, camera, renderer }); await BonusRound.break('intermission');
$ npx bonusround initRun it in your game’s folder. It finds your three.js renderer, shows you the diff, then makes the edits. Works without an account.
› integrate bonusround.ioPaste it into Claude Code, Cursor or Codex. Your agent reads integrate.md and does the rest.
- New games start in test mode: a free test round plays right away
of net ad revenue goes to you.
to join. No minimum traffic.
Earnings clear after 30 days.
minimum to cash out, through Stripe.
Monetize your three.js game with one line of code.
Add one line of code and you’re in. Attach it to your renderer and mark your natural breaks for full rounds. Brands pay for a 15-second Bonus Round that players actually play inside your game. You keep 70% of net ad revenue.
One line to start. Two more for full rounds.
One line of code is all you need to start. attach() and break() are the optional upgrade: they connect it to your scene and tell it when your game takes a breather, for full 15-second intermission rounds. We sell the slot, make the ad for your game, check it was seen, and pay you.
break() at natural breaks: round over, level complete, respawn.<!-- 1. One line of code --> <script async src="https://bonusround.io/v1/br.js" data-pub="pub_XXXXXXXX"></script> // 2. Optional, for full rounds: after your renderer exists BonusRound.attach({ THREE, scene, camera, renderer }); // 3. Optional: at a natural break await BonusRound.break('intermission');
npx bonusround init # shows a diff, asks before writing
Ads that players actually play.
A 5-second heads-up, then a 15-second branded round in your game, labelled “Ad”. Then everyone goes straight back in. These are real rounds in our own three.js games.
- Rooftop RumbleAfter a goal.The countdown runs over the replay.
BonusRound.break('intermission') - Sky HopperLevel complete.A 15-second round, then the next level.
BonusRound.break('intermission') - Turbo TidesIn-worldDrive past the pier.The pier becomes the ad. The race keeps going.
BonusRound.zone('pier') - Sky HopperOpt-inA second chance.Players choose a round to respawn. It pays the most.
BonusRound.rewarded({ onReward })
You keep 70%.
Of net ad revenue: what brands spend in your game, minus any disclosed agency commission. See pricing.
of net ad revenue goes to you, the developer.
to join. No minimum traffic, no setup fee.
Each earning clears 30 days after you earn it.
minimum to cash out, through Stripe.
three.js ads, answered.
How do I add ads to a three.js game?
Add one line of code to your page’s <head>. For full intermission rounds, also add BonusRound.attach({ THREE, scene, camera, renderer }) after your renderer exists, and await BonusRound.break('intermission') at natural breaks. npx bonusround init makes the install and attach edits for you; you place break() yourself. Step-by-step guide.
Does it work with React Three Fiber?
Yes. useThree() gives you scene, camera and gl (the WebGLRenderer). Add a small component inside your <Canvas> that attaches the SDK, and call break() from your game state. See Install → React Three Fiber.
Do ads slow down my game?
The loader is a small async script and the rest of the SDK is imported only when it’s needed. Round models are budgeted (about 10k triangles for a hero, 3k for a collectible) with 1K textures, and nothing loads until there’s an ad to show.
How much do I earn?
You keep 70% of net ad revenue: what brands spend in your game, minus any disclosed agency commission. Earnings clear after 30 days (net-30), and you can cash out through Stripe once you have $50. See Payouts.
My game is also on Poki or CrazyGames. Is that a problem?
No. Keep the same build. Those portals don’t allow third-party ads, so the SDK detects them and switches itself off there: no ad requests, and break() resolves right away. See portal mode.
Can I try it before going live?
Yes. New games start in test mode, so your next break() plays a free test round right away. Test plays are never billed and never paid.
Your next ad break could be the best part of the game.
Free for developers. Monetize your three.js game with one line of code and keep 70% of net ad revenue.