Integración de anuncios in-game
Última actualización: 2026-08-11
Integra anuncios Banner, intersticial y rewarded mediante el bridge del host de PlayNova. Tu juego corre en un iframe y se comunica con el host con postMessage — no incorpores SDK de anuncios de terceros en el paquete.
Cómo funciona la monetización
PlayNova llena anuncios en el host y comparte ingresos con creadores certificados (70 % para el creador por defecto). Los juegos solo piden show/load; el host maneja inventario, topes de frecuencia e informes de impresiones/clics.
Sobre para cada mensaje:
{ "source": "...", "type": "...", "payload": { } }- Los juegos deben setear
sourceenplaynova-game - El host responde con
sourceplaynova-host
Formatos de anuncio:
- Rewarded — opt-in del jugador (revive, doble recompensa, ítem gratis). Otorga recompensas solo después de
ads.rewarded_completed. - Intersticial — pausas naturales (nivel completado / game over). Nunca durante la jugada.
- Banner — franja del host; el juego solo pide show/hide.
Ubicaciones recomendadas
Siempre pasa un string placement estable para analíticas y topes. Prefiere los nombres de plataforma de abajo:
| Placement | Caso de uso |
|---|---|
revive | Continuar después de fallar |
double_reward | Bonus al final del nivel |
free_item / unlock | Consumible o desbloqueo de contenido |
level_complete / level_start / game_over / pause | Momentos intersticiales |
banner_bottom / banner_top | Espacios Banner |
Flujo de integración
- En una pausa natural, llama
ads.load_*conplacement(yrequestIdopcional). - Espera
ads.*_loaded(o maneja*_failedy sigue sin anuncios). - Llama
ads.show_*con el mismorequestId/placement. - En rewarded, cambia el estado del juego solo en
ads.rewarded_completed. En dismissed/failed, no otorgues la recompensa.
Tipos de mensajes bridge
Los strings type canónicos están definidos en playnova-web (ads-bridge). Alinea tu paquete de juego con estos valores exactos.
Juego → host
| type | Propósito |
|---|---|
ads.load_rewarded | Precargar inventario rewarded |
ads.show_rewarded | Mostrar rewarded (otorgar solo después de completar) |
ads.load_interstitial | Precargar intersticial |
ads.show_interstitial | Mostrar intersticial en pausa |
ads.show_banner | Pedir Banner del host visible |
ads.hide_banner | Ocultar Banner del host |
ads.preload | Precargar varios formatos |
ads.get_banner_height | Consultar altura del Banner para layout |
Host → juego
| type | Propósito |
|---|---|
ads.rewarded_loaded | Rewarded listo para mostrar |
ads.rewarded_failed | Fallo load/show rewarded |
ads.rewarded_completed | Rewarded completado — seguro otorgar |
ads.rewarded_dismissed | Rewarded cerrado antes — no otorgar |
ads.interstitial_loaded | Intersticial listo |
ads.interstitial_failed | Intersticial falló |
ads.interstitial_closed | Intersticial cerrado |
ads.banner_shown | Banner visible |
ads.banner_hidden | Banner oculto |
ads.banner_failed | Banner falló |
Helper copiar y pegar
Pégalo en tu index.html (o módulo). Reemplaza el otorgamiento de recompensa con tu lógica de juego.
function pnAds(type, payload) {
parent.postMessage({ source: 'playnova-game', type, payload }, '*');
}
function onPnHost(handler) {
window.addEventListener('message', (e) => {
const d = e.data;
if (!d || d.source !== 'playnova-host') return;
handler(d);
});
}
// Ejemplo: flujo revive
pnAds('ads.load_rewarded', { placement: 'revive' });
onPnHost((msg) => {
if (msg.type === 'ads.rewarded_loaded') {
pnAds('ads.show_rewarded', {
requestId: msg.payload && msg.payload.requestId,
placement: 'revive',
reward: { type: 'life', amount: 1 },
});
}
if (msg.type === 'ads.rewarded_completed') {
// otorgar recompensa SOLO aquí
}
});Reglas de producción
- No auto-clic, loops forzados ni tapar controles Close / Skip.
- No otorgues recompensas sin
ads.rewarded_completedpara eserequestId. - Respeta fallos del host: inventario vacío, sigue el juego normal.
- Prefiere load antes de show para menos espera al activar.
- Paquetes sin SDK de anuncios de terceros, trackers ni scripts pop-under.
- La frecuencia intersticial la impone el host; spam de show puede ignorarse.
FAQ
¿Puedo usar AdMob / Unity Ads dentro del zip?
No. PlayNova agrega demanda en el host. Meter otros SDK falla la revisión y rompe supuestos del sandbox iframe.
¿Qué pasa si el host no responde?
Trata silencio o *_failed como no-fill. Sigue el juego sin bloquear al jugador con un spinner infinito.
¿Dónde veo los ingresos?
Después de publicar anuncios en producción, impresiones e ingresos van a analíticas de creador. Liquidación según términos del programa.
El bridge del host está activo en la página de juego. Los tipos de mensaje de arriba son el contrato de producción — impleméntalos ya.
