Disclosure: this post contains affiliate links. If you sign up through them, I may earn a commission at no extra cost to you.
Short version: Monetag shows you two different numbers, and only one of them works in the SDK. The list of your Telegram Mini Apps shows an App ID. The SDK needs the Zone ID, which is a different, longer number buried inside the integration snippet.
I shipped four games with the App ID in place of the Zone ID. Everything looked wired up. Ads served zero. No error, no warning — just nothing.
I build small idle and merge games as Telegram Mini Apps — five of them are live right now — and rewarded ads are the primary revenue, not in-app purchases. So the ad integration isn't a nice-to-have; if it silently fails, the game earns nothing while looking completely healthy.
Monetag's dashboard gives you two numbers per mini app, and nothing on screen tells you which one the code wants:
| App ID | Zone ID | |
|---|---|---|
| Where you see it | The Telegram Mini Apps list — it's the name tag for the app | Inside the integration snippet, as show_XXXXXXXX() |
| Shape (mine) | 7 digits, 34xxxxx | 8 digits, 115xxxxx |
| Used by the SDK | No | Yes |
| Symptom if you use it | Zero impressions, no console error | Ads serve |
(IDs masked — publishing real zone IDs is asking for junk traffic against your account.)
The reason it's so easy to get wrong: the App ID is the number that's visible. It's on the list page, next to your app's name, exactly where you'd look for "the ID of this app". The Zone ID only appears once you expand a specific ad format.
Four live games — my merge, idle, daily-puzzle and shop titles — all had the App ID in the config. All four served zero ads. There is no error state for this: the SDK loads fine, the function call just isn't there. I fixed all four in one sitting once I understood the difference, and left a comment on the config line in every project so I can't repeat it.
show_XXXXXXXX() is the Zone ID. That's the one your code needs.Second thing that confused me: there's an Activate control, and it reads like an on/off toggle you must flip before ads work. It isn't. It just reveals the integration code. Embedding the snippet is the activation — there's no extra step on Monetag's side to wait for.
Monetag injects a global function named after your zone id. That's the part that makes the wrong ID fail silently — window['show_' + wrongId] is simply undefined, and if you don't guard for it you get nothing at all:
const MONETAG_ZONE = "115xxxxx"; // ← Zone ID, NOT the App ID const s = document.createElement('script'); s.src = 'https://libtl.com/sdk.js'; s.setAttribute('data-zone', MONETAG_ZONE); s.setAttribute('data-sdk', 'show_' + MONETAG_ZONE); document.head.appendChild(s); // later, on the player's opt-in tap: const fn = window['show_' + MONETAG_ZONE]; // named after the zone id if (typeof fn !== 'function') return; // ← wrong id lands here, silently fn().then(grantReward);
Two things I'd do again in any project:
Affiliate link — I earn a commission if you sign up, at no extra cost to you.
Sign up for MonetagFree to join · individual accounts accepted · $5 minimum payout via PayPal
One more thing, in case it saves someone a search: I keep ads switched off for Japanese-language users in my games as a personal precaution around local ad rules. That's my own caution, not advice — check your own situation.
The tools I actually use · Games
Details are accurate as of the publish date. Check Monetag's own docs for current terms.