Monetization

Ads

Formats, placements, role-based targeting and campaign budgets

RKHM has a built-in advertising system under Business → Advertisement — Campaigns (create and fund individual ads), Setting (per-format pricing) and Player ad setting (when ads play). It's shared, generic code, not tied to any one catalogue type, so everything below applies the same way regardless of what you sell.

Ad formats

FormatWhat it needsWhere it plays
BannerImage + click-through URLAny "Ads" PageBuilder widget placement
AudioShort audio clip (keep it well under a minute) + a small clickable banner shown while it playsIn the player, between plays, on the schedule set in Player ad setting (see below)
VideoA short video file, same interstitial mechanic as AudioIn the player, between plays, on the schedule set in Player ad setting (see below)
YouTubeA YouTube video ID instead of an uploaded fileIn the player, between plays, on the schedule set in Player ad setting (see below)
JavaScriptRaw JS/HTML you provide — a third-party ad tag, for exampleAny Ads widget placement
Google Ad UnitAdSense client ID + ad slot IDWeb only — not shown in the native/Cordova app
AdMob (banner / interstitial)AdMob unit IDsAndroid app only

There's also a separate, simpler mechanism for Google specifically: Business → Advertisement → Setting has a field for a raw Google AdSense "Auto Ads" script, pasted in directly. That's independent of the Google Ad Unit campaign type above — Auto Ads lets Google place ads anywhere on the page itself, while a Google Ad Unit campaign is a specific ad you place in a specific spot yourself.

Where ads appear — placements

Placements aren't a fixed list you pick from a dropdown — they're created by dragging an Ads widget onto a page in PageBuilder. Every Ads widget instance already placed on any page becomes an available placement when you set up a campaign, identified by its configured size. Add the widget to a page a second time and you have a second, independent placement to target.

Who sees ads — role-based targeting

There's no hardcoded "hide ads from subscribers" switch. Instead, every user role has an ads flag; if a user's role has it explicitly turned off, they see no ads anywhere, in any format. The usual setup is to turn this flag off on whichever role your paid subscription plan grants — so "ad-free for subscribers" is something you configure on the role, not a separate ads-specific setting.

Budget and billing

Each campaign carries its own fund_total — you fund a specific amount, and RKHM spends it down as the ad actually runs. Every impression deducts that format's per-impression cost (set in Business → Advertisement → Setting, one price per format); every click deducts that format's click cost and is tracked through a redirect link. An optional daily cap limits how fast a campaign's fund can be spent in a single day, and the daily counter resets on its own at midnight — no cronjob involved. A campaign that runs out of funds deactivates itself automatically; you'll see it stop serving without having to turn it off by hand.

When audio, video and YouTube ads play

These ads are timed by minutes of listening, not by queue position. Set the timing in Business → Advertisement → Player ad setting (the same group appears under Setting → Interface → Player):

  • Start Time (Offset) — how many minutes a new visitor can listen before their first ad. 0 plays an ad as soon as they start.
  • Frequency (Interval) — how many minutes of listening between ads.
  • Skippability and Skippability Threshold — whether listeners can skip an ad, and after how many seconds the Skip button appears.

When more than one ad is eligible for the same placement at the same moment, RKHM picks one at random rather than rotating them in sequence — over enough impressions this evens out, but it's not a scheduled rotation and there's no "show campaign A before campaign B" ordering control.

Limitations

  • Ad selection within a placement is random, not weighted or scheduled — you can't currently guarantee one campaign always shows before another.